From f575423506792af11408741eab04ca78cabcdbee Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Tue, 18 Oct 2011 22:30:25 +0200 Subject: [PATCH 1/7] started to push the screensaver over --- client-barcode/display.py | 153 ++++++++++++++++++++++++++++---- client-barcode/freitagskasse.py | 53 +++-------- 2 files changed, 145 insertions(+), 61 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index 59ad56d..b1459e3 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -1,36 +1,70 @@ import serial - - +from thread import start_new_thread, allocate_lock +import time class Display: def __init__(self,portname="/dev/ttyUSB0"): self.serialport=None - self.open_port(portname) + self.portlock = allocate_lock() + self.portname=portname + self.open_port() + self.brightness=0 + self.screensaver = Screensaver(self) + self.screensaver.start() def __del__(self): + if (not self.screensaver == None): + self.screensaver.terminate() + self.screensaver = None + if (not self.serialport == None): self.serialport.close() self.serialport=None - def open_port(self,portname): - self.serialport = serial.Serial(portname,9600,timeout=2,rtscts=True, dsrdtr=True) - print ("Initializing display:\n %s\n" % self.serialport ) - self.cmd_reset() - self.write("Hello world") + def open_port(self): + + self.mutex_get() + try: + self.serialport = serial.Serial(self.portname,9600,timeout=2,rtscts=True, dsrdtr=True) + print ("Initializing display on port:\n %s\n" % self.serialport ) + self.cmd_reset() + self.mutex_release() + except Exception as e: + print ("Exception opening serial port '%s' for display\n" % self.portname) + print ("Ignoring and trying to open it again later\n") + print (e) + self.serialport = None + self.mutex_release() + pass + + + def cmd_reset(self): #reset the display - self.write("\x1b\x40") + self.cmd("\x1b\x40") def cmd_cursor_show(self,on=True): #show or hide the cursor if (on): - self.write("\x1f\x43\x01") + self.cmd("\x1f\x43\x01") else: - self.write("\x1f\x43\x00") + self.cmd("\x1f\x43\x00") def cmd_blink(self,rate=127): - self.write("\x1f\x45%c" % rate) + self.cmd("\x1f\x45%c" % chr(rate)) + + + def cmd_brightness(self,level): + if (level==0): #turn off: + self.cmd_display_on(False) + self.brightness = level + return + else: + if (self.brightness==0): #turn on, then set wanted brightness: + self.cmd_display_on(True) + self.brightness = level + self.cmd("\x1F\x58%c" % chr(level-1) ) def cmd_display_on(self,on=True): # blink-command: @@ -51,24 +85,105 @@ class Display: cmd_curmode(3) def cmd_curmode(self,val=2): - self.write("\x1f%c" % val) + self.cmd("\x1f%c" % chr(val)) def cmd_clear(self): - self.write("\x0c") + self.cmd("\x0c") def cmd_time(self): # activate timer display in lower right corner. # actual time has to be set via display_set_timer. - self.write("\x1f\x55") + self.cmd("\x1f\x55") - def cmd_time_set(self,h,m): + def cmd_time_set(self,h=None,m=None): + if (h==None or m==None): + now = time.localtime() + h=now.tm_hour + m=now.tm_min # configures hour and minutes of the internal clock and # displays the time in the lower right corner. # turns off when something gets written into the line. # two bytes have to follow with hour and minute - self.write("\x1F\x54%c%c" % (h,m) ) + self.cmd("\x1F\x54%c%c" % (chr(h),chr(m)) ) + self.cmd_curmode_hscroll() # makes the time more robust... + + def cmd(self,text): #for commands: do not reset screensaver timeout + self.write(text,False) + def write(self,text,idle_reset=True): #for data: reset screensaver timeout + if (not self.serialport == None): + if (idle_reset): + self.screensaver.idle_reset(); + self.serialport.write(text) + else: + self.open_port() + + + def mutex_get(self): + self.portlock.acquire() + + def mutex_release(self): + self.portlock.release() + + def terminate(self): + if (not self.screensaver == None): + self.screensaver.terminate() + self.screensaver = None + + +import threading +import time + +class Screensaver (threading.Thread): + def __init__(self,display): + self.display=display + self.runme=True + self.idlecounter=0 + self.timeout_dim=30 + self.timeout_message=60 + self.timeout_off=120 + self.mutex = allocate_lock() + threading.Thread.__init__(self) + + def run(self): + print "Starting Screensaver thread" + while(self.runme): + self.mutex.acquire() + self._main_loop() + self.mutex.release() + time.sleep(.5) + print "Exiting Screensaver thread" + + def terminate(self): + self.runme = False + + + def idle_reset(self): + self.mutex.acquire() + self.idlecounter=0 + self.mutex.release() + + def _main_loop(self): + if (self.idlecounter < self.timeout_off): + self.idlecounter+=1 + + if (self.idlecounter>=self.timeout_dim and self.idlecounter <= (self.timeout_dim+7)): + x = (8-( self.idlecounter - self.timeout_dim))/2 + self.display.mutax_get() + self.display.cmd_brightness(1+x) + self.display.mutax_release() + return + + if (self.idlecounter==self.timeout_message): + return + + if (self.idlecounter==self.timeout_off): + self.display.mutax_get() + display.cmd_display_on(False) + self.display.mutax_release() + return + + def __del__(self): + print("bye") - def write(self,text): - self.serialport.write(text) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index d8ce0ba..c8214ff 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -60,6 +60,7 @@ lock = allocate_lock() def display_scroll_text(line,text): global scroll_line1,scroll_line2 global offset_line1,offset_line2 + global lock lock.acquire() if (line==1): #clear the line on invocation: send_display("\x1f\x24\x01%c\x18" % chr(line) ) @@ -91,18 +92,7 @@ def display_handle_scroll(line,text,offset): def display_cmd_dim(x): - global brightness - if (brightness!=x): - if (x==0): #turn off: - send_display("\x1F\x45%c" % chr(255) ) - brightness = x - return - - else: - if (brightness==0): #turn on, then set wanted brightness: - send_display("\x1F\x45%c" % chr(0) ) - brightness = x - send_display("\x1F\x58%c" % chr(x-1) ) + return def display_thread(x): @@ -110,6 +100,7 @@ def display_thread(x): global offset_line1,offset_line2 global screensaver global idlemessage + global lock offset_line1=0 offset_line2=0 @@ -122,9 +113,6 @@ def display_thread(x): if (screensaver <= SCREENSAVER_OFF): screensaver=screensaver+1 - if ((screensaver >= SCREENSAVER_DIM) and (screensaver <= (SCREENSAVER_DIM+7))): #activate first stage of screensaver: - x = (8-( screensaver - SCREENSAVER_DIM))/2 - display_cmd_dim(1+x) if (screensaver == SCREENSAVER_TIMEOUT): now = time.localtime() @@ -136,36 +124,14 @@ def display_thread(x): scroll_line2=None offset_line1=0 offset_line2=0 - - if (screensaver == SCREENSAVER_OFF): - display_cmd_dim(0) lock.release() time.sleep(.5) def send_display(s): - global display_fifo - if not display_fifo: - try: - fd = os.open( "/tmp/display", os.O_WRONLY) - display_fifo = os.fdopen(fd,"w") - except OSError: - display_fifo = None - pass - return - except IOError: - display_fifo = None - pass - return - try: - display_fifo.write(s) - display_fifo.flush() - except IOError: - display_fifo = None - pass - return - + global myDisplay + myDisplay.write(s) #Front-End Funtion to display a Screen # with heading @@ -198,6 +164,8 @@ def print_display(s): global scroll_line1,scroll_line2 global offset_line1,offset_line2 global screensaver + global myDisplay + global lock lock.acquire() screensaver=0 @@ -206,7 +174,7 @@ def print_display(s): scroll_line1=None scroll_line2=None display_cmd_dim(5) - send_display(s) + myDisplay.write(s) lock.release() def clear(): @@ -582,8 +550,7 @@ def main(): myDisplay = Display("/dev/ttyUSB0") myDisplay.cmd_reset() - - print_display("\x1b\x40\x1f\x43\x00") + myDisplay.cmd_cursor_show(False) start_new_thread(display_thread,(1,)) #display_scroll_text(1,"Line1: Text, dumm scrollend!") @@ -605,3 +572,5 @@ if __name__ == '__main__': except KeyboardInterrupt: pass print_display("\x1b\x40Goodbye!") + myDisplay.terminate() + From 2858b1e71ab462d78d13c82e861d4e478cd4ecb5 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Tue, 18 Oct 2011 23:10:35 +0200 Subject: [PATCH 2/7] yea, now screensaver almost works... or sth like that. lets convert the helper funcs --- client-barcode/display.py | 43 ++++++++++++++++++++++----------- client-barcode/freitagskasse.py | 10 +++++--- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index b1459e3..ee6b1d6 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -8,7 +8,7 @@ class Display: self.portlock = allocate_lock() self.portname=portname self.open_port() - self.brightness=0 + self.brightness=5 self.screensaver = Screensaver(self) self.screensaver.start() @@ -56,9 +56,12 @@ class Display: def cmd_brightness(self,level): + if (self.brightness==level): + return + print("setting brightness to %i \n" %level) if (level==0): #turn off: self.cmd_display_on(False) - self.brightness = level + self.brightness = 0 return else: if (self.brightness==0): #turn on, then set wanted brightness: @@ -71,18 +74,26 @@ class Display: # where the last value defines the blink rate, # with 0=always on, 255=always off if (on): + if (not self.brightness==0): + return + print("setting display to on: %s \n" % str(on)) self.cmd_blink(0) + self.brightness=5 else: + if (self.brightness==0): + return + print("setting display to on: %s \n" % str(on)) self.cmd_blink(255) + self.brightness=0 def cmd_curmode_overwrite(self): - cmd_curmode(1) + self.cmd_curmode(1) def cmd_curmode_vscroll(self): - cmd_curmode(2) + self.cmd_curmode(2) def cmd_curmode_hscroll(self): - cmd_curmode(3) + self.cmd_curmode(3) def cmd_curmode(self,val=2): self.cmd("\x1f%c" % chr(val)) @@ -140,9 +151,9 @@ class Screensaver (threading.Thread): self.display=display self.runme=True self.idlecounter=0 - self.timeout_dim=30 - self.timeout_message=60 - self.timeout_off=120 + self.timeout_dim=10 + self.timeout_message=20 + self.timeout_off=32 self.mutex = allocate_lock() threading.Thread.__init__(self) @@ -162,26 +173,30 @@ class Screensaver (threading.Thread): def idle_reset(self): self.mutex.acquire() self.idlecounter=0 + self.display.cmd_brightness(5) self.mutex.release() def _main_loop(self): if (self.idlecounter < self.timeout_off): self.idlecounter+=1 - if (self.idlecounter>=self.timeout_dim and self.idlecounter <= (self.timeout_dim+7)): x = (8-( self.idlecounter - self.timeout_dim))/2 - self.display.mutax_get() + self.display.mutex_get() self.display.cmd_brightness(1+x) - self.display.mutax_release() + self.display.mutex_release() return if (self.idlecounter==self.timeout_message): + print("WHAAAAGHAA") + self.display.mutex_get() + self.display.cmd_time_set() + self.display.mutex_release() return if (self.idlecounter==self.timeout_off): - self.display.mutax_get() - display.cmd_display_on(False) - self.display.mutax_release() + self.display.mutex_get() + self.display.cmd_display_on(False) + self.display.mutex_release() return def __del__(self): diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index c8214ff..c9ce940 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -110,8 +110,8 @@ def display_thread(x): offset_line1 = display_handle_scroll(1,scroll_line1,offset_line1) offset_line2 = display_handle_scroll(2,scroll_line2,offset_line2) - if (screensaver <= SCREENSAVER_OFF): - screensaver=screensaver+1 + # if (screensaver <= SCREENSAVER_OFF): +# screensaver=screensaver+1 if (screensaver == SCREENSAVER_TIMEOUT): @@ -131,7 +131,7 @@ def display_thread(x): def send_display(s): global myDisplay - myDisplay.write(s) +# myDisplay.write(s,False) #Front-End Funtion to display a Screen # with heading @@ -174,7 +174,7 @@ def print_display(s): scroll_line1=None scroll_line2=None display_cmd_dim(5) - myDisplay.write(s) +# myDisplay.write(s,False) lock.release() def clear(): @@ -550,6 +550,8 @@ def main(): myDisplay = Display("/dev/ttyUSB0") myDisplay.cmd_reset() + myDisplay.write("Hello world!\n") + time.sleep(10) myDisplay.cmd_cursor_show(False) start_new_thread(display_thread,(1,)) From a9d82b9b85c2fe91847e049ae897453069173ffc Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Tue, 18 Oct 2011 23:56:37 +0200 Subject: [PATCH 3/7] its scrolling, yay. --- client-barcode/display.py | 87 +++++++++++++++++++++++++++++++-- client-barcode/freitagskasse.py | 41 ++-------------- 2 files changed, 86 insertions(+), 42 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index ee6b1d6..1fabbcd 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -1,16 +1,22 @@ import serial from thread import start_new_thread, allocate_lock import time +import threading -class Display: +class Display(threading.Thread): def __init__(self,portname="/dev/ttyUSB0"): + threading.Thread.__init__(self) self.serialport=None + self.runme=True self.portlock = allocate_lock() self.portname=portname - self.open_port() self.brightness=5 + self.scroll_line1 = None + self.scroll_line2 = None + self.offset_line1 = 0 + self.offset_line2 = 0 self.screensaver = Screensaver(self) - self.screensaver.start() + self.open_port() def __del__(self): if (not self.screensaver == None): @@ -38,6 +44,79 @@ class Display: pass + #Helper-Function, scrolls text in a specific line. + def display_scroll_text(self,line,text): + if (line==1): #clear the line on invocation: + self.cmd("\x1f\x24\x01%c\x18" % chr(line) ) + self.scroll_line1 = text + self.offset_line1=0 + if (line==2): #clear the line on invocation: + self.cmd("\x1f\x24\x01%c\x18" % chr(line) ) + self.scroll_line2 = text + self.offset_line2=0 + + + def display_handle_scroll(self,line,text,offset): + if (text): + l = len(text) + if (l<21): + if (offset == 0): + self.cmd("\x1f\x24\x01%c%s" % (chr(line),text[offset:(20+offset)])) + offset=1 + else: + self.cmd("\x1f\x24\x01%c%s" % (chr(line),text[offset:(20+offset)])) + missing_chars=20+offset-l + if (missing_chars>0): + self.cmd(text[:missing_chars]) + offset=((offset+1)%l) + else: + offset=0 #reset offset + return offset + + + def run(self): + print "Starting Display thread" + self.screensaver.start() + while(self.runme): + print("display thread loop\n") + self.mutex_get() + print("display got mutex and handles scroll\n") + self.offset_line1 = self.display_handle_scroll(1,self.scroll_line1,self.offset_line1) + self.offset_line2 = self.display_handle_scroll(2,self.scroll_line2,self.offset_line2) + self.mutex_release() + time.sleep(.5) + print "Exiting Display thread" + + def terminate(self): + self.runme = False + + + + #Front-End Funtion to display a Screen + # with heading + def display_screen(self,title,message): + self.mutex_get() + + self.offset_line1=0 + self.offset_line2=0 + self.screensaver.idle_reset(); + self.cmd_brightness(5) + + if (len(title)<21): + self.scroll_line1=None + self.cmd("\x1f\x24\x01%c\x18%s" % (chr(1),'\xdb'*20) ) + if (len(title)<20): + pos=1+(20-len(title))/2 + else: + pos=1 + self.cmd("\x1f\x24%c%c%s" % (chr(pos),chr(1),title) ) + else: + self.display_scroll_text(1,title) + + self.display_scroll_text(2,message) + self.mutex_release() + + def cmd_reset(self): @@ -148,6 +227,7 @@ import time class Screensaver (threading.Thread): def __init__(self,display): + threading.Thread.__init__(self) self.display=display self.runme=True self.idlecounter=0 @@ -187,7 +267,6 @@ class Screensaver (threading.Thread): return if (self.idlecounter==self.timeout_message): - print("WHAAAAGHAA") self.display.mutex_get() self.display.cmd_time_set() self.display.mutex_release() diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index c9ce940..1133c16 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -95,40 +95,6 @@ def display_cmd_dim(x): return -def display_thread(x): - global scroll_line1,scroll_line2 - global offset_line1,offset_line2 - global screensaver - global idlemessage - global lock - - offset_line1=0 - offset_line2=0 - while(True): - lock.acquire() - - offset_line1 = display_handle_scroll(1,scroll_line1,offset_line1) - offset_line2 = display_handle_scroll(2,scroll_line2,offset_line2) - - # if (screensaver <= SCREENSAVER_OFF): -# screensaver=screensaver+1 - - - if (screensaver == SCREENSAVER_TIMEOUT): - now = time.localtime() - send_display("\x0c\x1F\x54%c%c\x1f\x03" % (chr(now.tm_hour),chr(now.tm_min))); - if (scroll_line2): - scroll_line1=scroll_line2 - else: - scroll_line1=idlemessage - scroll_line2=None - offset_line1=0 - offset_line2=0 - - lock.release() - time.sleep(.5) - - def send_display(s): global myDisplay # myDisplay.write(s,False) @@ -549,14 +515,13 @@ def main(): global myDisplay myDisplay = Display("/dev/ttyUSB0") + myDisplay.start() myDisplay.cmd_reset() - myDisplay.write("Hello world!\n") - time.sleep(10) + myDisplay.display_screen("Nachricht","Hallo Welt! Dies ist eine sehr lange NAchricht!") + time.sleep(100) myDisplay.cmd_cursor_show(False) start_new_thread(display_thread,(1,)) - #display_scroll_text(1,"Line1: Text, dumm scrollend!") - #display_scroll_text(4,"Line2: Und hier Text, auch dumm scrollend!") display_screen("HINWEIS","Herzlich willkommen bei der Freitagsrunde! *** ") while True: clear() From 65255fb53ad8fe502156e73d0be475f47f7b26fb Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Tue, 18 Oct 2011 23:59:18 +0200 Subject: [PATCH 4/7] the first time information is somehow displayed again --- client-barcode/freitagskasse.py | 81 ++------------------------------- 1 file changed, 3 insertions(+), 78 deletions(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index 1133c16..27abbb6 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -56,45 +56,6 @@ SCREENSAVER_OFF = 2* 10*60 lock = allocate_lock() -#Helper-Function, scrolls text in a specific line. -def display_scroll_text(line,text): - global scroll_line1,scroll_line2 - global offset_line1,offset_line2 - global lock - lock.acquire() - if (line==1): #clear the line on invocation: - send_display("\x1f\x24\x01%c\x18" % chr(line) ) - scroll_line1 = text - offset_line1=0 - if (line==2): #clear the line on invocation: - send_display("\x1f\x24\x01%c\x18" % chr(line) ) - scroll_line2 = text - offset_line2=0 - lock.release() - - -def display_handle_scroll(line,text,offset): - if (text): - l = len(text) - if (l<21): - if (offset == 0): - send_display("\x1f\x24\x01%c%s" % (chr(line),text[offset:(20+offset)])) - offset=1 - else: - send_display("\x1f\x24\x01%c%s" % (chr(line),text[offset:(20+offset)])) - missing_chars=20+offset-l - if (missing_chars>0): - send_display(text[:missing_chars]) - offset=((offset+1)%l) - else: - offset=0 #reset offset - return offset - - -def display_cmd_dim(x): - return - - def send_display(s): global myDisplay # myDisplay.write(s,False) @@ -102,46 +63,12 @@ def send_display(s): #Front-End Funtion to display a Screen # with heading def display_screen(title,message): - global scroll_line1,scroll_line2 - global offset_line1,offset_line2 - global screensaver - - offset_line1=0 - offset_line2=0 - screensaver=0 - display_cmd_dim(5) - - if (len(title)<21): - scroll_line1=None - send_display("\x1f\x24\x01%c\x18%s" % (chr(1),'\xdb'*20) ) - if (len(title)<20): - pos=1+(20-len(title))/2 - else: - pos=1 - send_display("\x1f\x24%c%c%s" % (chr(pos),chr(1),title) ) - else: - display_scroll_text(1,title) - - display_scroll_text(2,message) + myDisplay.display_screen(title,message) #Front-End function to send data to the display. def print_display(s): - global scroll_line1,scroll_line2 - global offset_line1,offset_line2 - global screensaver - global myDisplay - global lock - - lock.acquire() - screensaver=0 - offset_line1=0 - offset_line2=0 - scroll_line1=None - scroll_line2=None - display_cmd_dim(5) -# myDisplay.write(s,False) - lock.release() + myDisplay.write(s,False) def clear(): os.system('clear') @@ -517,10 +444,8 @@ def main(): myDisplay = Display("/dev/ttyUSB0") myDisplay.start() myDisplay.cmd_reset() - myDisplay.display_screen("Nachricht","Hallo Welt! Dies ist eine sehr lange NAchricht!") - time.sleep(100) + time.sleep(2) myDisplay.cmd_cursor_show(False) - start_new_thread(display_thread,(1,)) display_screen("HINWEIS","Herzlich willkommen bei der Freitagsrunde! *** ") while True: From dd49d650fbc6ad9c8b510412d6f7f2fe28afb7c3 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 19 Oct 2011 00:12:49 +0200 Subject: [PATCH 5/7] almost usable. threads are not all temrinating yet --- client-barcode/display.py | 30 ++++++++++------- client-barcode/freitagskasse.py | 58 +++++++++++++-------------------- 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index 1fabbcd..d9ac0a7 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -8,6 +8,7 @@ class Display(threading.Thread): threading.Thread.__init__(self) self.serialport=None self.runme=True + self.idlemessage=None self.portlock = allocate_lock() self.portname=portname self.brightness=5 @@ -32,13 +33,13 @@ class Display(threading.Thread): self.mutex_get() try: self.serialport = serial.Serial(self.portname,9600,timeout=2,rtscts=True, dsrdtr=True) - print ("Initializing display on port:\n %s\n" % self.serialport ) + #print ("Initializing display on port:\n %s\n" % self.serialport ) self.cmd_reset() self.mutex_release() except Exception as e: - print ("Exception opening serial port '%s' for display\n" % self.portname) - print ("Ignoring and trying to open it again later\n") - print (e) + #print ("Exception opening serial port '%s' for display\n" % self.portname) + #print ("Ignoring and trying to open it again later\n") + #print (e) self.serialport = None self.mutex_release() pass @@ -75,17 +76,17 @@ class Display(threading.Thread): def run(self): - print "Starting Display thread" + #print "Starting Display thread" self.screensaver.start() while(self.runme): - print("display thread loop\n") + #print("display thread loop\n") self.mutex_get() - print("display got mutex and handles scroll\n") + #print("display got mutex and handles scroll\n") self.offset_line1 = self.display_handle_scroll(1,self.scroll_line1,self.offset_line1) self.offset_line2 = self.display_handle_scroll(2,self.scroll_line2,self.offset_line2) self.mutex_release() time.sleep(.5) - print "Exiting Display thread" + #print "Exiting Display thread" def terminate(self): self.runme = False @@ -137,7 +138,7 @@ class Display(threading.Thread): def cmd_brightness(self,level): if (self.brightness==level): return - print("setting brightness to %i \n" %level) + #print("setting brightness to %i \n" %level) if (level==0): #turn off: self.cmd_display_on(False) self.brightness = 0 @@ -155,13 +156,13 @@ class Display(threading.Thread): if (on): if (not self.brightness==0): return - print("setting display to on: %s \n" % str(on)) + #print("setting display to on: %s \n" % str(on)) self.cmd_blink(0) self.brightness=5 else: if (self.brightness==0): return - print("setting display to on: %s \n" % str(on)) + #print("setting display to on: %s \n" % str(on)) self.cmd_blink(255) self.brightness=0 @@ -209,6 +210,11 @@ class Display(threading.Thread): else: self.open_port() + def setIdlemessage(self,text): + self.idlemessage=text + + def getIdlemessage(self): + return self.idlemessage def mutex_get(self): self.portlock.acquire() @@ -256,6 +262,7 @@ class Screensaver (threading.Thread): self.display.cmd_brightness(5) self.mutex.release() + def _main_loop(self): if (self.idlecounter < self.timeout_off): self.idlecounter+=1 @@ -269,6 +276,7 @@ class Screensaver (threading.Thread): if (self.idlecounter==self.timeout_message): self.display.mutex_get() self.display.cmd_time_set() + self.display.scroll_line1 = self.display.getIdlemessage() self.display.mutex_release() return diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index 27abbb6..80dc12d 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -42,7 +42,6 @@ display_fifo = None scroll_line1 = None scroll_line2 = None -idlemessage = None offset_line1 = 0 offset_line2 = 0 @@ -56,19 +55,6 @@ SCREENSAVER_OFF = 2* 10*60 lock = allocate_lock() -def send_display(s): - global myDisplay -# myDisplay.write(s,False) - -#Front-End Funtion to display a Screen -# with heading -def display_screen(title,message): - myDisplay.display_screen(title,message) - - -#Front-End function to send data to the display. -def print_display(s): - myDisplay.write(s,False) def clear(): os.system('clear') @@ -165,7 +151,7 @@ class Status: if self.logged_in(): print('Eingeloggt als: %s%s%s' % (COLOR_SOME, self.login_name, COLOR_RESET)) print() - print_display('\x0cHallo %-14s' % (self.login_name[:13]+"!") ) + myDisplay.write('\x0cHallo %-14s' % (self.login_name[:13]+"!") ) if self.transfers: initial_command, initial_balance = self.transfers[0] @@ -197,11 +183,11 @@ class Status: mylabel="Pfand "+command.commodity_label()[:9] if (mycmd==3): mylabel=("%-13s" % (command.commodity_label()[:13]))+"+P" - print_display('\x0b%-15s %4.2f' % (asciify(mylabel)[:15],abs(command.difference()))); - print_display('\x0b\nSUMME: {%02i} %8.2f' % ((i-1),initial_balance - self.balance)); + myDisplay.write('\x0b%-15s %4.2f' % (asciify(mylabel)[:15],abs(command.difference()))); + myDisplay.write('\x0b\nSUMME: {%02i} %8.2f' % ((i-1),initial_balance - self.balance)); else: - print_display('\x0b%-15s %4.2f' % (command.label()[:15],abs(command.difference()))); - print_display('\x0b\nSUMME: {%02i} %8.2f' % ((i-1),initial_balance - self.balance)); + myDisplay.write('\x0b%-15s %4.2f' % (command.label()[:15],abs(command.difference()))); + myDisplay.write('\x0b\nSUMME: {%02i} %8.2f' % ((i-1),initial_balance - self.balance)); if len(self.transfers) > 1: show_total(self.balance - initial_balance, plus='+') @@ -210,13 +196,13 @@ class Status: if self.balance < 0: warn_balance() - print_display('\x0b\nKonto: %5.2f!' % (self.balance) ) + myDisplay.write('\x0b\nKonto: %5.2f!' % (self.balance) ) print() print(COLOR_MUCH + 'Committen nicht vergessen.' + COLOR_RESET) else: print('Kontostand beträgt: %s%.2f Euro%s' % (COLOR_MUCH, self.balance, COLOR_RESET)) - display_screen("KONTOSTAND","%s: %.2f Euro" % (self.login_name,self.balance)) + myDisplay.display_screen("KONTOSTAND","%s: %.2f Euro" % (self.login_name,self.balance)) if self.balance < 0: print() warn_balance() @@ -224,7 +210,7 @@ class Status: print(COLOR_MUCH + 'Bitte einloggen.' + COLOR_RESET) print() print('Scanne dazu deine ID-Karte mit dem Barcode-Leser.') - display_screen("LOGIN","Bitte scanne Deinen login-Token! *** ") + myDisplay.display_screen("LOGIN","Bitte scanne Deinen login-Token! *** ") print() def logged_in(self): @@ -253,7 +239,7 @@ class Status: try: command.run(self.login_name) except urllib2.HTTPError as e: - print_display('\x0cFEHLER: Server Error%20s' % str(e)[:20]) + myDisplay.write('\x0cFEHLER: Server Error%20s' % str(e)[:20]) error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) break else: @@ -336,11 +322,11 @@ class Status: error_page(_PRODUCT_FIRST) return if prev.includes_deposit(): - print_display('\x0cFEHLER: schon Pfand %20s' % prev.item_name()[:20]) + myDisplay.write('\x0cFEHLER: schon Pfand %20s' % prev.item_name()[:20]) error_page('FEHLER: Pfand für Produkt "%s" bereits aktiviert' % prev.item_name()) return if prev.deposit_value() <= 0: - print_display('\x0cFEHLER: Pfandfrei! %20s' % prev.item_name()[:20]) + myDisplay.write('\x0cFEHLER: Pfandfrei! %20s' % prev.item_name()[:20]) error_page('FEHLER: Produkt "%s" hat kein Pfand' % prev.item_name()) return before = prev.difference() @@ -382,14 +368,13 @@ def print_prompt(): def handle(line, status): - global idlemessage if line == 'exit': clear() - print_display("\x0c") + myDisplay.write("\x0c") sys.exit(0) if status.logged_in(): - idlemessage=" Comitten nicht vergessen! ***" + myDisplay.setIdlemessage(" Comitten nicht vergessen! ***") if line in CODES: call = CODES[line] method = call[0] @@ -400,27 +385,27 @@ def handle(line, status): item = status.find(line) except urllib2.HTTPError as e: if e.code == 404: # URL not found == item not found with REST - print_display('\x0cERROR: %13sCode ist unbekannt' % ( line[:13])) + myDisplay.display_screen("FEHLER","Code ist unbekannt: '%s'" % ( line[:23])) error_page('FEHLER: Aktion oder Ware "%s" nicht bekannt' % line) else: - print_display('\x0cERROR: Server Error%20s' % str(e)[:20]) + myDisplay.display_screen("Server error",'%20s' % str(e)[:20]) error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) else: status.buy(item) else: - idlemessage="Mir ist langweilig!" + myDisplay.setIdlemessage("Mir ist langweilig!") try: status.login(line) except urllib2.HTTPError as e: if e.code == 404: # URL not found == user unknown - display_screen("FEHLER","Nutzer ist unbekannt: '%s' *** " % line) + myDisplay.display_screen("FEHLER","Nutzer ist unbekannt: '%s' *** " % line) error_page('FEHLER: Benutzer "%s" nicht bekannt' % line, hint_message='Ist in der WebApp unter "Einstellungen" ' \ 'für Ihren Account Plugin "BarcodePlugin" ' \ 'als erlaubt markiert?') else: - print_display('\x0cFEHLER: Server Error%20s' % str(e)[:20]) + myDisplay.display_screen("FEHLER",'Server Error %20s' % str(e)[:20]) error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) except urllib2.URLError as e: error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) @@ -447,14 +432,15 @@ def main(): time.sleep(2) myDisplay.cmd_cursor_show(False) - display_screen("HINWEIS","Herzlich willkommen bei der Freitagsrunde! *** ") + myDisplay.display_screen("HINWEIS","Herzlich willkommen bei der Freitagsrunde! *** ") + time.sleep(5) while True: clear() status.dump() print_prompt() line = read_line(sys.stdin, timeout=3*60.0, timeout_func=status.logout) if line: - print_display('\x0cBarcode:\n%20s' % line[:20]) + myDisplay.write('\x0cBarcode:\n%20s' % line[:20]) handle(line, status) @@ -463,6 +449,6 @@ if __name__ == '__main__': main() except KeyboardInterrupt: pass - print_display("\x1b\x40Goodbye!") + myDisplay.write("\x1b\x40Goodbye!") myDisplay.terminate() From 4af75944909b85c834c17910af409c53df0788b5 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 19 Oct 2011 00:22:14 +0200 Subject: [PATCH 6/7] gnah.. i don't know yet if I hate or like that language --- client-barcode/display.py | 8 +++----- client-barcode/freitagskasse.py | 7 ++++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index d9ac0a7..b220bf6 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -21,7 +21,6 @@ class Display(threading.Thread): def __del__(self): if (not self.screensaver == None): - self.screensaver.terminate() self.screensaver = None if (not self.serialport == None): @@ -79,17 +78,15 @@ class Display(threading.Thread): #print "Starting Display thread" self.screensaver.start() while(self.runme): - #print("display thread loop\n") + print("display thread loop\n") self.mutex_get() #print("display got mutex and handles scroll\n") self.offset_line1 = self.display_handle_scroll(1,self.scroll_line1,self.offset_line1) self.offset_line2 = self.display_handle_scroll(2,self.scroll_line2,self.offset_line2) self.mutex_release() time.sleep(.5) - #print "Exiting Display thread" + print "Exiting Display thread" - def terminate(self): - self.runme = False @@ -223,6 +220,7 @@ class Display(threading.Thread): self.portlock.release() def terminate(self): + self.runme=False if (not self.screensaver == None): self.screensaver.terminate() self.screensaver = None diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index 80dc12d..b71bd47 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -239,7 +239,7 @@ class Status: try: command.run(self.login_name) except urllib2.HTTPError as e: - myDisplay.write('\x0cFEHLER: Server Error%20s' % str(e)[:20]) + myDisplay.display_screen("Server error",'Server Error: %s' % str(e)) error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) break else: @@ -371,6 +371,7 @@ def handle(line, status): if line == 'exit': clear() myDisplay.write("\x0c") + myDisplay.terminate() sys.exit(0) if status.logged_in(): @@ -448,7 +449,7 @@ if __name__ == '__main__': try: main() except KeyboardInterrupt: - pass - myDisplay.write("\x1b\x40Goodbye!") myDisplay.terminate() + myDisplay.write("\x1b\x40Goodbye!") + pass From 67ebf64ffe4c7618a7901717d91bea455d494b3c Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 19 Oct 2011 00:27:02 +0200 Subject: [PATCH 7/7] finally usuable(?) again! --- client-barcode/display.py | 14 ++++++++------ client-barcode/freitagskasse.py | 1 - 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client-barcode/display.py b/client-barcode/display.py index b220bf6..42422d7 100644 --- a/client-barcode/display.py +++ b/client-barcode/display.py @@ -78,7 +78,7 @@ class Display(threading.Thread): #print "Starting Display thread" self.screensaver.start() while(self.runme): - print("display thread loop\n") + #print("display thread loop\n") self.mutex_get() #print("display got mutex and handles scroll\n") self.offset_line1 = self.display_handle_scroll(1,self.scroll_line1,self.offset_line1) @@ -203,6 +203,8 @@ class Display(threading.Thread): if (not self.serialport == None): if (idle_reset): self.screensaver.idle_reset(); + self.scroll_line1=None + self.scroll_line2=None self.serialport.write(text) else: self.open_port() @@ -235,20 +237,20 @@ class Screensaver (threading.Thread): self.display=display self.runme=True self.idlecounter=0 - self.timeout_dim=10 - self.timeout_message=20 - self.timeout_off=32 + self.timeout_dim=30 + self.timeout_message=60 + self.timeout_off=300 self.mutex = allocate_lock() threading.Thread.__init__(self) def run(self): - print "Starting Screensaver thread" + #print "Starting Screensaver thread" while(self.runme): self.mutex.acquire() self._main_loop() self.mutex.release() time.sleep(.5) - print "Exiting Screensaver thread" + #print "Exiting Screensaver thread" def terminate(self): self.runme = False diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index b71bd47..09c7815 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -430,7 +430,6 @@ def main(): myDisplay = Display("/dev/ttyUSB0") myDisplay.start() myDisplay.cmd_reset() - time.sleep(2) myDisplay.cmd_cursor_show(False) myDisplay.display_screen("HINWEIS","Herzlich willkommen bei der Freitagsrunde! *** ")