aboutsummaryrefslogtreecommitdiff
path: root/ui_remote.py
diff options
context:
space:
mode:
authorDavid Phillips <david@yeah.nah.nz>2021-03-13 20:03:55 +1300
committerDavid Phillips <david@yeah.nah.nz>2021-03-13 20:03:55 +1300
commitd9527ea3c5ab6f1e0776b86ecc43459eb1a706b2 (patch)
tree460b8dee91bc3d63a604d68d14745218e2cb7810 /ui_remote.py
parent64a168c77568f8886662b535515ff25d056042e9 (diff)
downloadaltimeter-d9527ea3c5ab6f1e0776b86ecc43459eb1a706b2.tar.xz
First cut of UI state machine
This patch adds a first skeleton/draft of the UI state machine, with the altimeter setting logic implemented at a basic level. It also adds a Python script which uses GDB/MI to simulate/inject UI events on a GDB remote (i.e. qemu-avr running the sim copy of the firmware).
Diffstat (limited to 'ui_remote.py')
-rwxr-xr-xui_remote.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/ui_remote.py b/ui_remote.py
new file mode 100755
index 0000000..e2cb584
--- /dev/null
+++ b/ui_remote.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+# ui_remote.py - naive script to poke and prod the altimeter firmware over
+# GDB/MI. Useful for rapid UI development/testing, all while probably not being
+# strictly threadsafe. We're not triggering an ISR on the remote, so PC could
+# already be in the middle of an ISR when we fire a UI event, which should
+# never be allowed to happen in normal use.
+# Useful nonetheless.
+#
+# FIXME allow smarter queueing of UI events in this script so they can be
+# batched into the same (slow) interrupt-and-continue window.
+#
+
+import atexit
+import curses
+import pygdbmi.gdbcontroller
+import sys
+
+
+def interrupt_run_continue(mi, command):
+ mi.write('interrupt')
+ mi.write(command)
+ mi.write('continue &')
+
+
+def main():
+ def curses_init():
+ stdscr = curses.initscr()
+ curses.cbreak()
+ curses.noecho()
+ return stdscr
+
+ def curses_end():
+ curses.nocbreak()
+ stdscr.keypad(False)
+ curses.echo()
+ curses.endwin()
+
+ # Give pygdbmi hardcoded GDB, ELF paths, remote. Good enough for now
+ mi = pygdbmi.gdbcontroller.GdbController(
+ command=["/usr/bin/avr-gdb", '--interpreter=mi3'])
+ mi.write('file build/altimeter_sim.elf', timeout_sec=5)
+ mi.write('target remote :1234')
+ mi.write('continue &')
+
+ # atexit covers crash cases which is nice
+ atexit.register(curses_end)
+ stdscr = curses_init()
+
+ stdscr.addstr(0, 0, "UI remote control via GDB. Press q to quit")
+ stdscr.addstr(1, 0, "w: up s: down a: hold d: short press")
+ running = True
+ while running:
+ stdscr.addstr(2, 0, "ready")
+ stdscr.clrtoeol()
+ key = stdscr.getch()
+ stdscr.addstr(2, 0, "busy")
+ stdscr.clrtoeol()
+ stdscr.refresh()
+ if key == ord('q'):
+ running = False
+ elif key == ord('w'):
+ interrupt_run_continue(mi, 'call up()')
+ pass
+ elif key == ord('s'):
+ interrupt_run_continue(mi, 'call down()')
+ pass
+ elif key == ord('a'):
+ interrupt_run_continue(mi, 'call hold()')
+ pass
+ elif key == ord('d'):
+ interrupt_run_continue(mi, 'call press()')
+ pass
+ else:
+ stdscr.addstr(1, 0, str(key))
+
+
+if __name__ == "__main__":
+ sys.exit(main())