1
0
mirror of https://github.com/naruxde/revpi-revpiday2019.git synced 2025-11-08 15:03:51 +01:00
Files
revpi-revpiday2019/praezipos/praezipos_raspi.py
2019-09-28 12:21:06 +02:00

145 lines
4.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Praezipos system for raspberry pi with sense hat."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2019 Sven Sager"
__license__ = "GPLv3"
from enum import Enum
from revpimodio2 import RevPiNetIODriver
from sense_hat import SenseHat
class PixelColor(Enum):
WHITE = (127, 127, 127)
RED = (127, 0, 0)
GREEN = (0, 127, 0)
BLUE = (0, 0, 127)
YELLOW = (127, 127, 0)
BLACK = (0, 0, 0)
class MyDriver:
def __init__(self, revpi_address: str, virtual_device: str):
self.hat = SenseHat()
self.px_connected = [(0, 0)]
self.px_running = [(2, 0)]
self.px_error = [(7, 0)]
self.px_center = [(i, 4) for i in range(8)]
self.px_left3 = [(i, 1) for i in range(8)]
self.px_left2 = [(i, 2) for i in range(8)]
self.px_left1 = [(i, 3) for i in range(8)]
self.px_right1 = [(i, 5) for i in range(8)]
self.px_right2 = [(i, 6) for i in range(8)]
self.px_right3 = [(i, 7) for i in range(8)]
self.mrk_pos = None
# Connect to RevPiModIO
self.rpi = RevPiNetIODriver(
revpi_address, virtual_device,
autorefresh=True,
monitoring=True,
replace_io_file=":network:",
)
self.rpi.handlesignalend(self.stop)
def _set_px(self, pixels: list, color: PixelColor):
"""Global function to set a pixel map."""
for pixel in pixels:
self.hat.set_pixel(*pixel, color.value)
def on_load_pos(self, name: str, value: int):
if not self.rpi.io.program_running.value:
return
if self.rpi.io.forklift.value:
status = True
pos_px = None
if self.rpi.io.more_left:
status = False
if value < 2000:
pos_px = self.px_right1
elif value < 4000:
pos_px = self.px_right2
else:
pos_px = self.px_right3
if self.rpi.io.more_right:
status = False
print(value)
if value < -4000:
pos_px = self.px_left3
elif value < -2000:
pos_px = self.px_left2
else:
pos_px = self.px_left1
if self.mrk_pos != pos_px:
# Switch off old pixel
if self.mrk_pos:
self._set_px(self.mrk_pos, PixelColor.BLACK)
# Switch on new pixel
if pos_px:
self._set_px(pos_px, PixelColor.RED)
self.mrk_pos = pos_px
# Show center line
self._set_px(
self.px_center,
PixelColor.GREEN if status else PixelColor.BLUE
)
else:
self._set_px(self.px_center, PixelColor.BLACK)
if self.mrk_pos:
self._set_px(self.mrk_pos, PixelColor.BLACK)
def on_program_running(self, name, value):
self._set_px(self.px_running, PixelColor.GREEN if value else PixelColor.YELLOW)
def start(self):
self.rpi.io.program_running.reg_event(self.on_program_running, prefire=True)
self.rpi.io.load_pos.reg_event(self.on_load_pos, prefire=True)
self.rpi.mainloop(blocking=False)
while not self.rpi.exitsignal.wait(0.2):
self._set_px(
self.px_connected,
PixelColor.RED if self.rpi.reconnecting else PixelColor.GREEN
)
# Check for errors
if self.rpi.ioerrors > 0:
self.rpi.resetioerrors()
self._set_px(self.px_error, PixelColor.RED)
else:
self._set_px(self.px_error, PixelColor.GREEN)
self.hat.clear()
self.rpi.disconnect()
def stop(self):
self.rpi.setdefaultvalues()
if __name__ == '__main__':
from time import sleep
root = None
while root is None:
try:
while True:
root = MyDriver("192.168.1.2", "panel01")
root.start()
if not root.rpi.config_changed:
break
except Exception as e:
print(e)
sleep(5)