Exemplo n.º 1
0
class HudServer(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.queue = queue
        self.assets_path = pathlib.Path(__file__).parent.absolute().as_posix()

    def run(self):
        self.button = Button("D0")
        self.led = LED("D1")
        self.miniscreen = Miniscreen()

        self.button.when_pressed = self.stop_blink

        while True:
            message = self.queue.get()
            if message is None:
                print('HUD Exiting')
                self.queue.task_done()
                break
            else:
                print('HUD Got message ', message)
                func = getattr(self, message)
                func()
                self.queue.task_done()

        return

    def welcome(self):
        print("HUD welcome")
        self.miniscreen.display_image_file(self.assets_path + "/welcome.gif")

    def start_blink(self):
        print("HUD blink")
        self.led.blink()
        self.miniscreen.display_multiline_text(
            "Blinking... Press button to stop", font_size=12)
        os.system("aplay " + self.assets_path + "/bell.wav")

    def stop_blink(self):
        print("HUD stop")
        self.led.off()
        os.system("espeak \"Excellent. I just turned off the led.\"")
        self.welcome()

    def goodbye(self):
        print("HUD goodbye")
        os.system("espeak \"Goodbye!\"")
Exemplo n.º 2
0
    def run(self):
        self.button = Button("D0")
        self.led = LED("D1")
        self.miniscreen = Miniscreen()

        self.button.when_pressed = self.stop_blink

        while True:
            message = self.queue.get()
            if message is None:
                print('HUD Exiting')
                self.queue.task_done()
                break
            else:
                print('HUD Got message ', message)
                func = getattr(self, message)
                func()
                self.queue.task_done()

        return
Exemplo n.º 3
0
import io
import serial
from pitop.miniscreen import Miniscreen
from PIL import Image, ImageDraw, ImageFont

# Serial setup
serialConf = serial.Serial('/dev/ttyAMA0', 9600, timeout=0.3)
serialio = io.TextIOWrapper(io.BufferedRWPair(serialConf, serialConf))

# Enable only NMEA sentences required
serialConf.write(b'$PMTK314,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1*34\r\n')

# pi-top[4] Miniscreen setup
ms = Miniscreen()
image = Image.new(
    ms.mode,
    ms.size,
)
canvas = ImageDraw.Draw(image)
ms.set_max_fps(1)

# NMEA sentences required
nmea_list = ['$GPGGA', '$GPGSA', '$GPRMC', '$GPZDA']


def speedCalc(data, u):
    #converts speed to user required units
    if u == 1:
        return f'{round((float(data) * 1.150779448),1)} MPH'
    elif u == 2:
        return f'{round((float(data) * 1.852),1)} KM/H'
Exemplo n.º 4
0
if not is_root():
    print("Admin access required - please run this script with 'sudo'.")
    exit()

# Define Giphy parameters
SEARCH_LIMIT = 10
SEARCH_TERM = "Monochrome"

CONFIG_FILE_PATH = "/etc/pt-miniscreen/settings.ini"
STARTUP_GIF_PATH = "/home/pi/miniscreen-startup.gif"

API_KEY = "<MY GIPHY KEY>"

# Define global variables
gif = None
miniscreen = Miniscreen()
req = PreparedRequest()
req.prepare_url(
    "http://api.giphy.com/v1/gifs/search",
    urlencode({
        "q": SEARCH_TERM,
        "api_key": API_KEY,
        "limit": f"{SEARCH_LIMIT}"
    }),
)


def display_instructions_dialog():
    miniscreen.select_button.when_pressed = play_random_gif
    miniscreen.cancel_button.when_pressed = None
    miniscreen.display_multiline_text("Press SELECT to load a random GIF!",
Exemplo n.º 5
0
    def __init__(self):
        from pitop.miniscreen import Miniscreen

        self._miniscreen = None
        if device_type() == DeviceName.pi_top_4.value:
            self._miniscreen = Miniscreen()
Exemplo n.º 6
0
    def run(self) -> int:
        def path_to_stored_file(arg_path):
            file_path = ""
            if isfile(arg_path):
                file_path = arg_path
            elif isdir(arg_path):
                file_path = join(arg_path, f"output_{strftime('%Y-%m-%d-%H-%M-%S')}")
            else:
                raise Exception(f"Invalid path: {arg_path}")
            return file_path

        try:
            from pitop.miniscreen import Miniscreen

            if self.args.oled_subcommand == "display":
                oled = Miniscreen()

                if self.args.force:
                    oled.set_control_to_pi()

                try:
                    print("Press Ctrl + C to exit.")

                    skip_timeout = False
                    if isfile(self.args.text) or is_url(self.args.text):
                        oled.play_animated_image_file(self.args.text)
                    else:
                        oled.display_multiline_text(
                            self.args.text, font_size=self.args.font_size
                        )

                    if not skip_timeout:
                        sleep(self.args.timeout)

                except KeyboardInterrupt:
                    pass

            elif self.args.oled_subcommand == "spi":
                oled = Miniscreen()

                if self.args.spi_bus is not None:
                    oled.spi_bus = self.args.spi_bus
                else:
                    print(oled.spi_bus)

            elif self.args.oled_subcommand == "capture":
                if self.args.capture_subcommand == "save":
                    file_path = path_to_stored_file(self.args.path)
                    extension = "PNG"
                    print(f"Saving capture to {file_path}.{extension}")
                    oled.image.save(f"{file_path}.{extension}")
                elif self.args.capture_subcommand == "start":
                    file_path = path_to_stored_file(self.args.path)
                    extension = "MP4"
                    print(f"Saving video capture to {file_path}.{extension}")
                    # TODO: configure video capture from OLED
                elif self.args.capture_subcommand == "stop":
                    print("Stopping video capture")
                    # TODO: configure video capture from OLED

            return 0
        except Exception as e:
            print(f"Error on pitop-oled.run: {e}")
            return 1
import queue, threading, io, serial, pynmea2
from time import sleep
import logging
from pitop.miniscreen import Miniscreen
from PIL import Image, ImageDraw, ImageFont

gpsSerial = serial.Serial('/dev/ttyS0', 9600, timeout=1.)
gpsIO = io.TextIOWrapper(io.BufferedRWPair(gpsSerial, gpsSerial))
gpsSerial.write(b'$PMTK314,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1*34\r\n')

ms = Miniscreen()
image = Image.new(
    ms.mode,
    ms.size,
)
canvas = ImageDraw.Draw(image)
ms.set_max_fps(60)

nmea_list = ['GGA', 'GSA', 'RMC', 'ZDA']
nmea_dict = {
    'latitude': "",
    'longitude': "",
    'speed': "",
    'date_time': "",
    'satelites': 0,
    'altitude': "",
    'fix': True,
    'fix_type': ""
}

q = queue.Queue()
Exemplo n.º 8
0
    def setUp(self):
        from pitop.miniscreen import Miniscreen

        self.miniscreen = Miniscreen()
Exemplo n.º 9
0
class OLEDTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        environ["SDL_VIDEODRIVER"] = "dummy"

    @classmethod
    def tearDownClass(cls):
        del environ["SDL_VIDEODRIVER"]

    def setUp(self):
        from pitop.miniscreen import Miniscreen

        self.miniscreen = Miniscreen()

    def tearDown(self):
        pass

    def get_bitmap_pix(self, file_path):
        bmp = Image.open(file_path).convert("1")
        bmp = bmp.point(lambda x: 0 if x == 0 else 1, "1")
        return self.miniscreen.core.canvas._pil_image_to_pix_arr(bmp)

    def compare_arrays(self, func_name, canvas_pix, bmp_pix):
        print("CANVAS:")
        print(canvas_pix)
        print("BITMAP:")
        print(bmp_pix)
        self.assertEqual(canvas_pix.all(), bmp_pix.all())

    def test_image(self):
        logo_path = root + "/assets/images/pi-top.png"
        img = Image.open(logo_path)
        canvas_pix = self.miniscreen.core.canvas.image(
            self.miniscreen.core.canvas.top_left(), img)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/pi-top.bmp")

        self.compare_arrays("image", canvas_pix, bmp_pix)

    def test_rectangle(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.rectangle(
            self.miniscreen.bounding_box)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/rectangle.bmp")

        self.compare_arrays("rectangle", canvas_pix, bmp_pix)

    def test_arc(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.arc(
            self.miniscreen.bounding_box, 0, 180)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/arc.bmp")

        self.compare_arrays("arc", canvas_pix, bmp_pix)

    def test_chord(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.chord(
            self.miniscreen.bounding_box, 0, 180)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/chord.bmp")

        self.compare_arrays("chord", canvas_pix, bmp_pix)

    def test_ellipse(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.ellipse(
            self.miniscreen.bounding_box)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/ellipse.bmp")

        self.compare_arrays("ellipse", canvas_pix, bmp_pix)

    def test_line(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.line(
            self.miniscreen.bounding_box)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/line.bmp")

        self.compare_arrays("line", canvas_pix, bmp_pix)

    def test_pieslice(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.pieslice(
            self.miniscreen.bounding_box, 0, 180)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/pieslice.bmp")

        self.compare_arrays("pieslice", canvas_pix, bmp_pix)

    def test_point(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.point(
            self.miniscreen.bounding_box)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/point.bmp")

        self.compare_arrays("point", canvas_pix, bmp_pix)

    def test_polygon(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.polygon(
            self.miniscreen.bounding_box)
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/polygon.bmp")

        self.compare_arrays("polygon", canvas_pix, bmp_pix)

    def test_text(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.text(
            self.miniscreen.core.canvas.top_left(), "test")
        bmp_pix = self.get_bitmap_pix(root + "/assets/bitmaps/text.bmp")

        self.compare_arrays("text", canvas_pix, bmp_pix)

    def test_multiline_text(self):
        self.miniscreen.reset()
        canvas_pix = self.miniscreen.core.canvas.multiline_text(
            self.miniscreen.core.canvas.top_left(), "Hello World!")
        bmp_pix = self.get_bitmap_pix(root +
                                      "/assets/bitmaps/multiline_text.bmp")

        self.compare_arrays("multiline_text", canvas_pix, bmp_pix)

    def test_max_fps(self):
        max_fps = 50
        self.miniscreen.reset()
        self.miniscreen.fps_regulator.set_max_fps(max_fps)
        max_sleep_time = self.miniscreen.fps_regulator.max_sleep_time
        self.assertEqual(max_sleep_time, 1 / max_fps)
Exemplo n.º 10
0
#!/usr/bin/env python3
from pitop.display import Display
from pitop.miniscreen import Miniscreen
from time import sleep

display = Display()

display.blank()

miniscreen = Miniscreen()
miniscreen.display_multiline_text("Hello, world!", font_size=20)
sleep(1)