forked from liftylol/MiniVanConfigurator
-
Notifications
You must be signed in to change notification settings - Fork 4
/
configurator.py
194 lines (161 loc) · 8.46 KB
/
configurator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# coding: utf8
import os, subprocess, datetime, fileinput
from flask import Flask, flash, request, redirect, url_for, send_from_directory
import common as kbd
KEYBOARDS = []
# import keyboard configurations and add them to app keyboard list
from keyboards.minivan import keyboard as minivan_rev1
KEYBOARDS.append(minivan_rev1)
from keyboards.minivan_rev3 import keyboard as minivan_rev3
KEYBOARDS.append(minivan_rev3)
from keyboards.roadkit import keyboard as roadkit
KEYBOARDS.append(roadkit)
from keyboards.transitvan import keyboard as transitvan
KEYBOARDS.append(transitvan)
from keyboards.provan import keyboard as provan
KEYBOARDS.append(provan)
from keyboards.minorca import keyboard as minorca
KEYBOARDS.append(minorca)
from keyboards.ergodox import keyboard as ergodox
KEYBOARDS.append(ergodox)
from keyboards.caravan import keyboard as caravan
KEYBOARDS.append(caravan)
from keyboards.lowwriter import keyboard as lowwriter
KEYBOARDS.append(lowwriter)
from keyboards.bananasplit import keyboard as bananasplit
KEYBOARDS.append(bananasplit)
app = Flask(__name__)
# Returns the file to download at the very end
@app.route('/downloads/<firmware>/<filename>')
def download_file(filename, firmware):
return send_from_directory("/app/tmk_keyboard/keyboard/{0}".format(firmware),
filename)
# This is our main routine. it allows GET and POST requests. If we get a GET request, we just send our template file
# to the browser (at the very end of the function) If it's a POST request, it means the browser already has our
# template and wants to send the values back to us. We do some sanity checks first to see if everything is ok The
# other steps we take will be explained right before everything.
@app.route('/', methods=['GET', 'POST'])
def main():
if request.method == 'POST':
#as soon as we get a POST request we remember the current time so we can crank out tons of configs at and every config has a unique name (1 request per second should be enough
#to not run into collisions at this time i hope ;))
now = str(datetime.datetime.now()).replace(' ', '-').replace(':', '-').split(".")[0]
#Here we take all POST parameters and stuff them into lists. One layer has one list.
keyboard_name = request.form.get('keyboard', '')
keyboard = None
for k in KEYBOARDS:
if k.name == keyboard_name:
keyboard = k
break
if keyboard is None:
return('error: no keyboard specified')
activeLayout = int(request.form.get('activeLayout', '0'))
hasZones = request.form.get('hasZones', 'false') == 'true'
layer1 = request.form.getlist('L1')
layer1types = request.form.getlist('LT1')
layer1mods = request.form.getlist('LM1')
layer2 = request.form.getlist('L2')
layer2types = request.form.getlist('LT2')
layer2mods = request.form.getlist('LM2')
layer3 = request.form.getlist('L3')
layer3types = request.form.getlist('LT3')
layer3mods = request.form.getlist('LM3')
layer4 = request.form.getlist('L4')
layer4types = request.form.getlist('LT4')
layer4mods = request.form.getlist('LM4')
layer5 = request.form.getlist('L5')
layer5types = request.form.getlist('LT5')
layer5mods = request.form.getlist('LM5')
layer6 = request.form.getlist('L6')
layer6types = request.form.getlist('LT6')
layer6mods = request.form.getlist('LM6')
layer7 = request.form.getlist('L7')
layer7types = request.form.getlist('LT7')
layer7mods = request.form.getlist('LM7')
layer8 = request.form.getlist('L8')
layer8types = request.form.getlist('LT8')
layer8mods = request.form.getlist('LM8')
layer9 = request.form.getlist('L9')
layer9types = request.form.getlist('LT9')
layer9mods = request.form.getlist('LM9')
layer10 = request.form.getlist('L10')
layer10types = request.form.getlist('LT10')
layer10mods = request.form.getlist('LM10')
layer11 = request.form.getlist('L11')
layer11types = request.form.getlist('LT11')
layer11mods = request.form.getlist('LM11')
layer12 = request.form.getlist('L12')
layer12types = request.form.getlist('LT12')
layer12mods = request.form.getlist('LM12')
layer13 = request.form.getlist('L13')
layer13types = request.form.getlist('LT13')
layer13mods = request.form.getlist('LM13')
layer14 = request.form.getlist('L14')
layer14types = request.form.getlist('LT14')
layer14mods = request.form.getlist('LM14')
layer15 = request.form.getlist('L15')
layer15types = request.form.getlist('LT15')
layer15mods = request.form.getlist('LM15')
layers = []
if layer1:
layers.append({'values': layer1, 'types': layer1types, 'mods': layer1mods})
if layer2:
layers.append({'values': layer2, 'types': layer2types, 'mods': layer2mods})
if layer3:
layers.append({'values': layer3, 'types': layer3types, 'mods': layer3mods})
if layer4:
layers.append({'values': layer4, 'types': layer4types, 'mods': layer4mods})
if layer5:
layers.append({'values': layer5, 'types': layer5types, 'mods': layer5mods})
if layer6:
layers.append({'values': layer6, 'types': layer6types, 'mods': layer6mods})
if layer7:
layers.append({'values': layer7, 'types': layer7types, 'mods': layer7mods})
if layer8:
layers.append({'values': layer8, 'types': layer8types, 'mods': layer8mods})
if layer9:
layers.append({'values': layer9, 'types': layer9types, 'mods': layer9mods})
if layer10:
layers.append({'values': layer10, 'types': layer10types, 'mods': layer10mods})
if layer11:
layers.append({'values': layer11, 'types': layer11types, 'mods': layer11mods})
if layer12:
layers.append({'values': layer12, 'types': layer12types, 'mods': layer12mods})
if layer13:
layers.append({'values': layer13, 'types': layer13types, 'mods': layer13mods})
if layer14:
layers.append({'values': layer14, 'types': layer14types, 'mods': layer14mods})
if layer15:
layers.append({'values': layer15, 'types': layer15types, 'mods': layer15mods})
if hasZones:
keys_per_layer = keyboard.get_num_keys(activeLayout)
template = keyboard.get_layout(activeLayout)
else:
keys_per_layer = keyboard.layouts[activeLayout]['num_keys']
template = keyboard.layouts[activeLayout]['layout']
for layer in layers:
if (len(layer['values']) != keys_per_layer):
return('error: some values are missing! please enter all information!')
layers, fn_actions = kbd.buildFnActions(layers)
for layer in layers:
layer = kbd.makeUpper(layer)
layer = kbd.translateList(layer)
if not(kbd.isAllowed(layer)):
return('error: there are invalid characters. please check your imput!<p>{0}</p>'.format(layer))
keymaps = kbd.buildKeyMaps(layers, template)
#We can now insert all the values we got into the template file we use. This point can 'propably' be improved still...
configfile = kbd.createTemplate(fn_actions, keymaps)
#As soon as we have the entire content of our config, we can write it into a file (with the timestamp we made right at the start!)
filename = "keymap_{0}_{1}.c".format(keyboard.firmware_folder, now)
callname = "{0}_{1}".format(keyboard.firmware_folder, now)
with open("/app/tmk_keyboard/keyboard/{0}/{1}".format(keyboard.firmware_folder, filename), "w+") as templatefile:
templatefile.write(configfile)
templatefile.close()
#everything is set up, now we just have to make our hex file with a system call
callstring = "make KEYMAP="+callname+" TARGETFILE="+callname+" > /dev/null"
subprocess.call(callstring, shell=True, cwd="/app/tmk_keyboard/keyboard/{0}/".format(keyboard.firmware_folder))
#everything is done, we have to return the hex file! :)
return redirect(url_for('download_file', filename=callname+'.hex', firmware=keyboard.firmware_folder))
#this is what happens on a GET request, we just send the index.htm file.
else:
return send_from_directory("/app/frontend/", "index.html")