def main(): oled.init() #initialze SEEED OLED display oled.setNormalDisplay() #Set display to normal mode (i.e non-inverse mode) oled.setHorizontalMode() oled.drawImage(Image.open('friendllyelec.png').convert('1')) time.sleep(1) signal.signal(signal.SIGUSR1, receive_signal) signal.signal(signal.SIGUSR2, receive_signal) signal.signal(signal.SIGALRM, receive_signal) currentView = VnstatView() while True: try: try: event = eventQueue.get(True, screenUpdateTime) currentView = currentView.processEvent(event) except Queue.Empty: pass # Draw a black filled box to clear the image draw.rectangle((0, 0, width, height), outline=0, fill=0) currentView.render(draw) oled.drawImage(image) except KeyboardInterrupt: break except IOError as e: print("Error:", e) # Cleanup before exit oled.clearDisplay()
def show_date(self, g_vars): ''' Date page - taken from original bakebit script & modified to add TZ ''' g_vars['drawing_in_progress'] = True # Clear display prior to painting new item self.display_obj.clear_display(g_vars) text = time.strftime("%A") g_vars['draw'].text((1, 0), text, font=FONT12, fill=255) text = time.strftime("%e %b %Y") g_vars['draw'].text((1, 13), text, font=FONT12, fill=255) text = time.strftime("%X") g_vars['draw'].text((1, 26), text, font=FONTB14, fill=255) text = time.strftime("%Z") g_vars['draw'].text((1, 41), "TZ: " + text, font=FONT12, fill=255) # Back button self.nav_button_obj.back() oled.drawImage(g_vars['image']) g_vars['display_state'] = 'page' g_vars['drawing_in_progress'] = False
def telusSlogan(): """Prints the Telus slogan""" draw.text((27, 1), "TELUS", font=font24b, fill=255) draw.text((23, 31), "The Future", font=font14, fill=255) draw.text((20, 45), "is Friendly", font=font14, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0)
def display(self): text = "Shut down?" draw.text((21, 19), text, font=font14b, fill=255) text = "yes" draw.text((4, 51), text, font=font10b, fill=255) text = "no" draw.text((111, 51), text, font=font10b, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0)
def display(self): self._update_data() text = "IP: {0}".format(self.ip_addr) draw.text((1, 1), text, font=font10b, fill=255) text = "Time: {0}".format(self.time) draw.text((1, 13), text, font=font10b, fill=255) text = "ip" draw.text((4, 51), text, font=font10b, fill=255) text = "test" draw.text((51, 51), text, font=font10b, fill=255) text = "sd" draw.text((111, 51), text, font=font10b, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0)
def reboot(self, g_vars): self.simple_table_obj.display_dialog_msg(g_vars, 'Rebooting...', back_button_req=0) time.sleep(1) oled.drawImage(g_vars['reboot_image']) g_vars['screen_cleared'] = True os.system('systemctl reboot') g_vars['shutdown_in_progress'] = True return
def display(self): if self.state == 0: # ask user if they want to begin test text = "Begin test?" draw.text((1, 21), text, font=font14b, fill=255) text = "yes" draw.text((4, 51), text, font=font10b, fill=255) text = "no" draw.text((111, 51), text, font=font10b, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0) elif self.state == 1: # testing text = "down: {0}".format(self.down) draw.text((1, 1), text, font=font10b, fill=255) text = "up: {0}".format(self.up) draw.text((1, 13), text, font=font10b, fill=255) text = "jitter: {0}".format(self.jitter) draw.text((1, 25), text, font=font10b, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0) elif self.state == 2: # test either stopped or finished text = "down: {0}".format(self.down) draw.text((1, 1), text, font=font10b, fill=255) text = "up: {0}".format(self.up) draw.text((1, 13), text, font=font10b, fill=255) text = "jitter: {0}".format(self.jitter) draw.text((1, 25), text, font=font10b, fill=255) text = "ip" draw.text((4, 51), text, font=font10b, fill=255) text = "test" draw.text((51, 51), text, font=font10b, fill=255) text = "sd" draw.text((111, 51), text, font=font10b, fill=255) oled.drawImage(image) draw.rectangle((0, 0, width, height), outline=0, fill=0)
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock global pageSleepCountdown lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return #if the countdown is zero we should be sleeping (blank the display to reduce screenburn) if pageSleepCountdown == 1: oled.clearDisplay() pageSleepCountdown = pageSleepCountdown - 1 return if pageSleepCountdown == 0: return pageSleepCountdown = pageSleepCountdown - 1 lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0,0,width,height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth=4 dotPadding=2 dotX=width-dotWidth-1 dotTop=(height-pageCount*dotWidth-(pageCount-1)*dotPadding)/2 for i in range(pageCount): if i==page_index: draw.rectangle((dotX, dotTop, dotX+dotWidth, dotTop+dotWidth), outline=255, fill=255) else: draw.rectangle((dotX, dotTop, dotX+dotWidth, dotTop+dotWidth), outline=255, fill=0) dotTop=dotTop+dotWidth+dotPadding if page_index==0: text = time.strftime("%a %e %b %Y") draw.text((2,2),text,font=font14,fill=255) year = time.strftime('%Y') now = time.time() start_date = time.mktime(time.strptime(year, '%Y')) end_date = time.mktime(time.strptime(str(int(year)+1), '%Y')) percent = int((now-start_date)/(end_date-start_date)*1000)/10.0 bar = int(round(percent/10, 0)) text = bar * u'\u2593' + (10 - bar) * u'\u2591' + str(percent) + '%' draw.text((2,20),text, font=font14, fill=255) text = time.strftime("%X") draw.text((8,38),text, font=fontb24, fill=255) elif page_index==1: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height-padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 try: IPAddress = get_ip_address('eth0') except: IPAddress = get_ip() cmd = "cat /proc/loadavg| awk '{printf \"CPU Load: %.2f\", $(1)}'" CPU = subprocess.check_output(cmd, shell = True ).decode("utf-8", errors="ignore") cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.1f%%\", int($3/1024),int($2/1024),$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell = True ).decode("utf-8", errors="ignore") cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell = True ).decode("utf-8", errors="ignore") tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()); if tempI>1000: tempI = tempI/1000 tempStr = u"CPU TEMP: %s\u00b0C" % int(tempI) draw.text((x+2, top), "IP: " + str(IPAddress), font=smartFont, fill=255) draw.text((x+2, top+12), str(CPU), font=smartFont, fill=255) draw.text((x+2, top+24), str(MemUsage), font=smartFont, fill=255) draw.text((x+2, top+36), str(Disk), font=smartFont, fill=255) draw.text((x+2, top+48), tempStr, font=smartFont, fill=255) elif page_index==3: #shutdown -- no draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2,20,width-4,20+16), outline=0, fill=0) draw.text((4, 22), 'Yes', font=font11, fill=255) draw.rectangle((2,38,width-4,38+16), outline=0, fill=255) draw.text((4, 40), 'No', font=font11, fill=0) elif page_index==4: #shutdown -- yes draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2,20,width-4,20+16), outline=0, fill=255) draw.text((4, 22), 'Yes', font=font11, fill=0) draw.rectangle((2,38,width-4,38+16), outline=0, fill=0) draw.text((4, 40), 'No', font=font11, fill=255) elif page_index==5: draw.text((2, 2), 'Shutting down', font=fontb14, fill=255) draw.text((2, 20), 'Please wait', font=font11, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def _shut_down(self): """Actual shut down page""" draw.rectangle((0, 0, width, height), outline=0, fill=0) oled.drawImage(image) os.system('sudo poweroff')
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock global pageSleepCountdown lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return #if the countdown is zero we should be sleeping (blank the display to reduce screenburn) if pageSleepCountdown == 0: oled.clearDisplay() return pageSleepCountdown = pageSleepCountdown - 1 lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0, 0, width, height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth = 4 dotPadding = 2 dotX = width - dotWidth - 1 dotTop = (height - pageCount * dotWidth - (pageCount - 1) * dotPadding) / 2 for i in range(pageCount): if i == page_index: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=255) else: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=0) dotTop = dotTop + dotWidth + dotPadding # Draw bottom of screen button indicators bottomLine = 55 # Define the starting vertical pixel if showButtonIndicator: draw.text((0, bottomLine), "Home", font=smartFont, fill=255) draw.text((50, bottomLine), "Next", font=smartFont, fill=255) draw.text((93, bottomLine), "Select", font=smartFont, fill=255) if page_index == 0: # Default page, shows WLANpi version, hostname, and eth0 IP address ver = "grep \"WLAN Pi v\" /var/www/html/index.html | sed \"s/<[^>]\+>//g\"" # Pull the version from a file by building the command VER = subprocess.check_output(ver, shell=True) # and saving the result draw.text((0, 1), str(VER), font=smartFont, fill=255) # and then draw it on screen HOSTNAME = subprocess.check_output( 'hostname', shell=True) # Get the current device hostname draw.text((0, 11), str(HOSTNAME), font=font11, fill=255) # and then draw it on screen draw.text((95, 20), "eth0", font=smartFont, fill=255) ip_eth0 = "ip addr show eth0 | grep -Po \'inet \K[\d.]+\'" # Pull the IP address for eth0 by building the command IP_ETH0 = subprocess.check_output(ip_eth0, shell=True) # and saving the result draw.text((0, 29), str(IP_ETH0), font=font14, fill=255) # and then draw it on screen elif page_index == 1: # Displays IP for usb0, wlan1, and CPU temp draw.text((95, 0), "usb0", font=smartFont, fill=255) # usb0 interface marker ip_usb0 = "ip addr show usb0 | grep -Po \'inet \K[\d.]+\'" # Pull the IP address for usb0 by building the command IP_USB0 = subprocess.check_output(ip_usb0, shell=True) # and saving the result draw.text((0, 9), str(IP_USB0), font=font14, fill=255) # and then draw it on screen # This check does not work consistently for wlan1. The APIPA address takes a long time to appear, and until it does this check will # pass as the path exists. The address has not always populated, and so the subprocess.check_output function fails # Currently unsure of a fix for this. #if os.path.exists('/sys/class/net/wlan1'): # If the directory doesn't exist do not display wlan1 # draw.text((95,23),"wlan1",font=smartFont,fill=255) # wlan1 interface marker # ip_wlan1 = "ip addr show wlan1 | grep -Po \'inet \K[\d.]+\'" # Pull the IP address for wlan1 by building the command # IP_WLAN1 = subprocess.check_output(ip_wlan1, shell = True ) # and saving the result # draw.text((0,31),str(IP_WLAN1),font=font14,fill=255) # and then draw it on screen # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height - padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()) if tempI > 1000: tempI = tempI / 1000 tempStr = "CPU TEMP: %sC" % str(tempI) draw.text((x, 40), tempStr, font=font11, fill=255) elif page_index == 2: #shutdown -- yes draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=255) draw.text((4, 22), 'B3 to confirm', font=font11, fill=0) #draw.rectangle((2,38,width-4,38+16), outline=0, fill=0) #draw.text((4, 40), 'No', font=font11, fill=255) elif page_index == 3: draw.text((2, 2), 'Shutting down', font=fontb14, fill=255) draw.text((2, 20), 'Please wait', font=font11, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def display_paged_table(self, g_vars, table_data, back_button_req=0): ''' This function takes several pages of information and displays on the display with appropriate pg up/pg down buttons table data is in format: data = { 'title' = 'page title', 'pages' = [ ['Page 1 line 1', Page 1 line 2, 'Page 1 line 3', 'Page 1 line 4'], ['Page 2 line 1', Page 2 line 2, 'Page 2 line 3', 'Page 2 line 4'], ['Page 3 line 1', Page 3 line 2, 'Page 3 line 3', 'Page 3 line 4'], ...etc. ] } ''' g_vars['drawing_in_progress'] = True g_vars['display_state'] = 'page' # Clear display prior to painting new item self.display_obj.clear_display(g_vars) y = 0 x = 0 font_offset = 0 font_size = 11 item_length_max = 20 table_display_max = 4 # write title title = table_data['title'] total_pages = len(table_data['pages']) if total_pages > 1: title += " ({}/{})".format(g_vars['current_scroll_selection'] + 1, total_pages) g_vars['draw'].text((x, y + font_offset), title.center(item_length_max, " "), font=SMART_FONT, fill=255) font_offset += font_size # Extract pages data table_pages = table_data['pages'] page_count = len(table_pages) # Display the page selected - correct over-shoot of page down if g_vars['current_scroll_selection'] == page_count: g_vars['current_scroll_selection'] -= 1 # Correct over-shoot of page up if g_vars['current_scroll_selection'] == -1: g_vars['current_scroll_selection'] = 0 page = table_pages[g_vars['current_scroll_selection']] # If the page has greater than table_display_max entries, slice it if len(page) > table_display_max: page = page[0:table_display_max] for item in page: if len(item) > item_length_max: item = item[0:item_length_max] g_vars['draw'].text((x, y + font_offset), item, font=SMART_FONT, fill=255) font_offset += font_size # if we're going need to scroll through pages, create buttons if (page_count > 1): # if (g_vars['current_scroll_selection'] < page_count) and (g_vars['current_scroll_selection'] < page_count-1): if g_vars['current_scroll_selection'] < page_count - 1: self.nav_button_obj.down(function="pgdown") if (g_vars['current_scroll_selection'] > 0) and ( g_vars['current_scroll_selection'] <= page_count - 1): self.nav_button_obj.down(function="pgup") # Back button if back_button_req: self.nav_button_obj.back(function="exit") oled.drawImage(g_vars['image']) g_vars['display_state'] = 'page' g_vars['drawing_in_progress'] = False return
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0, 0, width, height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth = 4 dotPadding = 2 dotX = width - dotWidth - 1 dotTop = (height - pageCount * dotWidth - (pageCount - 1) * dotPadding) / 2 for i in range(pageCount): if i == page_index: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=255) else: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=0) dotTop = dotTop + dotWidth + dotPadding if page_index == 0: ##ReDesigned by tianyuax text = time.strftime("%a %Y/%m/%d") draw.text((5, 2), text, font=font14, fill=255) text = time.strftime("%X") draw.text((6, 20), text, font=fontb24, fill=255) yn = time.strftime('%Y') t0 = time.mktime(time.strptime(yn, '%Y')) t1 = time.mktime(time.strptime(str(int(yn) + 1), '%Y')) tn = time.time() pt = int((tn - t0) / (t1 - t0) * 10000) / 100.00 text = str(pt) + "% passed.." draw.text((4, 48), text, font=font14, fill=255) elif page_index == 1: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height - padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 IPAddress = get_ip() cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'" CPU = subprocess.check_output(cmd, shell=True) cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell=True) cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell=True) tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()) if tempI > 1000: tempI = tempI / 1000 tempStr = "CPU TEMP: %sC" % str(tempI) draw.text((x, top + 5), "IP: " + str(IPAddress), font=smartFont, fill=255) draw.text((x, top + 5 + 12), str(CPU), font=smartFont, fill=255) draw.text((x, top + 5 + 24), str(MemUsage), font=smartFont, fill=255) draw.text((x, top + 5 + 36), str(Disk), font=smartFont, fill=255) draw.text((x, top + 5 + 48), tempStr, font=smartFont, fill=255) elif page_index == 3: #shutdown -- no draw.text((2, 2), 'Love me?', font=fontb24, fill=255) draw.rectangle((2, 30, width - 4, 30 + 16), outline=0, fill=0) draw.text((4, 32), 'Later', font=font12, fill=255) draw.rectangle((2, 47, width - 4, 47 + 16), outline=0, fill=255) draw.text((4, 49), 'Now', font=font12, fill=0) elif page_index == 4: #shutdown -- yes draw.text((2, 2), 'Love me?', font=fontb24, fill=255) draw.rectangle((2, 30, width - 4, 30 + 16), outline=0, fill=255) draw.text((4, 32), 'Later', font=font12, fill=0) draw.rectangle((2, 47, width - 4, 47 + 16), outline=0, fill=0) draw.text((4, 49), 'Now', font=font12, fill=255) elif page_index == 5: draw.text((2, 2), 'Reboot...', font=fontb14, fill=255) draw.text((2, 20), 'Please wait', font=font12, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0, 0, width, height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth = 4 dotPadding = 2 dotX = width - dotWidth - 1 dotTop = (height - pageCount * dotWidth - (pageCount - 1) * dotPadding) / 2 for i in range(pageCount): if i == page_index: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=255) else: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=0) dotTop = dotTop + dotWidth + dotPadding if page_index == PageIndex.TIME: padding = 0 top = padding text = time.strftime("%A") draw.text((2, top), text, font=font14, fill=255) text = time.strftime("%e %b %Y") draw.text((2, top + 16), text, font=font14, fill=255) text = time.strftime("%X") draw.text((2, top + 38), text, font=fontb24, fill=255) elif page_index == PageIndex.STATS: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 1 top = padding bottom = height - padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 LANIP = get_lan_ip() WANIP = get_wan_ip() CPU = get_cpu_usage() cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell=True) cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell=True) tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()) if tempI > 1000: tempI = tempI / 1000 tempStr = "CPU TEMP: %sC" % str(tempI) cpuStr = "CPU: {0:.2f} % {1}C".format(CPU, tempI) draw.text((x, top), "LAN: {0}".format(LANIP), font=smartFont, fill=255) draw.text((x, top + 12), "WAN: {0}".format(WANIP), font=smartFont, fill=255) draw.text((x, top + 24), cpuStr, font=smartFont, fill=255) draw.text((x, top + 36), str(MemUsage), font=smartFont, fill=255) draw.text((x, top + 48), str(Disk), font=smartFont, fill=255) elif page_index == PageIndex.MENU: draw.text((4, 22), 'Shutdown?', font=fontb14, fill=255) elif page_index == PageIndex.SHUTDOWN_NO: draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=0) draw.text((4, 22), 'Yes', font=font11, fill=255) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=255) draw.text((4, 40), 'No', font=font11, fill=0) elif page_index == PageIndex.SHUTDOWN_YES: draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=255) draw.text((4, 22), 'Yes', font=font11, fill=0) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=0) draw.text((4, 40), 'No', font=font11, fill=255) elif page_index == PageIndex.SHUTTING_DOWN: draw.text((2, 2), 'Shutting down', font=fontb14, fill=255) draw.text((2, 20), 'Please wait', font=font11, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock global pageSleepCountdown global disableTimeSeconds global disableCounter global status global enabledMarkerShownSeconds global enabledCounter lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return if disableCounter > 0: disableCounter = disableCounter - 1 #if the countdown is zero we should be sleeping (blank the display to reduce screenburn) if pageSleepCountdown == 1: oled.clearDisplay() pageSleepCountdown = pageSleepCountdown - 1 return if pageSleepCountdown == 0: return pageSleepCountdown = pageSleepCountdown - 1 lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0, 0, width, height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth = 4 dotPadding = 2 dotX = width - dotWidth - 1 dotTop = (height - pageCount * dotWidth - (pageCount - 1) * dotPadding) / 2 for i in range(pageCount): if i == page_index: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=255) else: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=0) dotTop = dotTop + dotWidth + dotPadding if page_index == 0: text = time.strftime("%A") draw.text((2, 2), text, font=font14, fill=255) text = time.strftime("%e %b %Y") draw.text((2, 18), text, font=font14, fill=255) text = time.strftime("%X") draw.text((2, 40), text, font=fontb24, fill=255) elif page_index == 1: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height - padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 try: IPAddress = get_ip_address('eth0') except: IPAddress = get_ip() cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'" CPU = subprocess.check_output(cmd, shell=True) cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell=True) cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell=True) tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()) if tempI > 1000: tempI = tempI / 1000 tempStr = "CPU TEMP: %sC" % str(tempI) cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .dns_queries_today" Queries = subprocess.check_output(cmd, shell=True).strip() cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .ads_blocked_today" AdsToday = subprocess.check_output(cmd, shell=True).strip() cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .ads_percentage_today" AdsPercentage = subprocess.check_output(cmd, shell=True).strip() cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .clients_ever_seen" ClientsEver = subprocess.check_output(cmd, shell=True).strip() cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .unique_clients" ClientsUnique = subprocess.check_output(cmd, shell=True).strip() draw.text((x, top + 2), "IP: " + str(IPAddress), font=smartFont, fill=255) draw.text((x, top + 2 + 12), "Queries: " + str(Queries), font=smartFont, fill=255) draw.text((x, top + 2 + 24), "Blocked: " + str(AdsToday), font=smartFont, fill=255) draw.text((x, top + 2 + 36), "Percent: " + str(AdsPercentage), font=smartFont, fill=255) draw.text((x, top + 2 + 48), "Clients: " + str(ClientsUnique), font=smartFont, fill=255) elif page_index == 3: #Disable Pi-Hole for some senconds? -- no draw.text( (2, 2), 'Disable ' + str(int(float(disableTimeSeconds) / 60)) + 'min?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=0) draw.text((4, 22), 'Yes', font=font11, fill=255) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=255) draw.text((4, 40), 'No', font=font11, fill=0) elif page_index == 4: #Disable Pi-Hole for some senconds? -- yes draw.text( (2, 2), 'Disable ' + str(int(float(disableTimeSeconds) / 60)) + 'min?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=255) draw.text((4, 22), 'Yes', font=font11, fill=0) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=0) draw.text((4, 40), 'No', font=font11, fill=255) elif page_index == 5: cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .status" status = subprocess.check_output(cmd, shell=True).strip() if str(status) == "\"disabled\"": enabledCounter = 0 draw.text((2, 2), 'Disabled', font=fontb14, fill=255) if disableCounter > 0: draw.text((2, 20), str(datetime.timedelta(seconds=disableCounter)), font=fontb24, fill=255) draw.rectangle( (2, 47, int( float(width - 4) * (float(disableCounter) / float(disableTimeSeconds))), 47 + 15), outline=0, fill=255) elif str(status) == "\"enabled\"": disableCounter = 0 draw.text((2, 2), 'Enabled', font=fontb14, fill=255) if enabledCounter < enabledMarkerShownSeconds: enabledCounter = enabledCounter + 1 else: enabledCounter = 0 update_page_index(1) else: draw.text((2, 2), 'Disabled', font=fontb14, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def receive_signal(signum, stack): global pageIndex global pageSleepCountdown global pageSleep lock.acquire() page_index = pageIndex lock.release() if page_index==5: return if signum == signal.SIGUSR1: print ('K1 pressed') if is_showing_power_msgbox(): # If Power Menu Open if page_index==3: # Shutdown - no update_page_index(4) else: update_page_index(3) draw_page() else: if page_index==0 and pageSleepCountdown>0: # Home update_page_index(6) else: pageIndex=0 draw_page() if signum == signal.SIGUSR2: print ('K2 pressed') if is_showing_power_msgbox(): # If Power Menu Open if page_index==4: # Shutdown update_page_index(5) else: update_page_index(0) draw_page() elif is_showing_wifi_msgbox(): # If Wifi Menu Open if page_index==6: # Change Wifi to Wifi Client update_page_index(9) elif page_index==7: # Change Wifi to Hotspot update_page_index(10) elif page_index==8: # Change Wifi NanoGate update_page_index(11) else: update_page_index(0) draw_page() elif page_index==1 and pageSleepCountdown>0: update_page_index(12) draw_page() elif page_index==12 and pageSleepCountdown>0: image1 = Image.open('shelly_guide_oled.png').convert('1') oled.drawImage(image1) time.sleep(5) else: update_page_index(1) draw_page() if signum == signal.SIGALRM: print ('K3 pressed') if is_showing_power_msgbox(): # If Power Menu Open update_page_index(0) draw_page() elif is_showing_wifi_msgbox(): # If Wifi Menu Open if page_index==6: # Wifi Client update_page_index(7) elif page_index==7: # Hotspot update_page_index(8) elif page_index==8: # NanoGate update_page_index(6) draw_page() elif pageSleepCountdown>0: update_page_index(3) draw_page() else: update_page_index(0) draw_page() pageSleepCountdown = pageSleep #user pressed a button, reset the sleep counter
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0, 0, width, height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth = 4 dotPadding = 2 dotX = width - dotWidth - 1 dotTop = (height - pageCount * dotWidth - (pageCount - 1) * dotPadding) / 2 for i in range(pageCount): if i == page_index: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=255) else: draw.rectangle( (dotX, dotTop, dotX + dotWidth, dotTop + dotWidth), outline=255, fill=0) dotTop = dotTop + dotWidth + dotPadding if page_index == 0: text = time.strftime("%A") draw.text((2, 2), text, font=font14, fill=255) text = time.strftime("%e %b %Y") draw.text((2, 18), text, font=font14, fill=255) text = time.strftime("%X") draw.text((2, 40), text, font=fontb24, fill=255) elif page_index == 1: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height - padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 cmd = "hostname -I | cut -d\' \' -f1" IP = subprocess.check_output(cmd, shell=True) cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'" CPU = subprocess.check_output(cmd, shell=True) cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell=True) cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell=True) tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()) if tempI > 1000: tempI = tempI / 1000 tempStr = "CPU TEMP: %sC" % str(tempI) draw.text((x, top + 5), "IP: " + str(IP), font=smartFont, fill=255) draw.text((x, top + 5 + 12), str(CPU), font=smartFont, fill=255) draw.text((x, top + 5 + 24), str(MemUsage), font=smartFont, fill=255) draw.text((x, top + 5 + 36), str(Disk), font=smartFont, fill=255) draw.text((x, top + 5 + 48), tempStr, font=smartFont, fill=255) elif page_index == 3: #shutdown -- no draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=0) draw.text((4, 22), 'Yes', font=font11, fill=255) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=255) draw.text((4, 40), 'No', font=font11, fill=0) elif page_index == 4: #shutdown -- yes draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2, 20, width - 4, 20 + 16), outline=0, fill=255) draw.text((4, 22), 'Yes', font=font11, fill=0) draw.rectangle((2, 38, width - 4, 38 + 16), outline=0, fill=0) draw.text((4, 40), 'No', font=font11, fill=255) elif page_index == 5: draw.text((2, 2), 'Shutting down', font=fontb14, fill=255) draw.text((2, 20), 'Please wait', font=font11, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def display_simple_table(self, g_vars, item_list, back_button_req=0, title='', font="small"): ''' This function takes a list and paints each entry as a line on a page. It also displays appropriate up/down scroll buttons if the entries passed exceed a page length (one line at a time) ''' g_vars['drawing_in_progress'] = True g_vars['display_state'] = 'page' # Clear display prior to painting new item self.display_obj.clear_display(g_vars) y = 0 x = 0 font_offset = 0 if font == "small": font_type = SMART_FONT font_size = 11 item_length_max = 20 table_display_max = 5 elif font == "medium": font_type = FONT11 font_size = 11 item_length_max = 17 table_display_max = 4 # write title if present if title != '': g_vars['draw'].text((x, y + font_offset), title.center(item_length_max, " "), font=font_type, fill=255) font_offset += font_size table_display_max -= 1 previous_table_list_length = g_vars['table_list_length'] g_vars['table_list_length'] = len(item_list) # if table length changes, reset current scroll selection # e.g. when showing lldp table info and eth cable # pulled so list size changes if g_vars['table_list_length'] != previous_table_list_length: g_vars['current_scroll_selection'] = 0 # if we're going to scroll of the end of the list, adjust pointer if g_vars['current_scroll_selection'] + table_display_max > g_vars[ 'table_list_length']: g_vars['current_scroll_selection'] -= 1 # modify list to display if scrolling required if g_vars['table_list_length'] > table_display_max: table_bottom_entry = g_vars[ 'current_scroll_selection'] + table_display_max item_list = item_list[ g_vars['current_scroll_selection']:table_bottom_entry] # show down if not at end of list in display window if table_bottom_entry < g_vars['table_list_length']: self.nav_button_obj.down() # show an up button if not at start of list if g_vars['current_scroll_selection'] > 0: self.nav_button_obj.next(function="up") for item in item_list: if len(item) > item_length_max: item = item[0:item_length_max] self.draw.text((x, y + font_offset), item, font=font_type, fill=255) font_offset += font_size # Back button if back_button_req: self.nav_button_obj.back(function="exit") oled.drawImage(g_vars['image']) g_vars['display_state'] = 'page' g_vars['drawing_in_progress'] = False return
def draw_page(): global drawing global image global draw global oled global font global font14 global smartFont global width global height global pageCount global pageIndex global showPageIndicator global width global height global lock global pageSleepCountdown global os lock.acquire() is_drawing = drawing page_index = pageIndex lock.release() if is_drawing: return #if the countdown is zero we should be sleeping (blank the display to reduce screenburn) if pageSleepCountdown == 1: oled.clearDisplay() pageSleepCountdown = pageSleepCountdown - 1 return if pageSleepCountdown == 0: return pageSleepCountdown = pageSleepCountdown - 1 lock.acquire() drawing = True lock.release() # Draw a black filled box to clear the image. draw.rectangle((0,0,width,height), outline=0, fill=0) # Draw current page indicator if showPageIndicator: dotWidth=4 dotPadding=2 dotX=width-dotWidth-1 dotTop=(height-pageCount*dotWidth-(pageCount-1)*dotPadding)/2 for i in range(pageCount): if i==page_index: draw.rectangle((dotX, dotTop, dotX+dotWidth, dotTop+dotWidth), outline=255, fill=255) else: draw.rectangle((dotX, dotTop, dotX+dotWidth, dotTop+dotWidth), outline=255, fill=0) dotTop=dotTop+dotWidth+dotPadding # Draw Home if page_index==0: text = time.strftime("%e %b %Y") draw.text((2,2),text,font=font14,fill=255) text = time.strftime("%X") draw.text((2,20),text,font=fontb24,fill=255) cmd = "wstat" wstat = subprocess.check_output(cmd, shell = True ) draw.text((2,48),str(wstat, encoding='utf-8', errors='ignore'),font=font14,fill=255) # Draw Settings elif page_index==1: # Draw some shapes. # First define some constants to allow easy resizing of shapes. padding = 2 top = padding bottom = height-padding # Move left to right keeping track of the current x position for drawing shapes. x = 0 cmd = "ip a | grep wlan0 | grep inet | awk '{print $2}' | rev | cut -c4- | rev" IPAddress = subprocess.check_output(cmd, shell = True ) cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'" CPU = subprocess.check_output(cmd, shell = True ) cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" MemUsage = subprocess.check_output(cmd, shell = True ) cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell = True ) tempI = int(open('/sys/class/thermal/thermal_zone0/temp').read()); if tempI>1000: tempI = tempI/1000 tempStr = "CPU TEMP: %sC" % str(tempI) draw.text((x, top+2), "IP: " + str(IPAddress, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) draw.text((x, top+2+12), str(CPU, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) draw.text((x, top+2+24), str(MemUsage, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) draw.text((x, top+2+36), str(Disk, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) draw.text((x, top+2+48), tempStr, font=smartFont, fill=255) # Draw Shutdown -- no elif page_index==3: draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2,20,width-4,20+16), outline=0, fill=0) draw.text((4, 22), 'Yes', font=font11, fill=255) draw.rectangle((2,38,width-4,38+16), outline=0, fill=255) draw.text((4, 40), 'No', font=font11, fill=0) # Draw Shutdown -- yes elif page_index==4: draw.text((2, 2), 'Shutdown?', font=fontb14, fill=255) draw.rectangle((2,20,width-4,20+16), outline=0, fill=255) draw.text((4, 22), 'Yes', font=font11, fill=0) draw.rectangle((2,38,width-4,38+16), outline=0, fill=0) draw.text((4, 40), 'No', font=font11, fill=255) # Draw Shutdown Message elif page_index==5: draw.text((2, 2), 'Shutting down', font=fontb14, fill=255) draw.text((2, 22), 'Please wait...', font=font11, fill=255) # Draw Change Wifi - Wifi Client elif page_index==6: draw.text((2, 2), 'Wifi Mode', font=fontb14, fill=255) draw.rectangle((2,18,width-4,18+16), outline=0, fill=255) draw.text((4, 20), 'Wifi Client', font=smartFont, fill=0) draw.rectangle((2,32,width-4,32+16), outline=0, fill=0) draw.text((4, 34), 'Hotspot', font=smartFont, fill=255) draw.rectangle((2,46,width-4,46+16), outline=0, fill=0) draw.text((4, 48), 'NanoGate', font=smartFont, fill=255) # Draw Chang Wifi - Hotspot elif page_index==7: draw.text((2, 2), 'Wifi Mode', font=fontb14, fill=255) draw.rectangle((2,18,width-4,18+16), outline=0, fill=0) draw.text((4, 20), 'Wifi Client', font=smartFont, fill=255) draw.rectangle((2,32,width-4,32+16), outline=0, fill=255) draw.text((4, 34), 'Hotspot', font=smartFont, fill=0) draw.rectangle((2,46,width-4,46+16), outline=0, fill=0) draw.text((4, 48), 'NanoGate', font=smartFont, fill=255) # Draw Chang Wifi - NanoGate elif page_index==8: draw.text((2, 2), 'Wifi Mode', font=fontb14, fill=255) draw.rectangle((2,18,width-4,18+16), outline=0, fill=0) draw.text((4, 20), 'Wifi Client', font=smartFont, fill=255) draw.rectangle((2,32,width-4,32+16), outline=0, fill=0) draw.text((4, 34), 'Hotspot', font=smartFont, fill=255) draw.rectangle((2,46,width-4,46+16), outline=0, fill=255) draw.text((4, 48), 'NanoGate', font=smartFont, fill=0) # Draw Change to Wifi Client elif page_index==9: draw.text((2, 2), 'Wifi Client', font=fontb14, fill=255) draw.text((2, 22), 'Please wait...', font=font11, fill=255) # Draw Change to Hotspot elif page_index==10: draw.text((2, 2), 'Hotspot', font=fontb14, fill=255) draw.text((2, 22), 'Please wait...', font=font11, fill=255) # Draw Change to NanoGate elif page_index==11: draw.text((2, 2), 'NanoGate', font=fontb14, fill=255) draw.text((2, 22), 'Please wait...', font=font11, fill=255) # Draw DHCP Leases elif page_index==12: draw.text((2, 2), 'Last 4 DHCP Leases', font=font11, fill=255) os.system('ldhcp') cmd = "sed -n 1p /tmp/dhcp.list" txt = subprocess.check_output(cmd, shell = True) draw.text((2, 16), str(txt, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) cmd = "sed -n 2p /tmp/dhcp.list" txt = subprocess.check_output(cmd, shell = True) draw.text((2, 28), str(txt, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) cmd = "sed -n 3p /tmp/dhcp.list" txt = subprocess.check_output(cmd, shell = True) draw.text((2, 40), str(txt, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) cmd = "sed -n 4p /tmp/dhcp.list" txt = subprocess.check_output(cmd, shell = True) draw.text((2, 52), str(txt, encoding='utf-8', errors='ignore'), font=smartFont, fill=255) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def draw_page(): global drawing global image global draw global oled global smartFont global width global height global scriptPath global scriptIndex global displayBeginIndex global width global height global lock global triggerExecution global scriptOutput global runningSubprocess global subprocessQueue global subprocessReadThread lock.acquire() is_drawing = drawing lock.release() if is_drawing: return lock.acquire() drawing = True scriptIndexDrawing = scriptIndex lock.release() draw.rectangle((0, 0, width, height), outline=0, fill=0) #clear img if (not os.path.isdir(scriptPath)): draw.text((0, 0), 'Script Path not Found!', font=smartFont, fill=255) draw.text((0, 12), scriptPath, font=smartFont, fill=255) else: scriptsInPath = os.listdir(scriptPath) if (scriptPath != scriptRootPath): scriptsInPath.insert(0, '..') filesCount = len(scriptsInPath) scriptsInPath.sort() #list and sort file scriptIndexDrawingPrev = scriptIndexDrawing if (filesCount == 0): scriptIndexDrawing = 0 elif (scriptIndexDrawing < 0): scriptIndexDrawing += filesCount elif (scriptIndexDrawing >= filesCount): scriptIndexDrawing -= filesCount if (scriptIndexDrawing != scriptIndexDrawingPrev ): #write value back if there is any change lock.acquire() scriptIndex = scriptIndexDrawing lock.release() displayIndex = scriptIndexDrawing + 1 if (filesCount == 0): displayIndex = 0 displayBeginIndex = 0 #for file in scriptsInPath: # print file if (scriptIndexDrawing < len(scriptsInPath)): #scriptsInPath may be empty fileSelected = scriptPath + scriptsInPath[scriptIndexDrawing] else: fileSelected = "" fileTypeString = 'Script: ' if os.path.isdir(fileSelected): fileTypeString = 'Folder: ' draw.text( (0, 0), fileTypeString + str(displayIndex) + ' of ' + str(filesCount), font=smartFont, fill=255) draw.line((0, 12, 127, 12), fill=255) if (filesCount > 0): #checkdisplayEntry if (scriptIndexDrawing < displayBeginIndex): displayBeginIndex = scriptIndexDrawing if (scriptIndexDrawing > displayBeginIndex + 2): displayBeginIndex = scriptIndexDrawing - 2 itemDisplaying = 3 if (filesCount < 3): itemDisplaying = filesCount displayBeginIndex = 0 try: for i in range( itemDisplaying): #displayEntry from displayBeginIndex fillColor = 255 index = displayBeginIndex + i if (scriptIndexDrawing == index): fillColor = 0 draw.rectangle( (0, 13 + 12 * i - 1, width, 13 + 12 * i + 12), outline=0, fill=255) if (runningSubprocess is not None): if (runningSubprocess.poll() == None): draw.rectangle((width - 10, 13 + 12 * i - 1 + 2, width - 2, 13 + 12 * i + 12 - 2), outline=0, fill=0) draw.text((1, 13 + 12 * i), scriptsInPath[index], font=smartFont, fill=fillColor) except: pass #something edit script alive may cause array out of bound error draw.line((0, 49, 127, 49), fill=255) #check running script, this will be triggered as soon as the process prints, enqueue_output called if (runningSubprocess is not None): while True: try: line = subprocessQueue.get_nowait() # or q.get(timeout=.1) except Queue.Empty: #print('no output yet') break else: # got line line = line.strip() scriptOutput = line #print scriptOutput + str(time.time()) draw.text((1, 13 + 12 * 3 + 1), scriptOutput, font=smartFont, fill=255) #check script execution needToExecute = False lock.acquire() needToExecute = triggerExecution if (triggerExecution): triggerExecution = False lock.release() if ((filesCount > 0) and (needToExecute == True)): if (runningSubprocess is not None): if (runningSubprocess.poll() == None): print 'Kill previous running script' runningSubprocess.kill() print 'Execute : ' + fileSelected if os.path.isdir(fileSelected): scriptPath = os.path.abspath(fileSelected) + '/' scriptIndex = 0 else: try: runningSubprocess = subprocess.Popen( fileSelected, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, close_fds=ON_POSIX) subprocessReadThread = threading.Thread( target=enqueue_output, args=(runningSubprocess.stdout, subprocessQueue)) subprocessReadThread.daemon = True # thread dies with the program subprocessReadThread.start() except Exception as e: print('Popen error occured.') print(e) oled.drawImage(image) lock.acquire() drawing = False lock.release()
def receive_signal(signum, stack): global pageIndex global pageSleepCountdown global pageSleep global disableTimeSeconds global disableCounter global status if pageSleepCountdown == 0: image1 = Image.open('pihole.png').convert('1') oled.drawImage(image1) time.sleep(0.5) pageSleepCountdown = pageSleep #user pressed a button, reset the sleep counter lock.acquire() page_index = pageIndex lock.release() #if page_index==5: # return if signum == signal.SIGUSR1: print 'K1 pressed' if is_showing_disable_msgbox(): if page_index == 3: update_page_index(4) else: update_page_index(3) draw_page() else: pageIndex = 0 draw_page() if signum == signal.SIGUSR2: print 'K2 pressed' if is_showing_disable_msgbox(): if page_index == 4: cmd = "curl -f -s \"http://127.0.0.1/admin/api.php?disable=" + str( disableTimeSeconds ) + "&auth=$(docker exec -i pihole grep -oPi \"(?<=WEBPASSWORD\=).+\" /etc/pihole/setupVars.conf)\" | jq .status" status = subprocess.check_output(cmd, shell=True) lock.acquire() disableCounter = disableTimeSeconds lock.release() update_page_index(5) draw_page() else: update_page_index(0) draw_page() else: update_page_index(1) draw_page() if signum == signal.SIGALRM: print 'K3 pressed' cmd = "curl -f -s http://127.0.0.1/admin/api.php | jq .status" status = subprocess.check_output(cmd, shell=True).strip() if str(status) == "\"disabled\"": enabledCounter = 0 update_page_index(5) draw_page() elif is_showing_disable_msgbox(): update_page_index(0) draw_page() else: update_page_index(3) draw_page()
logo_disment = 1 # 画布 image_background = Image.new('1', (width, height)) # Get drawing object to draw on image. font = ImageFont.load_default() draw = ImageDraw.Draw(image_background) # Load default font. # Alternatively load a TTF font. Make sure the .ttf font file is in the same directory as the python script! # Some other nice fonts to try: http://www.dafont.com/bitmap.php # font = ImageFont.truetype('Minecraftia.ttf', 8) # 图标分割线 draw.line((0, logo_y + 1, width, logo_y + 1), fill=128) oled.drawImage(image_background) time.sleep(10) # # # 2.4G&5.8G 1.5G 探测/寻向 无人机 远程 定位 # # 1 2 3 4 5 6 7 # image_return = Image.open('./logo/return.jpg').convert('1').resize((logo_x, logo_y)) # image_gps = Image.open('./logo/gps.jpg').convert('1').resize((logo_x, logo_y)) # image_search = Image.open('./logo/search.jpg').convert('1').resize((logo_x, logo_y)) # image_position = Image.open('./logo/position.jpg').convert('1').resize((logo_x, logo_y)) # image_uav = Image.open('./logo/UAV.jpg').convert('1').resize((logo_x, logo_y)) # image_remote = Image.open('./logo/remote.jpg').convert('1').resize((logo_x, logo_y)) # image_location = Image.open('./logo/location.jpg').convert('1').resize((logo_x, logo_y)) # # 图标横幅 # logo_image = [image_return, image_gps, image_search, image_position, image_uav, image_remote, image_location] #
#weibo def send_flag(client): weibo.send_message(client, Flag) def send_countdown(client, year, num): weibo.send_pic(client, str(year) + Countdown_Words + str(num) + "%", Countdown_Picpath) #image image0 = Image.open(Welcome_Picpath).convert('1') oled.drawImage(image0) time.sleep(2) signal.signal(signal.SIGUSR1, receive_signal) signal.signal(signal.SIGUSR2, receive_signal) signal.signal(signal.SIGALRM, receive_signal) #weibo client = weibo.init_login() time.sleep(10) send_flag(client) while True: try: draw_page()
def home_page(self, g_vars, menu): ethtool_file = ETHTOOL_FILE g_vars['drawing_in_progress'] = True g_vars['display_state'] = 'page' if g_vars['current_mode'] == "wconsole": # get wlan0 IP if_name = "wlan0" mode_name = "Wi-Fi Console" elif g_vars['current_mode'] == "hotspot": # get wlan0 IP if_name = "wlan0" mode_name = "Hotspot " + self.wifi_client_count() + " clients" elif g_vars['current_mode'] == "wiperf": # get wlan0 IP if_name = "wlan0" mode_name = "Wiperf" + self.check_wiperf_status() else: # get eth0 IP if_name = "eth0" mode_name = "" # get Ethernet port info (...for Jerry) try: eth_info = subprocess.check_output( '{} eth0 2>/dev/null'.format(ethtool_file), shell=True).decode() speed_re = re.findall(r'Speed\: (.*\/s)', eth_info, re.MULTILINE) duplex_re = re.findall(r'Duplex\: (.*)', eth_info, re.MULTILINE) link_re = re.findall(r'Link detected\: (.*)', eth_info, re.MULTILINE) if (speed_re is None) or (duplex_re is None) or (link_re is None): # Our pattern matching failed...silently fail....we must set up logging at some stage mode_name = "" elif (link_re[0] == "no"): # Ethernet link is down, report msg instead of speed & duplex mode_name = "Link down" else: # Report the speed & duplex messages from ethtool mode_name = "{} {}".format(speed_re[0], duplex_re[0]) except Exception as ex: # Something went wrong...show nothing mode_name = "" # If eth0 is down, lets show the usb0 IP address # in case anyone uses OTG conection & is confused if mode_name == "Link down": if_name = "usb0" mode_name = "" ip_addr_cmd = "ip addr show {} 2>/dev/null | grep -Po \'inet \K[\d.]+\' | head -n 1".format( if_name) try: ip_addr = subprocess.check_output(ip_addr_cmd, shell=True).decode() except Exception as ex: ip_addr = "No IP Addr" self.display_obj.clear_display(g_vars) g_vars['draw'].text((0, 1), str(g_vars['wlanpi_ver']), font=SMART_FONT, fill=255) g_vars['draw'].text((0, 11), str(g_vars['hostname']), font=FONT11, fill=255) g_vars['draw'].text((95, 20), if_name, font=SMART_FONT, fill=255) g_vars['draw'].text((0, 29), str(ip_addr), font=FONT14, fill=255) g_vars['draw'].text((0, 43), str(mode_name), font=SMART_FONT, fill=255) # if we're using a symbol key map, over-ride the menu button with the down symbol key_map_name = g_vars.get('key_map') key_map_type = g_vars['key_mappings'][key_map_name]['type'] self.nav_button_obj.back(function='menu') oled.drawImage(g_vars['image']) g_vars['drawing_in_progress'] = False return
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ''' import bakebit_128_64_oled as oled from PIL import Image from PIL import ImageFont from PIL import ImageDraw oled.init() #initialze SEEED OLED display oled.clearDisplay( ) #clear the screen and set start position to top left corner oled.setNormalDisplay() #Set display to normal mode (i.e non-inverse mode) oled.setHorizontalMode() image = Image.open('friendllyelec.png').convert('1') oled.drawImage(image)
def switcher(self, g_vars, resource_title, resource_switcher_file, mode_name): ''' Function to perform generic set of operations to switch wlanpi mode ''' reboot_image = g_vars['reboot_image'] # check resource is available if not os.path.isfile(resource_switcher_file): self.simple_table_obj.display_dialog_msg( g_vars, '{} not available'.format(resource_title), back_button_req=1) g_vars['display_state'] = 'page' return # Resource switcher was detected, so assume it's installed back_button_req = 0 if g_vars['current_mode'] == "classic": # if in classic mode, switch to the resource dialog_msg = 'Switching to {} mode (rebooting...)'.format( resource_title) switch = "on" elif g_vars['current_mode'] == mode_name: dialog_msg = 'Switching to Classic mode (rebooting...)' switch = "off" else: dialog_msg('Unknown mode: {}'.format(g_vars['current_mode']), back_button_req=1) g_vars['display_state'] = 'page' return False # Flip the mode self.simple_table_obj.display_dialog_msg(g_vars, dialog_msg, back_button_req) g_vars['shutdown_in_progress'] = True time.sleep(2) oled.drawImage(g_vars['reboot_image']) g_vars['screen_cleared'] = True try: dialog_msg = subprocess.check_output( "{} {}".format(resource_switcher_file, switch), shell=True).decode() # reboots except subprocess.CalledProcessError as exc: output = exc.output.decode() dialog_msg = mode_name # We only get to this point if the switch has failed for some reason # (Note that the switcher script reboots the WLANPi) g_vars['shutdown_in_progress'] = False g_vars['screen_cleared'] = False self.simple_table_obj.display_dialog_msg( g_vars, "Switch failed: {}".format(dialog_msg), back_button_req=0) g_vars['display_state'] = 'menu' # allow 5 secs to view failure msg time.sleep(3) # move back up to menu branch g_vars['current_menu_location'].pop() return False