Echo/echo-master/echo_serial/serial_controller.py
2020-07-06 23:41:26 +02:00

123 lines
3.8 KiB
Python

import serial
import _thread
import time
import sys
import os
import echo_db.database as EchoDB
import echo_controller.controller as Controller
class EchoSerial:
arduino = serial.Serial()
allow_control = True
@staticmethod
def init():
try:
print('Starting Serial Connection with arduino...')
# Start Serial Connection
EchoSerial.arduino.baudrate = 115200
EchoSerial.arduino.port = '/dev/ttyACM0'
EchoSerial.arduino.timeout = .1
EchoSerial.arduino.open()
if not EchoSerial.arduino.is_open:
print('Could not open Serial Connection with arduino!')
print('Serial Connection Opened with arduino!')
print('Starting Serial Handling Thread...')
_thread.start_new_thread(EchoSerial.handle_serial, ("Main Serial Thread", 2, ))
except:
print('Error Initializing Serial Controller!')
print('Serial Error: ' + str(sys.exc_info()[0]))
EchoSerial.allow_control = False
@staticmethod
def handle_serial(threadname, delay):
print('Serial Handling Thread Started!')
while EchoSerial.arduino.isOpen():
time.sleep(.02)
try:
data = EchoSerial.arduino.readline()[:-2]
if data:
# Parse Incoming Data > Decode to UTF-8
parsed_data = data.decode("utf-8")
# Start new thread to handle the reponse
_thread.start_new_thread(EchoSerial.handle_serial_data, ("Serial Response Handler Tread", 2, parsed_data))
except:
print('Error Occured on Serial handling Thread!')
print('Serial Error: ' + str(sys.exc_info()[0]))
EchoSerial.allow_control = False
EchoSerial.reopen_serial_connection()
# _thread.interrupt_main()
@staticmethod
def reopen_serial_connection():
try:
EchoSerial.arduino.close()
except:
print("Error closing serial connection")
while not EchoSerial.arduino.isOpen():
try:
EchoSerial.arduino.open()
except:
print("Error reopening serial connection")
finally:
time.sleep(1)
EchoSerial.allow_control = True
print("Serial Connection Established!")
@staticmethod
def handle_serial_data(threadNamee, delay, data):
# Command Example:
# 9472-4f60:temp_data:data
# Data is if needed separated by ,
print('Parsing Packet: ' + data)
# Remove packet Markers
data = data[1:-1]
# Parse command
parsed_data = data.split(':')
# Check if startup command
if parsed_data[0] == "0":
print('Echo Controller Ready!')
return
# Check if startup command
if parsed_data[0] == "1":
print('Echo LED Controller Ready!')
return
# Get Device
collection = EchoDB.EchoDB.database['Devices']
device = collection.find_one({'uuid': parsed_data[0]})
# Send to controller
Controller.Controller.handle_output_device(device, parsed_data[1], parsed_data)
@staticmethod
def send_serial(command):
# Command Example:
# 9472-4f60:get_data:data
# data is if needed separated by ,
EchoSerial.arduino.write(command.encode())
@staticmethod
def send_commmand(device, action, value = "0"):
serial_command = "<" + device['uuid'] + ":" + action + ":" + value + ">"
print('Sending Packet: ' + serial_command)
EchoSerial.send_serial(serial_command)