class ArduinoUSBThread ( threading.Thread ):
def __init__(self, file_dev_ttyusb):
self.re_isidle = re.compile(r'idle')
- self.re_isopen = re.compile(r'open')
- self.re_isclosed = re.compile(r'close|closing')
+ self.re_isopen = re.compile(r'Status: opened, idle')
+ self.re_isclosed = re.compile(r'Status: closed, idle')
self.re_toolong = re.compile(r'took too long!')
self.min_seconds_between_reset=10;
self.timestamp_send_reset=0;
self.running=True
self.lastline=""
self.last_status=None
+ self.shortsleep = 0
self.cv_updatestatus = threading.Condition(); #lock ist automatically created withing condition
self.file_dev_ttyusb=file_dev_ttyusb
#self.fh = open(self.file_dev_ttyusb,"w+")
- self.fh = os.fdopen(os.open(self.file_dev_ttyusb, os.O_RDWR | os.O_NONBLOCK),"r+")
+ self.fh = os.fdopen(os.open(self.file_dev_ttyusb, os.O_RDWR | os.O_NONBLOCK),"r+")
+ #pythons sucks just like perl: we need nonblock or we can't write to FileHandle while we block reading on same filehandle
self.statusdisplay = StatusDisplay()
threading.Thread.__init__(self)
self.cv_updatestatus.release()
def send_reset(self):
- logging.info("Resetting Door")
- print("\nSending r..")
+ self.shortsleep = 20
+ logging.info("Resetting Door")
+ #print("\nSending r..")
self.fh.write("r");
- print("done\n")
+ #print("done\n")
def send_statusrequest(self):
- print("\nSending s..")
+ self.shortsleep = 20
+ #print("\nSending s..")
self.fh.write("s");
- print("done\n")
+ #print("done\n")
self.cv_updatestatus.acquire()
self.cv_updatestatus.wait(5.0)
self.cv_updatestatus.release()
try:
line = self.fh.readline();
except IOError, e:
- time.sleep(0.5)
+ if self.shortsleep > 0:
+ time.sleep(0.05)
+ self.shortsleep -= 1
+ else:
+ time.sleep(0.5)
continue
self.cv_updatestatus.acquire()
- self.lastline=line
+ self.lastline=line.strip()
logging.info(self.file_dev_ttyusb+": "+self.lastline)
if self.re_isclosed.search(self.lastline):
self.last_status="closed"
- self.statusdisplay.display_open()
+ self.statusdisplay.display_closed()
elif self.re_isopen.search(self.lastline):
self.last_status="open"
- self.statusdisplay.display_closed()
+ self.statusdisplay.display_open()
elif self.re_toolong.search(self.lastline):
self.last_status="error"
if (time.time() - self.timestamp_send_reset) > self.min_seconds_between_reset:
ctrlfifo = ControlFIFOThread(fifofile,arduino)
ctrlfifo.start()
+arduino.send_statusrequest()
+
def exit_handler(signum, frame):
global arduino, ctrlfifo
logging.info("Door Daemon stopping")
arduino.stop()
sys.exit(0)
+#signals proapbly don't work because of readline
#signal.signal(signal.SIGTERM, exit_handler)
signal.signal(signal.SIGINT, exit_handler)
signal.signal(signal.SIGQUIT, exit_handler)
logging.info("Door Daemon started")
arduino.join()
-ctrlfifo.join()
\ No newline at end of file
+ctrlfifo.join()