refactoring

This commit is contained in:
Simone Margaritelli 2019-09-28 20:17:45 +02:00
parent 395a8a909a
commit d3969444af
3 changed files with 87 additions and 57 deletions
sdcard/rootfs/root/pwnagotchi
config.yml
scripts/pwnagotchi/ui

@ -93,7 +93,7 @@ ui:
enabled: true
rotation: 180
# Possible options inkyphat/inky or waveshare/ws
type: 'ws'
type: 'waveshare'
# Possible options red/yellow/black (black used for monocromatic displays)
color: 'black'
video:

@ -79,6 +79,7 @@ class Display(View):
self._video_address = config['ui']['display']['video']['address']
self._display_type = config['ui']['display']['type']
self._display_color = config['ui']['display']['color']
self._render_cb = None
self._display = None
self._httpd = None
self.canvas = None
@ -100,18 +101,26 @@ class Display(View):
else:
core.log("could not get ip of usb0, video server not starting")
def _is_inky(self):
return self._display_type in ('inkyphat', 'inky')
def _is_waveshare(self):
return self._display_type in ('waveshare', 'ws')
def _init_display(self):
if self._display_type in ('inkyphat', 'inky'):
if self._is_inky():
from inky import InkyPHAT
self._display = InkyPHAT(self._display_color)
self._display.set_border(InkyPHAT.BLACK)
elif self._display_type in ('waveshare', 'ws'):
self._render_cb = self._inky_render
elif self._is_waveshare():
from pwnagotchi.ui.waveshare import EPD
# core.log("display module started")
self._display = EPD()
self._display.init(self._display.FULL_UPDATE)
self._display.Clear(WHITE)
self._display.init(self._display.PART_UPDATE)
self._render_cb = self._waveshare_render
else:
core.log("unknown display type %s" % self._display_type)
@ -125,40 +134,44 @@ class Display(View):
img = self.canvas if self._rotation == 0 else self.canvas.rotate(-self._rotation)
return img
def _inky_render(self):
if self._display_color != 'mono':
display_colors = 3
else:
display_colors = 2
imgbuf = self.canvas.convert('RGB').convert('P', palette=1, colors=display_colors)
if self._display_color == 'red':
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0, # index 1 is black
255, 0, 0 # index 2 is red
])
elif self._display_color == 'yellow':
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0, # index 1 is black
255, 255, 0 # index 2 is yellow
])
else:
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0 # index 1 is black
])
self._display.set_image(imgbuf)
self._display.show()
def _waveshare_render(self):
buf = self._display.getbuffer(self.canvas)
self._display.displayPartial(buf)
def _on_view_rendered(self, img):
# core.log("display::_on_view_rendered")
VideoHandler.render(img)
if self._enabled:
self.canvas = img if self._rotation == 0 else img.rotate(self._rotation)
if self._display_type == 'inkyphat':
if self._display_color != 'mono':
display_colors = 3
else:
display_colors = 2
imgbuf = self.canvas.convert('RGB').convert('P', palette=1, colors=display_colors)
if self._display_color == 'red':
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0, # index 1 is black
255, 0, 0 # index 2 is red
])
elif self._display_color == 'yellow':
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0, # index 1 is black
255, 255, 0 #index 2 is yellow
])
else:
imgbuf.putpalette([
255, 255, 255, # index 0 is white
0, 0, 0 # index 1 is black
])
self._display.set_image(imgbuf)
self._display.show()
else:
buf = self._display.getbuffer(self.canvas)
self._display.displayPartial(buf)
if self._render_cb is not None:
self._render_cb()

@ -15,6 +15,34 @@ from pwnagotchi.ui.state import State
WHITE = 0xff
BLACK = 0x00
def setup_display_specifics(config):
width = 0
height = 0
face_pos = (0, 0)
name_pos = (0, 0)
status_pos = (0, 0)
if config['ui']['display']['type'] in ('inky', 'inkyphat'):
fonts.setup(10, 8, 10, 25)
width = 212
height = 104
face_pos = (0, int(height / 4))
name_pos = (int(width / 2) - 15, int(height * .15))
status_pos = (int(width / 2) - 15, int(height * .30))
elif config['ui']['display']['type'] in ('ws', 'waveshare'):
fonts.setup(10, 9, 10, 35)
width = 250
height = 122
face_pos = (0, 40)
name_pos = (125, 20)
status_pos = (125, 35)
return width, height, face_pos, name_pos, status_pos
class View(object):
def __init__(self, config, state={}):
self._render_cbs = []
@ -22,24 +50,8 @@ class View(object):
self._canvas = None
self._lock = Lock()
if config['ui']['display']['type'] in ('inky', 'inkyphat'):
self._width = 212
self._height = 104
fonts.setup(10, 8, 10, 25)
face_pos = (0, int(self._height / 4))
name_pos = (int(self._width / 2) - 15, int(self._height * .15))
status_pos = (int(self._width /2) - 15, int(self._height * .30))
elif config['ui']['display']['type'] in ('ws', 'waveshare'):
self._width = 250
self._height = 122
fonts.setup(10, 9, 10, 35)
face_pos = (0, 40)
name_pos = (125, 20)
status_pos = (125, 35)
self._width, self._height, \
face_pos, name_pos, status_pos = setup_display_specifics(config)
self._state = State(state={
'channel': LabeledValue(color=BLACK, label='CH', value='00', position=(0, 0), label_font=fonts.Bold,
@ -47,15 +59,18 @@ class View(object):
'aps': LabeledValue(color=BLACK, label='APS', value='0 (00)', position=(30, 0), label_font=fonts.Bold,
text_font=fonts.Medium),
#'epoch': LabeledValue(color=BLACK, label='E', value='0000', position=(145, 0), label_font=fonts.Bold,
# 'epoch': LabeledValue(color=BLACK, label='E', value='0000', position=(145, 0), label_font=fonts.Bold,
# text_font=fonts.Medium),
'uptime': LabeledValue(color=BLACK, label='UP', value='00:00:00', position=(self._width - 65, 0), label_font=fonts.Bold,
'uptime': LabeledValue(color=BLACK, label='UP', value='00:00:00', position=(self._width - 65, 0),
label_font=fonts.Bold,
text_font=fonts.Medium),
# 'square': Rect([1, 11, 124, 111]),
'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK),
'line2': Line([0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)], color=BLACK),
'line2': Line(
[0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)],
color=BLACK),
# 'histogram': Histogram([4, 94], color = BLACK),
@ -68,9 +83,11 @@ class View(object):
# 'face2': Bitmap( '/root/pwnagotchi/data/images/face_happy.bmp', (0, 20)),
'status': Text(value=voice.default(), position=status_pos, color=BLACK, font=fonts.Medium),
'shakes': LabeledValue(label='PWND ', value='0 (00)', color=BLACK, position=(0, self._height - int(self._height * .12) + 1), label_font=fonts.Bold,
'shakes': LabeledValue(label='PWND ', value='0 (00)', color=BLACK,
position=(0, self._height - int(self._height * .12) + 1), label_font=fonts.Bold,
text_font=fonts.Medium),
'mode': Text(value='AUTO', position=(self._width - 25, self._height - int(self._height * .12) + 1), font=fonts.Bold, color=BLACK),
'mode': Text(value='AUTO', position=(self._width - 25, self._height - int(self._height * .12) + 1),
font=fonts.Bold, color=BLACK),
})
for key, value in state.items():