Last active
May 5, 2023 22:45
-
-
Save pingswept/4494118 to your computer and use it in GitHub Desktop.
Code for Color Commons project on Greenway Light Blades in Boston. The real code starts around line 808; the rest is mostly boilerplate and data.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, render_template, request | |
from uwsgidecorators import * | |
import pytronics | |
import os, time | |
public = Flask(__name__) | |
public.config['PROPAGATE_EXCEPTIONS'] = True | |
# Include "no-cache" header in all POST responses | |
@public.after_request | |
def add_no_cache(response): | |
if request.method == 'POST': | |
response.cache_control.no_cache = True | |
return response | |
# config for upload | |
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif']) | |
ALLOWED_DIRECTORIES = set(['static/uploads/', 'static/pictures/']) | |
LIVE_PINS = ['LED', '2', '3', '4', '5', '6', '7'] | |
# public.config['MAX_CONTENT_LENGTH'] = 4 * 1024 * 1024 | |
### Home page ### | |
@public.route('/') | |
@public.route('/index.html') | |
def default_page(): | |
try: | |
with open('/etc/hostname', 'r') as f: | |
name = f.read().strip().capitalize() | |
except: | |
name = 'Rascal' | |
return render_template('/index.html', hostname=name, template_list=get_public_templates()) | |
def get_public_templates(): | |
r = [] | |
d = '/var/www/public/templates' | |
for f in os.listdir(d): | |
ff=os.path.join(d,f) | |
if os.path.isfile(ff): | |
r.append(f) | |
return sorted(r) | |
# Format date/time in Jinja template | |
@public.template_filter() | |
def datetimeformat(value, format='%H:%M / %d-%m-%Y'): | |
return time.strftime(format, value) | |
# Return current date and time in specified format | |
@public.route('/datetime', methods=['POST']) | |
def datetime(): | |
try: | |
format = request.form['format'] | |
except: | |
format = '%d %b %Y %H:%M %Z' | |
return time.strftime(format, time.localtime()) | |
### Generic HTML and Markdown templates, support for doc tab ### | |
@public.route('/<template_name>.html') | |
def template(template_name): | |
return render_template(template_name + '.html', magic="Hey presto!") | |
@public.route('/<doc_name>.md') | |
def document(doc_name): | |
return render_markdown('', doc_name) | |
@public.route('/docs/<doc_name>.md') | |
def document_docs(doc_name): | |
return render_markdown('docs/', doc_name) | |
def render_markdown(path, doc_name): | |
import markdown2 | |
with open('/var/www/public/templates/' + path + doc_name + '.md', 'r') as mdf: | |
return render_template('documentation.html', title=doc_name, markdown=markdown2.markdown(mdf.read())) | |
return 'Not Found', 404 | |
@public.route('/get_markdown', methods=['POST']) | |
def get_markdown(): | |
import markdown2 | |
doc_name = request.form['docName'] | |
try: | |
with open('/var/www/public/templates/docs/' + doc_name + '.md', 'r') as mdf: | |
return markdown2.markdown(mdf.read()) | |
except: | |
try: | |
with open('/var/www/public/templates/' + doc_name + '.md', 'r') as mdf: | |
return markdown2.markdown(mdf.read()) | |
except: | |
with open('/var/www/public/templates/docs/default.md', 'r') as mdf: | |
return markdown2.markdown(mdf.read()) | |
return 'Internal server error', 500 | |
### Support for pins ### | |
def toggle_pin(pin): | |
if pytronics.digitalRead(pin) == '1': | |
pytronics.digitalWrite(pin, 'LOW') | |
else: | |
pytronics.digitalWrite(pin, 'HIGH') | |
@public.route('/pin/<pin>/<state>') | |
def update_pin(pin, state): | |
try: | |
if state.lower() == 'on': | |
pytronics.digitalWrite(pin, 'HIGH') | |
return 'Set pin %s high' % pin | |
elif state.lower() == 'off': | |
pytronics.digitalWrite(pin, 'LOW') | |
return 'Set pin %s low' % pin | |
elif state.lower() == 'in': | |
pytronics.pinMode(pin,'INPUT') | |
return 'Set pin %s input' % pin | |
elif state.lower() == 'out': | |
pytronics.pinMode(pin,'OUTPUT') | |
return 'Set pin %s output' % pin | |
return "Something's wrong with your syntax. You should send something like: /pin/2/on" | |
except: | |
return 'Forbidden', 403 | |
@public.route('/read-pins', methods=['POST']) | |
def read_pins(): | |
import json | |
# return json.dumps(pytronics.readPins(LIVE_PINS)) | |
pins = pytronics.readPins(LIVE_PINS) | |
analog = {} | |
for chan in ['A0', 'A1', 'A2', 'A3']: | |
analog[chan] = pytronics.analogRead(chan) | |
return json.dumps({ 'pins': pins, 'analog': analog }) | |
### Support for serial ### | |
@public.route('/serial/<port>/<speed>/<message>', methods=['POST']) | |
def serial_write(port, speed, message): | |
pytronics.serialWrite(message, speed, port) | |
return 'Tried to write serial data.' | |
@public.route('/sms', methods=['POST']) | |
def control_lights(): | |
d = {'airforceblue': '11', | |
'airsuperiorityblue': '11', | |
'aliceblue': '16', | |
'amaranth': '29', | |
'amaranthpink': '25', | |
'amber': '22', | |
'ambergem': '43', | |
'america': '78', | |
'amethyst': '52', | |
'apple': '41', | |
'applegreen': '41', | |
'apricot': '48', | |
'aqua': '13', | |
'aquamarine': '51', | |
'art': '74', | |
'ash': '49', | |
'ashgray': '49', | |
'asparagus': '41', | |
'ass': '72', | |
'asshole': '72', | |
'atomictangerine': '24', | |
'aubum': '29', | |
'auburn': '32', | |
'avocado': '41', | |
'azure': '14', | |
'babyblue': '16', | |
'barnred': '30', | |
'baseball': '71', | |
'basketball': '58', | |
'battleship': '49', | |
'battleshipgray': '49', | |
'battlestar': '59', | |
'beaver': '33', | |
'beige': '46', | |
'bevan': '74', | |
'beyer': '74', | |
'bird': '64', | |
'birds': '64', | |
'bistre': '36', | |
'bittersweet': '24', | |
'bleudefrance': '14', | |
'blond': '10', | |
'blood': '95', | |
'blue': '17', | |
'bluegray': '11', | |
'blueviolet': '20', | |
'bondiblue': '19', | |
'bos': '71', | |
'boston': '70', | |
'brandeisblue': '14', | |
'brandon': '74', | |
'brightgreen': '39', | |
'bronze': '31', | |
'brown': '31', | |
'brown-nose': '31', | |
'brownnose': '31', | |
'bruin': '65', | |
'bruins': '65', | |
'buff': '47', | |
'bullshit': '72', | |
'burgundy': '32', | |
'butt': '72', | |
'butter': '76', | |
'byzantium': '55', | |
'cacahuete': '87', | |
'cadet': '49', | |
'cadetgray': '49', | |
'calpolygreen': '38', | |
'camel': '33', | |
'camo': '97', | |
'cardinal': '29', | |
'carmine': '30', | |
'carnationpink': '25', | |
'carolinablue': '16', | |
'carrot': '22', | |
'carrotorange': '22', | |
'celeste': '13', | |
'celtics': '58', | |
'cerise': '54', | |
'cerulean': '19', | |
'ceruleanblue': '19', | |
'chamoisee': '33', | |
'champagne': '48', | |
'chartreuse': '39', | |
'chartreusegreen': '39', | |
'chartreusetraditional': '40', | |
'chartreuseweb': '39', | |
'chartreuseyellow': '40', | |
'cheese': '76', | |
'chestnut': '31', | |
'chocolate': '31', | |
'cobalt': '18', | |
'cobaltblue': '18', | |
'columbia': '16', | |
'confetti': '64', | |
'coolgray': '49', | |
'copper': '31', | |
'coral': '24', | |
'cornflower': '12', | |
'cornflowerblue': '12', | |
'cream': '46', | |
'crimson': '29', | |
'cuddling': '73', | |
'cummingtonite': '94', | |
'cyan': '13', | |
'dan': '74', | |
'darkblue': '18', | |
'darkbrown': '36', | |
'darkgoldenrod': '45', | |
'darkgray': '50', | |
'darkgreen': '38', | |
'darkred': '30', | |
'darksalmon': '24', | |
'darkspringgreen': '38', | |
'dartmouth': '38', | |
'deepcarrotorange': '22', | |
'deeppink': '26', | |
'deepsky': '13', | |
'deepskyblue': '13', | |
'denim': '15', | |
'desertsand': '35', | |
'dick': '72', | |
'dodger': '14', | |
'dodgerblue': '14', | |
'dubstep': '64', | |
'duke': '18', | |
'dukeblue': '18', | |
'dumb': '78', | |
'earthyellow': '35', | |
'easter': '68', | |
'easteregg': '68', | |
'ecru': '47', | |
'egg': '68', | |
'eggplant': '55', | |
'eggshell': '10', | |
'egyptianblue': '17', | |
'electricblue': '51', | |
'electriccrimson': '28', | |
'electricindigo': '20', | |
'everything': '74', | |
'fallow': '33', | |
'fandango': '54', | |
'federalblue': '18', | |
'fern': '41', | |
'ferngreen': '41', | |
'fire': '62', | |
'fireenginered': '28', | |
'fish': '68', | |
'flame': '23', | |
'folly': '54', | |
'food': '75', | |
'forest': '38', | |
'forestgreen': '38', | |
'free': '78', | |
'freedom': '78', | |
'fuchsia': '54', | |
'fuck': '72', | |
'fulvous': '35', | |
'gak': '88', | |
'galactica': '59', | |
'gamboge': '22', | |
'glaucous': '11', | |
'glitter': '76', | |
'gold': '43', | |
'goldenrod': '45', | |
'goldmetal': '45', | |
'goldmetallic': '45', | |
'gray': '49', | |
'green': '37', | |
'greenway': '67', | |
'greenyellow': '40', | |
'grey': '49', | |
'hacker': '79', | |
'hackernews': '79', | |
'harlequin': '37', | |
'heliotrope': '53', | |
'helloworld': '82', | |
'hn': '79', | |
'hockey': '65', | |
'hollywoodcerise': '27', | |
'honeydew': '10', | |
'hotmagenta': '26', | |
'hotpink': '26', | |
'husband': '73', | |
'ica': '66', | |
'indiagreen': '38', | |
'indigo': '52', | |
'interactive': '74', | |
'internationalkleinblue': '17', | |
'internationalorange': '23', | |
'iris': '20', | |
'isabelline': '10', | |
'islamicgreen': '38', | |
'ivory': '10', | |
'jonquil': '43', | |
'juxtaposition': '69', | |
'kawan': '74', | |
'kawandeep': '74', | |
'khaki': '47', | |
'kiss': '73', | |
'kleinblue': '17', | |
'la': '63', | |
'lace': '10', | |
'laurel': '41', | |
'laurelgreen': '41', | |
'lavender': '53', | |
'lavenderpink': '25', | |
'lawn': '37', | |
'lawngreen': '37', | |
'lemonchiffon': '46', | |
'leo': '73', | |
'lightblue': '16', | |
'lightgreen': '39', | |
'lightyellow': '44', | |
'lime': '40', | |
'limerick': '41', | |
'lion': '45', | |
'littlespoon': '73', | |
'liver': '50', | |
'locks': '87', | |
'love': '73', | |
'lust': '28', | |
'magenta': '54', | |
'magicmint': '51', | |
'magnolia': '10', | |
'mahogany': '34', | |
'maize': '43', | |
'majorelleblue': '20', | |
'make': '78', | |
'malachite': '93', | |
'mantis': '41', | |
'mariah': '73', | |
'maroon': '32', | |
'mayablue': '16', | |
'mediumblue': '17', | |
'megan': '73', | |
'metalgold': '45', | |
'metallicgold': '45', | |
'midnight': '18', | |
'midnightblue': '18', | |
'midori': '40', | |
'mikado': '43', | |
'mikadoyellow': '43', | |
'moon': '66', | |
'moonbounce': '66', | |
'moonstone': '90', | |
'mouse': '68', | |
'mush': '75', | |
'myrtlegreen': '42', | |
'mytrle': '42', | |
'napa': '74', | |
'naplesyellow': '43', | |
'navajo': '48', | |
'navajowhite': '48', | |
'navy': '18', | |
'navyblue': '18', | |
'neodya': '77', | |
'neodya2': '77', | |
'non-photoblue': '16', | |
'nothing': '10', | |
'nyanza': '39', | |
'ochre': '35', | |
'officegreen': '38', | |
'oldsilver': '49', | |
'olive': '41', | |
'olivedrab': '41', | |
'ooblah': '83', | |
'opal': '91', | |
'opposite': '69', | |
'opposites': '69', | |
'orange': '22', | |
'orangepeel': '22', | |
'orangered': '23', | |
'orangeweb': '22', | |
'orchid': '53', | |
'oxfordblue': '18', | |
'pakistangreen': '38', | |
'palatinateblue': '17', | |
'papaya': '48', | |
'papayawhip': '48', | |
'park': '67', | |
'partner': '73', | |
'party': '64', | |
'pastel': '86', | |
'pastellow': '86', | |
'patrick': '58', | |
'patty': '58', | |
'peach': '48', | |
'peachorange': '48', | |
'peachyellow': '48', | |
'peanut': '87', | |
'pear': '41', | |
'periwinkle': '21', | |
'persianblue': '17', | |
'peru': '31', | |
'phthaloblue': '18', | |
'pinegreen': '19', | |
'pink': '25', | |
'pistachio': '41', | |
'playa': '64', | |
'plum': '55', | |
'poop': '75', | |
'popcorn': '76', | |
'portlandorange': '23', | |
'powderblue': '16', | |
'princetonorange': '22', | |
'public': '74', | |
'pumpkin': '22', | |
'purple': '55', | |
'rabbit': '68', | |
'rain': '61', | |
'rainbow': '57', | |
'random': '64', | |
'raspberry': '29', | |
'ravercamo': '98', | |
'rawumber': '33', | |
'red': '28', | |
'red-brown': '32', | |
'redbrown': '32', | |
'redorange': '23', | |
'redsock': '71', | |
'redsocks': '71', | |
'redsox': '71', | |
'redviolet': '54', | |
'redwhiteblue': '78', | |
'redwood': '30', | |
'river': '76', | |
'robin': '13', | |
'robinegg': '13', | |
'robineggblue': '13', | |
'romance': '73', | |
'romansilver': '49', | |
'rose': '54', | |
'rosepink': '26', | |
'rosewood': '30', | |
'royalblue': '15', | |
'ruby': '28', | |
'rufous': '32', | |
'russet': '31', | |
'rust': '34', | |
'sacramento': '38', | |
'sacramentostate': '38', | |
'sacramentostategreen': '38', | |
'safetyorange': '22', | |
'saffron': '43', | |
'salmon': '24', | |
'salmonella': '85', | |
'salmonpink': '25', | |
'sandybrown': '35', | |
'sapphire': '15', | |
'scanner': '56', | |
'scarlet': '28', | |
'schoolbus': '44', | |
'schoolbusyellow': '44', | |
'seafood': '68', | |
'seagreen': '42', | |
'sealbrown': '36', | |
'seaman': '84', | |
'seashell': '10', | |
'selectiveyellow': '43', | |
'semen': '84', | |
'sepia': '31', | |
'sex': '73', | |
'shamrock': '42', | |
'shamrockgreen': '42', | |
'sharon': '73', | |
'shit': '75', | |
'shockingpink': '27', | |
'shrimp': '68', | |
'sides': '69', | |
'sienna': '34', | |
'silver': '49', | |
'silverchalice': '49', | |
'silversand': '49', | |
'sinopia': '34', | |
'skobeloff': '19', | |
'sky': '13', | |
'skyblue': '16', | |
'skycamo': '96', | |
'slate': '49', | |
'slategray': '49', | |
'slimer': '89', | |
'slimergreen': '89', | |
'smoke': '10', | |
'smokeytopaz': '31', | |
'snow': '10', | |
'sonicsilver': '49', | |
'sparkle': '76', | |
'sparqule': '76', | |
'spoon': '73', | |
'springbud': '40', | |
'stafford': '74', | |
'steelblue': '11', | |
'stoplight': '60', | |
'stpatrick': '58', | |
'stream': '76', | |
'sunglow': '43', | |
'sunset': '81', | |
'tan': '33', | |
'tangelo': '23', | |
'tangerine': '22', | |
'tartar': '95', | |
'taupe': '50', | |
'tawny': '34', | |
'teal': '19', | |
'tearose': '24', | |
'tiffanyblue': '16', | |
'tigereye': '92', | |
'timberwolf': '49', | |
'toaster': '59', | |
'tomato': '23', | |
'tonton': '96', | |
'trueblue': '14', | |
'tufts': '15', | |
'tuftsblue': '15', | |
'turquoise': '13', | |
'tuscanred': '30', | |
'uclablue': '11', | |
'ultramarine': '18', | |
'ultrapink': '26', | |
'umber': '50', | |
'upforest': '42', | |
'upforestgreen': '42', | |
'usa': '78', | |
'vanilla': '46', | |
'vermillion': '28', | |
'violet': '52', | |
'virdee': '74', | |
'webelo': '76', | |
'weird': '64', | |
'weismann': '74', | |
'weissman': '74', | |
'wenge': '50', | |
'wheat': '35', | |
'white': '10', | |
'wife': '73', | |
'wine': '30', | |
'wired': '80', | |
'wisteria': '53', | |
'wonton': '96', | |
'wood': '31', | |
'yale': '15', | |
'yaleblue': '15', | |
'yc': '79', | |
'yellow': '44', | |
'yellow-green': '40', | |
'yellowgreen': '40', | |
'zaffre': '18', | |
':(': '18', | |
':)': '73', | |
'<3': '62', | |
'agreement': '76', | |
'ah': '84', | |
'ahh': '84', | |
'ahhh': '84', | |
'ahhhh': '84', | |
'ahhhhh': '84', | |
'aquarium': '90', | |
'aubergine': '54', | |
'avacado': '93', | |
'baboon': '91', | |
'banana': '92', | |
'barkingcrab': '62', | |
'barn': '29', | |
'bathtub': '76', | |
'bear': '77', | |
'black': '50', | |
'bleh': '98', | |
'bloom': '66', | |
'blur': '76', | |
'blurp': '84', | |
'blurp!': '84', | |
'bluw': '18', | |
'bokchoi': '41', | |
'bubblegum': '85', | |
'burntsiena': '34', | |
'butterscotch': '93', | |
'cabbage': '42', | |
'calman': '84', | |
'cat': '92', | |
'chair': '17', | |
'cherry': '29', | |
'christmas': '64', | |
'chromacity': '75', | |
'chromaticuty': '85', | |
'city': '67', | |
'clear': '50', | |
'comeonlights': '93', | |
'connect': '92', | |
'couch': '98', | |
'crab': '62', | |
'cranberry': '30', | |
'crazy': '91', | |
'cyclon': '59', | |
'cylon': '59', | |
'discus': '77', | |
'disparate': '69', | |
'dog': '77', | |
'dolphin': '93', | |
'dream': '85', | |
'eel': '84', | |
'ellie': '98', | |
'elliefolding': '98', | |
'emerald': '40', | |
'fever': '75', | |
'flash': '72', | |
'flu': '75', | |
'fuscia': '54', | |
'galaxy': '61', | |
'goldfish': '92', | |
'gopher': '77', | |
'grass': '41', | |
'hermit': '62', | |
'hermitcrab': '62', | |
'hermitcrabs': '62', | |
'holly': '40', | |
'iloveyou': '85', | |
'ish': '87', | |
'jellyfish': '85', | |
'kelly': '75', | |
'kelp': '89', | |
'lamp': '92', | |
'laugh': '91', | |
'lemon': '45', | |
'light': '93', | |
'lightning': '91', | |
'limeo': '93', | |
'line': '40', | |
'lisa': '27', | |
'lisamarie': '27', | |
'lobster': '62', | |
'macaroni': '92', | |
'macaroniandcheese': '92', | |
'magic': '93', | |
'mauve': '53', | |
'monkey': '98', | |
'moonstones': '93', | |
'myrtle': '42', | |
'near': '77', | |
'nior': '82', | |
'nude': '75', | |
'off': '50', | |
'onyx': '50', | |
'pee': '87', | |
'penis': '84', | |
'phish': '93', | |
'pick': '91', | |
'piss': '87', | |
'plaid': '85', | |
'polkadots': '91', | |
'poppy': '76', | |
'porsche': '92', | |
'potpourri': '91', | |
'proudmom': '88', | |
'puce': '63', | |
'putmeincoach': '82', | |
'quartz': '91', | |
'real': '60', | |
'robinsegg': '14', | |
'sabertoothtiger': '77', | |
'sage': '46', | |
'salman': '84', | |
'salmonsex': '73', | |
'saphire': '76', | |
'saturn': '62', | |
'science': '91', | |
'seaturtle': '93', | |
'seaweed': '41', | |
'shark': '77', | |
'smallcat': '92', | |
'soap': '85', | |
'starbuck': '21', | |
'sunrise': '92', | |
'ted': '27', | |
'tiger': '62', | |
'tin': '49', | |
'twilight': '61', | |
'twillight': '61', | |
'twinkle': '61', | |
'viridian': '42', | |
'werewolf': '21', | |
'yello': '92', | |
'youcompletemelights': '92', | |
'zebra': '93'} | |
allowed_commands = ['X040A', | |
'X040B', | |
'X040C', | |
'X040D', | |
'X040E', | |
'X040F', | |
'X0410', | |
'X0411', | |
'X0412', | |
'X0413', | |
'X0414', | |
'X0415', | |
'X0416', | |
'X0417', | |
'X0418', | |
'X0419', | |
'X041A', | |
'X041B', | |
'X041C', | |
'X041D', | |
'X041E', | |
'X041F', | |
'X0420', | |
'X0421', | |
'X0422', | |
'X0423', | |
'X0424', | |
'X0425', | |
'X0426', | |
'X0427', | |
'X0428', | |
'X0429', | |
'X042A', | |
'X042B', | |
'X042C', | |
'X042D', | |
'X042E', | |
'X042F', | |
'X0430', | |
'X0431', | |
'X0432', | |
'X0433', | |
'X0434', | |
'X0435', | |
'X0436', | |
'X0437', | |
'X0438', | |
'X0439', | |
'X043A', | |
'X043B', | |
'X043C', | |
'X043D', | |
'X043E', | |
'X043F', | |
'X0440', | |
'X0441', | |
'X0442', | |
'X0443', | |
'X0444', | |
'X0445', | |
'X0446', | |
'X0447', | |
'X0448', | |
'X0449', | |
'X044A', | |
'X044B', | |
'X044C', | |
'X044D', | |
'X044E', | |
'X044F', | |
'X0450', | |
'X0451', | |
'X0452', | |
'X0453', | |
'X0454', | |
'X0455', | |
'X0456', | |
'X0457', | |
'X0458', | |
'X0459', | |
'X045A', | |
'X045B', | |
'X045C', | |
'X045D', | |
'X045E', | |
'X045F', | |
'X0460', | |
'X0461', | |
'X0462'] | |
import random | |
message = request.form['Body'] | |
print "Received text message: " + str(message) | |
try: | |
program = int(d[message[0:25].lower().replace(' ', '')]) | |
except KeyError: | |
print 'color {0} not found'.format(message) | |
program = random.randint(10,98) | |
command = 'X04%(number)2.2X' % {"number": program} | |
print 'Translated {0} to {1}'.format(message, command) | |
if (command in allowed_commands): | |
pytronics.serialWrite(command, speed=9600) | |
else: | |
print "Command {0} is not one of the allowed commands.".format(command) | |
command = 'FAIL' | |
return('<?xml version="1.0" encoding="UTF-8"?><Response>{0}</Response>'.format(command)) | |
# Called from hello.html | |
@public.route('/flash_led', methods=['POST']) | |
def flash_led(): | |
if pytronics.digitalRead('LED') == '1': | |
pytronics.digitalWrite('LED', 'LOW') | |
message = "LED off" | |
else: | |
pytronics.digitalWrite('LED', 'HIGH') | |
message = "LED on" | |
return (message) | |
if __name__ == "__main__": | |
public.run(host='127.0.0.1:5000', debug=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment