Source code for pyfirmata_epd.epd
from time import sleep, time
from math import floor
try:
from pyfirmata import Board, util, STRING_DATA
except:
try:
from pyfirmata2 import Board, util, STRING_DATA
except:
print('You should install either pyfirmata or pyfirmata2!!')
MAX_DATA_BYTES, SERIAL_MESSAGE = 64, 0x60
[docs]
class Epd: # E Paper Display
"""
ePaper Display class
:param Board board: Arduino Board
"""
_current_state = 0
_last = False
def __init__(self, board):
self._board = board
self._board.add_cmd_handler(STRING_DATA, self._dataReceiver)
def _dataReceiver(self, *data):
try: msg = util.two_byte_iter_to_str(data)
except: return
if not msg.startswith('[epaperHandleMessage] '): return
if self._last != False: print(time() - self._last, msg)
else: print(msg)
self._last = time()
if msg == '[epaperHandleMessage] Done': self._current_state = 0
[docs]
def Reset(self):
"""Reset/Wakeup the ePaper-display. Actually runs Reset and Init on the display"""
self._current_state = 1 # Sending...
self._board.send_sysex(SERIAL_MESSAGE, [1]) # Reset
self._current_state = 2 # Sended
while self._current_state > 0: sleep(1)
[docs]
def DisplayFrame(self, black_image, red_image = None):
"""Send the image data to the ePaper-display to be shown
:param list[int] black_image: Black image data
:param list[int]|None red_image: Red image data (Optional)
"""
self._current_state = 1 # Sending...
self._board.send_sysex(SERIAL_MESSAGE, [4]) # Start black data
size = floor((MAX_DATA_BYTES - 2) / 2 / 8) * 8 # 24 probably
for b in range(0, len(black_image), size):
msg = [6]
for x in range(size):
if b + x >= len(black_image): break
msg.append(black_image[b + x] & 0x7F)
msg.append((black_image[b + x] >> 7) & 0x7F)
self._board.send_sysex(SERIAL_MESSAGE, msg) # DATA
self._board.send_sysex(SERIAL_MESSAGE, [7]) # Stop data
sleep(0.1)
if red_image is not None:
self._board.send_sysex(SERIAL_MESSAGE, [5]) # Start red data
for b in range(0, len(red_image), size):
msg = [6]
for x in range(size):
if b + x >= len(red_image): break
msg.append(red_image[b + x] & 0x7F)
msg.append((red_image[b + x] >> 7) & 0x7F)
self._board.send_sysex(SERIAL_MESSAGE, msg) # DATA
self._board.send_sysex(SERIAL_MESSAGE, [7]) # Stop data
sleep(0.1)
self._board.send_sysex(SERIAL_MESSAGE, [8]) # End message data
self._current_state = 2 # Sended
while self._current_state > 0: sleep(1)
[docs]
def Clear(self):
"""Clear the ePaper-display screen"""
self._current_state = 1 # Sending...
self._board.send_sysex(SERIAL_MESSAGE, [2]) # Clear
self._current_state = 2 # Sended
while self._current_state > 0: sleep(1)
[docs]
def Sleep(self):
"""Put the ePaper-display into deep sleep"""
self._current_state = 1 # Sending...
self._board.send_sysex(SERIAL_MESSAGE, [3]) # Sleep
self._current_state = 2 # Sended
while self._current_state > 0: sleep(1)