# Copyright (C) 2020 Daniel Richardson richardson.daniel@hotmail.co.uk # # This file is part of stockTicker project for justinodunn. # # stockTicker can not be copied and/or distributed without the express # permission of Daniel Richardson from flask import Flask, render_template, request from stockTicker import StockTicker from werkzeug.utils import secure_filename import os import datetime import threading import csv import pexpect import time import json 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 DelayTime = 20 LastCommand = '' speedTime = 25 LOGO_FOLDER = 'logos/' CSV_FOLDER = 'csv/new/' ALLOWED_EXTENSIONS = {'csv', 'png'} ticker = pexpect.spawn("sudo -E python3 stockTicker.py") ticker.sendline('A') # run by default def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def process_file(path, filename): default_csv = csv.writer(open('csv/tickers.csv', 'w')) new_csv = csv.reader(open((path), 'r')) for row in new_csv: default_csv.writerow(row) app = Flask(__name__) @app.route("/", methods=['GET', 'POST']) def hello(): global command now = datetime.datetime.now() timeString = now.strftime("%Y-%m-%d %H:%M") logos_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos') LogoList = os.listdir(logos_path) templateData = { 'title' : 'Stock Ticker Control Panel', 'time': timeString, 'runtime': command, 'tickers': tickerList, 'logofiles':LogoList, 'lastcommand':LastCommand, 'delay':DelayTime, 'speedtime':speedTime } return render_template('index.html', **templateData) @app.route("/Runtime", methods=['POST']) def Runtime(): command = request.form['text'] LastCommand = 'Change runtime' return hello() @app.route("/Delay", methods=['POST']) def Delay(): global DelayTime DelayTime = request.form['text'] global LastCommand LastCommand = 'Change Delay' return hello() @app.route("/Speed", methods=['POST']) def Speed(): global speed speed = request.form['text'] ticker.sendline(speed) f = open('csv/settings.csv', 'r') CSV = csv.reader(f) next(CSV) for line in CSV: _, brightness = line f.close() f = open('csv/settings.csv', 'w+') f.write('speed,brightness\n') f.write(str(speed) + ',' + brightness) f.close() global LastCommand LastCommand = 'Change Speed' return hello() @app.route("/Brightness", methods=['POST']) def Brightness(): global brightness brightness = int(request.form['text'])-1 ticker.sendline(str(brightness)) f = open('csv/settings.csv', 'r') CSV = csv.reader(f) next(CSV) for line in CSV: speed, _ = line f.close() f = open('csv/settings.csv', 'w+') f.write('speed,brightness\n') f.write(str(speed) + ',' + str(brightness)) f.close() global LastCommand LastCommand = 'Change Brightness' return hello() @app.route("/DisplayText", methods=['POST']) def DisplayText(): text = request.form['text'] f = open('csv/scroll_text.csv', 'w+') f.write(text) f.close() ticker.sendline('K') ticker.sendline('T') return hello() @app.route("/SetNews", methods=['POST']) def SetNews(): text = request.form['text'] #args = ['q', 'sources', 'category', 'country'] args = ['q', 'category', 'country'] arg_dict = {} lst = text.split(',') try: for i, arg in enumerate(args): if len(lst[i])>0: arg_dict[arg] = lst[i] json.dump( arg_dict, open( "csv/news_settings.json", 'w+' )) except Exception as e: #reset settings f = open( "csv/news_settings.json", 'w+' ) f.close() api_caller.sendline('R') return hello() @app.route("/SetWeather", methods=['POST']) def SetWeather(): text = request.form['text'] #args = ['q', 'sources', 'category', 'country'] f = open( "csv/weather_location.txt", 'w+' ) f.write(text) f.close() api_caller.sendline('R') return hello() @app.route("/DisplayGIF", methods=['POST']) def DisplayGIF(): if request.method == 'POST': if 'file' not in request.files: print('No file attached in request') return hello() fle = request.files['file'] if fle.filename == '': print('No file selected') return hello() if fle: filename = 'user_gif.gif' fle.save(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.path.join('display_images', filename))) global LastCommand LastCommand = 'Add a new logo file' ticker.sendline('K') ticker.sendline('G') return hello() return hello() @app.route("/DisplayImage", methods=['POST']) def DisplayImage(): if request.method == 'POST': if 'file' not in request.files: print('No file attached in request') return hello() fle = request.files['file'] if fle.filename == '': print('No file selected') return hello() if fle: filename = 'user_image.ppm' fle.save(os.path.join(os.path.dirname(os.path.abspath(__file__)),os.path.join('display_images', filename))) global LastCommand LastCommand = 'Add a new logo file' ticker.sendline('K') ticker.sendline('I') return hello() return hello() @app.route("/Ticker", methods=['POST']) def Ticker(): if request.method == 'POST': if 'file' not in request.files: print('No file attached in request') return hello() fle = request.files['file'] if fle.filename == '': print('No file selected') return hello() if fle and allowed_file(fle.filename): filename = secure_filename(fle.filename) fle.save(os.path.join(CSV_FOLDER, filename)) process_file(os.path.join(CSV_FOLDER, filename), filename) global LastCommand LastCommand = 'Change CSV file' return hello() return hello() @app.route("/AddLogo", methods=['POST']) def AddLogo(): if request.method == 'POST': if 'file' not in request.files: print('No file attached in request') return hello() fle = request.files['file'] if fle.filename == '': print('No file selected') return hello() if fle and allowed_file(fle.filename): filename = secure_filename(fle.filename) fle.save(os.path.join(LOGO_FOLDER, filename)) global LastCommand LastCommand = 'Add a new logo file' return hello() return hello() @app.route("/matrix", methods=['POST']) def matrix(): if "Run Stocks" in request.form: ticker.sendline('K') ticker.sendline('S') elif "Run Crypto" in request.form: ticker.sendline('K') ticker.sendline('C') elif "Run Forex" in request.form: ticker.sendline('K') ticker.sendline('F') elif "Run News" in request.form: ticker.sendline('K') ticker.sendline('N') elif "Run Weather" in request.form: ticker.sendline('K') ticker.sendline('W') elif "Run Daily Weather" in request.form: ticker.sendline('K') ticker.sendline('D') elif "Past NHL" in request.form: ticker.sendline('K') ticker.sendline('P') elif "Future NHL" in request.form: ticker.sendline('K') ticker.sendline('l') elif "Live NHL" in request.form: ticker.sendline('K') ticker.sendline('L') elif "Premier league table" in request.form: ticker.sendline('K') ticker.sendline('t') elif "Professional" in request.form: ticker.sendline('K') ticker.sendline('b') elif "All" in request.form: ticker.sendline('K') ticker.sendline('A') elif "Stop Display" in request.form: LastCommand = 'Stop display at next checkpoint' ticker.sendline('K') elif "Shutdown the pi" in request.form: try: os.system("sudo shutdown now") except: print("couldn't shutdown") return hello() if __name__ == "__main__": app.run(host='0.0.0.0', port=1024, debug=False) # the debuggger causes flickering #sudo ./demo -D1 final.ppm -t 50 -m 25 --led-gpio-mapping=adafruit-hat --led-rows=32 --led-cols=256 --led-slowdown-gpio=4