diff options
author | CruiseDevice | 2018-09-28 15:37:18 +0530 |
---|---|---|
committer | CruiseDevice | 2018-09-28 15:37:18 +0530 |
commit | 800b65f3bd13e5e720bc149ada25f34b67f507dd (patch) | |
tree | 77cc586e6cbb87f6513030ef02b6612c89d22379 | |
parent | a492c52c46be42beb5b93634e314556eb9d61c97 (diff) | |
download | sbhs_server-800b65f3bd13e5e720bc149ada25f34b67f507dd.tar.gz sbhs_server-800b65f3bd13e5e720bc149ada25f34b67f507dd.tar.bz2 sbhs_server-800b65f3bd13e5e720bc149ada25f34b67f507dd.zip |
SBHS class which communicates with the device
- get_usb_devices
- connect_devices
- create map of sbhs to usb
- setHeat, setFan, setTemp
- get machine id
- reset board
- create log files with sbhs readings
-rw-r--r-- | sbhs/sbhs.py | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/sbhs/sbhs.py b/sbhs/sbhs.py new file mode 100644 index 0000000..3b41a08 --- /dev/null +++ b/sbhs/sbhs.py @@ -0,0 +1,275 @@ +import serial +import os +from time import localtime, strftime, sleep +# import credentials +import sbhs_server.credentials as credentials + +# MAP_FILE = credentials.MAP_FILE +#LOG_FILE = '../log/sbhserr.log' +# LOG_FILE = credentials.LOG_FILE + +class SbhsServer(object): + """ This is the Single Board Heater System class """ + + def __init__(self): + self.outgoing_machine_id = 252 + self.incoming_fan = 253 + self.incoming_heat = 254 + self.outgoing_temp = 255 + self.max_heat = 100 + self.out_max_fan = 100 + + def get_usb_devices(self): + usb_devices = [] + for tty in os.listdir('/dev'): + if tty.startswith('ttyUSB'): + try: + usb_devices.append(int(tty[6:])) + except ValueError: + pass + + return usb_devices + + def connect_device(self, device_num): + """ + Open a serial connection via USB to the SBHS using USB Device Number + """ + # check for valid device number + + usb_device_file = '/dev/ttyUSB{}'.format(device_num) + try: + self.boardcon = serial.Serial(port=usb_device_file, + baudrate=9600, bytesize=8, + parity='N', stopbits=1, + timeout=2 + ) + self.sbhs = self.get_machine_id() + # org stopbits = 1 + status = True + except Exception as e: + status = False + print(e) + return status + + def map_sbhs_to_usb(self, usb_devices): + sbhs_map = [] + if usb_devices: + for usb in usb_devices: + print("usb", usb) + status = self.connect_device(usb) + if status: + sbhs = self.sbhs + sbhs_map.append({"usb_id": usb, "sbhs_mac_id": sbhs}) + return sbhs_map + + def connect(self, machine_id): + """ + Open a serial connection via USB to the SBHS using the + machine id + """ + # check for valid machine id number + try: + self.machine_id = int(machine_id) + except: + return False + + # get the usb device file from the machine map file + try: + map_file = open(MAP_FILE, 'r') + usb_device_file = False + + for mapping_str in map_file.readlines(): + mapping = mapping_str.split('=') + self.log('mapping: ' + mapping[1], 'ERROR') #srikant + + # if mapping for the machine id found set the usb device + # file and break out of loop + if mapping[0] == str(self.machine_id): + usb_device_file = mapping[1].strip() + #self.log('usb_device_file: ' + usb_device_file, 'ERROR') #srikant + break + + # reached end of file and check if machine id entry is present + # in the machine map file + map_file.close() + if not usb_device_file: + print("Error: cannot locate the USB device in the map table \ + for machine id {}".format(self.machine_id)) + self.log('cannot locate the USB device in the map table for \ + machine id %d' % self.machine_id, 'ERROR') + return False + except: + # map_file.close() + print("Error: cannot get the USB device path for the machine \ + id {}".format(self.machine_id)) + self.log('cannot get the USB device path for the machine id\ + %d' % self.machine_id, 'ERROR') + return False + + # check if SBHS device is connected + if not os.path.exists(usb_device_file): + print("SBHS device file" +usb_device_file + "does not exists") + self.log('SBHS device file ' + usb_device_file + ' does not\ + exists', 'ERROR') + return False + try: + self.boardcon = serial.Serial(port=usb_device_file, \ + baudrate=9600, bytesize=8, parity='N', \ + stopbits=1, timeout=2) #orignal stopbits = 1 + self.status = 1 + return True + except serial.serialutil.SerialException: + print("Error: cannot connect to machine id \ + {}".format(self.machine_id)) + self.log('cannot connect to machine id \ + %d' % self.machine_id, 'ERROR') + + self.machine_id = -1 + self.device_num = -1 + self.boardcon = False + self.status = 0 + + + def setHeat(self, val): + """ Sets the heat, checks if value is valid i.e. within range. + Input: self object, val + Output: Error message if heat cannot be set. + """ + if val > MAX_HEAT or val < 0: + print("Error: heat value cannot be more than {}".format(MAX_HEAT)) + return False + + try: + self._write(chr(INCOMING_HEAT)) + sleep(0.5) + self._write(chr(val)) + return True + except: + print("Error: cannot set heat for machine \ + id {}".format(self.machine_id)) + self.log('cannot set heat for machine id \ + %d' % self.machine_id, 'ERROR') + return False + + def setFan(self, val): + """ Sets the fan speed, checks if value is valid i.e. within range. + Input: self object, val + Output: Error message if fan cannot be set. + """ + if val > MAX_FAN or val < 0: + print("Error: fan value cannot be more than {}".format(MAX_FAN)) + return False + try: + self._write(chr(INCOMING_FAN)) + sleep(0.5) + self._write(chr(val)) + return True + except: + print("Error: cannot set fan for machine id \ + {}".format(self.machine_id)) + self.log('cannot set fan for machine id %d' % self.machine_id, \ + 'ERROR') + return False + + def getTemp(self): + """ Gets the temperature from the machine. + """ + try: + self.boardcon.flushInput() + self._write(chr(OUTGOING_TEMP)) + temp = ord(self._read(1)) + (0.1 * ord(self._read(1))) + return temp + except: + print("Error: cannot read temperature from machine id \ + {}".format(self.machine_id)) + self.log('cannot read temperature from machine id %d' \ + % self.machine_id, 'ERROR') + return 0.0 + + def get_machine_id(self): + """ Gets machine id from the device """ + try: + self.boardcon.flushInput() + self._write(str(self.outgoing_machine_id).encode()) + sleep(0.5) + machine_id = self._read(1) + except Exception as e: + print("e-->", e) + machine_id = -1 + return int(machine_id) + + def disconnect(self): + """ Reset the board fan and heat values and close the USB connection """ + try: + self.boardcon.close() + self.boardcon = False + self.status = 0 + return True + except: + print('Error: cannot close connection to the machine') + self.log('cannot close connection to the machine', 'ERROR') + return False + + def reset_board(self): + return self.setHeat(0) and self.setFan(100) + + def _read(self, size): + try: + data = self.boardcon.read(size).decode("ascii") + print(data) + return data + except Exception as e: + print(e) + + def _write(self, data): + try: + self.boardcon.write(data) + return True + except Exception as e: + print(e) + + def log(self, msg, level): + try: + errfile = open(LOG_FILE, 'a') # open error log file in append mode + if not errfile: + return + log_msg = '%s %s %s\n' %(level, strftime('%d:%m:%Y %H:%M:%S', \ + localtime()), msg) + + errfile.write(log_msg) + errfile.close() + return + except: + return + + +# if no device filename found then exit +# for device in device_files: +# s = sbhs.Sbhs() +# # getting the number from the device filename +# dev_id = device[6:] +# try: +# dev_id = int(dev_id) +# except: +# print('Invalid device name /dev/%s' % device) +# continue +# # connect to device +# res = s.connect_device(dev_id) +# if not res: +# print ('Cannot connect to /dev/%s' % device) +# s.disconnect() +# continue +# # get the machine id from the device +# machine_id = s.getMachineId() +# if machine_id < 0: +# print('Cannot get machine id from /dev/%s' % device) +# s.disconnect() +# continue +# print ('Found SBHS device /dev/%s with machine id %d' % (device, machine_id)) +# map_str = "%d=/dev/%s\n" % (machine_id, device) +# map_machine_file.write(map_str) + +# print ('Done. Exiting...') +# map_machine_file.close() +# sys.exit(1) + |