Skip to content

Commit 5988b10

Browse files
Merge pull request #43 from FrameworkComputer/fix-loop
Python GUI Fixes
2 parents 7181b7e + bbe5ccd commit 5988b10

3 files changed

Lines changed: 357 additions & 343 deletions

File tree

python/qmk_hid/firmware_update.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import os
2+
import time
3+
4+
from qmk_hid.protocol import bootloader_jump
5+
from qmk_hid import uf2conv
6+
7+
def dev_to_str(dev):
8+
return dev['path']
9+
10+
def flash_firmware(dev, fw_path):
11+
print(f"Flashing {fw_path} onto {dev_to_str(dev)}")
12+
13+
# First jump to bootloader
14+
drives = uf2conv.list_drives()
15+
if not drives:
16+
print("Jump to bootloader")
17+
bootloader_jump(dev)
18+
19+
timeout = 10 # 5s
20+
while not drives:
21+
if timeout == 0:
22+
print("Failed to find device in bootloader")
23+
# TODO: Handle return value
24+
return False
25+
# Wait for it to appear
26+
time.sleep(0.5)
27+
timeout -= 1
28+
drives = uf2conv.get_drives()
29+
30+
31+
if len(drives) == 0:
32+
print("No drive to deploy.")
33+
return False
34+
35+
# Firmware is pretty small, can just fit it all into memory
36+
with open(fw_path, 'rb') as f:
37+
fw_buf = f.read()
38+
39+
for d in drives:
40+
print("Flashing {} ({})".format(d, uf2conv.board_id(d)))
41+
uf2conv.write_file(d + "/NEW.UF2", fw_buf)
42+
43+
print("Flashing finished")
44+
45+
46+
# Example return value
47+
# {
48+
# '0.1.7': {
49+
# 'ansi': 'framework_ansi_default_v0.1.7.uf2',
50+
# 'gridpad': 'framework_gridpad_default_v0.1.7.uf2'
51+
# },
52+
# '0.1.8': {
53+
# 'ansi': 'framework_ansi_default.uf2',
54+
# 'gridpad': 'framework_gridpad_default.uf2',
55+
# }
56+
# }
57+
def find_releases(res_path, filename_format):
58+
from os import listdir
59+
from os.path import isfile, join
60+
import re
61+
62+
releases = {}
63+
try:
64+
versions = listdir(os.path.join(res_path, "releases"))
65+
except FileNotFoundError:
66+
return releases
67+
68+
for version in versions:
69+
path = join(res_path, "releases", version)
70+
releases[version] = {}
71+
for filename in listdir(path):
72+
if not isfile(join(path, filename)):
73+
continue
74+
type_search = re.search(filename_format, filename)
75+
if not type_search:
76+
print(f"Filename '{filename}' not matching patten!")
77+
sys.exit(1)
78+
continue
79+
fw_type = type_search.group(1)
80+
releases[version][fw_type] = os.path.join(res_path, "releases", version, filename)
81+
return releases

0 commit comments

Comments
 (0)