Skip to content

Commit d3e3c41

Browse files
authored
Merge pull request #58 from TheFinalJoke/build_async_worker_polled
Added Polling
2 parents cceff2c + 36a0363 commit d3e3c41

File tree

6 files changed

+61
-27
lines changed

6 files changed

+61
-27
lines changed

main.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import asyncio
44
import configparser
5-
import os
5+
import sys
66
from rgbmatrix import (
77
RGBMatrixOptions,
88
RGBMatrix
@@ -32,6 +32,8 @@
3232
logger.addHandler(sh)
3333
logger.addHandler(filehandler)
3434

35+
class OledExecption(Exception):
36+
pass
3537
class Main():
3638
def __init__(self, config) -> None:
3739
self.config = config
@@ -40,6 +42,7 @@ def __init__(self, config) -> None:
4042
self.logger.setLevel(self.config['basic'].getint('loglevel'))
4143
else:
4244
self.logger.setLevel(10)
45+
self.poll = None
4346
self.logger.debug(f"Logger is set to {self.logger.getEffectiveLevel()}")
4447
def parse_config_file(self):
4548
module = {}
@@ -100,26 +103,48 @@ async def init_matrix(self, matrix):
100103
verified_modules.append(SportMatrix(matrix, modules['sport'], logger))
101104
self.logger.info("Initalized matrixes")
102105
return verified_modules
106+
107+
async def run_matrix_worker(self, matrix, polled_data):
108+
self.logger.debug("Starting Worker")
109+
# Need to make sure these need to be coroutines
110+
matrix.render(polled_data)
111+
112+
async def poll_api_worker(self, matrix):
113+
polled_data = await matrix.poll_api()
114+
return polled_data
103115

104-
async def main_run(self):
105-
self.logger.info("Starting OhMyOled")
106-
matrix = RGBMatrix(options=self.poll_rgbmatrix())
107-
self.logger.debug("Built Options for RGBMatrix")
108-
matrixes = await self.init_matrix(matrix)
109-
self.logger.info("Starting Matrixes...")
110-
while True:
111-
for matrix in matrixes:
112-
poll = await matrix.poll_api()
113-
matrix.render(poll)
116+
async def main_run(self, loop):
117+
try:
118+
self.logger.info("Starting OhMyOled")
119+
matrix = RGBMatrix(options=self.poll_rgbmatrix())
120+
self.logger.debug("Built Options for RGBMatrix")
121+
matrixes = await self.init_matrix(matrix)
122+
self.logger.info("Starting Matrixes...")
123+
first_poll = True
124+
while True:
125+
for index, matrix in enumerate(matrixes):
126+
if first_poll:
127+
self.poll = await matrix.poll_api()
128+
first_poll = False
129+
if index + 1 >= len(matrixes):
130+
tasks = [asyncio.create_task(matrix.render(self.poll, loop)), asyncio.create_task(matrixes[0].poll_api())]
131+
else:
132+
# Each one build a new function that can be called asynchrounously
133+
tasks = [asyncio.create_task(matrix.render(self.poll, loop)), asyncio.create_task(matrixes[index+1].poll_api())]
134+
_, self.poll = await asyncio.gather(*tasks)
135+
except Exception as E:
136+
logger.error(E)
137+
loop.stop()
114138

115139
if __name__ == "__main__":
116140
config = configparser.ConfigParser()
117141
logger.info("Pulling configuration /etc/ohmyoled/ohmyoled.conf")
118142
config.read('/etc/ohmyoled/ohmyoled.conf')
119143
main = Main(config)
144+
120145
loop = asyncio.get_event_loop()
121146
try:
122-
loop.create_task(main.main_run())
147+
loop.create_task(main.main_run(loop))
123148
loop.run_forever()
124149
except KeyboardInterrupt:
125150
logger.critical("Key Interrupt")

matrix/matrix.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
#!/usr/bin/python3
22

33
# ABS_Matrix -> Matrix_Module
4-
#
5-
#
6-
#
74
from abc import abstractmethod
5+
import asyncio
6+
import functools
87
import configparser
98
import logging
109
from sys import exec_prefix
@@ -134,8 +133,18 @@ def image_resize(self, width, height) -> None:
134133
self.set_image(self.image.resize((width, height), Image.ANTIALIAS))
135134
self.set_draw(ImageDraw.Draw(self.image))
136135

137-
def render_image(self, xoffset=0, yoffset=0):
138-
self.matrix.SetImage(self.get_image, offset_y=yoffset, offset_x=xoffset)
136+
async def render_image(self, loop=None, xoffset=0, yoffset=0):
137+
if not loop:
138+
loop = asyncio.get_event_loop()
139+
await loop.run_in_executor(
140+
None,
141+
functools.partial(
142+
self.matrix.SetImage,
143+
self.get_image,
144+
offset_x=xoffset,
145+
offset_y=yoffset
146+
)
147+
)
139148

140149
def draw_rectangle(self, position: List[Tuple]):
141150
"""

matrix/sport/sportmatrix.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def build_standings_image(self, api, xpos) -> Tuple[int, int]:
178178
)
179179
return standings_image, (0, 25)
180180

181-
def render(self, api):
181+
async def render(self, api, loop):
182182
self.clear()
183183
self.reload_image()
184184
if 'baseball'in api.sport:
@@ -199,7 +199,7 @@ def render(self, api):
199199
)
200200
for image, position in images:
201201
self.paste_image(image, position)
202-
self.render_image()
202+
await self.render_image()
203203
xpos +=1
204204
xpos_for_top += 1
205205
if xpos_for_top == 100:
@@ -208,7 +208,7 @@ def render(self, api):
208208
else:
209209
font = ImageFont.truetype("/usr/share/fonts/fonts/04b24.otf", 14)
210210
self.draw_multiline_text((0, 0), "Basketball\nOffseason", font=font)
211-
self.render_image()
211+
await self.render_image()
212212
time.sleep(30)
213213
if 'basketball' in api.sport:
214214
# Check Data if Offseason if yes Diplay Offseason, Otherwise Display Data

matrix/stock/stockmatrix.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def render_lowest_price(self, api) -> None:
148148
fill=(255,0,0)
149149
)
150150

151-
def render(self, api) -> None:
151+
async def render(self, api, loop) -> None:
152152
self.logger.info("Started Render for Stock Matrix")
153153
self.clear()
154154
self.reload_image()
@@ -157,5 +157,5 @@ def render(self, api) -> None:
157157
self.render_previous_close(api)
158158
self.render_highest_price(api)
159159
self.render_lowest_price(api)
160-
self.render_image()
160+
await self.render_image()
161161
time.sleep(30)

matrix/time.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async def poll_api(self):
3030
def build_fmt(self):
3131
return "%I:%M:%S %p" if TimeFormat.TWELEVE else "%H:%M:%S"
3232

33-
def render(self, poll):
33+
async def render(self, poll, loop):
3434
# Build something that Loads in corner for all the modules loaded
3535
self.logger.info("Running Module TimeMatrix")
3636
counter = 0
@@ -41,6 +41,6 @@ def render(self, poll):
4141
self.set_draw(ImageDraw.Draw(self.get_image))
4242
self.draw_text((3, 5), f"{self.return_time('%m/%d/%Y')}", font=font, fill=eval(self.config.get('color')))
4343
self.draw_text((8, 16), f"{self.return_time('%I:%M:%S')}", font=font, fill=eval(self.config.get('color')))
44-
self.render_image()
44+
await self.render_image()
4545
counter = counter + 1
4646
time.sleep(1)

matrix/weathermatrix.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def render_time(self, api: Weather):
105105
self.draw_text((7, 23), sunrise, font=font)
106106
self.draw_text((35, 18), "\uf044", font=ImageFont.truetype("/usr/share/fonts/weathericons.ttf", 11), fill=(255, 145, 0))
107107
self.draw_text((40, 23), sunset, font=font)
108-
def render(self, api: Weather):
108+
async def render(self, api: Weather, loop):
109109
self.logger.info("Rendering Weather Matrix")
110110
self.logger.debug("Clearing Image")
111111
self.clear()
@@ -115,7 +115,7 @@ def render(self, api: Weather):
115115
self.render_icon(api)
116116
self.render_location(api)
117117
self.logger.info("Loading Screen 1 of Matrix")
118-
self.render_image()
118+
await self.render_image()
119119
time.sleep(30)
120120
self.clear()
121121
self.logger.debug("Reloading Image in matrix")
@@ -126,6 +126,6 @@ def render(self, api: Weather):
126126
self.render_wind(api)
127127
self.render_time(api)
128128
self.logger.info("Loading Screen 2 of Matrix")
129-
self.render_image()
129+
await self.render_image()
130130
time.sleep(30)
131131

0 commit comments

Comments
 (0)