mirror of
https://github.com/jayofelony/pwnagotchi.git
synced 2025-07-01 18:37:27 -04:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
c27cc0ac24 | |||
c9bdce0ea3 | |||
6422371346 | |||
3c5a95e0b8 | |||
18217119fc | |||
b03b3119c7 |
@ -7,7 +7,7 @@ It seems the Pi 5 is unable to run in monitor mode, will keep you updated on thi
|
|||||||
If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.6.4) and make sure you download the `armhf` version.
|
If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.6.4) and make sure you download the `armhf` version.
|
||||||
|
|
||||||
---
|
---
|
||||||
Download latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.6.2), and let it auto-update from here on out.
|
Download latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.6.7), and let it auto-update from here on out.
|
||||||
|
|
||||||
**Use RPi imager to flash, please don't flash a new user as this will mess with logs created.**
|
**Use RPi imager to flash, please don't flash a new user as this will mess with logs created.**
|
||||||
|
|
||||||
|
@ -172,11 +172,11 @@ def pwnagotchi_cli():
|
|||||||
% (pwnagotchi.__version__, latest_ver))
|
% (pwnagotchi.__version__, latest_ver))
|
||||||
# input validation
|
# input validation
|
||||||
if user_input.lower() in ('y', 'yes'):
|
if user_input.lower() in ('y', 'yes'):
|
||||||
|
if os.path.exists('/root/.auto-update'):
|
||||||
os.system("rm /root/.auto-update && systemctl restart pwnagotchi")
|
os.system("rm /root/.auto-update && systemctl restart pwnagotchi")
|
||||||
|
os.system("systemctl restart pwnagotchi")
|
||||||
print("Okay, give me a couple minutes. Just watch pwnlog while you wait.")
|
print("Okay, give me a couple minutes. Just watch pwnlog while you wait.")
|
||||||
elif user_input.lower() in ('n', 'no'): # using this elif for readability
|
|
||||||
print("Okay, guess not!")
|
print("Okay, guess not!")
|
||||||
else:
|
|
||||||
print("You are currently on the latest release, v%s." % pwnagotchi.__version__)
|
print("You are currently on the latest release, v%s." % pwnagotchi.__version__)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
__version__ = '2.6.7'
|
__version__ = '2.7.0'
|
||||||
|
BIN
pwnagotchi/locale/pt-br/LC_MESSAGES/voice.mo
Normal file
BIN
pwnagotchi/locale/pt-br/LC_MESSAGES/voice.mo
Normal file
Binary file not shown.
@ -10,98 +10,98 @@ msgstr ""
|
|||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2023-11-17 15:46+0100\n"
|
"POT-Creation-Date: 2023-11-17 15:46+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: Foxy <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
"Language: \n"
|
"Language: Portuguese (Brazil)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "ZzzzZZzzzzZzzz"
|
msgid "ZzzzZZzzzzZzzz"
|
||||||
msgstr ""
|
msgstr "ZzzzZZzzzzZzzz"
|
||||||
|
|
||||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||||
msgstr ""
|
msgstr "Olá, Eu sou Pwnagotchi! Iniciando ..."
|
||||||
|
|
||||||
msgid "New day, new hunt, new pwns!"
|
msgid "New day, new hunt, new pwns!"
|
||||||
msgstr ""
|
msgstr "Um novo dia, Uma nova caça e novos pwns!"
|
||||||
|
|
||||||
msgid "Hack the Planet!"
|
msgid "Hack the Planet!"
|
||||||
msgstr ""
|
msgstr "Burle o Planeta!"
|
||||||
|
|
||||||
msgid "AI ready."
|
msgid "AI ready."
|
||||||
msgstr ""
|
msgstr "IA pronta."
|
||||||
|
|
||||||
msgid "The neural network is ready."
|
msgid "The neural network is ready."
|
||||||
msgstr ""
|
msgstr "A rede neural está pronta."
|
||||||
|
|
||||||
msgid "Generating keys, do not turn off ..."
|
msgid "Generating keys, do not turn off ..."
|
||||||
msgstr ""
|
msgstr "Criando chaves, não desligue o sistema ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||||
msgstr ""
|
msgstr "Ei, canal {channel} está livre! Seu AP vai agradecer."
|
||||||
|
|
||||||
msgid "Reading last session logs ..."
|
msgid "Reading last session logs ..."
|
||||||
msgstr ""
|
msgstr "Lendo os logs da ultima sessão"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Read {lines_so_far} log lines so far ..."
|
msgid "Read {lines_so_far} log lines so far ..."
|
||||||
msgstr ""
|
msgstr "Leia {lines_so_far} linha de logs até agora ..."
|
||||||
|
|
||||||
msgid "I'm bored ..."
|
msgid "I'm bored ..."
|
||||||
msgstr ""
|
msgstr "Eu estou entediado ..."
|
||||||
|
|
||||||
msgid "Let's go for a walk!"
|
msgid "Let's go for a walk!"
|
||||||
msgstr ""
|
msgstr "Vamos ir numa caminhada!"
|
||||||
|
|
||||||
msgid "This is the best day of my life!"
|
msgid "This is the best day of my life!"
|
||||||
msgstr ""
|
msgstr "Esse é o melhor dia da minha vida!"
|
||||||
|
|
||||||
msgid "Shitty day :/"
|
msgid "Shitty day :/"
|
||||||
msgstr ""
|
msgstr "Dia ruim :/"
|
||||||
|
|
||||||
msgid "I'm extremely bored ..."
|
msgid "I'm extremely bored ..."
|
||||||
msgstr ""
|
msgstr "Eu estou extremamente entediado ..."
|
||||||
|
|
||||||
msgid "I'm very sad ..."
|
msgid "I'm very sad ..."
|
||||||
msgstr ""
|
msgstr "Eu estou muito triste ..."
|
||||||
|
|
||||||
msgid "I'm sad"
|
msgid "I'm sad"
|
||||||
msgstr ""
|
msgstr "Eu estou triste"
|
||||||
|
|
||||||
msgid "Leave me alone ..."
|
msgid "Leave me alone ..."
|
||||||
msgstr ""
|
msgstr "Me deixe em paz ..."
|
||||||
|
|
||||||
msgid "I'm mad at you!"
|
msgid "I'm mad at you!"
|
||||||
msgstr ""
|
msgstr "Eu estou bravo com você!"
|
||||||
|
|
||||||
msgid "I'm living the life!"
|
msgid "I'm living the life!"
|
||||||
msgstr ""
|
msgstr "Eu estou vivendo a vida!"
|
||||||
|
|
||||||
msgid "I pwn therefore I am."
|
msgid "I pwn therefore I am."
|
||||||
msgstr ""
|
msgstr "Eu pwn então Eu sou."
|
||||||
|
|
||||||
msgid "So many networks!!!"
|
msgid "So many networks!!!"
|
||||||
msgstr ""
|
msgstr "Tantas redes!!!"
|
||||||
|
|
||||||
msgid "I'm having so much fun!"
|
msgid "I'm having so much fun!"
|
||||||
msgstr ""
|
msgstr "Eu estou tendo muita diversão"
|
||||||
|
|
||||||
msgid "My crime is that of curiosity ..."
|
msgid "My crime is that of curiosity ..."
|
||||||
msgstr ""
|
msgstr "Meu crime é de curiosidade ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Hello {name}! Nice to meet you."
|
msgid "Hello {name}! Nice to meet you."
|
||||||
msgstr ""
|
msgstr "Olá {name}! É bom em conhecê-lo"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Yo {name}! Sup?"
|
msgid "Yo {name}! Sup?"
|
||||||
msgstr ""
|
msgstr "Ei {name}! Como vai?"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Hey {name} how are you doing?"
|
msgid "Hey {name} how are you doing?"
|
||||||
msgstr ""
|
msgstr "Ei {name} como você está indo?"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Unit {name} is nearby!"
|
msgid "Unit {name} is nearby!"
|
||||||
@ -121,115 +121,115 @@ msgstr ""
|
|||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "{name} missed!"
|
msgid "{name} missed!"
|
||||||
msgstr ""
|
msgstr "{name} errou!"
|
||||||
|
|
||||||
msgid "Missed!"
|
msgid "Missed!"
|
||||||
msgstr ""
|
msgstr "Errei!"
|
||||||
|
|
||||||
msgid "Good friends are a blessing!"
|
msgid "Good friends are a blessing!"
|
||||||
msgstr ""
|
msgstr "Bom amigos são uma bensão!"
|
||||||
|
|
||||||
msgid "I love my friends!"
|
msgid "I love my friends!"
|
||||||
msgstr ""
|
msgstr "Eu amo meus amigos!"
|
||||||
|
|
||||||
msgid "Nobody wants to play with me ..."
|
msgid "Nobody wants to play with me ..."
|
||||||
msgstr ""
|
msgstr "Ninguém quer brincar comigo ..."
|
||||||
|
|
||||||
msgid "I feel so alone ..."
|
msgid "I feel so alone ..."
|
||||||
msgstr ""
|
msgstr "Estou me sentindo sozinho"
|
||||||
|
|
||||||
msgid "Where's everybody?!"
|
msgid "Where's everybody?!"
|
||||||
msgstr ""
|
msgstr "Onde está todo mundo?!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Napping for {secs}s ..."
|
msgid "Napping for {secs}s ..."
|
||||||
msgstr ""
|
msgstr "Tirando uma soneca por {secs}s ..."
|
||||||
|
|
||||||
msgid "Zzzzz"
|
msgid "Zzzzz"
|
||||||
msgstr ""
|
msgstr "Zzzzz"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "ZzzZzzz ({secs}s)"
|
msgid "ZzzZzzz ({secs}s)"
|
||||||
msgstr ""
|
msgstr "ZzzZzzz ({secs}s)"
|
||||||
|
|
||||||
msgid "Good night."
|
msgid "Good night."
|
||||||
msgstr ""
|
msgstr "Boa noite."
|
||||||
|
|
||||||
msgid "Zzz"
|
msgid "Zzz"
|
||||||
msgstr ""
|
msgstr "Zzz"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Waiting for {secs}s ..."
|
msgid "Waiting for {secs}s ..."
|
||||||
msgstr ""
|
msgstr "Esperando por {secs}s ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Looking around ({secs}s)"
|
msgid "Looking around ({secs}s)"
|
||||||
msgstr ""
|
msgstr "Olhando por volta ({secs}s)"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Hey {what} let's be friends!"
|
msgid "Hey {what} let's be friends!"
|
||||||
msgstr ""
|
msgstr "Ei {what} vamos ser amigos!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Associating to {what}"
|
msgid "Associating to {what}"
|
||||||
msgstr ""
|
msgstr "Associando para {what}"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Yo {what}!"
|
msgid "Yo {what}!"
|
||||||
msgstr ""
|
msgstr "Ei {what}!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Just decided that {mac} needs no WiFi!"
|
msgid "Just decided that {mac} needs no WiFi!"
|
||||||
msgstr ""
|
msgstr "Apenas decidindo que {mac} não precisa de WiFi!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Deauthenticating {mac}"
|
msgid "Deauthenticating {mac}"
|
||||||
msgstr ""
|
msgstr "Desautenticando {mac}"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Kickbanning {mac}!"
|
msgid "Kickbanning {mac}!"
|
||||||
msgstr ""
|
msgstr "Banindo {mac}!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Cool, we got {num} new handshake{plural}!"
|
msgid "Cool, we got {num} new handshake{plural}!"
|
||||||
msgstr ""
|
msgstr "Legal, conseguimos {num} novos handshake{plural}!"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "You have {count} new message{plural}!"
|
msgid "You have {count} new message{plural}!"
|
||||||
msgstr ""
|
msgstr "Você tem {count} novas messagem{plural}!"
|
||||||
|
|
||||||
msgid "Oops, something went wrong ... Rebooting ..."
|
msgid "Oops, something went wrong ... Rebooting ..."
|
||||||
msgstr ""
|
msgstr "Oops, algo deu errado ... Reiniciando ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Uploading data to {to} ..."
|
msgid "Uploading data to {to} ..."
|
||||||
msgstr ""
|
msgstr "Enviando dados para {to} ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Downloading from {name} ..."
|
msgid "Downloading from {name} ..."
|
||||||
msgstr ""
|
msgstr "Instalando para {name} ..."
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Kicked {num} stations\n"
|
msgid "Kicked {num} stations\n"
|
||||||
msgstr ""
|
msgstr "Expulsei {num} estações\n"
|
||||||
|
|
||||||
msgid "Made >999 new friends\n"
|
msgid "Made >999 new friends\n"
|
||||||
msgstr ""
|
msgstr "Fiz >999 novos amigos\n"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Made {num} new friends\n"
|
msgid "Made {num} new friends\n"
|
||||||
msgstr ""
|
msgstr "Fiz {num} novos amigos\n"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Got {num} handshakes\n"
|
msgid "Got {num} handshakes\n"
|
||||||
msgstr ""
|
msgstr "Peguei {num} handshakes\n"
|
||||||
|
|
||||||
msgid "Met 1 peer"
|
msgid "Met 1 peer"
|
||||||
msgstr ""
|
msgstr "Encontrei 1 pessoa"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Met {num} peers"
|
msgid "Met {num} peers"
|
||||||
msgstr ""
|
msgstr "Encontrei {num} pessoas"
|
||||||
|
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -237,21 +237,24 @@ msgid ""
|
|||||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Estou navegando há {duration} e expulsei {deauthed} clientes! Também conheci "
|
||||||
|
"{associamos} novos amigos e comi {handshakes} handshakes! #pwnagotchi "
|
||||||
|
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||||
|
|
||||||
msgid "hours"
|
msgid "hours"
|
||||||
msgstr ""
|
msgstr "horas"
|
||||||
|
|
||||||
msgid "minutes"
|
msgid "minutes"
|
||||||
msgstr ""
|
msgstr "minutos"
|
||||||
|
|
||||||
msgid "seconds"
|
msgid "seconds"
|
||||||
msgstr ""
|
msgstr "segundos"
|
||||||
|
|
||||||
msgid "hour"
|
msgid "hour"
|
||||||
msgstr ""
|
msgstr "hora"
|
||||||
|
|
||||||
msgid "minute"
|
msgid "minute"
|
||||||
msgstr ""
|
msgstr "minuto"
|
||||||
|
|
||||||
msgid "second"
|
msgid "second"
|
||||||
msgstr ""
|
msgstr "segundo"
|
@ -11,10 +11,6 @@ from pwnagotchi import plugins
|
|||||||
import pwnagotchi.ui.faces as faces
|
import pwnagotchi.ui.faces as faces
|
||||||
from pwnagotchi.bettercap import Client
|
from pwnagotchi.bettercap import Client
|
||||||
|
|
||||||
from pwnagotchi.ui.components import Text
|
|
||||||
from pwnagotchi.ui.view import BLACK
|
|
||||||
import pwnagotchi.ui.fonts as fonts
|
|
||||||
|
|
||||||
|
|
||||||
class FixServices(plugins.Plugin):
|
class FixServices(plugins.Plugin):
|
||||||
__author__ = 'jayofelony'
|
__author__ = 'jayofelony'
|
||||||
@ -41,14 +37,12 @@ class FixServices(plugins.Plugin):
|
|||||||
self.isReloadingMon = False
|
self.isReloadingMon = False
|
||||||
self.connection = None
|
self.connection = None
|
||||||
self.LASTTRY = 0
|
self.LASTTRY = 0
|
||||||
self._status = "--"
|
|
||||||
self._count = 0
|
self._count = 0
|
||||||
|
|
||||||
def on_loaded(self):
|
def on_loaded(self):
|
||||||
"""
|
"""
|
||||||
Gets called when the plugin gets loaded
|
Gets called when the plugin gets loaded
|
||||||
"""
|
"""
|
||||||
self._status = "ld"
|
|
||||||
logging.info("[Fix_Services] plugin loaded.")
|
logging.info("[Fix_Services] plugin loaded.")
|
||||||
|
|
||||||
def on_ready(self, agent):
|
def on_ready(self, agent):
|
||||||
@ -59,10 +53,8 @@ class FixServices(plugins.Plugin):
|
|||||||
logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output))
|
logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output))
|
||||||
if ",UP," in str(cmd_output):
|
if ",UP," in str(cmd_output):
|
||||||
logging.info("wlan0mon is up.")
|
logging.info("wlan0mon is up.")
|
||||||
self._status = "up"
|
|
||||||
|
|
||||||
if len(self.pattern.findall(last_lines)) >= 3:
|
if len(self.pattern.findall(last_lines)) >= 3:
|
||||||
self._status = "XX"
|
|
||||||
if hasattr(agent, 'view'):
|
if hasattr(agent, 'view'):
|
||||||
display = agent.view()
|
display = agent.view()
|
||||||
display.set('status', 'Blind-Bug detected. Restarting.')
|
display.set('status', 'Blind-Bug detected. Restarting.')
|
||||||
@ -75,12 +67,10 @@ class FixServices(plugins.Plugin):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
logging.info("[Fix_Services] Logs look good!")
|
logging.info("[Fix_Services] Logs look good!")
|
||||||
self._status = ""
|
|
||||||
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
logging.error("[Fix_Services ip link show wlan0mon]: %s" % repr(err))
|
logging.error("[Fix_Services ip link show wlan0mon]: %s" % repr(err))
|
||||||
try:
|
try:
|
||||||
self._status = "xx"
|
|
||||||
self._tryTurningItOffAndOnAgain(agent)
|
self._tryTurningItOffAndOnAgain(agent)
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
logging.error("[Fix_Services OffNOn]: %s" % repr(err))
|
logging.error("[Fix_Services OffNOn]: %s" % repr(err))
|
||||||
@ -115,7 +105,7 @@ class FixServices(plugins.Plugin):
|
|||||||
other_last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10'],
|
other_last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10'],
|
||||||
stdout=subprocess.PIPE).stdout))[-10:])
|
stdout=subprocess.PIPE).stdout))[-10:])
|
||||||
other_other_last_lines = ''.join(
|
other_other_last_lines = ''.join(
|
||||||
list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/var/log/pwnagotchi.log'],
|
list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/home/pi/logs/pwnagotchi.log'],
|
||||||
stdout=subprocess.PIPE).stdout))[-10:])
|
stdout=subprocess.PIPE).stdout))[-10:])
|
||||||
# don't check if we ran a reset recently
|
# don't check if we ran a reset recently
|
||||||
logging.debug("[Fix_Services]**** epoch")
|
logging.debug("[Fix_Services]**** epoch")
|
||||||
@ -153,7 +143,6 @@ class FixServices(plugins.Plugin):
|
|||||||
logging.info("[Fix_Services] wifi.recon flip: success!")
|
logging.info("[Fix_Services] wifi.recon flip: success!")
|
||||||
if display:
|
if display:
|
||||||
display.update(force=True, new_data={"status": "Wifi recon flipped!",
|
display.update(force=True, new_data={"status": "Wifi recon flipped!",
|
||||||
"brcmfmac_status": self._status,
|
|
||||||
"face": faces.COOL})
|
"face": faces.COOL})
|
||||||
else:
|
else:
|
||||||
print("Wifi recon flipped\nthat was easy!")
|
print("Wifi recon flipped\nthat was easy!")
|
||||||
@ -223,12 +212,11 @@ class FixServices(plugins.Plugin):
|
|||||||
self.isReloadingMon = True
|
self.isReloadingMon = True
|
||||||
self.LASTTRY = time.time()
|
self.LASTTRY = time.time()
|
||||||
|
|
||||||
self._status = "BL"
|
|
||||||
if hasattr(connection, 'view'):
|
if hasattr(connection, 'view'):
|
||||||
display = connection.view()
|
display = connection.view()
|
||||||
if display:
|
if display:
|
||||||
display.update(force=True, new_data={"status": "I'm blind! Try turning it off and on again",
|
display.update(force=True, new_data={"status": "I'm blind! Try turning it off and on again",
|
||||||
"brcmfmac_status": self._status, "face": faces.BORED})
|
"face": faces.BORED})
|
||||||
else:
|
else:
|
||||||
display = None
|
display = None
|
||||||
|
|
||||||
@ -271,7 +259,6 @@ class FixServices(plugins.Plugin):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
cmd_output = subprocess.check_output("monstop", shell=True)
|
cmd_output = subprocess.check_output("monstop", shell=True)
|
||||||
self._status = "dn"
|
|
||||||
self.logPrintView("info", "[Fix_Services] wlan0mon down and deleted: %s" % cmd_output,
|
self.logPrintView("info", "[Fix_Services] wlan0mon down and deleted: %s" % cmd_output,
|
||||||
display, {"status": "wlan0mon d-d-d-down!", "face": faces.BORED})
|
display, {"status": "wlan0mon d-d-d-down!", "face": faces.BORED})
|
||||||
except Exception as nope:
|
except Exception as nope:
|
||||||
@ -291,7 +278,6 @@ class FixServices(plugins.Plugin):
|
|||||||
cmd_output = subprocess.check_output("sudo modprobe -r brcmfmac", shell=True)
|
cmd_output = subprocess.check_output("sudo modprobe -r brcmfmac", shell=True)
|
||||||
self.logPrintView("info", "[Fix_Services] unloaded brcmfmac", display,
|
self.logPrintView("info", "[Fix_Services] unloaded brcmfmac", display,
|
||||||
{"status": "Turning it off #%s" % tries, "face": faces.SMART})
|
{"status": "Turning it off #%s" % tries, "face": faces.SMART})
|
||||||
self._status = "ul"
|
|
||||||
time.sleep(1 + tries)
|
time.sleep(1 + tries)
|
||||||
|
|
||||||
# reload the module
|
# reload the module
|
||||||
@ -300,7 +286,6 @@ class FixServices(plugins.Plugin):
|
|||||||
cmd_output = subprocess.check_output("sudo modprobe brcmfmac", shell=True)
|
cmd_output = subprocess.check_output("sudo modprobe brcmfmac", shell=True)
|
||||||
|
|
||||||
self.logPrintView("info", "[Fix_Services] reloaded brcmfmac")
|
self.logPrintView("info", "[Fix_Services] reloaded brcmfmac")
|
||||||
self._status = "rl"
|
|
||||||
time.sleep(10 + 4 * tries) # give it some time for wlan device to stabilize, or whatever
|
time.sleep(10 + 4 * tries) # give it some time for wlan device to stabilize, or whatever
|
||||||
|
|
||||||
# success! now make the mon0
|
# success! now make the mon0
|
||||||
@ -308,14 +293,12 @@ class FixServices(plugins.Plugin):
|
|||||||
cmd_output = subprocess.check_output("monstart", shell=True)
|
cmd_output = subprocess.check_output("monstart", shell=True)
|
||||||
self.logPrintView("info", "[Fix_Services interface add wlan0mon] worked #%s: %s"
|
self.logPrintView("info", "[Fix_Services interface add wlan0mon] worked #%s: %s"
|
||||||
% (tries, cmd_output))
|
% (tries, cmd_output))
|
||||||
self._status = "up"
|
|
||||||
time.sleep(tries + 5)
|
time.sleep(tries + 5)
|
||||||
try:
|
try:
|
||||||
# try accessing mon0 in bettercap
|
# try accessing mon0 in bettercap
|
||||||
result = connection.run("set wifi.interface wlan0mon")
|
result = connection.run("set wifi.interface wlan0mon")
|
||||||
if "success" in result:
|
if "success" in result:
|
||||||
logging.info("[Fix_Services set wifi.interface wlan0mon] worked!")
|
logging.info("[Fix_Services set wifi.interface wlan0mon] worked!")
|
||||||
self._status = ""
|
|
||||||
self._count = self._count + 1
|
self._count = self._count + 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
# stop looping and get back to recon
|
# stop looping and get back to recon
|
||||||
@ -354,7 +337,6 @@ class FixServices(plugins.Plugin):
|
|||||||
if tries < 3:
|
if tries < 3:
|
||||||
if display:
|
if display:
|
||||||
display.update(force=True, new_data={"status": "And back on again...",
|
display.update(force=True, new_data={"status": "And back on again...",
|
||||||
"brcmfmac_status": self._status,
|
|
||||||
"face": faces.INTENSE})
|
"face": faces.INTENSE})
|
||||||
else:
|
else:
|
||||||
print("And back on again...")
|
print("And back on again...")
|
||||||
@ -370,10 +352,8 @@ class FixServices(plugins.Plugin):
|
|||||||
result = connection.run("wifi.clear; wifi.recon on")
|
result = connection.run("wifi.clear; wifi.recon on")
|
||||||
|
|
||||||
if "success" in result: # and result["success"] is True:
|
if "success" in result: # and result["success"] is True:
|
||||||
self._status = ""
|
|
||||||
if display:
|
if display:
|
||||||
display.update(force=True, new_data={"status": "I can see again! (probably)",
|
display.update(force=True, new_data={"status": "I can see again! (probably)",
|
||||||
"brcmfmac_status": self._status,
|
|
||||||
"face": faces.HAPPY})
|
"face": faces.HAPPY})
|
||||||
else:
|
else:
|
||||||
print("I can see again")
|
print("I can see again")
|
||||||
@ -388,31 +368,9 @@ class FixServices(plugins.Plugin):
|
|||||||
logging.error("[Fix_Services wifi.recon on] %s" % repr(err))
|
logging.error("[Fix_Services wifi.recon on] %s" % repr(err))
|
||||||
pwnagotchi.reboot()
|
pwnagotchi.reboot()
|
||||||
|
|
||||||
# called to setup the ui elements
|
|
||||||
def on_ui_setup(self, ui):
|
|
||||||
with ui._lock:
|
|
||||||
# add custom UI elements
|
|
||||||
if "position" in self.options:
|
|
||||||
pos = self.options['position'].split(',')
|
|
||||||
pos = [int(x.strip()) for x in pos]
|
|
||||||
else:
|
|
||||||
pos = (ui.width() / 2 + 35, ui.height() - 11)
|
|
||||||
|
|
||||||
logging.info("Got here")
|
|
||||||
ui.add_element('brcmfmac_status', Text(color=BLACK, value='--', position=pos, font=fonts.Small))
|
|
||||||
|
|
||||||
# called when the ui is updated
|
|
||||||
def on_ui_update(self, ui):
|
|
||||||
# update those elements
|
|
||||||
if self._status:
|
|
||||||
ui.set('brcmfmac_status', "wlan0mon %s" % self._status)
|
|
||||||
else:
|
|
||||||
ui.set('brcmfmac_status', "rst#%s" % self._count)
|
|
||||||
|
|
||||||
def on_unload(self, ui):
|
def on_unload(self, ui):
|
||||||
with ui._lock:
|
with ui._lock:
|
||||||
try:
|
try:
|
||||||
ui.remove_element('brcmfmac_status')
|
|
||||||
logging.info("[Fix_Services] unloaded")
|
logging.info("[Fix_Services] unloaded")
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
logging.info("[Fix_Services] unload err %s " % repr(err))
|
logging.info("[Fix_Services] unload err %s " % repr(err))
|
||||||
|
@ -141,7 +141,7 @@ class MemTemp(plugins.Plugin):
|
|||||||
elif ui.is_inky():
|
elif ui.is_inky():
|
||||||
h_pos = (140, 68)
|
h_pos = (140, 68)
|
||||||
v_pos = (160, 54)
|
v_pos = (160, 54)
|
||||||
elif ui.is_waveshare27inch():
|
elif ui.is_waveshare2in7():
|
||||||
h_pos = (192, 138)
|
h_pos = (192, 138)
|
||||||
v_pos = (211, 122)
|
v_pos = (211, 122)
|
||||||
else:
|
else:
|
||||||
|
@ -1 +0,0 @@
|
|||||||
|
|
@ -20,46 +20,46 @@ from pwnagotchi.ui.hw.waveshare2in13b_V4 import Waveshare213bV4
|
|||||||
from pwnagotchi.ui.hw.waveshare3in5lcd import Waveshare35lcd
|
from pwnagotchi.ui.hw.waveshare3in5lcd import Waveshare35lcd
|
||||||
from pwnagotchi.ui.hw.spotpear24in import Spotpear24inch
|
from pwnagotchi.ui.hw.spotpear24in import Spotpear24inch
|
||||||
from pwnagotchi.ui.hw.displayhatmini import DisplayHatMini
|
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 import Waveshare154
|
||||||
from pwnagotchi.ui.hw.waveshare1in54_V2 import Waveshare154V2
|
from pwnagotchi.ui.hw.waveshare1in54_V2 import Waveshare154V2
|
||||||
from pwnagotchi.ui.hw.waveshare1in54b_V2 import Waveshare154bV2
|
from pwnagotchi.ui.hw.waveshare1in54b_V2 import Waveshare154bV2
|
||||||
# from pwnagotchi.ui.hw.waveshare1in54c import Waveshare154c
|
from pwnagotchi.ui.hw.waveshare1in54c import Waveshare1in54c
|
||||||
# from pwnagotchi.ui.hw.waveshare1in64g import Waveshare164g
|
from pwnagotchi.ui.hw.waveshare1in64g import Waveshare1in64g
|
||||||
from pwnagotchi.ui.hw.waveshare2in7b import Waveshare27b
|
from pwnagotchi.ui.hw.waveshare2in7b import Waveshare27b
|
||||||
from pwnagotchi.ui.hw.waveshare2in7b_V2 import Waveshare27bV2
|
from pwnagotchi.ui.hw.waveshare2in7b_V2 import Waveshare27bV2
|
||||||
from pwnagotchi.ui.hw.waveshare2in9b_V3 import Waveshare29bV3
|
from pwnagotchi.ui.hw.waveshare2in9b_V3 import Waveshare29bV3
|
||||||
from pwnagotchi.ui.hw.waveshare2in9b_V4 import Waveshare29bV4
|
from pwnagotchi.ui.hw.waveshare2in9b_V4 import Waveshare29bV4
|
||||||
# from pwnagotchi.ui.hw.waveshare2in9bc import Waveshare29bc
|
from pwnagotchi.ui.hw.waveshare2in9bc import Waveshare2in9bc
|
||||||
# from pwnagotchi.ui.hw.waveshare2in9d import Waveshare29d
|
from pwnagotchi.ui.hw.waveshare2in9d import Waveshare2in9d
|
||||||
from pwnagotchi.ui.hw.waveshare2in13b_V3 import Waveshare213bV3
|
from pwnagotchi.ui.hw.waveshare2in13b_V3 import Waveshare2in13bV3
|
||||||
# from pwnagotchi.ui.hw.waveshare2in23g import Waveshare223g
|
from pwnagotchi.ui.hw.waveshare2in23g import Waveshare2in23g
|
||||||
# from pwnagotchi.ui.hw.waveshare2in36g import Waveshare236g
|
from pwnagotchi.ui.hw.waveshare2in36g import Waveshare2in36g
|
||||||
# from pwnagotchi.ui.hw.waveshare2in66 import Waveshare266
|
from pwnagotchi.ui.hw.waveshare2in66 import Waveshare2in66
|
||||||
# from pwnagotchi.ui.hw.waveshare3in0g import Waveshare30g
|
from pwnagotchi.ui.hw.waveshare3in0g import Waveshare3in0g
|
||||||
# from pwnagotchi.ui.hw.waveshare3in7 import Waveshare37
|
from pwnagotchi.ui.hw.waveshare3in7 import Waveshare3in7
|
||||||
# from pwnagotchi.ui.hw.waveshare3in52 import Waveshare352
|
from pwnagotchi.ui.hw.waveshare3in52 import Waveshare3in52
|
||||||
# from pwnagotchi.ui.hw.waveshare4in01f import Waveshare401f
|
from pwnagotchi.ui.hw.waveshare4in01f import Waveshare4in01f
|
||||||
# from pwnagotchi.ui.hw.waveshare4in2 import Waveshare42inch
|
from pwnagotchi.ui.hw.waveshare4in2 import Waveshare4in2
|
||||||
# from pwnagotchi.ui.hw.waveshare4in2_V2 import Waveshare42V2
|
from pwnagotchi.ui.hw.waveshare4in2_V2 import Waveshare4in2V2
|
||||||
# from pwnagotchi.ui.hw.waveshare4in2b_V2 import Waveshare42bV2
|
from pwnagotchi.ui.hw.waveshare4in2b_V2 import Waveshare4in2bV2
|
||||||
# from pwnagotchi.ui.hw.waveshare4in2bc import Waveshare42bc
|
from pwnagotchi.ui.hw.waveshare4in2bc import Waveshare4in2bc
|
||||||
# from pwnagotchi.ui.hw.waveshare4in26 import Waveshare426
|
from pwnagotchi.ui.hw.waveshare4in26 import Waveshare4in26
|
||||||
# from pwnagotchi.ui.hw.waveshare4in37g import Waveshare437g
|
from pwnagotchi.ui.hw.waveshare4in37g import Waveshare4in37g
|
||||||
# from pwnagotchi.ui.hw.waveshare5in65f import Waveshare565f
|
from pwnagotchi.ui.hw.waveshare5in65f import Waveshare5in65f
|
||||||
# from pwnagotchi.ui.hw.waveshare5in83 import Waveshare583
|
from pwnagotchi.ui.hw.waveshare5in83 import Waveshare5in83
|
||||||
# from pwnagotchi.ui.hw.waveshare5in83_V2 import Waveshare583V2
|
from pwnagotchi.ui.hw.waveshare5in83_V2 import Waveshare5in83V2
|
||||||
# from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare583bV2
|
from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare5in83bV2
|
||||||
# from pwnagotchi.ui.hw.waveshare5in83b_V2 import Waveshare583bc
|
from pwnagotchi.ui.hw.waveshare5in83bc import Waveshare5in83bc
|
||||||
# from pwnagotchi.ui.hw.waveshare7in3f import Waveshare73f
|
from pwnagotchi.ui.hw.waveshare7in3f import Waveshare7in3f
|
||||||
# from pwnagotchi.ui.hw.waveshare7in3g import Waveshare73g
|
from pwnagotchi.ui.hw.waveshare7in3g import Waveshare7in3g
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5 import Waveshare75
|
from pwnagotchi.ui.hw.waveshare7in5 import Waveshare7in5
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5_HD import Waveshare75HD
|
from pwnagotchi.ui.hw.waveshare7in5_HD import Waveshare7in5HD
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5_V2 import Waveshare75V2
|
from pwnagotchi.ui.hw.waveshare7in5_V2 import Waveshare7in5V2
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5b_HD import Waveshare75bHD
|
from pwnagotchi.ui.hw.waveshare7in5b_HD import Waveshare7in5bHD
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5b_V2 import Waveshare75bV2
|
from pwnagotchi.ui.hw.waveshare7in5b_V2 import Waveshare7in5bV2
|
||||||
# from pwnagotchi.ui.hw.waveshare7in5bc import Waveshare75bc
|
from pwnagotchi.ui.hw.waveshare7in5bc import Waveshare7in5bc
|
||||||
# from pwnagotchi.ui.hw.waveshare13in3k import Waveshare133k
|
from pwnagotchi.ui.hw.waveshare13in3k import Waveshare13in3k
|
||||||
|
|
||||||
|
|
||||||
def display_for(config):
|
def display_for(config):
|
||||||
@ -155,100 +155,100 @@ def display_for(config):
|
|||||||
return DisplayHatMini(config)
|
return DisplayHatMini(config)
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare1in54c':
|
elif config['ui']['display']['type'] == 'waveshare1in54c':
|
||||||
return
|
return Waveshare1in54c
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare1in64g':
|
elif config['ui']['display']['type'] == 'waveshare1in64g':
|
||||||
return
|
return Waveshare1in64g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare1in02':
|
elif config['ui']['display']['type'] == 'waveshare1in02':
|
||||||
return
|
return Waveshare1in02
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in9bc':
|
elif config['ui']['display']['type'] == 'waveshare2in9bc':
|
||||||
return
|
return Waveshare2in9bc
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in9d':
|
elif config['ui']['display']['type'] == 'waveshare2in9d':
|
||||||
return
|
return Waveshare2in9d
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in13b_v3':
|
elif config['ui']['display']['type'] == 'waveshare2in13b_v3':
|
||||||
return
|
return Waveshare2in13bV3
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in23g':
|
elif config['ui']['display']['type'] == 'waveshare2in23g':
|
||||||
return
|
return Waveshare2in23g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in36g':
|
elif config['ui']['display']['type'] == 'waveshare2in36g':
|
||||||
return
|
return Waveshare2in36g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare2in66':
|
elif config['ui']['display']['type'] == 'waveshare2in66':
|
||||||
return
|
return Waveshare2in66
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare3in0g':
|
elif config['ui']['display']['type'] == 'waveshare3in0g':
|
||||||
return
|
return Waveshare3in0g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare3in7':
|
elif config['ui']['display']['type'] == 'waveshare3in7':
|
||||||
return
|
return Waveshare3in7
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare3in52':
|
elif config['ui']['display']['type'] == 'waveshare3in52':
|
||||||
return
|
return Waveshare3in52
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in01f':
|
elif config['ui']['display']['type'] == 'waveshare4in01f':
|
||||||
return
|
return Waveshare4in01f
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in2':
|
elif config['ui']['display']['type'] == 'waveshare4in2':
|
||||||
return
|
return Waveshare4in2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in2_v2':
|
elif config['ui']['display']['type'] == 'waveshare4in2_v2':
|
||||||
return
|
return Waveshare4in2V2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in2b_v2':
|
elif config['ui']['display']['type'] == 'waveshare4in2b_v2':
|
||||||
return
|
return Waveshare4in2bV2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in2bc':
|
elif config['ui']['display']['type'] == 'waveshare4in2bc':
|
||||||
return
|
return Waveshare4in2bc
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in26':
|
elif config['ui']['display']['type'] == 'waveshare4in26':
|
||||||
return
|
return Waveshare4in26
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare4in37g':
|
elif config['ui']['display']['type'] == 'waveshare4in37g':
|
||||||
return
|
return Waveshare4in37g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare5in65f':
|
elif config['ui']['display']['type'] == 'waveshare5in65f':
|
||||||
return
|
return Waveshare5in65f
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare5in83':
|
elif config['ui']['display']['type'] == 'waveshare5in83':
|
||||||
return
|
return Waveshare5in83
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare5in83_v2':
|
elif config['ui']['display']['type'] == 'waveshare5in83_v2':
|
||||||
return
|
return Waveshare5in83V2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare5in83b_v2':
|
elif config['ui']['display']['type'] == 'waveshare5in83b_v2':
|
||||||
return
|
return Waveshare5in83bV2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare5in83bc':
|
elif config['ui']['display']['type'] == 'waveshare5in83bc':
|
||||||
return
|
return Waveshare5in83bc
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in3f':
|
elif config['ui']['display']['type'] == 'waveshare7in3f':
|
||||||
return
|
return Waveshare7in3f
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in3g':
|
elif config['ui']['display']['type'] == 'waveshare7in3g':
|
||||||
return
|
return Waveshare7in3g
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5':
|
elif config['ui']['display']['type'] == 'waveshare7in5':
|
||||||
return
|
return Waveshare7in5
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5_HD':
|
elif config['ui']['display']['type'] == 'waveshare7in5_HD':
|
||||||
return
|
return Waveshare7in5HD
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5_v2':
|
elif config['ui']['display']['type'] == 'waveshare7in5_v2':
|
||||||
return
|
return Waveshare7in5V2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5b_HD':
|
elif config['ui']['display']['type'] == 'waveshare7in5b_HD':
|
||||||
return
|
return Waveshare7in5bHD
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5b_v2':
|
elif config['ui']['display']['type'] == 'waveshare7in5b_v2':
|
||||||
return
|
return Waveshare7in5bV2
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare7in5bc':
|
elif config['ui']['display']['type'] == 'waveshare7in5bc':
|
||||||
return
|
return Waveshare7in5bc
|
||||||
|
|
||||||
elif config['ui']['display']['type'] == 'waveshare13in3k':
|
elif config['ui']['display']['type'] == 'waveshare13in3k':
|
||||||
return
|
return Waveshare13in3k
|
||||||
|
@ -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 ###
|
|
||||||
|
|
@ -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 ###
|
|
@ -169,7 +169,7 @@ class EPD:
|
|||||||
# self.ReadBusy()
|
# self.ReadBusy()
|
||||||
|
|
||||||
def init(self, lut):
|
def init(self, lut):
|
||||||
if (epdconfig.module_init() != 0):
|
if epdconfig.module_init() != 0:
|
||||||
return -1
|
return -1
|
||||||
# EPD hardware init start
|
# EPD hardware init start
|
||||||
self.reset()
|
self.reset()
|
||||||
|
@ -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 ###
|
|
@ -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 ###
|
|
@ -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 ###
|
|
||||||
|
|
@ -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 ###
|
|
@ -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 ###
|
|
@ -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 ###
|
|
@ -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 ###
|
|
||||||
|
|
@ -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 ###
|
|
@ -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 ###
|
|
@ -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 ###
|
|
@ -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 ###
|
|
||||||
|
|
@ -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 ###
|
|
@ -498,7 +498,7 @@ class EPD:
|
|||||||
self.ReadBusy()
|
self.ReadBusy()
|
||||||
# pass
|
# pass
|
||||||
|
|
||||||
def Clear(self, color):
|
def Clear(self):
|
||||||
self.send_command(0x10)
|
self.send_command(0x10)
|
||||||
for i in range(0, int(self.width * self.height / 8)):
|
for i in range(0, int(self.width * self.height / 8)):
|
||||||
self.send_data(0xFF)
|
self.send_data(0xFF)
|
||||||
|
@ -227,7 +227,7 @@ class EPD:
|
|||||||
self.send_data((y >> 8) & 0xFF)
|
self.send_data((y >> 8) & 0xFF)
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
if (epdconfig.module_init() != 0):
|
if epdconfig.module_init() != 0:
|
||||||
return -1
|
return -1
|
||||||
# EPD hardware init start
|
# EPD hardware init start
|
||||||
self.reset()
|
self.reset()
|
||||||
|
@ -417,7 +417,7 @@ class EPD:
|
|||||||
self.send_command(0x20)
|
self.send_command(0x20)
|
||||||
self.ReadBusy()
|
self.ReadBusy()
|
||||||
|
|
||||||
def Clear(self, color, mode):
|
def Clear(self, mode):
|
||||||
self.send_command(0x4E)
|
self.send_command(0x4E)
|
||||||
self.send_data(0x00)
|
self.send_data(0x00)
|
||||||
self.send_data(0x00)
|
self.send_data(0x00)
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
import pwnagotchi.ui.fonts as fonts
|
|
||||||
from pwnagotchi.ui.hw.base import DisplayImpl
|
|
||||||
|
|
||||||
|
|
||||||
class WaveshareV1(DisplayImpl):
|
|
||||||
def __init__(self, config):
|
|
||||||
super(WaveshareV1, self).__init__(config, 'waveshare_1')
|
|
||||||
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['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):
|
|
||||||
if self.config['color'] == 'black':
|
|
||||||
logging.info("initializing waveshare v1 display in monochromatic mode")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v1.epd2in13 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)
|
|
||||||
elif self.config['color'] == 'fastAndFurious':
|
|
||||||
logging.info("initializing waveshare v1 3-color display in FAST MODE")
|
|
||||||
logging.info("THIS MAY BE POTENTIALLY DANGEROUS. NO WARRANTY IS PROVIDED")
|
|
||||||
logging.info("USE THIS DISPLAY IN THIS MODE AT YOUR OWN RISK")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v1.epd2in13bcFAST import EPD
|
|
||||||
self._display = EPD()
|
|
||||||
self._display.init()
|
|
||||||
self._display.Clear()
|
|
||||||
else:
|
|
||||||
logging.info("initializing waveshare v1 display 3-color mode")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v1.epd2in13bc import EPD
|
|
||||||
self._display = EPD()
|
|
||||||
self._display.init()
|
|
||||||
self._display.Clear()
|
|
||||||
|
|
||||||
def render(self, canvas):
|
|
||||||
if self.config['color'] == 'black':
|
|
||||||
buf = self._display.getbuffer(canvas)
|
|
||||||
self._display.display(buf)
|
|
||||||
elif self.config['color'] == 'fastAndFurious':
|
|
||||||
buf_black = self._display.getbuffer(canvas)
|
|
||||||
self._display.DisplayPartial(buf_black)
|
|
||||||
else:
|
|
||||||
buf_black = self._display.getbuffer(canvas)
|
|
||||||
self._display.displayBlack(buf_black)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self._display.Clear(0xff)
|
|
@ -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()
|
||||||
|
@ -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()
|
|
@ -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()
|
||||||
|
@ -42,5 +42,4 @@ class Waveshare144lcd(DisplayImpl):
|
|||||||
self._display.display(canvas)
|
self._display.display(canvas)
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
pass
|
self._display.clear()
|
||||||
#self._display.clear()
|
|
||||||
|
@ -32,10 +32,10 @@ class Waveshare154(DisplayImpl):
|
|||||||
return self._layout
|
return self._layout
|
||||||
|
|
||||||
def initialize(self):
|
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
|
from pwnagotchi.ui.hw.libs.waveshare.v1in54.epd1in54 import EPD
|
||||||
self._display = EPD()
|
self._display = EPD()
|
||||||
self._display.init()
|
self._display.init(0x00)
|
||||||
self._display.Clear()
|
self._display.Clear()
|
||||||
|
|
||||||
def render(self, canvas):
|
def render(self, canvas):
|
||||||
@ -43,4 +43,5 @@ class Waveshare154(DisplayImpl):
|
|||||||
self._display.display(buf, None)
|
self._display.display(buf, None)
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
|
# pass
|
||||||
self._display.Clear()
|
self._display.Clear()
|
||||||
|
@ -32,10 +32,10 @@ class Waveshare154V2(DisplayImpl):
|
|||||||
return self._layout
|
return self._layout
|
||||||
|
|
||||||
def initialize(self):
|
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
|
from pwnagotchi.ui.hw.libs.waveshare.v1in54_v2.epd1in54_V2 import EPD
|
||||||
self._display = EPD()
|
self._display = EPD()
|
||||||
self._display.init()
|
self._display.init(False)
|
||||||
self._display.Clear()
|
self._display.Clear()
|
||||||
|
|
||||||
def render(self, canvas):
|
def render(self, canvas):
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
import pwnagotchi.ui.fonts as fonts
|
|
||||||
from pwnagotchi.ui.hw.base import DisplayImpl
|
|
||||||
|
|
||||||
|
|
||||||
class WaveshareV2(DisplayImpl):
|
|
||||||
def __init__(self, config):
|
|
||||||
super(WaveshareV2, self).__init__(config, 'waveshare_2')
|
|
||||||
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 v2 display")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v2.waveshare import EPD
|
|
||||||
self._display = EPD()
|
|
||||||
self._display.init(self._display.FULL_UPDATE)
|
|
||||||
self._display.Clear(0xff)
|
|
||||||
self._display.init(self._display.PART_UPDATE)
|
|
||||||
|
|
||||||
def render(self, canvas):
|
|
||||||
buf = self._display.getbuffer(canvas)
|
|
||||||
self._display.displayPartial(buf)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self._display.Clear(0xff)
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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)
|
|
@ -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()
|
|
@ -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)
|
|
@ -5,9 +5,9 @@ from pwnagotchi.ui.hw.base import DisplayImpl
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
class Waveshare213bV3(DisplayImpl):
|
class Waveshare2in13bV3(DisplayImpl):
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
super(Waveshare213bV3, self).__init__(config, 'waveshare2in13b_v3')
|
super(Waveshare2in13bV3, self).__init__(config, 'waveshare2in13b_v3')
|
||||||
self._display = None
|
self._display = None
|
||||||
|
|
||||||
def layout(self):
|
def layout(self):
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
45
pwnagotchi/ui/hw/waveshare2in66g.py
Normal file
45
pwnagotchi/ui/hw/waveshare2in66g.py
Normal file
@ -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()
|
@ -32,15 +32,15 @@ class Waveshare27inch(DisplayImpl):
|
|||||||
return self._layout
|
return self._layout
|
||||||
|
|
||||||
def initialize(self):
|
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
|
from pwnagotchi.ui.hw.libs.waveshare.v2in7.epd2in7 import EPD
|
||||||
self._display = EPD()
|
self._display = EPD()
|
||||||
self._display.init()
|
self._display.init()
|
||||||
self._display.Clear(0xFF)
|
self._display.Clear()
|
||||||
|
|
||||||
def render(self, canvas):
|
def render(self, canvas):
|
||||||
buf = self._display.getbuffer(canvas)
|
buf = self._display.getbuffer(canvas)
|
||||||
self._display.display(buf)
|
self._display.display(buf)
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self._display.Clear(0xff)
|
self._display.Clear()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
import pwnagotchi.ui.fonts as fonts
|
|
||||||
from pwnagotchi.ui.hw.base import DisplayImpl
|
|
||||||
|
|
||||||
|
|
||||||
class WaveshareV3(DisplayImpl):
|
|
||||||
def __init__(self, config):
|
|
||||||
super(WaveshareV3, self).__init__(config, 'waveshare_3')
|
|
||||||
self._display = None
|
|
||||||
|
|
||||||
def layout(self):
|
|
||||||
fonts.setup(10, 8, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
return self._layout
|
|
||||||
|
|
||||||
def initialize(self):
|
|
||||||
logging.info("initializing waveshare v3 display")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v3.epd2in13_V3 import EPD
|
|
||||||
self._display = EPD()
|
|
||||||
self._display.init()
|
|
||||||
self._display.Clear(0xFF)
|
|
||||||
|
|
||||||
def render(self, canvas):
|
|
||||||
buf = self._display.getbuffer(canvas)
|
|
||||||
self._display.displayPartial(buf)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
#pass
|
|
||||||
self._display.Clear(0xFF)
|
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
import logging
|
|
||||||
|
|
||||||
import pwnagotchi.ui.fonts as fonts
|
|
||||||
from pwnagotchi.ui.hw.base import DisplayImpl
|
|
||||||
|
|
||||||
|
|
||||||
class WaveshareV4(DisplayImpl):
|
|
||||||
def __init__(self, config):
|
|
||||||
super(WaveshareV4, self).__init__(config, 'waveshare_4')
|
|
||||||
self._display = None
|
|
||||||
|
|
||||||
def layout(self):
|
|
||||||
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
|
|
||||||
}
|
|
||||||
return self._layout
|
|
||||||
|
|
||||||
def initialize(self):
|
|
||||||
logging.info("initializing waveshare v4 display")
|
|
||||||
from pwnagotchi.ui.hw.libs.waveshare.v4.epd2in13_V4 import EPD
|
|
||||||
self._display = EPD()
|
|
||||||
self._display.init()
|
|
||||||
self._display.Clear(0xFF)
|
|
||||||
|
|
||||||
def render(self, canvas):
|
|
||||||
buf = self._display.getbuffer(canvas)
|
|
||||||
self._display.displayPartial(buf)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self._display.Clear(0xFF)
|
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -240,7 +240,6 @@ def load_config(args):
|
|||||||
# the very first step is to normalize the display name, so we don't need dozens of if/elif around
|
# the very first step is to normalize the display name, so we don't need dozens of if/elif around
|
||||||
if config['ui']['display']['type'] in ('inky', 'inkyphat'):
|
if config['ui']['display']['type'] in ('inky', 'inkyphat'):
|
||||||
config['ui']['display']['type'] = 'inky'
|
config['ui']['display']['type'] = 'inky'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('papirus', 'papi'):
|
elif config['ui']['display']['type'] in ('papirus', 'papi'):
|
||||||
config['ui']['display']['type'] = 'papirus'
|
config['ui']['display']['type'] = 'papirus'
|
||||||
|
|
||||||
@ -259,14 +258,26 @@ def load_config(args):
|
|||||||
elif config['ui']['display']['type'] in ('ws_4', 'ws4', 'waveshare_4', 'waveshare4'):
|
elif config['ui']['display']['type'] in ('ws_4', 'ws4', 'waveshare_4', 'waveshare4'):
|
||||||
config['ui']['display']['type'] = 'waveshare_4'
|
config['ui']['display']['type'] = 'waveshare_4'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_27inch', 'ws27inch', 'waveshare_27inch', 'waveshare27inch'):
|
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', 'ws27inchv2', 'waveshare_27inchv2', 'waveshare27inchv2'):
|
elif config['ui']['display']['type'] in ('ws_27inchv2', 'waveshare2in7_v2', 'ws27inchv2', 'waveshare_27inchv2', 'waveshare27inchv2'):
|
||||||
config['ui']['display']['type'] = 'waveshare27inchv2'
|
config['ui']['display']['type'] = 'waveshare2in7_v2'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_29inch', 'ws29inch', 'waveshare_29inch', 'waveshare29inch'):
|
elif config['ui']['display']['type'] in ('ws_27inchbv2', 'waveshare2in7b_v2', 'ws27inchbv2', 'waveshare_27inchbv2', 'waveshare27inchbv2'):
|
||||||
config['ui']['display']['type'] = 'waveshare29inch'
|
config['ui']['display']['type'] = 'waveshare2in7b_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_29inch', 'waveshare2in9', 'ws29inch', 'waveshare_29inch', 'waveshare29inch'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_29inchv2', 'waveshare2in9_v2', 'ws29inchv2', 'waveshare_29inchv2', 'waveshare29inchv2'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_29inchbv3', 'waveshare2in9b_v3', 'ws29inchbv3', 'waveshare_29inchbv3', 'waveshare29inchbv3'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9b_v3'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_29inchbv4', 'waveshare2in9b_v4', 'ws29inchbv4', 'waveshare_29inchbv4', 'waveshare29inchbv4'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9b_v4'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in 'lcdhat':
|
elif config['ui']['display']['type'] in 'lcdhat':
|
||||||
config['ui']['display']['type'] = 'lcdhat'
|
config['ui']['display']['type'] = 'lcdhat'
|
||||||
@ -277,21 +288,29 @@ def load_config(args):
|
|||||||
elif config['ui']['display']['type'] in ('dfrobot_2', 'df2'):
|
elif config['ui']['display']['type'] in ('dfrobot_2', 'df2'):
|
||||||
config['ui']['display']['type'] = 'dfrobot_2'
|
config['ui']['display']['type'] = 'dfrobot_2'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_154inch', 'ws154inch', 'waveshare_154inch', 'waveshare154inch'):
|
elif config['ui']['display']['type'] in ('ws_154inch', 'waveshare1in54', 'ws154inch', 'waveshare_154inch', 'waveshare154inch'):
|
||||||
config['ui']['display']['type'] = 'waveshare154inch'
|
config['ui']['display']['type'] = 'waveshare1in54'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in (
|
elif config['ui']['display']['type'] in ('ws_154inchb', 'waveshare1in54b', 'ws154inchb', 'waveshare_154inchb', 'waveshare154inchb'):
|
||||||
'waveshare144lcd', 'ws_144inch', 'ws144inch', 'waveshare_144inch', 'waveshare144inch'):
|
config['ui']['display']['type'] = 'waveshare1in54b'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_154inchbv2', 'waveshare1in54bv2', 'ws154inchbv2', 'waveshare_154inchbv2', 'waveshare154inchbv2'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare1in54b_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('ws_154inchv2', 'waveshare1in54v2', 'ws154inchv2', 'waveshare_154inchv2', 'waveshare154inchv2'):
|
||||||
|
config['ui']['display']['type'] = 'waveshare1in54_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in ('waveshare144lcd', 'ws_144inch', 'ws144inch', 'waveshare_144inch', 'waveshare144inch'):
|
||||||
config['ui']['display']['type'] = 'waveshare144lcd'
|
config['ui']['display']['type'] = 'waveshare144lcd'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_213d', 'ws213d', 'waveshare_213d', 'waveshare213d'):
|
elif config['ui']['display']['type'] in ('ws_213d', 'ws213d', 'waveshare2in13d', 'waveshare_213d', 'waveshare213d'):
|
||||||
config['ui']['display']['type'] = 'waveshare213d'
|
config['ui']['display']['type'] = 'waveshare2in13d'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_213bc', 'ws213bc', 'waveshare_213bc', 'waveshare213bc'):
|
elif config['ui']['display']['type'] in ('ws_213bc', 'ws213bc', 'waveshare2in13bc', 'waveshare_213bc', 'waveshare213bc'):
|
||||||
config['ui']['display']['type'] = 'waveshare213bc'
|
config['ui']['display']['type'] = 'waveshare2in13bc'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in ('ws_213bv4', 'ws213bv4', 'waveshare_213bv4', 'waveshare213inb_v4'):
|
elif config['ui']['display']['type'] in ('ws_213bv4', 'waveshare2in13b_v4', 'ws213bv4', 'waveshare_213bv4', 'waveshare213inb_v4'):
|
||||||
config['ui']['display']['type'] = 'waveshare213inb_v4'
|
config['ui']['display']['type'] = 'waveshare2in13b_v4'
|
||||||
|
|
||||||
elif config['ui']['display']['type'] in 'spotpear24inch':
|
elif config['ui']['display']['type'] in 'spotpear24inch':
|
||||||
config['ui']['display']['type'] = 'spotpear24inch'
|
config['ui']['display']['type'] = 'spotpear24inch'
|
||||||
@ -302,6 +321,105 @@ def load_config(args):
|
|||||||
elif config['ui']['display']['type'] in 'waveshare35lcd':
|
elif config['ui']['display']['type'] in 'waveshare35lcd':
|
||||||
config['ui']['display']['type'] = 'waveshare35lcd'
|
config['ui']['display']['type'] = 'waveshare35lcd'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare1in54c':
|
||||||
|
config['ui']['display']['type'] = 'waveshare1in54c'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare1in64g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare1in64g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare1in02':
|
||||||
|
config['ui']['display']['type'] = 'waveshare1in02'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in9bc':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9bc'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in9d':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in9d'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in13b_v3':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in13b_v3'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in23g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in23g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in36g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in36g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare2in66':
|
||||||
|
config['ui']['display']['type'] = 'waveshare2in66'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare3in0g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare3in0g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare3in7':
|
||||||
|
config['ui']['display']['type'] = 'waveshare3in7'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare3in52':
|
||||||
|
config['ui']['display']['type'] = 'waveshare3in52'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in01f':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in01f'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in2_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in2_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in2b_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in2b_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in2bc':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in2bc'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in26':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in26'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare4in37g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare4in37g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare5in65f':
|
||||||
|
config['ui']['display']['type'] = 'waveshare5in65f'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare5in83':
|
||||||
|
config['ui']['display']['type'] = 'waveshare5in83'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare5in83_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare5in83_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare5in83b_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare5in83b_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare5in83bc':
|
||||||
|
config['ui']['display']['type'] = 'waveshare5in83bc'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in3f':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in3f'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in3g':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in3g'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5_HD':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5_HD'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5b_HD':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5b_HD'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5b_v2':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5b_v2'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare7in5bc':
|
||||||
|
config['ui']['display']['type'] = 'waveshare7in5bc'
|
||||||
|
|
||||||
|
elif config['ui']['display']['type'] in 'waveshare13in3k':
|
||||||
|
config['ui']['display']['type'] = 'waveshare13in3k'
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print("unsupported display type %s" % config['ui']['display']['type'])
|
print("unsupported display type %s" % config['ui']['display']['type'])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -326,7 +444,10 @@ def iface_channels(ifname):
|
|||||||
output = subprocess.getoutput("/sbin/iw phy%s channels | grep ' MHz' | grep -v disabled | sed 's/^.*\[//g' | sed s/\].*\$//g" % phy)
|
output = subprocess.getoutput("/sbin/iw phy%s channels | grep ' MHz' | grep -v disabled | sed 's/^.*\[//g' | sed s/\].*\$//g" % phy)
|
||||||
for line in output.split("\n"):
|
for line in output.split("\n"):
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
|
try:
|
||||||
channels.append(int(line))
|
channels.append(int(line))
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
return channels
|
return channels
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,8 +53,8 @@ classifiers = [
|
|||||||
[project.urls]
|
[project.urls]
|
||||||
Homepage = "https://pwnagotchi.ai/"
|
Homepage = "https://pwnagotchi.ai/"
|
||||||
Documentation = "https://pwnagotchi.ai/"
|
Documentation = "https://pwnagotchi.ai/"
|
||||||
Repository = "https://github.com/jayofelony/pwnagotchi-bookworm.git"
|
Repository = "https://github.com/jayofelony/pwnagotchi-bookworm"
|
||||||
"Bug Tracker" = "https://github.com/jayofelony/pwnagotchi-bookworm.git/issues"
|
"Bug Tracker" = "https://github.com/jayofelony/pwnagotchi-bookworm/issues"
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
pwnagotchi_cli = "bin.pwnagotchi:pwnagotchi_cli"
|
pwnagotchi_cli = "bin.pwnagotchi:pwnagotchi_cli"
|
Reference in New Issue
Block a user