-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbraid_gui.py
More file actions
154 lines (124 loc) · 5.25 KB
/
braid_gui.py
File metadata and controls
154 lines (124 loc) · 5.25 KB
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
from queue import Queue
from threading import Thread
import time
from imgui_bundle import imgui, immapp
import serial
import yaml
from braider import Braider
from config_loading import check_config_for_inconsistencies
command_queue = Queue(maxsize=1)
def exec_commands():
while True:
command = command_queue.get()
command()
command_queue.task_done()
command_worker = Thread(target=exec_commands, daemon=True)
command_worker.start()
def gui():
global pattern_is_executing, pattern_cursor
imgui.begin("Braid Control")
imgui.separator_text("Going Places and Grabbing Spools")
for spool in brdr.spools:
highlight = brdr._currently_grabbed_spool == spool
if highlight:
imgui.push_style_color(imgui.Col_.button, imgui.get_style_color_vec4(imgui.Col_.text_selected_bg))
if imgui.button(f"Grab {spool}"):
command_queue.put(lambda s=spool: brdr.grab(s))
if highlight:
imgui.pop_style_color()
imgui.same_line()
imgui.new_line()
for place in places.keys():
if places[place] is None:
if imgui.button(f"Assign {place} to current position"):
command_queue.put(lambda p=place: brdr.disengage_magnet())
places[place] = list(brdr.position)
# brdr.beep(440) FIXME
print(f"Assigning current position to {place}")
with open("config.yaml", "w") as fh:
yaml.dump(config, fh)
else:
if imgui.button(f"Go to {place} {places[place]}"):
command_queue.put(lambda p=place: brdr.move_to(*places[p]))
# brdr.beep(440) FIXME
print(f"Moving to {place}")
imgui.same_line()
imgui.new_line()
if imgui.button("Clear all places"):
for p in places:
places[p] = None
with open("config.yaml", "w") as fh:
yaml.dump(config, fh)
# brdr.beep(640) FIXME
brdr.beep(640)
brdr.beep(640)
brdr.beep(640)
imgui.separator_text("Manual Movement Controls")
imgui.dummy(imgui.ImVec2(7, 0)) # Add some space
imgui.same_line()
if imgui.arrow_button("Up", imgui.Dir.up):
command_queue.put(lambda: brdr.move_up(5))
if imgui.arrow_button("Left", imgui.Dir.left):
command_queue.put(lambda: brdr.move_left(5))
imgui.same_line()
if imgui.arrow_button("Right", imgui.Dir.right):
command_queue.put(lambda: brdr.move_right(5))
imgui.dummy(imgui.ImVec2(7, 0)) # Add some space
imgui.same_line()
if imgui.arrow_button("Down", imgui.Dir.down):
command_queue.put(lambda: brdr.move_down(5))
changed, new_state = imgui.checkbox("Engage Magnet", brdr._magnet_is_engaged)
if changed:
if new_state:
command_queue.put(lambda: brdr.engage_magnet())
else:
command_queue.put(lambda: brdr.disengage_magnet())
imgui.separator_text("Pattern Control")
if imgui.arrow_button("Rewind", imgui.Dir.left):
pattern_cursor = 0
pattern_is_executing = False
imgui.same_line()
if not pattern_is_executing and imgui.button("Run Pattern"):
all_places_set = all(p is not None for p in places.values())
all_spools_set = all(p is not None for p in brdr.spools.values())
if not all_places_set:
print("Not all places are set!", places)
elif not all_spools_set:
print("Not all spools are set!", brdr.spools)
else:
pattern_is_executing = True
if pattern_is_executing and imgui.button("Pause Pattern"):
pattern_is_executing = False
for idx, (spool, place) in enumerate(config.get("pattern", [])):
highlight = pattern_cursor == idx
if highlight:
imgui.push_style_color(imgui.Col_.button, imgui.get_style_color_vec4(imgui.Col_.text_selected_bg))
imgui.begin_disabled(pattern_is_executing or places[place] is None or spool not in brdr.spools)
if imgui.button(f"{spool} -> {place}##{idx}"):
command_queue.put(lambda s=spool, p=place: (brdr.grab(s), brdr.move_to(*places[p])))
imgui.end_disabled()
if highlight:
imgui.pop_style_color()
if pattern_is_executing:
spool, place = config["pattern"][pattern_cursor]
try:
command_queue.put(lambda s=spool, p=place: (brdr.grab(s), brdr.move_to(*places[p])))
pattern_cursor += 1
except Exception as e:
print(f"Error executing pattern: {e}")
if pattern_cursor >= len(config.get("pattern", [])):
pattern_is_executing = False
pattern_cursor = 0
print("Pattern execution completed.")
imgui.end()
if __name__ == "__main__":
serial_connection = serial.Serial('/dev/ttyACM0', 250000)
time.sleep(2) # Wait for the serial connection to be established
with open("config.yaml", "r") as fh:
config = yaml.load(fh, Loader=yaml.FullLoader)
check_config_for_inconsistencies(config)
brdr = Braider(serial_connection, spool_names=config["spool_names"])
places = config["places"]
pattern_is_executing = False
pattern_cursor = 0
immapp.run(gui_function=gui, window_title="Braid GUI", window_size_auto=True)