115 lines
3.1 KiB
Python
115 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
import string
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
from io import BytesIO
|
|
import string
|
|
import base64
|
|
|
|
|
|
NULL_CHAR = chr(0)
|
|
file = open('/dev/hidg0', 'rb+')
|
|
|
|
alphabet_lower = set(string.ascii_lowercase)
|
|
alphabet_upper = set(string.ascii_uppercase)
|
|
|
|
colors = {
|
|
"Z": "a", # Black
|
|
"B": "b", # Blue
|
|
"G": "c", # Green
|
|
"M": "d", # Magenta
|
|
"R": "e", # Red
|
|
"P": "f", # Pink
|
|
"Y": "g", # Yellow
|
|
"W": "h", # White
|
|
"z": "i", # Light/blink Black
|
|
"b": "j", # Light/blink Blue
|
|
"g": "k", # Light/blink Green
|
|
"m": "l", # Light/blink Magenta
|
|
"r": "m", # Light/blink Red
|
|
"p": "n", # Light/blink Pink
|
|
"y": "o", # Light/blink Yellow
|
|
"w": "p" # Light/blink White
|
|
}
|
|
|
|
def write_report(report):
|
|
file.write(report.encode())
|
|
|
|
|
|
def release_keys():
|
|
write_report(NULL_CHAR*8)
|
|
|
|
|
|
def printchar(c):
|
|
if c in alphabet_lower:
|
|
write_report(NULL_CHAR*2+chr(4 + ord(c) - ord('a'))+NULL_CHAR*5)
|
|
elif c in alphabet_upper:
|
|
write_report(chr(32)+NULL_CHAR+chr(4 + ord(c) - ord('A'))+NULL_CHAR*5)
|
|
elif c.isdigit():
|
|
write_report(NULL_CHAR*2+chr(0x1e + ((ord(c) - ord('0') - 1) % 10))+NULL_CHAR*5)
|
|
elif c == ' ':
|
|
write_report(NULL_CHAR*2+chr(44)+NULL_CHAR*5)
|
|
elif c == '\n':
|
|
write_report(NULL_CHAR*2+chr(40)+NULL_CHAR*5)
|
|
else:
|
|
write_report(chr(32)+NULL_CHAR+chr(0x38)+NULL_CHAR*5)
|
|
release_keys()
|
|
|
|
|
|
def change_color(background, foreground):
|
|
if background in colors and foreground in colors:
|
|
# DELETE keypress
|
|
write_report(NULL_CHAR*2+chr(0x2a)+NULL_CHAR*5)
|
|
release_keys()
|
|
write_report(NULL_CHAR*2+chr(4 + ord(colors[background]) - ord('a'))+NULL_CHAR*5)
|
|
release_keys()
|
|
write_report(NULL_CHAR*2+chr(4 + ord(colors[foreground]) - ord('a'))+NULL_CHAR*5)
|
|
else:
|
|
print('Malformed Color code: §' + background + foreground)
|
|
write_report(chr(32)+NULL_CHAR+chr(0x38)+NULL_CHAR*5)
|
|
release_keys()
|
|
|
|
|
|
def printstring(s):
|
|
last_c = ''
|
|
last_last_c = ''
|
|
for c in s:
|
|
if last_last_c == '§':
|
|
change_color(last_c, c)
|
|
elif c != '§' and last_c != '§':
|
|
printchar(c)
|
|
last_c, last_last_c = c, last_c
|
|
|
|
|
|
def reset_color():
|
|
change_color('Z', 'g')
|
|
release_keys()
|
|
|
|
|
|
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
|
|
|
|
def do_GET(self):
|
|
self.send_response(200)
|
|
self.end_headers()
|
|
self.wfile.write(b'Hello, world!')
|
|
|
|
def do_POST(self):
|
|
print(self.headers)
|
|
message = base64.b64decode(self.headers['X-Messages']).decode('utf8')
|
|
self.send_response(200)
|
|
self.end_headers()
|
|
response = BytesIO()
|
|
response.write(b'This is POST request. ')
|
|
response.write(b'Received: ')
|
|
self.wfile.write(response.getvalue())
|
|
if message == 'reset':
|
|
printstring('\n' * 32)
|
|
else:
|
|
printstring(message + '\n')
|
|
reset_color()
|
|
file.flush()
|
|
|
|
|
|
httpd = HTTPServer(('0.0.0.0', 8000), SimpleHTTPRequestHandler)
|
|
httpd.serve_forever()
|