lag fixed and stockTicker.py refactored into a class

This commit is contained in:
Neythen 2021-04-26 20:27:34 +01:00
parent 086b22e776
commit 992251955d
4 changed files with 199 additions and 202 deletions

View File

@ -6,12 +6,16 @@
# permission of Daniel Richardson # permission of Daniel Richardson
from flask import Flask, render_template, request from flask import Flask, render_template, request
from stockTicker import runStockTicker, stopStockTicker from stockTicker import StockTicker
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
import os import os
import datetime import datetime
import threading import threading
import csv import csv
stock_ticker = StockTicker()
command = 300 command = 300
tickerList = 0 tickerList = 0
DelayTime = 20 DelayTime = 20
@ -124,12 +128,12 @@ def matrix():
global LastCommand global LastCommand
if "Run Display" in request.form: if "Run Display" in request.form:
pass pass
runStockTicker(command, DelayTime, speedTime) stock_ticker.runStockTicker(command, DelayTime, speedTime)
LastCommand = 'Run display' LastCommand = 'Run display'
elif "Stop Display (at next refresh)" in request.form: elif "Stop Display (at next refresh)" in request.form:
pass pass
try: try:
stopStockTicker() stock_ticker.stopStockTicker()
LastCommand = 'Stop display at next checkpoint' LastCommand = 'Stop display at next checkpoint'
except: except:
print("none running") print("none running")
@ -145,4 +149,4 @@ def matrix():
if __name__ == "__main__": if __name__ == "__main__":
app.run(host='0.0.0.0', port=1024, debug=True) app.run(host='0.0.0.0', port=1024, debug=True)
#sudo ./demo -D1 final.ppm -t 50 -m 25 --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256 #sudo ./demo -D1 final.ppm -t 50 -m 25 --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256 --led-slowdown-gpio=4

View File

