diff --git a/__pycache__/stockTicker.cpython-37.pyc b/__pycache__/stockTicker.cpython-37.pyc index 71a15fd..5fe368a 100644 Binary files a/__pycache__/stockTicker.cpython-37.pyc and b/__pycache__/stockTicker.cpython-37.pyc differ diff --git a/csv/tickers.csv b/csv/tickers.csv index 34210e2..4fd7c6e 100644 --- a/csv/tickers.csv +++ b/csv/tickers.csv @@ -1,11 +1,12 @@ -MSFT -NFLX -GOOG -TSLA -AAPL -INTC -TXN -HPQ -HOG -LUV -WMT +MSFT,248.07,249.06 +NFLX,502.91,504.99 +GOOG,2365.73,2368.42 +TSLA,671,681.06 +AAPL,129.37,129.2 +INTC,56.87,56.96 +TXN,180.66,181.01 +HPQ,34.04,34.24 +HOG,48.42,48.33 +LUV,61.4,60.77 +WMT,140.88,140.71 +BJ,45.06,45.17 diff --git a/final.ppm b/final.ppm index d5d8f0a..8eda2c8 100755 Binary files a/final.ppm and b/final.ppm differ diff --git a/server.py b/server.py index ea3ac1e..876dbde 100644 --- a/server.py +++ b/server.py @@ -16,6 +16,8 @@ import pexpect from multiprocessing import Process from subprocess import Popen, PIPE #stock_ticker = StockTicker() +api_caller = pexpect.spawn("sudo -E python3 api_caller.py") + command = 300 tickerList = 0 @@ -162,6 +164,7 @@ def matrix(): LastCommand = 'Run display' elif "Stop Display (at next refresh)" in request.form: pass + print('run display') #ticker.kill() try: #stock_ticker.stopStockTicker() diff --git a/stockTicker.py b/stockTicker.py index c607a41..e9d445d 100644 --- a/stockTicker.py +++ b/stockTicker.py @@ -13,9 +13,9 @@ from PIL import Image, ImageDraw, ImageFont import time import csv import requests - +import pexpect from rgbmatrix import RGBMatrix, RGBMatrixOptions -import finnhub + def getInput(Block=False): if Block or select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []): @@ -25,14 +25,13 @@ def getInput(Block=False): msg = '' return msg - + class StockTicker(): def __init__(self): #Define global resources self.symbols = [] - self.ApiKey = "c24qddqad3ickpckgg80" - self.SandboxApiKey = "sandbox_c24qddqad3ickpckgg8g" + self.greenORred = (255, 255, 255) #self.blank = Image.open('logos/blank.png') self.blank = Image.new('RGB', (0, 32)) @@ -49,7 +48,7 @@ class StockTicker(): options.hardware_mapping = 'adafruit-hat' # If you have an Adafruit HAT: 'adafruit-hat' options.gpio_slowdown = 3 self.matrix = RGBMatrix(options = options) - self.finnhubClient = finnhub.Client(api_key=self.ApiKey) + def openImage(self, image_file): image = Image.open(image_file) @@ -103,22 +102,30 @@ class StockTicker(): # use two image files and switch between them with a seemless transition current_img = 1 - + kill = False while True: if current_img == 1: - image = self.openImage(image_files[0]) + image1 = self.openImage(image_files[0]) + image2 = self.openImage(image_files[1]) elif current_img == 2: - image = self.openImage(image_files[1]) + image1 = self.openImage(image_files[1]) + image2 = self.openImage(image_files[0]) + + img_width, img_height = image1.size + print('wh:', self.matrix.width, self.matrix.height) - img_width, img_height = image.size - while offset_x > -img_width: offset_x -= 1 - - self.setImage(image, offset_x = offset_x, offset_y = offset_y) + + self.setImage(image1, offset_x = offset_x, offset_y = offset_y) + + if offset_x + img_width < self.matrix.width: # if the image is ending + self.setImage(image2, offset_x = offset_x + img_width, offset_y = offset_y) + + time.sleep(self.delay) @@ -126,6 +133,7 @@ class StockTicker(): msg = getInput() if msg == 'K': self.resetMatrix() + kill = True break elif msg == 's': @@ -141,6 +149,9 @@ class StockTicker(): except KeyboardInterrupt: sys.stdout.flush() pass + + + if kill: break if current_img == 1: @@ -223,26 +234,6 @@ class StockTicker(): print('width:', im.size[0]) return new_im - - #Get current prices and day prices for the ticker then format the response into an array - def getStockPrices(self, symbols): - apiCalledError = False - stock_info = [] - try: - quotes = [self.finnhubClient.quote(symbol) for symbol in symbols] - current_prices = [quote['c'] for quote in quotes] - opening_prices = [quote['o'] for quote in quotes] - - for i, symbol in enumerate(symbols): - stock_info.append([symbol, current_prices[i], opening_prices[i]]) - - - except Exception as e: - print("Could not fetch data - API CALLS REACHED? - Will display old image") - print(e) - apiCalledError = True - return stock_info, apiCalledError - def resetMatrix(self): for x in range(self.matrix.width): for y in range(self.matrix.height): @@ -256,45 +247,53 @@ class StockTicker(): image_list = [] start = time.time() - stock_info, apiCalledError = self.getStockPrices(self.symbols) + self.readCSV() - if (apiCalledError == False): - for i in range(len(stock_info)): - change = float(stock_info[i][1])-float(stock_info[i][2]) #TEXT - ticker = stock_info[i][0] #TEXT - current = '%.2f' % float(stock_info[i][1]) #TEXT + + for i, symbol in enumerate(self.symbols): + info = self.stock_info[symbol] + + change = float(info[0])-float(info[1]) #TEXT + ticker = symbol #TEXT + current = '%.2f' % float(info[0]) #TEXT - logo = self.getLogo(stock_info[i][0]) - arrow, change = self.getArrow(change) - change = '%.2f' % change - midFrame = self.textToImage(ticker, current, change, arrow) #IMAGE THE TEXT + logo = self.getLogo(symbol) + arrow, change = self.getArrow(change) + change = '%.2f' % change + midFrame = self.textToImage(ticker, current, change, arrow) #IMAGE THE TEXT - stitchedStock = self.stitchImage([logo,midFrame]) - image_list.append(self.blank) - image_list.append(stitchedStock) + stitchedStock = self.stitchImage([logo,midFrame]) + image_list.append(self.blank) + image_list.append(stitchedStock) - - print('elapsed time loop ended: ' + str((time.time()-start))) - if (apiCalledError == False): - finalDisplayImage = self.stitchImage(image_list) - finalDisplayImage.save('final.ppm') - - + finalDisplayImage = self.stitchImage(image_list) + finalDisplayImage.save('final.ppm') + #Send the final stitched image to the display for set amount of time 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(self.displayTime) +" -m "+ str(self.speedDisplay) +" --led-gpio-mapping=adafruit-hat --led-rows=64 --led-cols=64 --led-slowdown-gpio=4 ") self.scrollImageTransition(['final.ppm', 'final.ppm'], offset_x = 0, offset_y = 0) - #Retrieve symbols from the CSV file - def getSymbols(self): + #Retrieve symbols and stock info from the csv file + def readCSV(self): self.symbols = [] - CSV = csv.reader(open('csv/tickers.csv', 'r')) + self.stock_info = {} + f = open('csv/tickers.csv', 'r') + CSV = csv.reader(f) for row in CSV: print(row) - self.symbols.append(row[0]) - + try: + symbol, current_price, opening_price = row + self.symbols.append(symbol) + self.stock_info[symbol] = [current_price, opening_price] + except: + symbol = row[0] + self.symbols.append(symbol) + self.stock_info[symbol] = [] + + f.close() print(self.symbols) @@ -337,9 +336,11 @@ if __name__ == '__main__': #print(sys.stdin.readlines()) stock_ticker = StockTicker() - stock_ticker.getSymbols() - #stock_ticker.getFullStockImage() - #stock_ticker.displayMatrix() + #t = time.time() + #api_caller = pexpect.spawn("sudo -E python3 api_caller.py") + #print('time to call api', time.time()-t) + stock_ticker.getFullStockImage() + stock_ticker.displayMatrix() while True: