From 328d227b8fa6391e706807258c2628c6bb77b1ef Mon Sep 17 00:00:00 2001 From: Romain Bazile Date: Mon, 7 Jun 2021 13:36:24 +0200 Subject: [PATCH] display: detect display availability (cherry picked from commit 922b47ca8fdd495b8b2835e9ab5b6430982e1735) --- scripts/planktoscope/display.py | 130 +++++++++++++++++--------------- 1 file changed, 69 insertions(+), 61 deletions(-) diff --git a/scripts/planktoscope/display.py b/scripts/planktoscope/display.py index 067eb62..fbd9097 100644 --- a/scripts/planktoscope/display.py +++ b/scripts/planktoscope/display.py @@ -16,91 +16,99 @@ import planktoscope.uuidName class Display(object): + display_available = True + def __init__(self): # Raspberry Pi pin configuration: RST = None # on the PiOLED this pin isnt used + try: + # 128x32 display with hardware I2C: + self.__disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST) - # 128x32 display with hardware I2C: - self.__disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST) - - # Initialize library. - self.__disp.begin() - - self.display_machine_name() - logger.success("planktoscope.display is ready!") + # Initialize library. + self.__disp.begin() + self.display_machine_name() + logger.success("planktoscope.display is ready!") + except Exception as e: + logger.error("Could not detect the display") + self.display_available = False def display_machine_name(self): - self.__clear() - machineName = planktoscope.uuidName.machineName( - machine=planktoscope.uuidName.getSerial() - ) - self.display_text(machineName.replace(" ", "\n")) + if self.display_available: + self.__clear() + machineName = planktoscope.uuidName.machineName( + machine=planktoscope.uuidName.getSerial() + ) + self.display_text(machineName.replace(" ", "\n")) def display_text(self, message): - text = message.replace("\n", " ") - logger.info(f"Displaying message {text}") + if self.display_available: + text = message.replace("\n", " ") + logger.info(f"Displaying message {text}") - # Clear display. - self.__clear() - width = self.__disp.width - height = self.__disp.height + # Clear display. + self.__clear() + width = self.__disp.width + height = self.__disp.height - # Create blank image for drawing. - # Make sure to create image with mode '1' for 1-bit color. + # Create blank image for drawing. + # Make sure to create image with mode '1' for 1-bit color. - image = PIL.Image.new("1", (width, height)) + image = PIL.Image.new("1", (width, height)) - # Get drawing object to draw on image. - draw = PIL.ImageDraw.Draw(image) + # Get drawing object to draw on image. + draw = PIL.ImageDraw.Draw(image) - # Draw a black filled box to clear the image. - draw.rectangle((0, 0, width, height), outline=0, fill=0) + # Draw a black filled box to clear the image. + draw.rectangle((0, 0, width, height), outline=0, fill=0) - # Draw some shapes. - # First define some constants to allow easy resizing of shapes. - padding = -2 - top = padding - bottom = height - padding - # Move left to right keeping track of the current x position for drawing shapes. - x = 0 + # Draw some shapes. + # First define some constants to allow easy resizing of shapes. + padding = -2 + top = padding + bottom = height - padding + # Move left to right keeping track of the current x position for drawing shapes. + x = 0 - # Load default font. - font = PIL.ImageFont.truetype( - font="truetype/dejavu/DejaVuSansMono.ttf", size=15 - ) + # Load default font. + font = PIL.ImageFont.truetype( + font="truetype/dejavu/DejaVuSansMono.ttf", size=15 + ) - # Draw a black filled box to clear the image. - draw.rectangle((0, 0, width, height), outline=0, fill=0) + # Draw a black filled box to clear the image. + draw.rectangle((0, 0, width, height), outline=0, fill=0) - text_size = font.getsize_multiline(message) - x = width / 2 - text_size[0] / 2 + text_size = font.getsize_multiline(message) + x = width / 2 - text_size[0] / 2 - draw.text((x, 0), message, font=font, fill=255, align="center") + draw.text((x, 0), message, font=font, fill=255, align="center") - # draw.text((0, top + 15), "READY", font=font, fill=255) - # now = datetime.datetime.isoformat(datetime.datetime.now())[:-16] - # draw.text( - # (68, 0), - # now, - # font=PIL.ImageFont.truetype(font="truetype/dejavu/DejaVuSansMono.ttf", size=10), - # fill=255, - # ) - # draw.text((x, top + 16), str(Disk), font=font, fill=255) - # draw.text((x, top + 24), "wlan0:" + str(IP), font=font, fill=255) + # draw.text((0, top + 15), "READY", font=font, fill=255) + # now = datetime.datetime.isoformat(datetime.datetime.now())[:-16] + # draw.text( + # (68, 0), + # now, + # font=PIL.ImageFont.truetype(font="truetype/dejavu/DejaVuSansMono.ttf", size=10), + # fill=255, + # ) + # draw.text((x, top + 16), str(Disk), font=font, fill=255) + # draw.text((x, top + 24), "wlan0:" + str(IP), font=font, fill=255) - # Display image. - self.__disp.image(image) - self.__disp.display() + # Display image. + self.__disp.image(image) + self.__disp.display() def __clear(self): - logger.trace("Clear the display") - # Clear display. - self.__disp.clear() - self.__disp.display() + if self.display_available: + logger.trace("Clear the display") + # Clear display. + self.__disp.clear() + self.__disp.display() def stop(self): - logger.info("Display is out!") - self.display_text("Cut the power\nin 5s") + if self.display_available: + logger.info("Display is out!") + self.display_text("Cut the power\nin 5s") if __name__ == "__main__":