@ -13,25 +13,27 @@ from PIL import Image, ImageDraw, ImageFont
import time import time
import csv import csv
#Define global resources class StockTicker():
symbols = [] def __init__(self):
ApiKeys = [["b1be6696d54342bdb5c8f59a052854fd","237d183faf984e7eba708a647c55153a","3012b3cb19784ed4be2b02e9907e53cb"],["f835e85df2a74df1904fe6dc53bcc17a","41ec268496744c34a96e3c408081300b","2d566fc71ade46d688713b13730c5219"]] #Define global resources
#ApiKeys = [["6172b84d1f464ad88b95ed52e4391bce","979f9b8c9ee748fbbb57cb490ccaaf42","593fa818a44144699b75433aafd92d15"] self.symbols = []
retrievedList = [] self.ApiKeys = [["b1be6696d54342bdb5c8f59a052854fd","237d183faf984e7eba708a647c55153a","3012b3cb19784ed4be2b02e9907e53cb"],["f835e85df2a74df1904fe6dc53bcc17a","41ec268496744c34a96e3c408081300b","2d566fc71ade46d688713b13730c5219"]]
greenORred = (255, 255, 255) #self.ApiKeys = [["6172b84d1f464ad88b95ed52e4391bce","979f9b8c9ee748fbbb57cb490ccaaf42","593fa818a44144699b75433aafd92d15"]
ListStocks = [] self.retrievedList = []
blank = Image.open('logos/blank.png') self.greenORred = (255, 255, 255)
ApiCalledError = False self.ListStocks = []
keySwapper = 0 self.blank = Image.open('logos/blank.png')
displayTime = 60 self.ApiCalledError = False
speedDisplay = 25 self.keySwapper = 0
running = True self.displayTime = 60
Delay = 20 self.speedDisplay = 25
parseCSV = 0 self.running = True
symbolLength = 0 self.Delay = 20
self.parseCSV = 0
self.symbolLength = 0
#Get the logo from file that is the same as ticker name #Get the logo from file that is the same as ticker name
def getLogo(Ticker): def getLogo(self, Ticker):
try: try:
Logo = Image.open('logos/' + Ticker + '.png') Logo = Image.open('logos/' + Ticker + '.png')
except: except:
@ -39,20 +41,20 @@ def getLogo(Ticker):
Logo = Image.open('logos/default.png') Logo = Image.open('logos/default.png')
return Logo return Logo
#Using change between min and day price give appropriate arrow #Using change between min and day price give appropriate arrow
#and set the overall change colour #and set the overall change colour
def getArrow(CHANGE): def getArrow(self, CHANGE):
global greenORred self.greenORred
if(CHANGE>0): if(CHANGE>0):
Arrow = Image.open('logos/up.png') Arrow = Image.open('logos/up.png')
greenORred = (0, 255, 0) self.greenORred = (0, 255, 0)
return Arrow, CHANGE return Arrow, CHANGE
Arrow = Image.open('logos/down.png') Arrow = Image.open('logos/down.png')
greenORred = (255, 0, 0) self.greenORred = (255, 0, 0)
CHANGE = (CHANGE * -1) CHANGE = (CHANGE * -1)
return Arrow, CHANGE return Arrow, CHANGE
def get_text_dimensions(text_string, font): def get_text_dimensions(self, text_string, font):
canvas = Image.new('RGB', (100,100)) canvas = Image.new('RGB', (100,100))
draw = ImageDraw.Draw(canvas) draw = ImageDraw.Draw(canvas)
@ -68,29 +70,29 @@ def get_text_dimensions(text_string, font):
return width,height return width,height
#Draw Ticker, current and change onto one image #Draw Ticker, current and change onto one image
def textToImage(TICKER, CURRENT, CHANGE, ARROW): def textToImage(self, TICKER, CURRENT, CHANGE, ARROW):
font = ImageFont.truetype("EncodeSans.ttf", 18) font = ImageFont.truetype("EncodeSans.ttf", 18)
img = Image.new('RGB', (150, 32)) img = Image.new('RGB', (150, 32))
d = ImageDraw.Draw(img) d = ImageDraw.Draw(img)
d.text((4, -4), TICKER, fill=(255, 255, 255), font=font) d.text((4, -4), TICKER, fill=(255, 255, 255), font=font)
d.text((4, 13), CURRENT, fill=greenORred, font=font) d.text((4, 13), CURRENT, fill=self.greenORred, font=font)
text_width_current, text_height = get_text_dimensions(CURRENT, font) text_width_current, text_height = self.get_text_dimensions(CURRENT, font)
img.paste(ARROW, ((text_width_current + 9),18)) img.paste(ARROW, ((text_width_current + 9),18))
d.text(((text_width_current+29), 13), CHANGE, fill=greenORred, font=font) d.text(((text_width_current+29), 13), CHANGE, fill=self.greenORred, font=font)
text_width_change, text_height = get_text_dimensions(CHANGE, font) text_width_change, text_height = self.get_text_dimensions(CHANGE, font)
newWidth = (text_width_current+29) + (text_width_change) newWidth = (text_width_current+29) + (text_width_change)
img.crop((0,0,newWidth,32)) img.crop((0,0,newWidth,32))
return img return img
#Stitch the logo & prices picture into one image #Stitch the logo & prices picture into one image
def stitchImage(IMAGES): def stitchImage(self, IMAGES):
widths, heights = zip(*(i.size for i in IMAGES)) widths, heights = zip(*(i.size for i in IMAGES))
total_width = sum(widths) total_width = sum(widths)
max_height = max(heights) max_height = max(heights)
@ -101,14 +103,14 @@ def stitchImage(IMAGES):
x_offset += im.size[0] x_offset += im.size[0]
return new_im return new_im
#Display the image onto the matrix #Display the image onto the matrix
def displayImage(IMAGE): def displayImage(self, IMAGE):
print('k') print('k')
return 0 return 0
#Get current prices and day prices for the ticker then format the response into an array #Get current prices and day prices for the ticker then format the response into an array
def getStockPrices(APIKEY, SYMBOLS): def getStockPrices(self, APIKEY, SYMBOLS):
global ApiCalledError
try: try:
symbols_list = SYMBOLS.split(",") symbols_list = SYMBOLS.split(",")
td = TDClient(apikey=APIKEY) td = TDClient(apikey=APIKEY)
@ -120,119 +122,110 @@ def getStockPrices(APIKEY, SYMBOLS):
del currentDayPriceList[0] del currentDayPriceList[0]
currentMinPriceClose = tmin[symbols_list[i]][0]['close'] currentMinPriceClose = tmin[symbols_list[i]][0]['close']
currentDayPriceClose = currentDayPriceList[0]['close'] currentDayPriceClose = currentDayPriceList[0]['close']
retrievedList.append([]) self.retrievedList.append([])
retrievedList[i].append(symbols_list[i]) self.retrievedList[i].append(symbols_list[i])
retrievedList[i].append(currentMinPriceClose) self.retrievedList[i].append(currentMinPriceClose)
retrievedList[i].append(currentDayPriceClose) self.retrievedList[i].append(currentDayPriceClose)
except: except:
ApiCalledError = True self.ApiCalledError = True
print("Could not fetch data - API CALLS REACHED? - Will display old image") print("Could not fetch data - API CALLS REACHED? - Will display old image")
#Connect all the pieces togeather creating 1 long final stock image #Connect all the pieces togeather creating 1 long final stock image
def GetfullStockImage(): def GetfullStockImage(self):
global ListStocks
global retrievedList self.ApiCalledError = False
global ApiCalledError self.ListStocks = []
ApiCalledError = False self.retrievedList = []
ListStocks = []
retrievedList = []
start = time.time() start = time.time()
print('elapsed time: ' + str((time.time()-start))) print('elapsed time: ' + str((time.time()-start)))
j=0 j=0
while (j<3): while (j<3):
print('API KEY: ' + str(ApiKeys[keySwapper][j])) print('API KEY: ' + str(self.ApiKeys[self.keySwapper][j]))
getStockPrices(ApiKeys[keySwapper][j], symbols[(j+parseCSV)][0]) self.getStockPrices(self.ApiKeys[self.keySwapper][j], self.symbols[(j+self.parseCSV)][0])
if (ApiCalledError == False): if (self.ApiCalledError == False):
j+=1 j+=1
print('elapsed time after api call: ' + str((time.time()-start))) print('elapsed time after api call: ' + str((time.time()-start)))
for i in range(len(retrievedList)): for i in range(len(self.retrievedList)):
print('elapsed timethrough loop: ' + str((time.time()-start))) print('elapsed timethrough loop: ' + str((time.time()-start)))
Change = float(retrievedList[i][1])-float(retrievedList[i][2]) #TEXT Change = float(self.retrievedList[i][1])-float(self.retrievedList[i][2]) #TEXT
Ticker = retrievedList[i][0] #TEXT Ticker = self.retrievedList[i][0] #TEXT
Current = '%.2f' % float(retrievedList[i][1]) #TEXT Current = '%.2f' % float(self.retrievedList[i][1]) #TEXT
Logo = getLogo(retrievedList[i][0]) Logo = self.getLogo(self.retrievedList[i][0])
Arrow, Change = getArrow(Change) Arrow, Change = self.getArrow(Change)
Change = '%.2f' % Change Change = '%.2f' % Change
MidFrame = textToImage(Ticker, Current, Change, Arrow) #IMAGE THE TEXT MidFrame = self.textToImage(Ticker, Current, Change, Arrow) #IMAGE THE TEXT
StitchedStock = stitchImage([Logo,MidFrame]) StitchedStock = self.stitchImage([Logo,MidFrame])
ListStocks.append(blank) self.ListStocks.append(self.blank)
ListStocks.append(StitchedStock) self.ListStocks.append(StitchedStock)
retrievedList = [] self.retrievedList = []
else: else:
break break
print('elapsed time loop ended: ' + str((time.time()-start))) print('elapsed time loop ended: ' + str((time.time()-start)))
if (ApiCalledError == False): if (self.ApiCalledError == False):
FinalDisplayImage = stitchImage(ListStocks) FinalDisplayImage = self.stitchImage(self.ListStocks)
FinalDisplayImage.save('final.ppm') FinalDisplayImage.save('final.ppm')
print(retrievedList) print(self.retrievedList)
#Send the final stitched image to the display for set amount of time #Send the final stitched image to the display for set amount of time
def displayMatrix(): def displayMatrix(self):
#os.system("sudo ./demo -D1 final.ppm -t " + str(displayTime) +" -m "+ str(speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256") #os.system("sudo ./demo -D1 final.ppm -t " + str(displayTime) +" -m "+ str(speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256")
os.system("sudo ./demo -D1 final.ppm -t " + str(displayTime) +" -m "+ str(speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=64 --led-cols=64") os.system("sudo ./demo -D1 final.ppm -t " + str(self.displayTime) +" -m "+ str(self.speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=64 --led-cols=64 --led-slowdown-gpio=4 ")
#Retrieve symbols from the CSV file #Retrieve symbols from the CSV file
def GetSymbols(): def GetSymbols(self):
global symbols
symbols = [] self.symbols = []
CSV = csv.reader(open('csv/tickers.csv', 'r')) CSV = csv.reader(open('csv/tickers.csv', 'r'))
z = 0 z = 0
for row in CSV: for row in CSV:
symbols.append([]) self.symbols.append([])
endLine = str(row[0]+','+row[1]+','+row[2]+','+row[3]+','+row[4]+','+row[5]+','+row[6]+','+row[7]+','+row[8]+','+row[9]+','+row[10]) endLine = str(row[0]+','+row[1]+','+row[2]+','+row[3]+','+row[4]+','+row[5]+','+row[6]+','+row[7]+','+row[8]+','+row[9]+','+row[10])
symbols[z].append(endLine) self.symbols[z].append(endLine)
z+=1 z+=1
print(symbols)
#Main run definition called by server print(self.symbols)
def runStockTicker(RUNTIME, DELAY, SPEEDTIME):
global keySwapper
global running
global displayTime
global symbolLength
global parseCSV
global Delay
global speedDisplay
parseCSV = 0 #Main run definition called by server
Delay = DELAY def runStockTicker(self, RUNTIME, DELAY, SPEEDTIME):
displayTime = RUNTIME
speedDisplay = SPEEDTIME self.parseCSV = 0
GetSymbols() self.Delay = DELAY
symbolLength = (len(symbols) - 3) self.displayTime = RUNTIME
GetfullStockImage() self.speedDisplay = SPEEDTIME
keySwapper += 1 self.GetSymbols()
running = True self.symbolLength = (len(self.symbols) - 3)
parseCSV += 3 self.GetfullStockImage()
self.keySwapper += 1
self.running = True
self.parseCSV += 3
while (True): while (True):
if (running == True): if (self.running == True):
if (keySwapper<=1): if (self.keySwapper<=1):
if(parseCSV <= symbolLength): if(self.parseCSV <= self.symbolLength):
th = threading.Thread(target=displayMatrix) th = threading.Thread(target=self.displayMatrix)
th.start() th.start()
#displayMatrix() #displayMatrix()
time.sleep((int(displayTime) - int(Delay))) time.sleep((int(self.displayTime) - int(self.Delay)))
GetfullStockImage() self.GetfullStockImage()
keySwapper += 1 self.keySwapper += 1
th.join() th.join()
parseCSV += 3 self.parseCSV += 3
else: else:
parseCSV = 0 self.parseCSV = 0
else: else:
keySwapper = 0 self.keySwapper = 0
else: else:
break; break;
#Change running to false stopping refresh at next checkpoint #Change running to false stopping refresh at next checkpoint
def stopStockTicker(): def stopStockTicker(self):
global running
global keySwapper self.keySwapper = 0
keySwapper = 0 self.running = False
running = False
print('MATRIX DISPLAY STOP CALLED') print('MATRIX DISPLAY STOP CALLED')

Binary file not shown.