From c27cc0ac2467daf3645147ac9e6a2beac7c123df Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 15 Jan 2024 22:46:18 +0100 Subject: [PATCH] Added 38 waveshare displays or so Layouts may not be correct, but I have no way of testing that. --- pwnagotchi/ui/__init__.py | 1 - pwnagotchi/ui/hw/__init__.py | 132 ++--- pwnagotchi/ui/hw/libs/__init__.py | 0 pwnagotchi/ui/hw/libs/waveshare/__init__.py | 0 .../hw/libs/waveshare/v154inch/epd1in54b.py | 219 -------- .../hw/libs/waveshare/v154inch/epdconfig.py | 154 ------ .../ui/hw/libs/waveshare/v1in54/epd1in54.py | 2 +- .../ui/hw/libs/waveshare/v213bc/epd2in13bc.py | 378 ------------- .../ui/hw/libs/waveshare/v213bc/epdconfig.py | 154 ------ .../ui/hw/libs/waveshare/v213d/epd2in13d.py | 358 ------------ .../ui/hw/libs/waveshare/v213d/epdconfig.py | 154 ------ .../libs/waveshare/v213inb_v4/epd2in13b_V4.py | 204 ------- .../hw/libs/waveshare/v213inb_v4/epdconfig.py | 227 -------- .../ui/hw/libs/waveshare/v27inch/__init__.py | 0 .../ui/hw/libs/waveshare/v27inch/epd2in7.py | 520 ------------------ .../ui/hw/libs/waveshare/v27inch/epdconfig.py | 154 ------ .../hw/libs/waveshare/v27inchV2/epd2in7_V2.py | 520 ------------------ .../hw/libs/waveshare/v27inchV2/epdconfig.py | 243 -------- .../ui/hw/libs/waveshare/v29inch/epd2in9.py | 201 ------- .../ui/hw/libs/waveshare/v29inch/epdconfig.py | 154 ------ .../ui/hw/libs/waveshare/v2in7/epd2in7.py | 2 +- .../hw/libs/waveshare/v2in9_v2/epd2in9V2.py | 2 +- .../ui/hw/libs/waveshare/v3in7/epd3in7.py | 2 +- .../ui/hw/libs/waveshare/v4in2/epd4in2.py | 2 +- pwnagotchi/ui/hw/waveshare13in3k.py | 45 ++ pwnagotchi/ui/hw/waveshare154inch.py | 47 -- pwnagotchi/ui/hw/waveshare1in02.py | 45 ++ pwnagotchi/ui/hw/waveshare1in44lcd.py | 3 +- pwnagotchi/ui/hw/waveshare1in54.py | 5 +- pwnagotchi/ui/hw/waveshare1in54_V2.py | 4 +- pwnagotchi/ui/hw/waveshare1in54c.py | 45 ++ pwnagotchi/ui/hw/waveshare1in64g.py | 45 ++ pwnagotchi/ui/hw/waveshare213bc.py | 47 -- pwnagotchi/ui/hw/waveshare213d.py | 47 -- pwnagotchi/ui/hw/waveshare213inb_v4.py | 72 --- pwnagotchi/ui/hw/waveshare27inch.py | 46 -- pwnagotchi/ui/hw/waveshare27inchv2.py | 49 -- pwnagotchi/ui/hw/waveshare29inch.py | 47 -- pwnagotchi/ui/hw/waveshare2in13b_V3.py | 4 +- pwnagotchi/ui/hw/waveshare2in23g.py | 46 ++ pwnagotchi/ui/hw/waveshare2in36g.py | 45 ++ pwnagotchi/ui/hw/waveshare2in66.py | 45 ++ pwnagotchi/ui/hw/waveshare2in66g.py | 45 ++ pwnagotchi/ui/hw/waveshare2in7.py | 6 +- pwnagotchi/ui/hw/waveshare2in9bc.py | 45 ++ pwnagotchi/ui/hw/waveshare2in9d.py | 45 ++ pwnagotchi/ui/hw/waveshare3in0g.py | 45 ++ pwnagotchi/ui/hw/waveshare3in52.py | 45 ++ pwnagotchi/ui/hw/waveshare3in7.py | 45 ++ pwnagotchi/ui/hw/waveshare4in01f.py | 45 ++ pwnagotchi/ui/hw/waveshare4in2.py | 45 ++ pwnagotchi/ui/hw/waveshare4in26.py | 45 ++ pwnagotchi/ui/hw/waveshare4in2_V2.py | 45 ++ pwnagotchi/ui/hw/waveshare4in2b_V2.py | 45 ++ pwnagotchi/ui/hw/waveshare4in2bc.py | 45 ++ pwnagotchi/ui/hw/waveshare4in37g.py | 45 ++ pwnagotchi/ui/hw/waveshare5in65f.py | 45 ++ pwnagotchi/ui/hw/waveshare5in83.py | 45 ++ pwnagotchi/ui/hw/waveshare5in83_V2.py | 45 ++ pwnagotchi/ui/hw/waveshare5in83b_V2.py | 45 ++ pwnagotchi/ui/hw/waveshare5in83bc.py | 45 ++ pwnagotchi/ui/hw/waveshare7in3f.py | 45 ++ pwnagotchi/ui/hw/waveshare7in3g.py | 45 ++ pwnagotchi/ui/hw/waveshare7in5.py | 45 ++ pwnagotchi/ui/hw/waveshare7in5_HD.py | 45 ++ pwnagotchi/ui/hw/waveshare7in5_V2.py | 58 ++ pwnagotchi/ui/hw/waveshare7in5b_HD.py | 45 ++ pwnagotchi/ui/hw/waveshare7in5b_V2.py | 45 ++ pwnagotchi/ui/hw/waveshare7in5bc.py | 45 ++ pwnagotchi/utils.py | 2 +- 70 files changed, 1582 insertions(+), 4079 deletions(-) delete mode 100644 pwnagotchi/ui/__init__.py delete mode 100644 pwnagotchi/ui/hw/libs/__init__.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/__init__.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v154inch/epd1in54b.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v154inch/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213bc/epd2in13bc.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213bc/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213d/epd2in13d.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213d/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epd2in13b_V4.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v27inch/__init__.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v27inch/epd2in7.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v27inch/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epd2in7_V2.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v29inch/epd2in9.py delete mode 100644 pwnagotchi/ui/hw/libs/waveshare/v29inch/epdconfig.py delete mode 100644 pwnagotchi/ui/hw/waveshare154inch.py delete mode 100644 pwnagotchi/ui/hw/waveshare213bc.py delete mode 100644 pwnagotchi/ui/hw/waveshare213d.py delete mode 100644 pwnagotchi/ui/hw/waveshare213inb_v4.py delete mode 100644 pwnagotchi/ui/hw/waveshare27inch.py delete mode 100644 pwnagotchi/ui/hw/waveshare27inchv2.py delete mode 100644 pwnagotchi/ui/hw/waveshare29inch.py create mode 100644 pwnagotchi/ui/hw/waveshare2in66g.py diff --git a/pwnagotchi/ui/__init__.py b/pwnagotchi/ui/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/pwnagotchi/ui/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pwnagotchi/ui/hw/__init__.py b/pwnagotchi/ui/hw/__init__.py index abe7478e..11ec7bf3 100644 --- a/pwnagotchi/ui/hw/__init__.py +++ b/pwnagotchi/ui/hw/__init__.py @@ -20,46 +20,46 @@ from pwnagotchi.ui.hw.waveshare2in13b_V4 import Waveshare213bV4 from pwnagotchi.ui.hw.waveshare3in5lcd import Waveshare35lcd from pwnagotchi.ui.hw.spotpear24in import Spotpear24inch from pwnagotchi.ui.hw.displayhatmini import DisplayHatMini -# from pwnagotchi.ui.hw.waveshare1in02 import Waveshare102 +from pwnagotchi.ui.hw.waveshare1in02 import Waveshare1in02 from pwnagotchi.ui.hw.waveshare1in54 import Waveshare154 from pwnagotchi.ui.hw.waveshare1in54_V2 import Waveshare154V2 from pwnagotchi.ui.hw.waveshare1in54b_V2 import Waveshare154bV2 -# from pwnagotchi.ui.hw.waveshare1in54c import Waveshare154c -# from pwnagotchi.ui.hw.waveshare1in64g import Waveshare164g +from pwnagotchi.ui.hw.waveshare1in54c import Waveshare1in54c +from pwnagotchi.ui.hw.waveshare1in64g import Waveshare1in64g from pwnagotchi.ui.hw.waveshare2in7b import Waveshare27b from pwnagotchi.ui.hw.waveshare2in7b_V2 import Waveshare27bV2 from pwnagotchi.ui.hw.waveshare2in9b_V3 import Waveshare29bV3 from pwnagotchi.ui.hw.waveshare2in9b_V4 import Waveshare29bV4 -# from pwnagotchi.ui.hw.waveshare2in9bc import Waveshare29bc -# from pwnagotchi.ui.hw.waveshare2in9d import Waveshare29d -from pwnagotchi.ui.hw.waveshare2in13b_V3 import Waveshare213bV3 -# from pwnagotchi.ui.hw.waveshare2in23g import Waveshare223g -# from pwnagotchi.ui.hw.waveshare2in36g import Waveshare236g -# from pwnagotchi.ui.hw.waveshare2in66 import Waveshare266 -# from pwnagotchi.ui.hw.waveshare3in0g import Waveshare30g -# from pwnagotchi.ui.hw.waveshare3in7 import Waveshare37 -# from pwnagotchi.ui.hw.waveshare3in52 import Waveshare352 -# from pwnagotchi.ui.hw.waveshare4in01f import Waveshare401f -# from pwnagotchi.ui.hw.waveshare4in2 import Waveshare42inch -# from pwnagotchi.ui.hw.waveshare4in2_V2 import Waveshare42V2 -# from pwnagotchi.ui.hw.waveshare4in2b_V2 import Waveshare42bV2 -# from pwnagotchi.ui.hw.waveshare4in2bc import Waveshare42bc -# from pwnagotchi.ui.hw.waveshare4in26 import Waveshare426 -# from pwnagotchi.ui.hw.waveshare4in37g import Waveshare437g -# from pwnagotchi.ui.hw.waveshare5in65f import Waveshare565f -# from pwnagotchi.ui.hw.waveshare5in83 import Waveshare583 -# from pwnagotchi.ui.hw.waveshare5in83_V2 import Waveshare583V2 -# from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare583bV2 -# from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare583bc -# from pwnagotchi.ui.hw.waveshare7in3f import Waveshare73f -# from pwnagotchi.ui.hw.waveshare7in3g import Waveshare73g -# from pwnagotchi.ui.hw.waveshare7in5 import Waveshare75 -# from pwnagotchi.ui.hw.waveshare7in5_HD import Waveshare75HD -# from pwnagotchi.ui.hw.waveshare7in5_V2 import Waveshare75V2 -# from pwnagotchi.ui.hw.waveshare7in5b_HD import Waveshare75bHD -# from pwnagotchi.ui.hw.waveshare7in5b_V2 import Waveshare75bV2 -# from pwnagotchi.ui.hw.waveshare7in5bc import Waveshare75bc -# from pwnagotchi.ui.hw.waveshare13in3k import Waveshare133k +from pwnagotchi.ui.hw.waveshare2in9bc import Waveshare2in9bc +from pwnagotchi.ui.hw.waveshare2in9d import Waveshare2in9d +from pwnagotchi.ui.hw.waveshare2in13b_V3 import Waveshare2in13bV3 +from pwnagotchi.ui.hw.waveshare2in23g import Waveshare2in23g +from pwnagotchi.ui.hw.waveshare2in36g import Waveshare2in36g +from pwnagotchi.ui.hw.waveshare2in66 import Waveshare2in66 +from pwnagotchi.ui.hw.waveshare3in0g import Waveshare3in0g +from pwnagotchi.ui.hw.waveshare3in7 import Waveshare3in7 +from pwnagotchi.ui.hw.waveshare3in52 import Waveshare3in52 +from pwnagotchi.ui.hw.waveshare4in01f import Waveshare4in01f +from pwnagotchi.ui.hw.waveshare4in2 import Waveshare4in2 +from pwnagotchi.ui.hw.waveshare4in2_V2 import Waveshare4in2V2 +from pwnagotchi.ui.hw.waveshare4in2b_V2 import Waveshare4in2bV2 +from pwnagotchi.ui.hw.waveshare4in2bc import Waveshare4in2bc +from pwnagotchi.ui.hw.waveshare4in26 import Waveshare4in26 +from pwnagotchi.ui.hw.waveshare4in37g import Waveshare4in37g +from pwnagotchi.ui.hw.waveshare5in65f import Waveshare5in65f +from pwnagotchi.ui.hw.waveshare5in83 import Waveshare5in83 +from pwnagotchi.ui.hw.waveshare5in83_V2 import Waveshare5in83V2 +from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare5in83bV2 +from pwnagotchi.ui.hw.waveshare5in83bc import Waveshare5in83bc +from pwnagotchi.ui.hw.waveshare7in3f import Waveshare7in3f +from pwnagotchi.ui.hw.waveshare7in3g import Waveshare7in3g +from pwnagotchi.ui.hw.waveshare7in5 import Waveshare7in5 +from pwnagotchi.ui.hw.waveshare7in5_HD import Waveshare7in5HD +from pwnagotchi.ui.hw.waveshare7in5_V2 import Waveshare7in5V2 +from pwnagotchi.ui.hw.waveshare7in5b_HD import Waveshare7in5bHD +from pwnagotchi.ui.hw.waveshare7in5b_V2 import Waveshare7in5bV2 +from pwnagotchi.ui.hw.waveshare7in5bc import Waveshare7in5bc +from pwnagotchi.ui.hw.waveshare13in3k import Waveshare13in3k def display_for(config): @@ -155,100 +155,100 @@ def display_for(config): return DisplayHatMini(config) elif config['ui']['display']['type'] == 'waveshare1in54c': - return + return Waveshare1in54c elif config['ui']['display']['type'] == 'waveshare1in64g': - return + return Waveshare1in64g elif config['ui']['display']['type'] == 'waveshare1in02': - return + return Waveshare1in02 elif config['ui']['display']['type'] == 'waveshare2in9bc': - return + return Waveshare2in9bc elif config['ui']['display']['type'] == 'waveshare2in9d': - return + return Waveshare2in9d elif config['ui']['display']['type'] == 'waveshare2in13b_v3': - return + return Waveshare2in13bV3 elif config['ui']['display']['type'] == 'waveshare2in23g': - return + return Waveshare2in23g elif config['ui']['display']['type'] == 'waveshare2in36g': - return + return Waveshare2in36g elif config['ui']['display']['type'] == 'waveshare2in66': - return + return Waveshare2in66 elif config['ui']['display']['type'] == 'waveshare3in0g': - return + return Waveshare3in0g elif config['ui']['display']['type'] == 'waveshare3in7': - return + return Waveshare3in7 elif config['ui']['display']['type'] == 'waveshare3in52': - return + return Waveshare3in52 elif config['ui']['display']['type'] == 'waveshare4in01f': - return + return Waveshare4in01f elif config['ui']['display']['type'] == 'waveshare4in2': - return + return Waveshare4in2 elif config['ui']['display']['type'] == 'waveshare4in2_v2': - return + return Waveshare4in2V2 elif config['ui']['display']['type'] == 'waveshare4in2b_v2': - return + return Waveshare4in2bV2 elif config['ui']['display']['type'] == 'waveshare4in2bc': - return + return Waveshare4in2bc elif config['ui']['display']['type'] == 'waveshare4in26': - return + return Waveshare4in26 elif config['ui']['display']['type'] == 'waveshare4in37g': - return + return Waveshare4in37g elif config['ui']['display']['type'] == 'waveshare5in65f': - return + return Waveshare5in65f elif config['ui']['display']['type'] == 'waveshare5in83': - return + return Waveshare5in83 elif config['ui']['display']['type'] == 'waveshare5in83_v2': - return + return Waveshare5in83V2 elif config['ui']['display']['type'] == 'waveshare5in83b_v2': - return + return Waveshare5in83bV2 elif config['ui']['display']['type'] == 'waveshare5in83bc': - return + return Waveshare5in83bc elif config['ui']['display']['type'] == 'waveshare7in3f': - return + return Waveshare7in3f elif config['ui']['display']['type'] == 'waveshare7in3g': - return + return Waveshare7in3g elif config['ui']['display']['type'] == 'waveshare7in5': - return + return Waveshare7in5 elif config['ui']['display']['type'] == 'waveshare7in5_HD': - return + return Waveshare7in5HD elif config['ui']['display']['type'] == 'waveshare7in5_v2': - return + return Waveshare7in5V2 elif config['ui']['display']['type'] == 'waveshare7in5b_HD': - return + return Waveshare7in5bHD elif config['ui']['display']['type'] == 'waveshare7in5b_v2': - return + return Waveshare7in5bV2 elif config['ui']['display']['type'] == 'waveshare7in5bc': - return + return Waveshare7in5bc elif config['ui']['display']['type'] == 'waveshare13in3k': - return + return Waveshare13in3k diff --git a/pwnagotchi/ui/hw/libs/__init__.py b/pwnagotchi/ui/hw/libs/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pwnagotchi/ui/hw/libs/waveshare/__init__.py b/pwnagotchi/ui/hw/libs/waveshare/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pwnagotchi/ui/hw/libs/waveshare/v154inch/epd1in54b.py b/pwnagotchi/ui/hw/libs/waveshare/v154inch/epd1in54b.py deleted file mode 100644 index 7b241c9d..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v154inch/epd1in54b.py +++ /dev/null @@ -1,219 +0,0 @@ -# ***************************************************************************** -# * | File : epd1in54b.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V4.0 -# * | Date : 2019-06-20 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig - -# Display resolution -EPD_WIDTH = 200 -EPD_HEIGHT = 200 - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - lut_vcom0 = [0x0E, 0x14, 0x01, 0x0A, 0x06, 0x04, 0x0A, 0x0A, 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x0A, 0x00] - lut_w = [0x0E, 0x14, 0x01, 0x0A, 0x46, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x86, 0x0A, 0x04] - lut_b = [0x0E, 0x14, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x4A, 0x04] - lut_g1 = [0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04] - lut_g2 = [0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A, 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04] - lut_vcom1 = [0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] - lut_red0 = [0x83, 0x5D, 0x01, 0x81, 0x48, 0x23, 0x77, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] - lut_red1 = [0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) # module reset - epdconfig.delay_ms(10) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - logging.debug("e-Paper busy") - while(epdconfig.digital_read(self.busy_pin) == 0): - epdconfig.delay_ms(100) - logging.debug("e-Paper busy release") - - def set_lut_bw(self): - self.send_command(0x20) # vcom - for count in range(0, 15): - self.send_data(self.lut_vcom0[count]) - self.send_command(0x21) # ww -- - for count in range(0, 15): - self.send_data(self.lut_w[count]) - self.send_command(0x22) # bw r - for count in range(0, 15): - self.send_data(self.lut_b[count]) - self.send_command(0x23) # wb w - for count in range(0, 15): - self.send_data(self.lut_g1[count]) - self.send_command(0x24) # bb b - for count in range(0, 15): - self.send_data(self.lut_g2[count]) - - def set_lut_red(self): - self.send_command(0x25) - for count in range(0, 15): - self.send_data(self.lut_vcom1[count]) - self.send_command(0x26) - for count in range(0, 15): - self.send_data(self.lut_red0[count]) - self.send_command(0x27) - for count in range(0, 15): - self.send_data(self.lut_red1[count]) - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - # EPD hardware init start - self.reset() - - self.send_command(0x01) # POWER_SETTING - self.send_data(0x07) - self.send_data(0x00) - self.send_data(0x08) - self.send_data(0x00) - self.send_command(0x06) # BOOSTER_SOFT_START - self.send_data(0x07) - self.send_data(0x07) - self.send_data(0x07) - self.send_command(0x04) # POWER_ON - - self.ReadBusy() - - self.send_command(0X00) # PANEL_SETTING - self.send_data(0xCF) - self.send_command(0X50) # VCOM_AND_DATA_INTERVAL_SETTING - self.send_data(0x17) - self.send_command(0x30) # PLL_CONTROL - self.send_data(0x39) - self.send_command(0x61) # TCON_RESOLUTION set x and y - self.send_data(0xC8) - self.send_data(0x00) - self.send_data(0xC8) - self.send_command(0x82) # VCM_DC_SETTING_REGISTER - self.send_data(0x0E) - - self.set_lut_bw() - self.set_lut_red() - return 0 - - def getbuffer(self, image): - buf = [0xFF] * int(self.width * self.height / 8) - # Set buffer to value of Python Imaging Library image. - # Image must be in mode 1. - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - if imwidth != self.width or imheight != self.height: - raise ValueError('Image must be same dimensions as display \ - ({0}x{1}).' .format(self.width, self.height)) - - pixels = image_monocolor.load() - for y in range(self.height): - for x in range(self.width): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - return buf - - def display(self, blackimage, redimage): - # send black data - if (blackimage != None): - self.send_command(0x10) # DATA_START_TRANSMISSION_1 - for i in range(0, int(self.width * self.height / 8)): - temp = 0x00 - for bit in range(0, 4): - if (blackimage[i] & (0x80 >> bit) != 0): - temp |= 0xC0 >> (bit * 2) - self.send_data(temp) - temp = 0x00 - for bit in range(4, 8): - if (blackimage[i] & (0x80 >> bit) != 0): - temp |= 0xC0 >> ((bit - 4) * 2) - self.send_data(temp) - - # send red data - if (redimage != None): - self.send_command(0x13) # DATA_START_TRANSMISSION_2 - for i in range(0, int(self.width * self.height / 8)): - self.send_data(redimage[i]) - - self.send_command(0x12) # DISPLAY_REFRESH - self.ReadBusy() - - def Clear(self): - self.send_command(0x10) # DATA_START_TRANSMISSION_1 - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_data(0xFF) - - self.send_command(0x13) # DATA_START_TRANSMISSION_2 - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - - self.send_command(0x12) # DISPLAY_REFRESH - self.ReadBusy() - - def sleep(self): - self.send_command(0x50) # VCOM_AND_DATA_INTERVAL_SETTING - self.send_data(0x17) - self.send_command(0x82) # to solve Vcom drop - self.send_data(0x00) - self.send_command(0x01) # power setting - self.send_data(0x02) # gate switch to external - self.send_data(0x00) - self.send_data(0x00) - self.send_data(0x00) - self.ReadBusy() - - self.send_command(0x02) # power off - - epdconfig.module_exit() - -### END OF FILE ### - diff --git a/pwnagotchi/ui/hw/libs/waveshare/v154inch/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v154inch/epdconfig.py deleted file mode 100644 index 861f43da..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v154inch/epdconfig.py +++ /dev/null @@ -1,154 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2019-06-21 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - - # SPI device, bus = 0, device = 0 - self.SPI = spidev.SpiDev(0, 0) - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.close() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - - -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v1in54/epd1in54.py b/pwnagotchi/ui/hw/libs/waveshare/v1in54/epd1in54.py index d1214857..f7415ba3 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/v1in54/epd1in54.py +++ b/pwnagotchi/ui/hw/libs/waveshare/v1in54/epd1in54.py @@ -169,7 +169,7 @@ class EPD: # self.ReadBusy() def init(self, lut): - if (epdconfig.module_init() != 0): + if epdconfig.module_init() != 0: return -1 # EPD hardware init start self.reset() diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213bc/epd2in13bc.py b/pwnagotchi/ui/hw/libs/waveshare/v213bc/epd2in13bc.py deleted file mode 100644 index 71386fcd..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213bc/epd2in13bc.py +++ /dev/null @@ -1,378 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in13bc.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V4.0 -# * | Date : 2019-06-20 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig -from PIL import Image - -# Display resolution -EPD_WIDTH = 104 -EPD_HEIGHT = 212 - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - - lut_vcomDC = [ - 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x60, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - ] - - lut_ww = [ - 0x40, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x40, 0x14, 0x00, 0x00, 0x00, 0x01, - 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bw = [ - 0x40, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x03, - 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_wb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_vcom1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - ] - - lut_ww1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bw1 = [ - 0x80, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_wb1 = [ - 0x40, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bb1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(10) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - logging.debug("e-Paper busy") - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - epdconfig.delay_ms(100) - logging.debug("e-Paper busy release") - - def TurnOnDisplay(self): - self.send_command(0x12) - epdconfig.delay_ms(10) - self.ReadBusy() - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - - logging.debug("e-Paper 2.13bc preboot Freeze recovery") - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - epdconfig.delay_ms(100) - self.reset() - epdconfig.delay_ms(200) - self.send_command(0x01) # POWER SETTING - self.send_data(0x03) - self.send_data(0x00) - self.send_data(0x2b) - self.send_data(0x2b) - self.send_data(0x03) - epdconfig.delay_ms(200) - self.send_command(0x06) # BOOSTER_SOFT_START - self.send_data(0x17) - self.send_data(0x17) - self.send_data(0x17) - self.send_command(0x04) # POWER_ON - epdconfig.delay_ms(200) - self.send_command(0X50) - self.send_data(0xf7) - self.send_command(0X02) # power off - self.send_command(0X07) # deep sleep - self.send_data(0xA5) - epdconfig.GPIO.output(epdconfig.RST_PIN, 0) - epdconfig.GPIO.output(epdconfig.DC_PIN, 0) - epdconfig.GPIO.output(epdconfig.CS_PIN, 0) - #logging.debug("Reset, powerdown, voltage off done") - logging.debug("e-Paper is not frozen now :)") - - - self.reset() - - self.send_command(0x01) # POWER SETTING - self.send_data(0x03) - self.send_data(0x00) - self.send_data(0x2b) - self.send_data(0x2b) - self.send_data(0x03) - - self.send_command(0x06) # BOOSTER_SOFT_START - self.send_data(0x17) - self.send_data(0x17) - self.send_data(0x17) - - self.send_command(0x04) # POWER_ON - logging.debug("e-Paper 2.13bc bootup busy") - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - epdconfig.delay_ms(100) - -# self.send_command(0x00) # PANEL_SETTING -# self.send_data(0x8F) -# self.send_command(0x50) # VCOM_AND_DATA_INTERVAL_SETTING -# self.send_data(0xF0) -# self.send_command(0x61) # RESOLUTION_SETTING -# self.send_data(self.width & 0xff) -# self.send_data(self.height >> 8) -# self.send_data(self.height & 0xff) - - self.send_command(0x00) # panel setting - self.send_data(0xbf) # LUT from OTP,128x296 - self.send_data(0x0d) # VCOM to 0V fast - - self.send_command(0x30) # PLL setting - self.send_data(0x3a) # 3a 100HZ 29 150Hz 39 200HZ 31 171HZ - - self.send_command(0x61) # resolution setting - self.send_data(self.width & 0xff) - self.send_data((self.height >> 8) & 0xff) - self.send_data(self.height& 0xff) - - self.send_command(0x82) # vcom_DC setting - self.send_data(0x28) - - #self.Clear() - logging.debug("e-Paper booted") - return 0 - - def SetFullReg(self): - self.send_command(0x82) - self.send_data(0x00) - self.send_command(0X50) - self.send_data(0x97) - - self.send_command(0x20) # vcom - for count in range(0, 44): - self.send_data(self.lut_vcomDC[count]) - self.send_command(0x21) # ww -- - for count in range(0, 42): - self.send_data(self.lut_ww[count]) - self.send_command(0x22) # bw r - for count in range(0, 42): - self.send_data(self.lut_bw[count]) - self.send_command(0x23) # wb w - for count in range(0, 42): - self.send_data(self.lut_wb[count]) - self.send_command(0x24) # bb b - for count in range(0, 42): - self.send_data(self.lut_bb[count]) - - - def getbuffer(self, image): - # logging.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width/8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if(imwidth == self.width and imheight == self.height): - logging.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - logging.debug("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8)) - return buf - - def display(self, imageblack, imagered): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(imageblack[i]) - self.send_command(0x92) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(imagered[i]) - self.send_command(0x92) - - self.send_command(0x12) # REFRESH - self.ReadBusy() - - def pwndisplay(self, imageblack): - if (Image == None): - return - - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0x00) - epdconfig.delay_ms(10) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(imageblack[i]) - epdconfig.delay_ms(10) - - self.SetFullReg() - self.TurnOnDisplay() - - - def Clear(self): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_command(0x92) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_command(0x92) - - self.send_command(0x12) # REFRESH - self.ReadBusy() - - def pwnclear(self): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - epdconfig.delay_ms(10) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - epdconfig.delay_ms(10) - - self.SetFullReg() - self.TurnOnDisplay() - - def sleep(self): - self.send_command(0x02) # POWER_OFF - self.ReadBusy() - self.send_command(0x07) # DEEP_SLEEP - self.send_data(0xA5) # check code - - epdconfig.module_exit() -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213bc/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v213bc/epdconfig.py deleted file mode 100644 index 861f43da..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213bc/epdconfig.py +++ /dev/null @@ -1,154 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2019-06-21 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - - # SPI device, bus = 0, device = 0 - self.SPI = spidev.SpiDev(0, 0) - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.close() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - - -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213d/epd2in13d.py b/pwnagotchi/ui/hw/libs/waveshare/v213d/epd2in13d.py deleted file mode 100644 index 81199c78..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213d/epd2in13d.py +++ /dev/null @@ -1,358 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in13d.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V4.0 -# * | Date : 2019-06-20 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig -from PIL import Image -import RPi.GPIO as GPIO - -# Display resolution -EPD_WIDTH = 104 -EPD_HEIGHT = 212 - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - lut_vcomDC = [ - 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x60, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - ] - - lut_ww = [ - 0x40, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x40, 0x14, 0x00, 0x00, 0x00, 0x01, - 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bw = [ - 0x40, 0x17, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x0F, 0x0F, 0x00, 0x00, 0x03, - 0x40, 0x0A, 0x01, 0x00, 0x00, 0x01, - 0xA0, 0x0E, 0x0E, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_wb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_vcom1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - ] - - lut_ww1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bw1 = [ - 0x80, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_wb1 = [ - 0x40, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - lut_bb1 = [ - 0x00, 0x19, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(10) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - logging.debug("e-Paper busy") - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - self.send_command(0x71) - epdconfig.delay_ms(100) - logging.debug("e-Paper busy release") - - def TurnOnDisplay(self): - self.send_command(0x12) - epdconfig.delay_ms(10) - self.ReadBusy() - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - # EPD hardware init start - self.reset() - - self.send_command(0x01) # POWER SETTING - self.send_data(0x03) - self.send_data(0x00) - self.send_data(0x2b) - self.send_data(0x2b) - self.send_data(0x03) - - self.send_command(0x06) # boost soft start - self.send_data(0x17) # A - self.send_data(0x17) # B - self.send_data(0x17) # C - - self.send_command(0x04) - self.ReadBusy() - - self.send_command(0x00) # panel setting - self.send_data(0xbf) # LUT from OTP,128x296 - self.send_data(0x0d) # VCOM to 0V fast - - self.send_command(0x30) # PLL setting - self.send_data(0x3a) # 3a 100HZ 29 150Hz 39 200HZ 31 171HZ - - self.send_command(0x61) # resolution setting - self.send_data(self.width) - self.send_data((self.height >> 8) & 0xff) - self.send_data(self.height& 0xff) - - self.send_command(0x82) # vcom_DC setting - self.send_data(0x28) - return 0 - - def SetFullReg(self): - self.send_command(0x82) - self.send_data(0x00) - self.send_command(0X50) - self.send_data(0x97) - - self.send_command(0x20) # vcom - for count in range(0, 44): - self.send_data(self.lut_vcomDC[count]) - self.send_command(0x21) # ww -- - for count in range(0, 42): - self.send_data(self.lut_ww[count]) - self.send_command(0x22) # bw r - for count in range(0, 42): - self.send_data(self.lut_bw[count]) - self.send_command(0x23) # wb w - for count in range(0, 42): - self.send_data(self.lut_wb[count]) - self.send_command(0x24) # bb b - for count in range(0, 42): - self.send_data(self.lut_bb[count]) - - def SetPartReg(self): - self.send_command(0x82) - self.send_data(0x03) - self.send_command(0X50) - self.send_data(0x47) - - self.send_command(0x20) # vcom - for count in range(0, 44): - self.send_data(self.lut_vcom1[count]) - self.send_command(0x21) # ww -- - for count in range(0, 42): - self.send_data(self.lut_ww1[count]) - self.send_command(0x22) # bw r - for count in range(0, 42): - self.send_data(self.lut_bw1[count]) - self.send_command(0x23) # wb w - for count in range(0, 42): - self.send_data(self.lut_wb1[count]) - self.send_command(0x24) # bb b - for count in range(0, 42): - self.send_data(self.lut_bb1[count]) - - def getbuffer(self, image): - # logging.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width/8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if(imwidth == self.width and imheight == self.height): - logging.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - logging.debug("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8)) - return buf - - def display(self, image): - if (Image == None): - return - - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0x00) - epdconfig.delay_ms(10) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(image[i]) - epdconfig.delay_ms(10) - - self.SetFullReg() - self.TurnOnDisplay() - - def DisplayPartial(self, image): - if (Image == None): - return - - self.SetPartReg() - self.send_command(0x91) - self.send_command(0x90) - self.send_data(0) - self.send_data(self.width - 1) - - self.send_data(0) - self.send_data(0) - self.send_data(int(self.height / 256)) - self.send_data(self.height % 256 - 1) - self.send_data(0x28) - - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(image[i]) - epdconfig.delay_ms(10) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(~image[i]) - epdconfig.delay_ms(10) - - self.TurnOnDisplay() - - def Clear(self): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0x00) - epdconfig.delay_ms(10) - - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - epdconfig.delay_ms(10) - - self.SetFullReg() - self.TurnOnDisplay() - - def sleep(self): - self.send_command(0X50) - self.send_data(0xf7) - self.send_command(0X02) # power off - self.send_command(0X07) # deep sleep - self.send_data(0xA5) - - epdconfig.module_exit() - -### END OF FILE ### - diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213d/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v213d/epdconfig.py deleted file mode 100644 index 861f43da..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213d/epdconfig.py +++ /dev/null @@ -1,154 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2019-06-21 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - - # SPI device, bus = 0, device = 0 - self.SPI = spidev.SpiDev(0, 0) - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.close() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - - -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epd2in13b_V4.py b/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epd2in13b_V4.py deleted file mode 100644 index 3c87471b..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epd2in13b_V4.py +++ /dev/null @@ -1,204 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in13b_V4.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2022-04-21 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig - -# Display resolution -EPD_WIDTH = 122 -EPD_HEIGHT = 250 - -logger = logging.getLogger(__name__) - - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - # hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(20) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(2) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(20) - - # send 1 byte command - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - # send 1 byte data - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - # send a lot of data - def send_data2(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte2(data) - epdconfig.digital_write(self.cs_pin, 1) - - # judge e-Paper whether is busy - def busy(self): - logger.debug("e-Paper busy") - while (epdconfig.digital_read(self.busy_pin) != 0): - epdconfig.delay_ms(10) - logger.debug("e-Paper busy release") - - # set the display window - def set_windows(self, xstart, ystart, xend, yend): - self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION - self.send_data((xstart >> 3) & 0xff) - self.send_data((xend >> 3) & 0xff) - - self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION - self.send_data(ystart & 0xff) - self.send_data((ystart >> 8) & 0xff) - self.send_data(yend & 0xff) - self.send_data((yend >> 8) & 0xff) - - # set the display cursor(origin) - def set_cursor(self, xstart, ystart): - self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER - self.send_data(xstart & 0xff) - - self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER - self.send_data(ystart & 0xff) - self.send_data((ystart >> 8) & 0xff) - - # initialize - def init(self): - if (epdconfig.module_init() != 0): - return -1 - - self.reset() - - self.busy() - self.send_command(0x12) # SWRESET - self.busy() - - self.send_command(0x01) # Driver output control - self.send_data(0xf9) - self.send_data(0x00) - self.send_data(0x00) - - self.send_command(0x11) # data entry mode - self.send_data(0x03) - - self.set_windows(0, 0, self.width - 1, self.height - 1) - self.set_cursor(0, 0) - - self.send_command(0x3C) # BorderWavefrom - self.send_data(0x05) - - self.send_command(0x18) # Read built-in temperature sensor - self.send_data(0x80) - - self.send_command(0x21) # Display update control - self.send_data(0x80) - self.send_data(0x80) - - self.busy() - - return 0 - - # turn on display - def ondisplay(self): - self.send_command(0x20) - self.busy() - - # image converted to bytearray - def getbuffer(self, image): - img = image - imwidth, imheight = img.size - if (imwidth == self.width and imheight == self.height): - img = img.convert('1') - elif (imwidth == self.height and imheight == self.width): - # image has correct dimensions, but needs to be rotated - img = img.rotate(90, expand=True).convert('1') - else: - logger.warning("Wrong image dimensions: must be " + - str(self.width) + "x" + str(self.height)) - # return a blank buffer - return [0x00] * (int(self.width/8) * self.height) - - buf = bytearray(img.tobytes('raw')) - return buf - - # display image - def display(self, imageblack, imagered): - self.send_command(0x24) - self.send_data2(imageblack) - - self.send_command(0x26) - self.send_data2(imagered) - - self.ondisplay() - - # display white image - def clear(self): - if self.width % 8 == 0: - linewidth = int(self.width/8) - else: - linewidth = int(self.width/8) + 1 - - buf = [0xff] * (int(linewidth * self.height)) - - self.send_command(0x24) - self.send_data2(buf) - - self.send_command(0x26) - self.send_data2(buf) - - self.ondisplay() - - # Compatible with older version functions - def Clear(self): - self.clear() - - # sleep - def sleep(self): - self.send_command(0x10) # DEEP_SLEEP - self.send_data(0x01) # check code - - epdconfig.delay_ms(2000) - epdconfig.module_exit() -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epdconfig.py deleted file mode 100644 index 2c1cd1da..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v213inb_v4/epdconfig.py +++ /dev/null @@ -1,227 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.2 -# * | Date : 2022-10-29 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - -logger = logging.getLogger(__name__) - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - self.SPI = spidev.SpiDev() - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def spi_writebyte2(self, data): - self.SPI.writebytes2(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - # SPI device, bus = 0, device = 0 - self.SPI.open(0, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.close() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def spi_writebyte2(self, data): - for i in range(len(data)): - self.SPI.SYSFS_software_spi_transfer(data[i]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) - - -class SunriseX3: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - Flag = 0 - - def __init__(self): - import spidev - import Hobot.GPIO - - self.GPIO = Hobot.GPIO - self.SPI = spidev.SpiDev() - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def spi_writebyte2(self, data): - # for i in range(len(data)): - # self.SPI.writebytes([data[i]]) - self.SPI.xfer3(data) - - def module_init(self): - if self.Flag == 0: - self.Flag = 1 - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - # SPI device, bus = 0, device = 0 - self.SPI.open(2, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - else: - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.close() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.Flag = 0 - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN]) - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'): - implementation = SunriseX3() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - -### END OF FILE ### \ No newline at end of file diff --git a/pwnagotchi/ui/hw/libs/waveshare/v27inch/__init__.py b/pwnagotchi/ui/hw/libs/waveshare/v27inch/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pwnagotchi/ui/hw/libs/waveshare/v27inch/epd2in7.py b/pwnagotchi/ui/hw/libs/waveshare/v27inch/epd2in7.py deleted file mode 100644 index 4bb2245a..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v27inch/epd2in7.py +++ /dev/null @@ -1,520 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in7.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V4.0 -# * | Date : 2019-06-20 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# 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 OR 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 logging -from . import epdconfig - -# Display resolution -EPD_WIDTH = 176 -EPD_HEIGHT = 264 - -GRAY1 = 0xff #white -GRAY2 = 0xC0 -GRAY3 = 0x80 #gray -GRAY4 = 0x00 #Blackest -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - self.GRAY1 = GRAY1 #white - self.GRAY2 = GRAY2 - self.GRAY3 = GRAY3 #gray - self.GRAY4 = GRAY4 #Blackest - - lut_vcom_dc = [0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x60, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ] - lut_ww = [ - 0x40, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x40, 0x14, 0x00, 0x00, 0x00, 0x01, - 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_bw = [ - 0x40, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x40, 0x14, 0x00, 0x00, 0x00, 0x01, - 0xA0, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_bb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - lut_wb = [ - 0x80, 0x08, 0x00, 0x00, 0x00, 0x02, - 0x90, 0x28, 0x28, 0x00, 0x00, 0x01, - 0x80, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x50, 0x12, 0x12, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - ###################full screen update LUT###################### - #0~3 gray - gray_lut_vcom = [ - 0x00, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x60, 0x14, 0x14, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x13, 0x0A, 0x01, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - #R21 - gray_lut_ww =[ - 0x40, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x90, 0x14, 0x14, 0x00, 0x00, 0x01, - 0x10, 0x14, 0x0A, 0x00, 0x00, 0x01, - 0xA0, 0x13, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - #R22H r - gray_lut_bw =[ - 0x40, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x90, 0x14, 0x14, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x0A, 0x00, 0x00, 0x01, - 0x99, 0x0C, 0x01, 0x03, 0x04, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - #R23H w - gray_lut_wb =[ - 0x40, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x90, 0x14, 0x14, 0x00, 0x00, 0x01, - 0x00, 0x14, 0x0A, 0x00, 0x00, 0x01, - 0x99, 0x0B, 0x04, 0x04, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - #R24H b - gray_lut_bb =[ - 0x80, 0x0A, 0x00, 0x00, 0x00, 0x01, - 0x90, 0x14, 0x14, 0x00, 0x00, 0x01, - 0x20, 0x14, 0x0A, 0x00, 0x00, 0x01, - 0x50, 0x13, 0x01, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(10) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - logging.debug("e-Paper busy") - while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy - epdconfig.delay_ms(200) - logging.debug("e-Paper busy release") - - def set_lut(self): - self.send_command(0x20) # vcom - for count in range(0, 44): - self.send_data(self.lut_vcom_dc[count]) - self.send_command(0x21) # ww -- - for count in range(0, 42): - self.send_data(self.lut_ww[count]) - self.send_command(0x22) # bw r - for count in range(0, 42): - self.send_data(self.lut_bw[count]) - self.send_command(0x23) # wb w - for count in range(0, 42): - self.send_data(self.lut_bb[count]) - self.send_command(0x24) # bb b - for count in range(0, 42): - self.send_data(self.lut_wb[count]) - - def gray_SetLut(self): - self.send_command(0x20) - for count in range(0, 44): #vcom - self.send_data(self.gray_lut_vcom[count]) - - self.send_command(0x21) #red not use - for count in range(0, 42): - self.send_data(self.gray_lut_ww[count]) - - self.send_command(0x22) #bw r - for count in range(0, 42): - self.send_data(self.gray_lut_bw[count]) - - self.send_command(0x23) #wb w - for count in range(0, 42): - self.send_data(self.gray_lut_wb[count]) - - self.send_command(0x24) #bb b - for count in range(0, 42): - self.send_data(self.gray_lut_bb[count]) - - self.send_command(0x25) #vcom - for count in range(0, 42): - self.send_data(self.gray_lut_ww[count]) - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - - # EPD hardware init start - self.reset() - - self.send_command(0x01) # POWER_SETTING - self.send_data(0x03) # VDS_EN, VDG_EN - self.send_data(0x00) # VCOM_HV, VGHL_LV[1], VGHL_LV[0] - self.send_data(0x2b) # VDH - self.send_data(0x2b) # VDL - self.send_data(0x09) # VDHR - - self.send_command(0x06) # BOOSTER_SOFT_START - self.send_data(0x07) - self.send_data(0x07) - self.send_data(0x17) - - # Power optimization - self.send_command(0xF8) - self.send_data(0x60) - self.send_data(0xA5) - - # Power optimization - self.send_command(0xF8) - self.send_data(0x89) - self.send_data(0xA5) - - # Power optimization - self.send_command(0xF8) - self.send_data(0x90) - self.send_data(0x00) - - # Power optimization - self.send_command(0xF8) - self.send_data(0x93) - self.send_data(0x2A) - - # Power optimization - self.send_command(0xF8) - self.send_data(0xA0) - self.send_data(0xA5) - - # Power optimization - self.send_command(0xF8) - self.send_data(0xA1) - self.send_data(0x00) - - # Power optimization - self.send_command(0xF8) - self.send_data(0x73) - self.send_data(0x41) - - self.send_command(0x16) # PARTIAL_DISPLAY_REFRESH - self.send_data(0x00) - self.send_command(0x04) # POWER_ON - self.ReadBusy() - - self.send_command(0x00) # PANEL_SETTING - self.send_data(0xAF) # KW-BF KWR-AF BWROTP 0f - - self.send_command(0x30) # PLL_CONTROL - self.send_data(0x3A) # 3A 100HZ 29 150Hz 39 200HZ 31 171HZ - - self.send_command(0x82) # VCM_DC_SETTING_REGISTER - self.send_data(0x12) - self.set_lut() - return 0 - - def Init_4Gray(self): - if (epdconfig.module_init() != 0): - return -1 - self.reset() - - self.send_command(0x01) #POWER SETTING - self.send_data (0x03) - self.send_data (0x00) - self.send_data (0x2b) - self.send_data (0x2b) - - - self.send_command(0x06) #booster soft start - self.send_data (0x07) #A - self.send_data (0x07) #B - self.send_data (0x17) #C - - self.send_command(0xF8) #boost?? - self.send_data (0x60) - self.send_data (0xA5) - - self.send_command(0xF8) #boost?? - self.send_data (0x89) - self.send_data (0xA5) - - self.send_command(0xF8) #boost?? - self.send_data (0x90) - self.send_data (0x00) - - self.send_command(0xF8) #boost?? - self.send_data (0x93) - self.send_data (0x2A) - - self.send_command(0xF8) #boost?? - self.send_data (0xa0) - self.send_data (0xa5) - - self.send_command(0xF8) #boost?? - self.send_data (0xa1) - self.send_data (0x00) - - self.send_command(0xF8) #boost?? - self.send_data (0x73) - self.send_data (0x41) - - self.send_command(0x16) - self.send_data(0x00) - - self.send_command(0x04) - self.ReadBusy() - - self.send_command(0x00) #panel setting - self.send_data(0xbf) #KW-BF KWR-AF BWROTP 0f - - self.send_command(0x30) #PLL setting - self.send_data (0x90) #100hz - - self.send_command(0x61) #resolution setting - self.send_data (0x00) #176 - self.send_data (0xb0) - self.send_data (0x01) #264 - self.send_data (0x08) - - self.send_command(0x82) #vcom_DC setting - self.send_data (0x12) - - self.send_command(0X50) #VCOM AND DATA INTERVAL SETTING - self.send_data(0x97) - - def getbuffer(self, image): - # logging.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width/8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if(imwidth == self.width and imheight == self.height): - logging.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - logging.debug("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8)) - return buf - - def getbuffer_4Gray(self, image): - # logging.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width / 4) * self.height) - image_monocolor = image.convert('L') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - i=0 - # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if(imwidth == self.width and imheight == self.height): - logging.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if(pixels[x, y] == 0xC0): - pixels[x, y] = 0x80 - elif (pixels[x, y] == 0x80): - pixels[x, y] = 0x40 - i= i+1 - if(i%4 == 0): - buf[int((x + (y * self.width))/4)] = ((pixels[x-3, y]&0xc0) | (pixels[x-2, y]&0xc0)>>2 | (pixels[x-1, y]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6) - - elif(imwidth == self.height and imheight == self.width): - logging.debug("Horizontal") - for x in range(imwidth): - for y in range(imheight): - newx = y - newy = x - if(pixels[x, y] == 0xC0): - pixels[x, y] = 0x80 - elif (pixels[x, y] == 0x80): - pixels[x, y] = 0x40 - i= i+1 - if(i%4 == 0): - buf[int((newx + (newy * self.width))/4)] = ((pixels[x, y-3]&0xc0) | (pixels[x, y-2]&0xc0)>>2 | (pixels[x, y-1]&0xc0)>>4 | (pixels[x, y]&0xc0)>>6) - return buf - - def display(self, image): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(image[i]) - self.send_command(0x12) - self.ReadBusy() - - def display_4Gray(self, image): - self.send_command(0x10) - for i in range(0, 5808): #5808*4 46464 - temp3=0 - for j in range(0, 2): - temp1 = image[i*2+j] - for k in range(0, 2): - temp2 = temp1&0xC0 - if(temp2 == 0xC0): - temp3 |= 0x01#white - elif(temp2 == 0x00): - temp3 |= 0x00 #black - elif(temp2 == 0x80): - temp3 |= 0x01 #gray1 - else: #0x40 - temp3 |= 0x00 #gray2 - temp3 <<= 1 - - temp1 <<= 2 - temp2 = temp1&0xC0 - if(temp2 == 0xC0): #white - temp3 |= 0x01 - elif(temp2 == 0x00): #black - temp3 |= 0x00 - elif(temp2 == 0x80): - temp3 |= 0x01 #gray1 - else : #0x40 - temp3 |= 0x00 #gray2 - if(j!=1 or k!=1): - temp3 <<= 1 - temp1 <<= 2 - self.send_data(temp3) - - self.send_command(0x13) - for i in range(0, 5808): #5808*4 46464 - temp3=0 - for j in range(0, 2): - temp1 = image[i*2+j] - for k in range(0, 2): - temp2 = temp1&0xC0 - if(temp2 == 0xC0): - temp3 |= 0x01#white - elif(temp2 == 0x00): - temp3 |= 0x00 #black - elif(temp2 == 0x80): - temp3 |= 0x00 #gray1 - else: #0x40 - temp3 |= 0x01 #gray2 - temp3 <<= 1 - - temp1 <<= 2 - temp2 = temp1&0xC0 - if(temp2 == 0xC0): #white - temp3 |= 0x01 - elif(temp2 == 0x00): #black - temp3 |= 0x00 - elif(temp2 == 0x80): - temp3 |= 0x00 #gray1 - else: #0x40 - temp3 |= 0x01 #gray2 - if(j!=1 or k!=1): - temp3 <<= 1 - temp1 <<= 2 - self.send_data(temp3) - - self.gray_SetLut() - self.send_command(0x12) - epdconfig.delay_ms(200) - self.ReadBusy() - # pass - - def Clear(self, color): - self.send_command(0x10) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_command(0x13) - for i in range(0, int(self.width * self.height / 8)): - self.send_data(0xFF) - self.send_command(0x12) - self.ReadBusy() - - def sleep(self): - self.send_command(0X50) - self.send_data(0xf7) - self.send_command(0X02) - self.send_command(0X07) - self.send_data(0xA5) - - epdconfig.module_exit() -### END OF FILE ### - diff --git a/pwnagotchi/ui/hw/libs/waveshare/v27inch/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v27inch/epdconfig.py deleted file mode 100644 index efbc319e..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v27inch/epdconfig.py +++ /dev/null @@ -1,154 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2019-06-21 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# 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 OR 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 os -import logging -import sys -import time - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - - # SPI device, bus = 0, device = 0 - self.SPI = spidev.SpiDev(0, 0) - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.close() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - - -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epd2in7_V2.py b/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epd2in7_V2.py deleted file mode 100644 index 2ac71178..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epd2in7_V2.py +++ /dev/null @@ -1,520 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in7_V2.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2022-09-17 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig - -# Display resolution -EPD_WIDTH = 176 -EPD_HEIGHT = 264 - -GRAY1 = 0xff # white -GRAY2 = 0xC0 -GRAY3 = 0x80 # gray -GRAY4 = 0x00 # Blackest - -logger = logging.getLogger(__name__) - - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - self.GRAY1 = GRAY1 # white - self.GRAY2 = GRAY2 - self.GRAY3 = GRAY3 # gray - self.GRAY4 = GRAY4 # Blackest - - LUT_DATA_4Gray = [ - 0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x48, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2, 0x48, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x20, 0x48, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xA, 0x19, 0x0, 0x3, 0x8, 0x0, 0x0, - 0x14, 0x1, 0x0, 0x14, 0x1, 0x0, 0x3, - 0xA, 0x3, 0x0, 0x8, 0x19, 0x0, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, - 0x22, 0x17, 0x41, 0x0, 0x32, 0x1C, - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(2) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - logger.debug("e-Paper busy") - while (epdconfig.digital_read(self.busy_pin) == 1): # 1: idle, 0: busy - epdconfig.delay_ms(20) - logger.debug("e-Paper busy release") - - def TurnOnDisplay(self): - self.send_command(0x22) # Display Update Control - self.send_data(0xF7) - self.send_command(0x20) # Activate Display Update Sequence - self.ReadBusy() - - def TurnOnDisplay_Fast(self): - self.send_command(0x22) # Display Update Control - self.send_data(0xC7) - self.send_command(0x20) # Activate Display Update Sequence - self.ReadBusy() - - def TurnOnDisplay_Partial(self): - self.send_command(0x22) # Display Update Control - self.send_data(0xFF) - self.send_command(0x20) # Activate Display Update Sequence - self.ReadBusy() - - def TurnOnDisplay_4GRAY(self): - self.send_command(0x22) # Display Update Control - self.send_data(0xC7) - self.send_command(0x20) # Activate Display Update Sequence - self.ReadBusy() - - def Lut(self): - self.send_command(0x32) - for i in range(159): - self.send_data(self.LUT_DATA_4Gray[i]) - - def init(self): - if (epdconfig.module_init() != 0): - return -1 - - # EPD hardware init start - self.reset() - self.ReadBusy() - - self.send_command(0x12) # SWRESET - self.ReadBusy() - - self.send_command(0x45) # set Ram-Y address start/end position - self.send_data(0x00) - self.send_data(0x00) - self.send_data(0x07) # 0x0107-->(263+1)=264 - self.send_data(0x01) - - self.send_command(0x4F) # set RAM y address count to 0; - self.send_data(0x00) - self.send_data(0x00) - - self.send_command(0x11) # data entry mode - self.send_data(0x03) - return 0 - - def init_Fast(self): - if (epdconfig.module_init() != 0): - return -1 - - # EPD hardware init start - self.reset() - self.ReadBusy() - - self.send_command(0x12) # SWRESET - self.ReadBusy() - - self.send_command(0x12) # SWRESET - self.ReadBusy() - - self.send_command(0x18) # Read built-in temperature sensor - self.send_data(0x80) - - self.send_command(0x22) # Load temperature value - self.send_data(0xB1) - self.send_command(0x20) - self.ReadBusy() - - self.send_command(0x1A) # Write to temperature register - self.send_data(0x64) - self.send_data(0x00) - - self.send_command(0x45) # set Ram-Y address start/end position - self.send_data(0x00) - self.send_data(0x00) - self.send_data(0x07) # 0x0107-->(263+1)=264 - self.send_data(0x01) - - self.send_command(0x4F) # set RAM y address count to 0; - self.send_data(0x00) - self.send_data(0x00) - - self.send_command(0x11) # data entry mode - self.send_data(0x03) - - self.send_command(0x22) # Load temperature value - self.send_data(0x91) - self.send_command(0x20) - self.ReadBusy() - return 0 - - def Init_4Gray(self): - if (epdconfig.module_init() != 0): - return -1 - self.reset() - - self.send_command(0x12) # soft reset - self.ReadBusy(); - - self.send_command(0x74) # set analog block control - self.send_data(0x54) - self.send_command(0x7E) # set digital block control - self.send_data(0x3B) - - self.send_command(0x01) # Driver output control - self.send_data(0x07) - self.send_data(0x01) - self.send_data(0x00) - - self.send_command(0x11) # data entry mode - self.send_data(0x03) - - self.send_command(0x44) # set Ram-X address start/end position - self.send_data(0x00) - self.send_data(0x15) # 0x15-->(21+1)*8=176 - - self.send_command(0x45) # set Ram-Y address start/end position - self.send_data(0x00) - self.send_data(0x00) - self.send_data(0x07) # 0x0107-->(263+1)=264 - self.send_data(0x01) - - self.send_command(0x3C) # BorderWavefrom - self.send_data(0x00) - - self.send_command(0x2C) # VCOM Voltage - self.send_data(self.LUT_DATA_4Gray[158]) # 0x1C - - self.send_command(0x3F) # EOPQ - self.send_data(self.LUT_DATA_4Gray[153]) - - self.send_command(0x03) # VGH - self.send_data(self.LUT_DATA_4Gray[154]) - - self.send_command(0x04) # - self.send_data(self.LUT_DATA_4Gray[155]) # VSH1 - self.send_data(self.LUT_DATA_4Gray[156]) # VSH2 - self.send_data(self.LUT_DATA_4Gray[157]) # VSL - - self.Lut() # LUT - - self.send_command(0x4E) # set RAM x address count to 0; - self.send_data(0x00) - self.send_command(0x4F) # set RAM y address count to 0X199; - self.send_data(0x00) - self.send_data(0x00) - self.ReadBusy() - return 0 - - def getbuffer(self, image): - # logger.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width / 8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if (imwidth == self.width and imheight == self.height): - logger.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - elif (imwidth == self.height and imheight == self.width): - logger.debug("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[int((newx + newy * self.width) / 8)] &= ~(0x80 >> (y % 8)) - return buf - - def getbuffer_4Gray(self, image): - # logger.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width / 4) * self.height) - image_monocolor = image.convert('L') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - i = 0 - # logger.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if (imwidth == self.width and imheight == self.height): - logger.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if (pixels[x, y] == 0xC0): - pixels[x, y] = 0x80 - elif (pixels[x, y] == 0x80): - pixels[x, y] = 0x40 - i = i + 1 - if (i % 4 == 0): - buf[int((x + (y * self.width)) / 4)] = ( - (pixels[x - 3, y] & 0xc0) | (pixels[x - 2, y] & 0xc0) >> 2 | ( - pixels[x - 1, y] & 0xc0) >> 4 | (pixels[x, y] & 0xc0) >> 6) - - elif (imwidth == self.height and imheight == self.width): - logger.debug("Horizontal") - for x in range(imwidth): - for y in range(imheight): - newx = y - newy = self.height - x - 1 - if (pixels[x, y] == 0xC0): - pixels[x, y] = 0x80 - elif (pixels[x, y] == 0x80): - pixels[x, y] = 0x40 - i = i + 1 - if (i % 4 == 0): - buf[int((newx + (newy * self.width)) / 4)] = ( - (pixels[x, y - 3] & 0xc0) | (pixels[x, y - 2] & 0xc0) >> 2 | ( - pixels[x, y - 1] & 0xc0) >> 4 | (pixels[x, y] & 0xc0) >> 6) - return buf - - def Clear(self): - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - self.send_command(0x24) - for j in range(Height): - for i in range(Width): - self.send_data(0XFF) - self.TurnOnDisplay() - - def display(self, image): - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - self.send_command(0x24) - for j in range(Height): - for i in range(Width): - self.send_data(image[i + j * Width]) - self.TurnOnDisplay() - - def display_Fast(self, image): - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - self.send_command(0x24) - for j in range(Height): - for i in range(Width): - self.send_data(image[i + j * Width]) - self.TurnOnDisplay_Fast() - - def display_Base(self, image): - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - self.send_command(0x24) # Write Black and White image to RAM - for j in range(Height): - for i in range(Width): - self.send_data(image[i + j * Width]) - - self.send_command(0x26) # Write Black and White image to RAM - for j in range(Height): - for i in range(Width): - self.send_data(image[i + j * Width]) - self.TurnOnDisplay() - - def display_Base_color(self, color): - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - self.send_command(0x24) # Write Black and White image to RAM - for j in range(Height): - for i in range(Width): - self.send_data(color) - - self.send_command(0x26) # Write Black and White image to RAM - for j in range(Height): - for i in range(Width): - self.send_data(color) - # self.TurnOnDisplay() - - def display_Partial(self, Image, Xstart, Ystart, Xend, Yend): - if ((Xstart % 8 + Xend % 8 == 8 & Xstart % 8 > Xend % 8) | Xstart % 8 + Xend % 8 == 0 | ( - Xend - Xstart) % 8 == 0): - Xstart = Xstart // 8 - Xend = Xend // 8 - else: - Xstart = Xstart // 8 - if Xend % 8 == 0: - Xend = Xend // 8 - else: - Xend = Xend // 8 + 1 - - if (self.width % 8 == 0): - Width = self.width // 8 - else: - Width = self.width // 8 + 1 - Height = self.height - - Xend -= 1 - Yend -= 1 - - # Reset - self.reset() - - self.send_command(0x3C) # BorderWavefrom - self.send_data(0x80) - - self.send_command(0x44) # set RAM x address start/end, in page 35 - self.send_data(Xstart & 0xff) # RAM x address start at 00h; - self.send_data(Xend & 0xff) # RAM x address end at 0fh(15+1)*8->128 - self.send_command(0x45) # set RAM y address start/end, in page 35 - self.send_data(Ystart & 0xff) # RAM y address start at 0127h; - self.send_data((Ystart >> 8) & 0x01) # RAM y address start at 0127h; - self.send_data(Yend & 0xff) # RAM y address end at 00h; - self.send_data((Yend >> 8) & 0x01) - - self.send_command(0x4E) # set RAM x address count to 0; - self.send_data(Xstart & 0xff) - self.send_command(0x4F) # set RAM y address count to 0X127; - self.send_data(Ystart & 0xff) - self.send_data((Ystart >> 8) & 0x01) - - self.send_command(0x24) # Write Black and White image to RAM - for j in range(Height): - for i in range(Width): - if ((j > Ystart - 1) & (j < (Yend + 1)) & (i > Xstart - 1) & (i < (Xend + 1))): - self.send_data(Image[i + j * Width]) - self.TurnOnDisplay_Partial() - - def display_4Gray(self, image): - self.send_command(0x24) - for i in range(0, 5808): # 5808*4 46464 - temp3 = 0 - for j in range(0, 2): - temp1 = image[i * 2 + j] - for k in range(0, 2): - temp2 = temp1 & 0xC0 - if (temp2 == 0xC0): - temp3 |= 0x00 - elif (temp2 == 0x00): - temp3 |= 0x01 - elif (temp2 == 0x80): - temp3 |= 0x01 - else: # 0x40 - temp3 |= 0x00 - temp3 <<= 1 - - temp1 <<= 2 - temp2 = temp1 & 0xC0 - if (temp2 == 0xC0): - temp3 |= 0x00 - elif (temp2 == 0x00): - temp3 |= 0x01 - elif (temp2 == 0x80): - temp3 |= 0x01 - else: # 0x40 - temp3 |= 0x00 - if (j != 1 or k != 1): - temp3 <<= 1 - temp1 <<= 2 - self.send_data(temp3) - - self.send_command(0x26) - for i in range(0, 5808): # 5808*4 46464 - temp3 = 0 - for j in range(0, 2): - temp1 = image[i * 2 + j] - for k in range(0, 2): - temp2 = temp1 & 0xC0 - if (temp2 == 0xC0): - temp3 |= 0x00 - elif (temp2 == 0x00): - temp3 |= 0x01 - elif (temp2 == 0x80): - temp3 |= 0x00 - else: # 0x40 - temp3 |= 0x01 - temp3 <<= 1 - - temp1 <<= 2 - temp2 = temp1 & 0xC0 - if (temp2 == 0xC0): - temp3 |= 0x00 - elif (temp2 == 0x00): - temp3 |= 0x01 - elif (temp2 == 0x80): - temp3 |= 0x00 - else: # 0x40 - temp3 |= 0x01 - if (j != 1 or k != 1): - temp3 <<= 1 - temp1 <<= 2 - self.send_data(temp3) - - self.TurnOnDisplay_4GRAY() - - def sleep(self): - self.send_command(0X10) - self.send_data(0x01) - - epdconfig.delay_ms(2000) - epdconfig.module_exit() -### END OF FILE ### \ No newline at end of file diff --git a/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epdconfig.py deleted file mode 100644 index c469b0f5..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v27inchV2/epdconfig.py +++ /dev/null @@ -1,243 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.2 -# * | Date : 2022-10-29 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - -logger = logging.getLogger(__name__) - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - PWR_PIN = 18 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - self.SPI = spidev.SpiDev() - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def spi_writebyte2(self, data): - self.SPI.writebytes2(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.PWR_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - self.GPIO.output(self.PWR_PIN, 1) - - # SPI device, bus = 0, device = 0 - self.SPI.open(0, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.close() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - self.GPIO.output(self.PWR_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN, self.PWR_PIN]) - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - PWR_PIN = 18 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def spi_writebyte2(self, data): - for i in range(len(data)): - self.SPI.SYSFS_software_spi_transfer(data[i]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.PWR_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - self.GPIO.output(self.PWR_PIN, 1) - - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - self.GPIO.output(self.PWR_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN, self.PWR_PIN]) - - -class SunriseX3: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - PWR_PIN = 18 - Flag = 0 - - def __init__(self): - import spidev - import Hobot.GPIO - - self.GPIO = Hobot.GPIO - self.SPI = spidev.SpiDev() - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def spi_writebyte2(self, data): - # for i in range(len(data)): - # self.SPI.writebytes([data[i]]) - self.SPI.xfer3(data) - - def module_init(self): - if self.Flag == 0: - self.Flag = 1 - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.PWR_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - self.GPIO.output(self.PWR_PIN, 1) - - # SPI device, bus = 0, device = 0 - self.SPI.open(2, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - else: - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.close() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.Flag = 0 - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - self.GPIO.output(self.PWR_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN], self.PWR_PIN) - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'): - implementation = SunriseX3() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - -### END OF FILE ### \ No newline at end of file diff --git a/pwnagotchi/ui/hw/libs/waveshare/v29inch/epd2in9.py b/pwnagotchi/ui/hw/libs/waveshare/v29inch/epd2in9.py deleted file mode 100644 index 80671a45..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v29inch/epd2in9.py +++ /dev/null @@ -1,201 +0,0 @@ -# ***************************************************************************** -# * | File : epd2in9.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V4.0 -# * | Date : 2019-06-20 -# # | Info : python demo -# ----------------------------------------------------------------------------- -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 logging -from . import epdconfig - -# Display resolution -EPD_WIDTH = 128 -EPD_HEIGHT = 296 - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.cs_pin = epdconfig.CS_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - - lut_full_update = [ - 0x50, 0xAA, 0x55, 0xAA, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ] - - lut_partial_update = [ - 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, 0) - epdconfig.delay_ms(10) - epdconfig.digital_write(self.reset_pin, 1) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, 0) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([command]) - epdconfig.digital_write(self.cs_pin, 1) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, 1) - epdconfig.digital_write(self.cs_pin, 0) - epdconfig.spi_writebyte([data]) - epdconfig.digital_write(self.cs_pin, 1) - - def ReadBusy(self): - while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy - epdconfig.delay_ms(200) - - def TurnOnDisplay(self): - self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 - self.send_data(0xC4) - self.send_command(0x20) # MASTER_ACTIVATION - self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE - - logging.debug("e-Paper busy") - self.ReadBusy() - logging.debug("e-Paper busy release") - - def SetWindow(self, x_start, y_start, x_end, y_end): - self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION - # x point must be the multiple of 8 or the last 3 bits will be ignored - self.send_data((x_start >> 3) & 0xFF) - self.send_data((x_end >> 3) & 0xFF) - self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION - self.send_data(y_start & 0xFF) - self.send_data((y_start >> 8) & 0xFF) - self.send_data(y_end & 0xFF) - self.send_data((y_end >> 8) & 0xFF) - - def SetCursor(self, x, y): - self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER - # x point must be the multiple of 8 or the last 3 bits will be ignored - self.send_data((x >> 3) & 0xFF) - self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER - self.send_data(y & 0xFF) - self.send_data((y >> 8) & 0xFF) - self.ReadBusy() - - def init(self, lut): - if (epdconfig.module_init() != 0): - return -1 - # EPD hardware init start - self.reset() - - self.send_command(0x01) # DRIVER_OUTPUT_CONTROL - self.send_data((EPD_HEIGHT - 1) & 0xFF) - self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF) - self.send_data(0x00) # GD = 0 SM = 0 TB = 0 - - self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL - self.send_data(0xD7) - self.send_data(0xD6) - self.send_data(0x9D) - - self.send_command(0x2C) # WRITE_VCOM_REGISTER - self.send_data(0xA8) # VCOM 7C - - self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD - self.send_data(0x1A) # 4 dummy lines per gate - - self.send_command(0x3B) # SET_GATE_TIME - self.send_data(0x08) # 2us per line - - self.send_command(0x11) # DATA_ENTRY_MODE_SETTING - self.send_data(0x03) # X increment Y increment - - self.send_command(0x32) # WRITE_LUT_REGISTER - for i in range(0, len(lut)): - self.send_data(lut[i]) - # EPD hardware init end - return 0 - - def getbuffer(self, image): - # logging.debug("bufsiz = ",int(self.width/8) * self.height) - buf = [0xFF] * (int(self.width/8) * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - # logging.debug("imwidth = %d, imheight = %d",imwidth,imheight) - if(imwidth == self.width and imheight == self.height): - logging.debug("Vertical") - for y in range(imheight): - for x in range(imwidth): - # Set the bits for the column of pixels at the current position. - if pixels[x, y] == 0: - buf[int((x + y * self.width) / 8)] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - logging.debug("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - buf[int((newx + newy*self.width) / 8)] &= ~(0x80 >> (y % 8)) - return buf - - def display(self, image): - if (image == None): - return - self.SetWindow(0, 0, self.width - 1, self.height - 1) - for j in range(0, self.height): - self.SetCursor(0, j) - self.send_command(0x24) # WRITE_RAM - for i in range(0, int(self.width / 8)): - self.send_data(image[i + j * int(self.width / 8)]) - self.TurnOnDisplay() - - def Clear(self, color): - self.SetWindow(0, 0, self.width - 1, self.height - 1) - for j in range(0, self.height): - self.SetCursor(0, j) - self.send_command(0x24) # WRITE_RAM - for i in range(0, int(self.width / 8)): - self.send_data(color) - self.TurnOnDisplay() - - def sleep(self): - self.send_command(0x10) # DEEP_SLEEP_MODE - self.send_data(0x01) - - epdconfig.module_exit() -### END OF FILE ### - diff --git a/pwnagotchi/ui/hw/libs/waveshare/v29inch/epdconfig.py b/pwnagotchi/ui/hw/libs/waveshare/v29inch/epdconfig.py deleted file mode 100644 index 861f43da..00000000 --- a/pwnagotchi/ui/hw/libs/waveshare/v29inch/epdconfig.py +++ /dev/null @@ -1,154 +0,0 @@ -# /***************************************************************************** -# * | File : epdconfig.py -# * | Author : Waveshare team -# * | Function : Hardware underlying interface -# * | Info : -# *---------------- -# * | This version: V1.0 -# * | Date : 2019-06-21 -# * | Info : -# ****************************************************************************** -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furished 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 OR 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 os -import logging -import sys -import time - - -class RaspberryPi: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import spidev - import RPi.GPIO - - self.GPIO = RPi.GPIO - - # SPI device, bus = 0, device = 0 - self.SPI = spidev.SpiDev(0, 0) - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.close() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logging.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logging.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - - self.GPIO.cleanup() - - -if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): - implementation = RaspberryPi() -else: - implementation = JetsonNano() - -for func in [x for x in dir(implementation) if not x.startswith('_')]: - setattr(sys.modules[__name__], func, getattr(implementation, func)) - - -### END OF FILE ### diff --git a/pwnagotchi/ui/hw/libs/waveshare/v2in7/epd2in7.py b/pwnagotchi/ui/hw/libs/waveshare/v2in7/epd2in7.py index b2eba6df..a109872c 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/v2in7/epd2in7.py +++ b/pwnagotchi/ui/hw/libs/waveshare/v2in7/epd2in7.py @@ -498,7 +498,7 @@ class EPD: self.ReadBusy() # pass - def Clear(self, color): + def Clear(self): self.send_command(0x10) for i in range(0, int(self.width * self.height / 8)): self.send_data(0xFF) diff --git a/pwnagotchi/ui/hw/libs/waveshare/v2in9_v2/epd2in9V2.py b/pwnagotchi/ui/hw/libs/waveshare/v2in9_v2/epd2in9V2.py index ce8bd80f..2f896373 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/v2in9_v2/epd2in9V2.py +++ b/pwnagotchi/ui/hw/libs/waveshare/v2in9_v2/epd2in9V2.py @@ -227,7 +227,7 @@ class EPD: self.send_data((y >> 8) & 0xFF) def init(self): - if (epdconfig.module_init() != 0): + if epdconfig.module_init() != 0: return -1 # EPD hardware init start self.reset() diff --git a/pwnagotchi/ui/hw/libs/waveshare/v3in7/epd3in7.py b/pwnagotchi/ui/hw/libs/waveshare/v3in7/epd3in7.py index d8e8d042..fd626f57 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/v3in7/epd3in7.py +++ b/pwnagotchi/ui/hw/libs/waveshare/v3in7/epd3in7.py @@ -417,7 +417,7 @@ class EPD: self.send_command(0x20) self.ReadBusy() - def Clear(self, color, mode): + def Clear(self, mode): self.send_command(0x4E) self.send_data(0x00) self.send_data(0x00) diff --git a/pwnagotchi/ui/hw/libs/waveshare/v4in2/epd4in2.py b/pwnagotchi/ui/hw/libs/waveshare/v4in2/epd4in2.py index 83180526..acab6852 100644 --- a/pwnagotchi/ui/hw/libs/waveshare/v4in2/epd4in2.py +++ b/pwnagotchi/ui/hw/libs/waveshare/v4in2/epd4in2.py @@ -34,7 +34,7 @@ from PIL import Image import RPi.GPIO as GPIO # Display resolution -EPD_WIDTH = 400 +EPD_WIDTH = 400 EPD_HEIGHT = 300 GRAY1 = 0xff # white diff --git a/pwnagotchi/ui/hw/waveshare13in3k.py b/pwnagotchi/ui/hw/waveshare13in3k.py index e69de29b..bff5f970 100644 --- a/pwnagotchi/ui/hw/waveshare13in3k.py +++ b/pwnagotchi/ui/hw/waveshare13in3k.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare13in3k(DisplayImpl): + def __init__(self, config): + super(Waveshare13in3k, self).__init__(config, 'waveshare13in3k') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 960 + self._layout['height'] = 680 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 960, 12] + self._layout['line2'] = [0, 116, 960, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 13.3k inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v13in3k.epd13in3k import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare154inch.py b/pwnagotchi/ui/hw/waveshare154inch.py deleted file mode 100644 index a6781219..00000000 --- a/pwnagotchi/ui/hw/waveshare154inch.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare154inch(DisplayImpl): - def __init__(self, config): - super(Waveshare154inch, self).__init__(config, 'waveshare_1_54inch') - self._display = None - - def layout(self): - fonts.setup(10, 9, 10, 35, 25, 9) - self._layout['width'] = 200 - self._layout['height'] = 200 - self._layout['face'] = (0, 40) - self._layout['name'] = (5, 20) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (135, 0) - self._layout['line1'] = [0, 14, 200, 14] - self._layout['line2'] = [0, 186, 200, 186] - self._layout['friend_face'] = (0, 92) - self._layout['friend_name'] = (40, 94) - self._layout['shakes'] = (0, 187) - self._layout['mode'] = (170, 187) - self._layout['status'] = { - 'pos': (5, 90), - 'font': fonts.status_font(fonts.Medium), - 'max': 20 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare v154 display") - from pwnagotchi.ui.hw.libs.waveshare.v154inch.epd1in54b import EPD - self._display = EPD() - self._display.init() - self._display.Clear() - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.display(buf, None) - - def clear(self): - pass - #self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare1in02.py b/pwnagotchi/ui/hw/waveshare1in02.py index e69de29b..994d1424 100644 --- a/pwnagotchi/ui/hw/waveshare1in02.py +++ b/pwnagotchi/ui/hw/waveshare1in02.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare1in02(DisplayImpl): + def __init__(self, config): + super(Waveshare1in02, self).__init__(config, 'waveshare1in02') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 80 + self._layout['height'] = 128 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 80, 12] + self._layout['line2'] = [0, 116, 80, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 1.02 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v1in02.epd1in02 import EPD + self._display = EPD() + self._display.Init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare1in44lcd.py b/pwnagotchi/ui/hw/waveshare1in44lcd.py index 0cef5f2c..88853b87 100644 --- a/pwnagotchi/ui/hw/waveshare1in44lcd.py +++ b/pwnagotchi/ui/hw/waveshare1in44lcd.py @@ -42,5 +42,4 @@ class Waveshare144lcd(DisplayImpl): self._display.display(canvas) def clear(self): - pass - #self._display.clear() + self._display.clear() diff --git a/pwnagotchi/ui/hw/waveshare1in54.py b/pwnagotchi/ui/hw/waveshare1in54.py index 50abf40d..c9186714 100644 --- a/pwnagotchi/ui/hw/waveshare1in54.py +++ b/pwnagotchi/ui/hw/waveshare1in54.py @@ -32,10 +32,10 @@ class Waveshare154(DisplayImpl): return self._layout def initialize(self): - logging.info("initializing waveshare v154 display") + logging.info("initializing waveshare v1in54 display") from pwnagotchi.ui.hw.libs.waveshare.v1in54.epd1in54 import EPD self._display = EPD() - self._display.init() + self._display.init(0x00) self._display.Clear() def render(self, canvas): @@ -43,4 +43,5 @@ class Waveshare154(DisplayImpl): self._display.display(buf, None) def clear(self): + # pass self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare1in54_V2.py b/pwnagotchi/ui/hw/waveshare1in54_V2.py index 09116cd3..c173e0d9 100644 --- a/pwnagotchi/ui/hw/waveshare1in54_V2.py +++ b/pwnagotchi/ui/hw/waveshare1in54_V2.py @@ -32,10 +32,10 @@ class Waveshare154V2(DisplayImpl): return self._layout def initialize(self): - logging.info("initializing waveshare v154 display") + logging.info("initializing waveshare v1in54_v2 display") from pwnagotchi.ui.hw.libs.waveshare.v1in54_v2.epd1in54_V2 import EPD self._display = EPD() - self._display.init() + self._display.init(False) self._display.Clear() def render(self, canvas): diff --git a/pwnagotchi/ui/hw/waveshare1in54c.py b/pwnagotchi/ui/hw/waveshare1in54c.py index e69de29b..8ab51fa8 100644 --- a/pwnagotchi/ui/hw/waveshare1in54c.py +++ b/pwnagotchi/ui/hw/waveshare1in54c.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare1in54c(DisplayImpl): + def __init__(self, config): + super(Waveshare1in54c, self).__init__(config, 'waveshare1in54c') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 152 + self._layout['height'] = 152 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 152, 12] + self._layout['line2'] = [0, 116, 152, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 1.54c inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v1in54c.epd1in54c import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare1in64g.py b/pwnagotchi/ui/hw/waveshare1in64g.py index e69de29b..24cdc409 100644 --- a/pwnagotchi/ui/hw/waveshare1in64g.py +++ b/pwnagotchi/ui/hw/waveshare1in64g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare1in64g(DisplayImpl): + def __init__(self, config): + super(Waveshare1in64g, self).__init__(config, 'waveshare1in64g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 168 + self._layout['height'] = 168 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 168, 12] + self._layout['line2'] = [0, 116, 168, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 1.64g inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v1in64g.epd1in64g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare213bc.py b/pwnagotchi/ui/hw/waveshare213bc.py deleted file mode 100644 index f889c9b6..00000000 --- a/pwnagotchi/ui/hw/waveshare213bc.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare213bc(DisplayImpl): - def __init__(self, config): - super(Waveshare213bc, self).__init__(config, 'waveshare213bc') - self._display = None - - def layout(self): - fonts.setup(10, 8, 10, 25, 25, 9) - self._layout['width'] = 212 - self._layout['height'] = 104 - self._layout['face'] = (0, 26) - self._layout['name'] = (5, 15) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (147, 0) - self._layout['line1'] = [0, 12, 212, 12] - self._layout['line2'] = [0, 92, 212, 92] - self._layout['friend_face'] = (0, 76) - self._layout['friend_name'] = (40, 78) - self._layout['shakes'] = (0, 93) - self._layout['mode'] = (187, 93) - self._layout['status'] = { - 'pos': (91, 15), - 'font': fonts.status_font(fonts.Medium), - 'max': 20 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare 213bc display") - from pwnagotchi.ui.hw.libs.waveshare.v213bc.epd2in13bc import EPD - self._display = EPD() - self._display.init() - self._display.Clear() - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.pwndisplay(buf) - - def clear(self): - #pass - self._display.pwnclear() diff --git a/pwnagotchi/ui/hw/waveshare213d.py b/pwnagotchi/ui/hw/waveshare213d.py deleted file mode 100644 index 0313081d..00000000 --- a/pwnagotchi/ui/hw/waveshare213d.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare213d(DisplayImpl): - def __init__(self, config): - super(Waveshare213d, self).__init__(config, 'waveshare213d') - self._display = None - - def layout(self): - fonts.setup(10, 8, 10, 25, 25, 9) - self._layout['width'] = 212 - self._layout['height'] = 104 - self._layout['face'] = (0, 26) - self._layout['name'] = (5, 15) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (147, 0) - self._layout['line1'] = [0, 12, 212, 12] - self._layout['line2'] = [0, 92, 212, 92] - self._layout['friend_face'] = (0, 76) - self._layout['friend_name'] = (40, 78) - self._layout['shakes'] = (0, 93) - self._layout['mode'] = (187, 93) - self._layout['status'] = { - 'pos': (91, 15), - 'font': fonts.status_font(fonts.Medium), - 'max': 20 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare 213d display") - from pwnagotchi.ui.hw.libs.waveshare.v213d.epd2in13d import EPD - self._display = EPD() - self._display.init() - self._display.Clear() - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.display(buf) - - def clear(self): - #pass - self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare213inb_v4.py b/pwnagotchi/ui/hw/waveshare213inb_v4.py deleted file mode 100644 index eaebf724..00000000 --- a/pwnagotchi/ui/hw/waveshare213inb_v4.py +++ /dev/null @@ -1,72 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl -from PIL import Image - - -class Waveshare213bV4(DisplayImpl): - def __init__(self, config): - super(Waveshare213bV4, self).__init__(config, 'waveshare213inb_v4') - self._display = None - - def layout(self): - if self.config['color'] == 'black': - fonts.setup(10, 9, 10, 35, 25, 9) - self._layout['width'] = 250 - self._layout['height'] = 122 - self._layout['face'] = (0, 40) - self._layout['name'] = (5, 20) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (185, 0) - self._layout['line1'] = [0, 14, 250, 14] - self._layout['line2'] = [0, 108, 250, 108] - self._layout['friend_face'] = (0, 92) - self._layout['friend_name'] = (40, 94) - self._layout['shakes'] = (0, 109) - self._layout['mode'] = (225, 109) - self._layout['status'] = { - 'pos': (125, 20), - 'font': fonts.status_font(fonts.Medium), - 'max': 20 - } - else: - fonts.setup(10, 8, 10, 25, 25, 9) - self._layout['width'] = 212 - self._layout['height'] = 104 - self._layout['face'] = (0, 26) - self._layout['name'] = (5, 15) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['status'] = (91, 15) - self._layout['uptime'] = (147, 0) - self._layout['line1'] = [0, 12, 212, 12] - self._layout['line2'] = [0, 92, 212, 92] - self._layout['friend_face'] = (0, 76) - self._layout['friend_name'] = (40, 78) - self._layout['shakes'] = (0, 93) - self._layout['mode'] = (187, 93) - self._layout['status'] = { - 'pos': (125, 20), - 'font': fonts.status_font(fonts.Medium), - 'max': 14 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare 2.13inb v4 display") - from pwnagotchi.ui.hw.libs.waveshare.v213inb_v4.epd2in13b_V4 import EPD - self._display = EPD() - self._display.init() - self._display.Clear() - - def render(self, canvasBlack = None, canvasRed = None): - buffer = self._display.getbuffer - image = Image.new('1', (self._layout['height'], self._layout['width'])) - imageBlack = image if canvasBlack is None else canvasBlack - imageRed = image if canvasRed is None else canvasRed - self._display.display(buffer(imageBlack), buffer(imageRed)) - - def clear(self): - self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare27inch.py b/pwnagotchi/ui/hw/waveshare27inch.py deleted file mode 100644 index 29fbbbe9..00000000 --- a/pwnagotchi/ui/hw/waveshare27inch.py +++ /dev/null @@ -1,46 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare27inch(DisplayImpl): - def __init__(self, config): - super(Waveshare27inch, self).__init__(config, 'waveshare27inch') - self._display = None - - def layout(self): - fonts.setup(10, 9, 10, 35, 25, 9) - self._layout['width'] = 264 - self._layout['height'] = 176 - self._layout['face'] = (66, 27) - self._layout['name'] = (5, 73) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (199, 0) - self._layout['line1'] = [0, 14, 264, 14] - self._layout['line2'] = [0, 162, 264, 162] - self._layout['friend_face'] = (0, 146) - self._layout['friend_name'] = (40, 146) - self._layout['shakes'] = (0, 163) - self._layout['mode'] = (239, 163) - self._layout['status'] = { - 'pos': (38, 93), - 'font': fonts.status_font(fonts.Medium), - 'max': 40 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare v1 2.7 inch display") - from pwnagotchi.ui.hw.libs.waveshare.v27inch.epd2in7 import EPD - self._display = EPD() - self._display.init() - self._display.Clear(0xFF) - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.display(buf) - - def clear(self): - self._display.Clear(0xff) diff --git a/pwnagotchi/ui/hw/waveshare27inchv2.py b/pwnagotchi/ui/hw/waveshare27inchv2.py deleted file mode 100644 index 63a863ea..00000000 --- a/pwnagotchi/ui/hw/waveshare27inchv2.py +++ /dev/null @@ -1,49 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare27inchV2(DisplayImpl): - def __init__(self, config): - super(Waveshare27inchV2, self).__init__(config, 'waveshare27inchV2') - self._display = None - - def layout(self): - fonts.setup(10, 9, 10, 35, 25, 9) - self._layout['width'] = 264 - self._layout['height'] = 176 - self._layout['face'] = (66, 27) - self._layout['name'] = (5, 73) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (199, 0) - self._layout['line1'] = [0, 14, 264, 14] - self._layout['line2'] = [0, 162, 264, 162] - self._layout['friend_face'] = (0, 146) - self._layout['friend_name'] = (40, 146) - self._layout['shakes'] = (0, 163) - self._layout['mode'] = (239, 163) - self._layout['status'] = { - 'pos': (38, 93), - 'font': fonts.status_font(fonts.Medium), - 'max': 40 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare v2 2.7 inch display") - from pwnagotchi.ui.hw.libs.waveshare.v27inchV2.epd2in7_V2 import EPD - self._display = EPD() - self._display.init() - # this must have changed by waveshare - # remove the 0xFF(Clear(0xFF)) other wise it errors. can't pass oxff and self - self._display.Clear() - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.display(buf) - - def clear(self): - # This line also removes the 0xFF - self._display.Clear() \ No newline at end of file diff --git a/pwnagotchi/ui/hw/waveshare29inch.py b/pwnagotchi/ui/hw/waveshare29inch.py deleted file mode 100644 index 2ae2b5ab..00000000 --- a/pwnagotchi/ui/hw/waveshare29inch.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -import pwnagotchi.ui.fonts as fonts -from pwnagotchi.ui.hw.base import DisplayImpl - - -class Waveshare29inch(DisplayImpl): - def __init__(self, config): - super(Waveshare29inch, self).__init__(config, 'waveshare_29inch') - self._display = None - - def layout(self): - fonts.setup(10, 9, 10, 35, 25, 9) - self._layout['width'] = 296 - self._layout['height'] = 128 - self._layout['face'] = (0, 40) - self._layout['name'] = (5, 25) - self._layout['channel'] = (0, 0) - self._layout['aps'] = (28, 0) - self._layout['uptime'] = (230, 0) - self._layout['line1'] = [0, 14, 296, 14] - self._layout['line2'] = [0, 112, 296, 112] - self._layout['friend_face'] = (0, 96) - self._layout['friend_name'] = (40, 96) - self._layout['shakes'] = (0, 114) - self._layout['mode'] = (268, 114) - self._layout['status'] = { - 'pos': (130, 25), - 'font': fonts.status_font(fonts.Medium), - 'max': 28 - } - return self._layout - - def initialize(self): - logging.info("initializing waveshare v1 2.9 inch display") - from pwnagotchi.ui.hw.libs.waveshare.v29inch.epd2in9 import EPD - self._display = EPD() - self._display.init(self._display.lut_full_update) - self._display.Clear(0xFF) - self._display.init(self._display.lut_partial_update) - - def render(self, canvas): - buf = self._display.getbuffer(canvas) - self._display.display(buf) - - def clear(self): - self._display.Clear(0xFF) diff --git a/pwnagotchi/ui/hw/waveshare2in13b_V3.py b/pwnagotchi/ui/hw/waveshare2in13b_V3.py index fac3235a..a3266557 100644 --- a/pwnagotchi/ui/hw/waveshare2in13b_V3.py +++ b/pwnagotchi/ui/hw/waveshare2in13b_V3.py @@ -5,9 +5,9 @@ from pwnagotchi.ui.hw.base import DisplayImpl from PIL import Image -class Waveshare213bV3(DisplayImpl): +class Waveshare2in13bV3(DisplayImpl): def __init__(self, config): - super(Waveshare213bV3, self).__init__(config, 'waveshare2in13b_v3') + super(Waveshare2in13bV3, self).__init__(config, 'waveshare2in13b_v3') self._display = None def layout(self): diff --git a/pwnagotchi/ui/hw/waveshare2in23g.py b/pwnagotchi/ui/hw/waveshare2in23g.py index e69de29b..362f547e 100644 --- a/pwnagotchi/ui/hw/waveshare2in23g.py +++ b/pwnagotchi/ui/hw/waveshare2in23g.py @@ -0,0 +1,46 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in23g(DisplayImpl): + def __init__(self, config): + super(Waveshare2in23g, self).__init__(config, 'waveshare2in23g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 25, 25, 9) + self._layout['width'] = 122 + self._layout['height'] = 250 + self._layout['face'] = (0, 26) + self._layout['name'] = (5, 15) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (28, 0) + self._layout['uptime'] = (147, 0) + self._layout['line1'] = [0, 12, 122, 12] + self._layout['line2'] = [0, 92, 122, 92] + self._layout['friend_face'] = (0, 76) + self._layout['friend_name'] = (40, 78) + self._layout['shakes'] = (0, 93) + self._layout['mode'] = (187, 93) + self._layout['status'] = { + 'pos': (91, 15), + 'font': fonts.status_font(fonts.Medium), + 'max': 20 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2.23g inch display") + from pwnagotchi.ui.hw.libs.waveshare.v2in23g.epd2in13g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + buf = self._display.getbuffer(canvas) + self._display.display(buf) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in36g.py b/pwnagotchi/ui/hw/waveshare2in36g.py index e69de29b..34dbb195 100644 --- a/pwnagotchi/ui/hw/waveshare2in36g.py +++ b/pwnagotchi/ui/hw/waveshare2in36g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in36g(DisplayImpl): + def __init__(self, config): + super(Waveshare2in36g, self).__init__(config, 'waveshare2in36g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 168 + self._layout['height'] = 296 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 168, 12] + self._layout['line2'] = [0, 116, 168, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2.36g inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v2in36g.epd2in36g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in66.py b/pwnagotchi/ui/hw/waveshare2in66.py index e69de29b..c6b86699 100644 --- a/pwnagotchi/ui/hw/waveshare2in66.py +++ b/pwnagotchi/ui/hw/waveshare2in66.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in66(DisplayImpl): + def __init__(self, config): + super(Waveshare2in66, self).__init__(config, 'waveshare2in66') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 152 + self._layout['height'] = 296 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 152, 12] + self._layout['line2'] = [0, 116, 152, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2.66 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v2in66.epd2in66 import EPD + self._display = EPD() + self._display.init(0) + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in66g.py b/pwnagotchi/ui/hw/waveshare2in66g.py new file mode 100644 index 00000000..bf34cca9 --- /dev/null +++ b/pwnagotchi/ui/hw/waveshare2in66g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in66g(DisplayImpl): + def __init__(self, config): + super(Waveshare2in66g, self).__init__(config, 'waveshare2in66g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 152 + self._layout['height'] = 296 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 152, 12] + self._layout['line2'] = [0, 116, 152, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2.66 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v2in66g.epd2in66g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in7.py b/pwnagotchi/ui/hw/waveshare2in7.py index 0c2e98f6..9482103a 100644 --- a/pwnagotchi/ui/hw/waveshare2in7.py +++ b/pwnagotchi/ui/hw/waveshare2in7.py @@ -32,15 +32,15 @@ class Waveshare27inch(DisplayImpl): return self._layout def initialize(self): - logging.info("initializing waveshare V1 2.7 inch display") + logging.info("initializing waveshare 2.7 V1 inch display") from pwnagotchi.ui.hw.libs.waveshare.v2in7.epd2in7 import EPD self._display = EPD() self._display.init() - self._display.Clear(0xFF) + self._display.Clear() def render(self, canvas): buf = self._display.getbuffer(canvas) self._display.display(buf) def clear(self): - self._display.Clear(0xff) + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in9bc.py b/pwnagotchi/ui/hw/waveshare2in9bc.py index e69de29b..b3edf95f 100644 --- a/pwnagotchi/ui/hw/waveshare2in9bc.py +++ b/pwnagotchi/ui/hw/waveshare2in9bc.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in9bc(DisplayImpl): + def __init__(self, config): + super(Waveshare2in9bc, self).__init__(config, 'waveshare2in9bc') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 128 + self._layout['height'] = 296 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 128, 12] + self._layout['line2'] = [0, 116, 128, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2,9bc inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v2in9bc.epd2in9bc import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare2in9d.py b/pwnagotchi/ui/hw/waveshare2in9d.py index e69de29b..43c92aed 100644 --- a/pwnagotchi/ui/hw/waveshare2in9d.py +++ b/pwnagotchi/ui/hw/waveshare2in9d.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare2in9d(DisplayImpl): + def __init__(self, config): + super(Waveshare2in9d, self).__init__(config, 'waveshare2in9d') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 128 + self._layout['height'] = 296 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 80, 12] + self._layout['line2'] = [0, 116, 80, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 2.9d inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v2in9d.epd2in9d import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare3in0g.py b/pwnagotchi/ui/hw/waveshare3in0g.py index e69de29b..4c546f51 100644 --- a/pwnagotchi/ui/hw/waveshare3in0g.py +++ b/pwnagotchi/ui/hw/waveshare3in0g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare3in0g(DisplayImpl): + def __init__(self, config): + super(Waveshare3in0g, self).__init__(config, 'waveshare3in0g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 168 + self._layout['height'] = 400 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 168, 12] + self._layout['line2'] = [0, 116, 168, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 3.00g inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v3in0g.epd3in0g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare3in52.py b/pwnagotchi/ui/hw/waveshare3in52.py index e69de29b..d7d0d724 100644 --- a/pwnagotchi/ui/hw/waveshare3in52.py +++ b/pwnagotchi/ui/hw/waveshare3in52.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare3in52(DisplayImpl): + def __init__(self, config): + super(Waveshare3in52, self).__init__(config, 'waveshare3in52') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 240 + self._layout['height'] = 360 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 240, 12] + self._layout['line2'] = [0, 116, 240, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 3.52 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v3in52.epd3in52 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare3in7.py b/pwnagotchi/ui/hw/waveshare3in7.py index e69de29b..d36b6105 100644 --- a/pwnagotchi/ui/hw/waveshare3in7.py +++ b/pwnagotchi/ui/hw/waveshare3in7.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare3in7(DisplayImpl): + def __init__(self, config): + super(Waveshare3in7, self).__init__(config, 'waveshare3in7') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 280 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 280, 12] + self._layout['line2'] = [0, 116, 280, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 3.7 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v3in7.epd3in7 import EPD + self._display = EPD() + self._display.init(0) + self._display.Clear(0) + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear(0) diff --git a/pwnagotchi/ui/hw/waveshare4in01f.py b/pwnagotchi/ui/hw/waveshare4in01f.py index e69de29b..caf2696a 100644 --- a/pwnagotchi/ui/hw/waveshare4in01f.py +++ b/pwnagotchi/ui/hw/waveshare4in01f.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in01f(DisplayImpl): + def __init__(self, config): + super(Waveshare4in01f, self).__init__(config, 'waveshare4in01f') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 640 + self._layout['height'] = 400 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 640, 12] + self._layout['line2'] = [0, 116, 640, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.01f inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in01f.epd4in01f import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in2.py b/pwnagotchi/ui/hw/waveshare4in2.py index e69de29b..f555d63e 100644 --- a/pwnagotchi/ui/hw/waveshare4in2.py +++ b/pwnagotchi/ui/hw/waveshare4in2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in2(DisplayImpl): + def __init__(self, config): + super(Waveshare4in2, self).__init__(config, 'waveshare4in2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 400 + self._layout['height'] = 300 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 400, 12] + self._layout['line2'] = [0, 116, 400, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in2.epd4in2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in26.py b/pwnagotchi/ui/hw/waveshare4in26.py index e69de29b..10133630 100644 --- a/pwnagotchi/ui/hw/waveshare4in26.py +++ b/pwnagotchi/ui/hw/waveshare4in26.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in26(DisplayImpl): + def __init__(self, config): + super(Waveshare4in26, self).__init__(config, 'waveshare4in26') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 800 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 800, 12] + self._layout['line2'] = [0, 116, 800, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.26 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in26.epd4in26 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in2_V2.py b/pwnagotchi/ui/hw/waveshare4in2_V2.py index e69de29b..92fc3e62 100644 --- a/pwnagotchi/ui/hw/waveshare4in2_V2.py +++ b/pwnagotchi/ui/hw/waveshare4in2_V2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in2V2(DisplayImpl): + def __init__(self, config): + super(Waveshare4in2V2, self).__init__(config, 'waveshare4in2_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 400 + self._layout['height'] = 300 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 400, 12] + self._layout['line2'] = [0, 116, 400, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.2 V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in2_v2.epd4in2_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in2b_V2.py b/pwnagotchi/ui/hw/waveshare4in2b_V2.py index e69de29b..07b611d5 100644 --- a/pwnagotchi/ui/hw/waveshare4in2b_V2.py +++ b/pwnagotchi/ui/hw/waveshare4in2b_V2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in2bV2(DisplayImpl): + def __init__(self, config): + super(Waveshare4in2bV2, self).__init__(config, 'waveshare4in2b_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 400 + self._layout['height'] = 300 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 400, 12] + self._layout['line2'] = [0, 116, 400, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.2b V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in2b_v2.epd4in2b_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in2bc.py b/pwnagotchi/ui/hw/waveshare4in2bc.py index e69de29b..7bbbe0f2 100644 --- a/pwnagotchi/ui/hw/waveshare4in2bc.py +++ b/pwnagotchi/ui/hw/waveshare4in2bc.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in2bc(DisplayImpl): + def __init__(self, config): + super(Waveshare4in2bc, self).__init__(config, 'waveshare4in2bc') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 400 + self._layout['height'] = 300 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 400, 12] + self._layout['line2'] = [0, 116, 400, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.2bc V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in2bc.epd4in2bc import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare4in37g.py b/pwnagotchi/ui/hw/waveshare4in37g.py index e69de29b..1f28282e 100644 --- a/pwnagotchi/ui/hw/waveshare4in37g.py +++ b/pwnagotchi/ui/hw/waveshare4in37g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare4in37g(DisplayImpl): + def __init__(self, config): + super(Waveshare4in37g, self).__init__(config, 'waveshare4in37g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 512 + self._layout['height'] = 368 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 512, 12] + self._layout['line2'] = [0, 116, 512, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 4.37g inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v4in37g.epd4in37g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare5in65f.py b/pwnagotchi/ui/hw/waveshare5in65f.py index e69de29b..e7c09b7c 100644 --- a/pwnagotchi/ui/hw/waveshare5in65f.py +++ b/pwnagotchi/ui/hw/waveshare5in65f.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare5in65f(DisplayImpl): + def __init__(self, config): + super(Waveshare5in65f, self).__init__(config, 'waveshare5in65f') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 600 + self._layout['height'] = 448 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 600, 12] + self._layout['line2'] = [0, 116, 600, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 5.65f inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v5in65f.epd5in65f import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare5in83.py b/pwnagotchi/ui/hw/waveshare5in83.py index e69de29b..46934aa4 100644 --- a/pwnagotchi/ui/hw/waveshare5in83.py +++ b/pwnagotchi/ui/hw/waveshare5in83.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare5in83(DisplayImpl): + def __init__(self, config): + super(Waveshare5in83, self).__init__(config, 'waveshare5in83') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 600 + self._layout['height'] = 448 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 600, 12] + self._layout['line2'] = [0, 116, 600, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 5.83 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v5in83.epd5in83 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare5in83_V2.py b/pwnagotchi/ui/hw/waveshare5in83_V2.py index e69de29b..d0d3f93a 100644 --- a/pwnagotchi/ui/hw/waveshare5in83_V2.py +++ b/pwnagotchi/ui/hw/waveshare5in83_V2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare5in83V2(DisplayImpl): + def __init__(self, config): + super(Waveshare5in83V2, self).__init__(config, 'waveshare5in83_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 648 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 648, 12] + self._layout['line2'] = [0, 116, 648, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 5.83 V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v5in83_v2.epd5in83_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare5in83b_V2.py b/pwnagotchi/ui/hw/waveshare5in83b_V2.py index e69de29b..a7f289d9 100644 --- a/pwnagotchi/ui/hw/waveshare5in83b_V2.py +++ b/pwnagotchi/ui/hw/waveshare5in83b_V2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare5in83bV2(DisplayImpl): + def __init__(self, config): + super(Waveshare5in83bV2, self).__init__(config, 'waveshare5in83b_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 648 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 648, 12] + self._layout['line2'] = [0, 116, 648, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 5.83b V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v5in83b_v2.epd5in83b_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare5in83bc.py b/pwnagotchi/ui/hw/waveshare5in83bc.py index e69de29b..58e86d82 100644 --- a/pwnagotchi/ui/hw/waveshare5in83bc.py +++ b/pwnagotchi/ui/hw/waveshare5in83bc.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare5in83bc(DisplayImpl): + def __init__(self, config): + super(Waveshare5in83bc, self).__init__(config, 'waveshare5in83bc') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 600 + self._layout['height'] = 448 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 600, 12] + self._layout['line2'] = [0, 116, 600, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 5.83bc inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v5in83bc.epd5in83bc import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in3f.py b/pwnagotchi/ui/hw/waveshare7in3f.py index e69de29b..fdbfccbd 100644 --- a/pwnagotchi/ui/hw/waveshare7in3f.py +++ b/pwnagotchi/ui/hw/waveshare7in3f.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in3f(DisplayImpl): + def __init__(self, config): + super(Waveshare7in3f, self).__init__(config, 'waveshare7in3f') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 800 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 800, 12] + self._layout['line2'] = [0, 116, 480, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.3f inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in3f.epd7in3f import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in3g.py b/pwnagotchi/ui/hw/waveshare7in3g.py index e69de29b..c1d7f557 100644 --- a/pwnagotchi/ui/hw/waveshare7in3g.py +++ b/pwnagotchi/ui/hw/waveshare7in3g.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in3g(DisplayImpl): + def __init__(self, config): + super(Waveshare7in3g, self).__init__(config, 'waveshare7in3g') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 800 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 800, 12] + self._layout['line2'] = [0, 116, 480, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.3g inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in3g.epd7in3g import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5.py b/pwnagotchi/ui/hw/waveshare7in5.py index e69de29b..f8492033 100644 --- a/pwnagotchi/ui/hw/waveshare7in5.py +++ b/pwnagotchi/ui/hw/waveshare7in5.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5, self).__init__(config, 'waveshare7in5') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 640 + self._layout['height'] = 384 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 640, 12] + self._layout['line2'] = [0, 116, 640, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.5 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5.epd7in5 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5_HD.py b/pwnagotchi/ui/hw/waveshare7in5_HD.py index e69de29b..4e0876ff 100644 --- a/pwnagotchi/ui/hw/waveshare7in5_HD.py +++ b/pwnagotchi/ui/hw/waveshare7in5_HD.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5HD(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5HD, self).__init__(config, 'waveshare7in5_HD') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 880 + self._layout['height'] = 528 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 880, 12] + self._layout['line2'] = [0, 116, 880, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.5HD inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5_HD.epd7in5_HD import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5_V2.py b/pwnagotchi/ui/hw/waveshare7in5_V2.py index e69de29b..3c3f00a1 100644 --- a/pwnagotchi/ui/hw/waveshare7in5_V2.py +++ b/pwnagotchi/ui/hw/waveshare7in5_V2.py @@ -0,0 +1,58 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5V2(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5V2, self).__init__(config, 'waveshare7in5_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 800 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 800, 12] + self._layout['line2'] = [0, 116, 800, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + if self.config['color'] == 'fast': + logging.info("initializing waveshare 7.5 V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5_v2.epd7in5_V2_fast import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + elif self.config['color'] == 'old': + logging.info("initializing waveshare 7.5 V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5_v2.epd7in5_V2_old import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + else: + logging.info("initializing waveshare 7.5 V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5_v2.epd7in5_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5b_HD.py b/pwnagotchi/ui/hw/waveshare7in5b_HD.py index e69de29b..a14161e4 100644 --- a/pwnagotchi/ui/hw/waveshare7in5b_HD.py +++ b/pwnagotchi/ui/hw/waveshare7in5b_HD.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5bHD(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5bHD, self).__init__(config, 'waveshare7in5b_HD') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 880 + self._layout['height'] = 528 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 880, 12] + self._layout['line2'] = [0, 116, 880, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.5b HD inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5b_HD.epd7in5b_HD import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5b_V2.py b/pwnagotchi/ui/hw/waveshare7in5b_V2.py index e69de29b..6f2dc68d 100644 --- a/pwnagotchi/ui/hw/waveshare7in5b_V2.py +++ b/pwnagotchi/ui/hw/waveshare7in5b_V2.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5bV2(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5bV2, self).__init__(config, 'waveshare7in5b_v2') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 800 + self._layout['height'] = 480 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 800, 12] + self._layout['line2'] = [0, 116, 800, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.5b V2 inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5b_v2.epd7in5b_V2 import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/ui/hw/waveshare7in5bc.py b/pwnagotchi/ui/hw/waveshare7in5bc.py index e69de29b..6bc743de 100644 --- a/pwnagotchi/ui/hw/waveshare7in5bc.py +++ b/pwnagotchi/ui/hw/waveshare7in5bc.py @@ -0,0 +1,45 @@ +import logging + +import pwnagotchi.ui.fonts as fonts +from pwnagotchi.ui.hw.base import DisplayImpl + + +class Waveshare7in5bc(DisplayImpl): + def __init__(self, config): + super(Waveshare7in5bc, self).__init__(config, 'waveshare7in5bc') + self._display = None + + def layout(self): + fonts.setup(10, 8, 10, 18, 25, 9) + self._layout['width'] = 640 + self._layout['height'] = 384 + self._layout['face'] = (0, 43) + self._layout['name'] = (0, 14) + self._layout['channel'] = (0, 0) + self._layout['aps'] = (0, 71) + self._layout['uptime'] = (0, 25) + self._layout['line1'] = [0, 12, 640, 12] + self._layout['line2'] = [0, 116, 640, 116] + self._layout['friend_face'] = (12, 88) + self._layout['friend_name'] = (1, 103) + self._layout['shakes'] = (26, 117) + self._layout['mode'] = (0, 117) + self._layout['status'] = { + 'pos': (65, 26), + 'font': fonts.status_font(fonts.Small), + 'max': 12 + } + return self._layout + + def initialize(self): + logging.info("initializing waveshare 7.5bc inch lcd display") + from pwnagotchi.ui.hw.libs.waveshare.v7in5bc.epd7in5bc import EPD + self._display = EPD() + self._display.init() + self._display.Clear() + + def render(self, canvas): + self._display.display(canvas) + + def clear(self): + self._display.Clear() diff --git a/pwnagotchi/utils.py b/pwnagotchi/utils.py index 83ee24f1..b58f59f1 100644 --- a/pwnagotchi/utils.py +++ b/pwnagotchi/utils.py @@ -259,7 +259,7 @@ def load_config(args): config['ui']['display']['type'] = 'waveshare_4' elif config['ui']['display']['type'] in ('ws_27inch', 'ws27inch', 'waveshare2in7', 'waveshare_27inch', 'waveshare27inch'): - config['ui']['display']['type'] = 'waveshare27inch' + config['ui']['display']['type'] = 'waveshare2in7' elif config['ui']['display']['type'] in ('ws_27inchv2', 'waveshare2in7_v2', 'ws27inchv2', 'waveshare_27inchv2', 'waveshare27inchv2'): config['ui']['display']['type'] = 'waveshare2in7_v2'