summaryrefslogtreecommitdiffstats
path: root/movement/movement.c
diff options
context:
space:
mode:
authorEdward Shin <contact@edwardsh.in>2023-10-15 00:36:49 -0400
committerEdward Shin <contact@edwardsh.in>2024-01-07 00:20:20 -0500
commit5b762d016841acb3cefa60f05e963711f0a3eb2b (patch)
tree8bea5eb0443df8cbe9cd2e402d2df8dfe7445b0b /movement/movement.c
parent63d6bc6aa0ddf4cc1ce1918ef7650852a25e581b (diff)
downloadSensor-Watch-5b762d016841acb3cefa60f05e963711f0a3eb2b.tar.gz
Sensor-Watch-5b762d016841acb3cefa60f05e963711f0a3eb2b.tar.bz2
Sensor-Watch-5b762d016841acb3cefa60f05e963711f0a3eb2b.zip
USB Improvements
* Introduce shell module for basic serial shell with argument parsing * Introduce shell_cmd_list module for basic compile-time command registration * Harden USB handling to hang less and drop fewer inputs - Service tud_task() with periodic TC0 timer interrupt - Service cdc_task() with periodic TC1 timer interrupt - Handle shell servicing in main app loop - Add a circular buffering layer for reads/writes * Change newline prints to also send carriage return * Refactor filesystem commands for shell subsystem * Introduce new shell commands: - 'help' command - 'flash' command to reset into bootloader - 'stress' command to stress CDC writes Testing: * Shell validated on Sensor Watch Blue w/ Linux host * Shell validated in emscripten emulator * Tuned by spamming inputs during `stress` cmd until stack didn't crash
Diffstat (limited to 'movement/movement.c')
-rw-r--r--movement/movement.c32
1 files changed, 6 insertions, 26 deletions
diff --git a/movement/movement.c b/movement/movement.c
index f0868416..b6c11978 100644
--- a/movement/movement.c
+++ b/movement/movement.c
@@ -33,6 +33,7 @@
#include "watch.h"
#include "filesystem.h"
#include "movement.h"
+#include "shell.h"
#ifndef MOVEMENT_FIRMWARE
#include "movement_config.h"
@@ -538,30 +539,9 @@ bool app_loop(void) {
}
}
- // if we are plugged into USB, handle the file browser tasks
+ // if we are plugged into USB, handle the serial shell
if (watch_is_usb_enabled()) {
- char line[256] = {0};
-#if __EMSCRIPTEN__
- // This is a terrible hack; ideally this should be handled deeper in the watch library.
- // Alas, emscripten treats read() as something that should pop up an input box, so I
- // wasn't able to implement this over there. I sense that this relates to read() being
- // the wrong way to read data from USB (like we should be using fgets or something), but
- // until I untangle that, this will have to do.
- char *received_data = (char*)EM_ASM_INT({
- var len = lengthBytesUTF8(tx) + 1;
- var s = _malloc(len);
- stringToUTF8(tx, s, len);
- return s;
- });
- memcpy(line, received_data, min(255, strlen(received_data)));
- free(received_data);
- EM_ASM({
- tx = "";
- });
-#else
- read(0, line, 256);
-#endif
- if (strlen(line)) filesystem_process_command(line);
+ shell_task();
}
event.subsecond = 0;
@@ -633,13 +613,13 @@ void cb_fast_tick(void) {
// Notice: is it possible that two or more buttons have an identical timestamp? In this case
// only one of these buttons would receive the long press event. Don't bother for now...
if (movement_state.light_down_timestamp > 0)
- if (movement_state.fast_ticks - movement_state.light_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
+ if (movement_state.fast_ticks - movement_state.light_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
event.event_type = EVENT_LIGHT_LONG_PRESS;
if (movement_state.mode_down_timestamp > 0)
- if (movement_state.fast_ticks - movement_state.mode_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
+ if (movement_state.fast_ticks - movement_state.mode_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
event.event_type = EVENT_MODE_LONG_PRESS;
if (movement_state.alarm_down_timestamp > 0)
- if (movement_state.fast_ticks - movement_state.alarm_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
+ if (movement_state.fast_ticks - movement_state.alarm_down_timestamp == MOVEMENT_LONG_PRESS_TICKS + 1)
event.event_type = EVENT_ALARM_LONG_PRESS;
// this is just a fail-safe; fast tick should be disabled as soon as the button is up, the LED times out, and/or the alarm finishes.
// but if for whatever reason it isn't, this forces the fast tick off after 20 seconds.