def monitor(port='/dev/ttyAMA0', baudrate=115200, timeout=1, checkstatus=True): import serial import cupid.pilib as pilib from time import mktime, localtime data = [] if checkstatus: systemstatus = pilib.readonedbrow(pilib.controldatabase, 'systemstatus')[0] runhandler = systemstatus['serialhandlerenabled'] checktime = mktime(localtime()) checkfrequency = 15 # seconds if runhandler: pilib.log(pilib.iolog, "Starting monitoring of serial port", 1, pilib.iologlevel) else: pilib.log(pilib.iolog, "Not starting monitoring of serial port. How did I get here?", 1, pilib.iologlevel) else: runhandler = True if runhandler: ser = serial.Serial(port=port, baudrate=baudrate, timeout=timeout) print("Monitoring serial port " + ser.name) else: print('not monitoring serial port ') while runhandler: ch = ser.read(1) if len(ch) == 0: # rec'd nothing print all if len(data) > 0: s = '' for x in data: s += '%s' % x # ord(x) # Here for diagnostics # print '%s [len = %d]' % (s, len(data)) # now process data # print(s) # print(s.split('\n')) try: # print('*************** processing datadict') datadicts, messages = processserialdata(s) # print('ALL MY DATADICTS') # print(datadicts) # print('END OF DICTS') except IOError: print('error processing message') except Exception as ex: template = "An exception of type {0} occured. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) print message else: for datadict, message in zip(datadicts, messages): if datadict: print("datadict: ") print(datadict) # print("message: ") # print(message) publish = False for k in datadict: # print(k + datadict[k]) if k not in ['nodeid','RX_RSSI']: pass # if 'cmd' in datadict: publish = True if publish: print('publishing message') statusresult = lograwmessages(message) pilib.sizesqlitetable(pilib.motesdatabase, 'readmessages', 1000) statusresult = processremotedata(datadict, message) else: if message: print('message: ') print(message) # except: # print('error processing returned datadict, message:') # print(message) # else: # print("message parse was successful") # print(message) else: # no data, let's see if we should send message try: lastqueuedmessage = pilib.getfirsttimerow(pilib.motesdatabase, 'queuedmessages', 'queuedtime')[0] except IndexError: # no rows # print('we have an error getting a queued message. Could be just no message.') pass else: # send queued message print(lastqueuedmessage) try: print('going to send message:') print(lastqueuedmessage['message']) ser.write(lastqueuedmessage['message'].encode()) # sendserialmessage(ser, lastqueuedmessage['message']) except: print('oops') else: print('that worked out. remove message from queue') conditionnames = ['queuedtime', 'message'] conditionvalues = [lastqueuedmessage['queuedtime'], lastqueuedmessage['message']] delquery = pilib.makedeletesinglevaluequery('queuedmessages', {'conditionnames':conditionnames, 'conditionvalues':conditionvalues}) pilib.sqlitequery(pilib.motesdatabase, delquery) print('move to sent messages') pilib.sqliteinsertsingle(pilib.motesdatabase, 'sentmessages', [lastqueuedmessage['queuedtime'], pilib.gettimestring(), lastqueuedmessage['message']]) data = [] else: data.append(ch) if checkstatus: thetime = mktime(localtime()) if thetime-checktime > checkfrequency: print('checking control status') systemstatus = pilib.readonedbrow(pilib.controldatabase, 'systemstatus')[0] runserialhandler = systemstatus['serialhandlerenabled'] if runserialhandler: checktime = thetime pilib.log(pilib.iolog, 'Continuing serialhandler based on status check',3,pilib.iologlevel) else: runhandler=False pilib.log(pilib.iolog, 'Aborting serialhandler based on status check',3,pilib.iologlevel)
def monitor(port='/dev/ttyAMA0', baudrate=115200, timeout=1, checkstatus=True): import serial import cupid.pilib as pilib from time import mktime, localtime from time import sleep data = [] stringmessage = '' rawseriallog = True if rawseriallog: print('serial logging is enabled.') logfile = open(pilib.seriallog, 'a', 1) logfile.write('\n' + pilib.gettimestring() + ": Initializing serial log\n") if checkstatus: systemstatus = pilib.readonedbrow(pilib.controldatabase, 'systemstatus')[0] runhandler = systemstatus['serialhandlerenabled'] checktime = mktime(localtime()) checkfrequency = 15 # seconds if runhandler: pilib.log(pilib.iolog, "Starting monitoring of serial port", 1, pilib.iologlevel) else: pilib.log(pilib.iolog, "Not starting monitoring of serial port. How did I get here?", 1, pilib.iologlevel) else: runhandler = True if runhandler: ser = serial.Serial(port=port, baudrate=baudrate, timeout=timeout) print("Monitoring serial port " + ser.name) else: print('not monitoring serial port ') while runhandler: # This reading has to happen faster than the messages come, or they will all be stuck together try: ch = ser.read(1) # if ch == '\x0D': # print('carriage return') # elif ch == '\x00': # print('null character') if len(ch) == 0 or ch == '\x0D': # print('LEN ZERO OR END CHAR: PROCESS TIME') # rec'd nothing print all if len(data) > 0: s = '' for x in data: s += '%s' % x # ord(x) # Here for diagnostics # print '%s [len = %d]' % (s, len(data)) # now process data # print(s) # print(s.split('\n')) try: # print('*************** processing datadict') datadicts, messages = processserialdata(s) # print('ALL MY DATADICTS') # print(datadicts) # print('END OF DICTS') except IOError: print('error processing message') except Exception as ex: template = "An exception of type {0} occured. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) print message else: for datadict, message in zip(datadicts, messages): if datadict: # print("datadict: ") # print(datadict) # print("message: ") # print(message) publish = False for k in datadict: # print(k + datadict[k]) if k not in ['nodeid','RX_RSSI']: pass # if 'cmd' in datadict: publish = True if publish: # print('publishing message') statusresult = lograwmessages(message) pilib.sizesqlitetable(pilib.motesdatabase, 'readmessages', 1000) statusresult = processremotedata(datadict, message) else: if message: print('message: ') print(message) # Log message if rawseriallog: try: logfile.write(pilib.gettimestring() + ' : ' + message + '\n') except Exception as e: template = "An exception of type {0} occured. Arguments:\n{1!r}" message = template.format(type(ex).__name__, ex.args) print message else: # no data, let's see if we should send message # print('no data, try sending') pass pilib.log(pilib.seriallog, "Attempting send routine", 1, 1) # See if there are messages to send. # try: runsendhandler(ser) # except Exception as e: # pilib.log(pilib.seriallog, "Error in send routine", 1, 1) # # template = "An exception of type {0} occured. Arguments:\n{1!r}" # message = template.format(type(ex).__name__, ex.args) # pilib.log(pilib.seriallog, message, 1, 1) # print message data = [] else: # print('DATA NOT ZERO') # print(ch) data.append(ch) stringmessage += str(ch) if checkstatus: print('checking status') thetime = mktime(localtime()) if thetime-checktime > checkfrequency: print('checking control status') systemstatus = pilib.readonedbrow(pilib.controldatabase, 'systemstatus')[0] runserialhandler = systemstatus['serialhandlerenabled'] if runserialhandler: checktime = thetime pilib.log(pilib.iolog, 'Continuing serialhandler based on status check',3,pilib.iologlevel) else: runhandler=False pilib.log(pilib.iolog, 'Aborting serialhandler based on status check',3,pilib.iologlevel) except KeyboardInterrupt: print('\n Exiting on keyboard interrupt\n') logfile.close() return except: # print('no characters available!') sleep(0.5) # return #runsendhandler(ser) logfile.close() ser.close() return