From 3d897431082ab37b681bcd8534c8d4986f8f71db Mon Sep 17 00:00:00 2001 From: Robb-Fr Date: Tue, 23 Apr 2024 14:02:55 +0200 Subject: [PATCH] refactors and adds tests for display --- display_controller/__init__.py | 7 ----- display_controller/__main__.py | 37 +++++------------------ display_controller/lib/__init__.py | 45 ++++++++++++++++++++++++++++ display_controller/test_display.bmp | Bin 0 -> 15662 bytes display_controller/tests.py | 41 +++++++++++++++++-------- 5 files changed, 81 insertions(+), 49 deletions(-) create mode 100644 display_controller/test_display.bmp diff --git a/display_controller/__init__.py b/display_controller/__init__.py index 122bdbf..e69de29 100644 --- a/display_controller/__init__.py +++ b/display_controller/__init__.py @@ -1,7 +0,0 @@ -import os -import sys - -picdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "pic") -libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "lib") -if os.path.exists(libdir): - sys.path.append(libdir) diff --git a/display_controller/__main__.py b/display_controller/__main__.py index cdc1398..72ae635 100644 --- a/display_controller/__main__.py +++ b/display_controller/__main__.py @@ -2,14 +2,15 @@ # -*- coding:utf-8 -*- import os import logging -from . import picdir -from .lib import parse_api_result +from .lib import create_to_display_image, parse_api_result, font from waveshare_epd import epd4in2 -from PIL import Image, ImageDraw, ImageFont logging.basicConfig(level=logging.DEBUG) +TEST_IMAGE_GEN = False RESULT_FILENAME = "api_result.tsv" +if TEST_IMAGE_GEN: + RESULT_FILENAME = "api_result_test.tsv" result_filepath = os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), @@ -31,33 +32,9 @@ epd.init() epd.Clear() - font31 = ImageFont.truetype(os.path.join(picdir, "Menlo.ttc"), 31) - - # Drawing the next transport departures - logging.info("Drawing the next transport departures...") - Bimage = Image.new("1", (epd.width, epd.height), 255) # 255: clear the frame - draw = ImageDraw.Draw(Bimage) - LINE_HEIGHT = 2 - PADDING_WITH_LINE = 16 - FONT_SIZE = 31 - for i, s in enumerate(to_display): - draw.text( - (0, i * (FONT_SIZE + LINE_HEIGHT + PADDING_WITH_LINE * 2)), - s, - font=font31, - fill=0, - ) - draw.rectangle( - ( - 20, - (FONT_SIZE + PADDING_WITH_LINE) - + i * (LINE_HEIGHT + PADDING_WITH_LINE * 2 + FONT_SIZE), - 400 - 20, - (FONT_SIZE + PADDING_WITH_LINE + LINE_HEIGHT) - + i * (LINE_HEIGHT + PADDING_WITH_LINE * 2 + FONT_SIZE), - ), - fill=0, - ) + Bimage = create_to_display_image(to_display, epd.width, epd.height, font) + if TEST_IMAGE_GEN: + Bimage.save("display_controller/test_display.bmp") epd.display(epd.getbuffer(Bimage)) logging.info("Goto Sleep...") diff --git a/display_controller/lib/__init__.py b/display_controller/lib/__init__.py index d89ad13..2bf878a 100644 --- a/display_controller/lib/__init__.py +++ b/display_controller/lib/__init__.py @@ -1,10 +1,23 @@ from typing import List import logging import os +from PIL import Image, ImageFont, ImageDraw +import sys MAX_NB_COLS = 4 MAX_DISPLAYED_LINES = 5 +picdir = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pic" +) +font = ImageFont.truetype(os.path.join(picdir, "Menlo.ttc"), 31) + +libdir = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "lib" +) +if os.path.exists(libdir): + sys.path.append(libdir) + def parse_api_result(result_filepath: str) -> List[str]: if not os.path.isfile(result_filepath): @@ -25,6 +38,7 @@ def parse_api_result(result_filepath: str) -> List[str]: line_direction = cols[1][:3] + ".." + cols[1][-3:] to_append = ( cols[0] + + " " * (3 - len(cols[0])) + " " + line_direction + " " @@ -34,3 +48,34 @@ def parse_api_result(result_filepath: str) -> List[str]: logging.info(f"appending {to_append}") to_display.append(to_append) return to_display + + +def create_to_display_image( + text_to_display: List[str], width: int, height: int, font: ImageFont.FreeTypeFont +) -> Image.Image: + # Drawing the next transport departures + logging.info("Drawing the next transport departures...") + Bimage = Image.new("1", (width, height), 255) # 255: clear the frame + draw = ImageDraw.Draw(Bimage) + LINE_HEIGHT = 2 + PADDING_WITH_LINE = 16 + FONT_SIZE = font.size + for i, s in enumerate(text_to_display): + draw.text( + (0, i * (FONT_SIZE + LINE_HEIGHT + PADDING_WITH_LINE * 2)), + s, + font=font, + fill=0, + ) + draw.rectangle( + ( + 20, + (FONT_SIZE + PADDING_WITH_LINE) + + i * (LINE_HEIGHT + PADDING_WITH_LINE * 2 + FONT_SIZE), + 400 - 20, + (FONT_SIZE + PADDING_WITH_LINE + LINE_HEIGHT) + + i * (LINE_HEIGHT + PADDING_WITH_LINE * 2 + FONT_SIZE), + ), + fill=0, + ) + return Bimage diff --git a/display_controller/test_display.bmp b/display_controller/test_display.bmp new file mode 100644 index 0000000000000000000000000000000000000000..67d329ad54a239bcfce083592fe6967f3cca6a59 GIT binary patch literal 15662 zcmeI3zmMBC6vyda0dEz$2W7_&MS*NLTu(rkPW@wU>yVrbq`+-a^B2{JJHX@p36bL= zVZ2EqoxCVxp*p?`M^vFlj$FKSH%WpsZtT>(G{Rh1MoGJAqUNiio z)Sf7H{f&Qpg>!mQa*s-n;U>np!}CF_s!KnF+S1NVUpCHatLCg9nozrok zVJxajReZWE+F8n2%5PM!JX5F4`LmKw7xQ%&7~Ixq^P(cg9#?E9VO-sxdZxHoxs>Vn zPTIck%mts~4gFKwO4DhtS6PN{1H&sSM2VSF(_vq(>cmc0Zz$Jkb6z%Xsmc*!G*>k; zT(Wb*v~)`_{ua1Ob^>E7ZznM8i(n_u)NE&q*{lN7Y1mnHZp}A~c5r_rFbjnS(=nR7 zSv87|bysWWHmEF4IC0$qb3RX*tE-gx*tvGZY`mTGd2I$etIdXO>TacB7oD7EZVVjD zm(U%XkHR$W?`@_F?LkY;No4A-vlV#VZFJ)d7&@cG?J<#AuT2=QovS%iDE z$9LFe+9R`|at_m=?ks=LdZq_c@|9r67IcQ%+rorim|@JgBg)pDft~(2UH3_;54Anl zbRv2FN_c;(4I3CS8)5W^QE7j&3d|df`*2yQW|%)W8RnAa5AxrjmfPCaE{xImK0q2Vu5j|bLl=D#2CaBSS?IaJPAIhXA*8kq2+b+J>TYjE<6?U&@Zb)?4QX85B0!*{e9i)eKpuW-j+=Q@CotwkadGJzl+#QbSvOx-1LKN%9hi(}dT*;x zx$CMHJFYI)8_v&Zrqwn>C5@}Ge)mj9{|w9@CEH=9yeIQ|V5};{PDV3bi4R_v3kAPX z>WNA9&sZ~EimwyKEw-4kX1bOYsn)fT#X9+ojpj7dwTvCDZzA*A)%AM6W?IP@)q2(S z^S9I<$PSDH?uDFYT2UEFy)M@4{(DWwR%wj4y_!j;V_(+oQDAyi(zqr(rwQmUD_ZoE>}K{J`ePWyGm1TmtS*p6Qj$9*P~_@LR#_}=!+$Ic|a zUboSX9yAl|tixth)J$ffLw%GQ^jxBumB}i?Pn?!HIrd4 zQjSu>j5JfF-_3Zu1^r{sq#H*}qM1;)ceCg>+MDXnM3QbXqM69oue>UVnn}8z8LA@^ zbe2CDy^Cf_nX6dQyp|EoBwJvxBfmN18PQCA@mHt-_NJo#$upvvTyAdPp_yFLr+#w| zX7A8UZdpm)!odSR4)6Q=0ga#hCeE710sqYsf86)r5dHQTE%Q{&efuSrJH-BpZM*O1 zN&iDts`lCt2pxS&OB9)iz$&mc+< zzr{0S`VvcPY)}*fgCkCTNsQZNL^JJY_y&ocLI3PBSdXGTmA(&SxDf9zz;9}Y5zX`( zjSoJEeq%e>T-ml0V)IOeVBf&l*r)b<4)wB!ADw`4;`eM$yT4X`m|4D^Mn~|rp`0( zqu*R{LpSzGn6YMRf5qiQGhvT05{a+Jn#qt`z{EavOPyh4pNTaS{}iK?k-N9$!0-`O zUiO*1X1YKYhTZ-|OeWpRWXe<4#7sVz#(|$4hd39WO8-2@j`#Zg-w&~W?%(>u9i#uR z52n~W_}~A8pXrD+HZOUeDHof!1Rk`E|J9vtmpspui_J?kQ!6W;n>mY+kCFBsLGs@H`Xy ztuN8GWS>d=Cb4;75l=p|nn~o(NHYnQ)l3qbH_}YPWHr+; nw^Pj|Oja|A-X3WtVX~S@V)NXNW+L#Rnn{d}52iH*jkkXR2sKg$ literal 0 HcmV?d00001 diff --git a/display_controller/tests.py b/display_controller/tests.py index 8d46f23..843c034 100644 --- a/display_controller/tests.py +++ b/display_controller/tests.py @@ -1,26 +1,43 @@ import unittest import os -from lib import parse_api_result +from lib import create_to_display_image, parse_api_result, font +from lib.waveshare_epd import epd4in2 +from PIL import Image, ImageChops TEST_RESULT_FILENAME = "api_result_test.tsv" +TEST_IMAGE_FILENAME = "test_display.bmp" +test_result_filepath = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), + "api_fetcher", + TEST_RESULT_FILENAME, +) -class TestParse(unittest.TestCase): +test_image_filepath = os.path.join( + os.path.dirname(os.path.realpath(__file__)), TEST_IMAGE_FILENAME +) + + +class TestDisplayController(unittest.TestCase): def test_parse_result(self): - test_result_filepath = os.path.join( - os.path.dirname(os.path.dirname(os.path.realpath(__file__))), - "api_fetcher", - TEST_RESULT_FILENAME, - ) expected = [ - "6 Gen..age 10:46+1", - "3 Gra..tti 10:46+1", - "9 Ver..urs 10:46", - "6 Ver..age 10:47", - "10 Gen..ive 10:47", + "6 Gen..age 10:46+1", + "3 Gra..tti 10:46+1", + "9 Ver..urs 10:46", + "6 Ver..age 10:47", + "10 Gen..ive 10:47", ] self.assertEqual(parse_api_result(test_result_filepath), expected) + def test_generate_image(self): + to_display = parse_api_result(test_result_filepath) + epd = epd4in2.EPD() + + test_image = create_to_display_image(to_display, epd.width, epd.height, font) + with Image.open(test_image_filepath) as expected_image: + diff = ImageChops.difference(test_image, expected_image) + self.assertIsNone(diff.getbbox()) + if __name__ == "__main__": unittest.main()