From 22b1ac0283a6aed800ea86960305284199747cdc Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Mon, 9 May 2022 12:55:58 -0400 Subject: simulator: add USB serial input field --- movement/movement.c | 30 ++++++++++++++++++++++++++++++ watch-library/hardware/watch/watch.c | 4 ++++ watch-library/shared/watch/watch.h | 4 ++++ watch-library/simulator/shell.html | 9 +++++++++ watch-library/simulator/watch/watch.c | 4 ++++ 5 files changed, 51 insertions(+) diff --git a/movement/movement.c b/movement/movement.c index 4a5bc04e..72c087e9 100644 --- a/movement/movement.c +++ b/movement/movement.c @@ -25,7 +25,11 @@ #include #include #include +#include +#include +#include #include "watch.h" +#include "filesystem.h" #include "movement.h" #ifndef MOVEMENT_FIRMWARE @@ -423,6 +427,32 @@ bool app_loop(void) { } } + // if we are plugged into USB, handle the file browser tasks + 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)) printf(line); + } + event.subsecond = 0; return can_sleep && (movement_state.light_ticks == -1) && !movement_state.is_buzzing; diff --git a/watch-library/hardware/watch/watch.c b/watch-library/hardware/watch/watch.c index 32bbccbb..b3dc4e8d 100644 --- a/watch-library/hardware/watch/watch.c +++ b/watch-library/hardware/watch/watch.c @@ -41,3 +41,7 @@ void SYSTEM_Handler(void) { bool watch_is_buzzer_or_led_enabled(void){ return hri_mclk_get_APBCMASK_TCC0_bit(MCLK); } + +bool watch_is_usb_enabled(void) { + return USB->DEVICE.CTRLA.bit.ENABLE; +} diff --git a/watch-library/shared/watch/watch.h b/watch-library/shared/watch/watch.h index b307feca..b94d36fb 100644 --- a/watch-library/shared/watch/watch.h +++ b/watch-library/shared/watch/watch.h @@ -76,6 +76,10 @@ */ bool watch_is_buzzer_or_led_enabled(void); +/** @brief Returns true if USB is enabled. + */ +bool watch_is_usb_enabled(void); + /** @brief Reads up to len bytes from the USB serial. * @param file ignored, you can pass in 0 * @param ptr pointer to a buffer of at least len bytes diff --git a/watch-library/simulator/shell.html b/watch-library/simulator/shell.html index 2f560aba..80e1e2ea 100644 --- a/watch-library/simulator/shell.html +++ b/watch-library/simulator/shell.html @@ -323,6 +323,9 @@
+ + +