123 lines
3.8 KiB
Python
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)
|
|
|
|
|
|
|
|
|
|
|
|
|