]> git.earman.xyz Git - sensor-watch.git/commitdiff
simulator: add USB serial input field
authorJoey Castillo <joeycastillo@utexas.edu>
Mon, 9 May 2022 16:55:58 +0000 (12:55 -0400)
committerJoey Castillo <joeycastillo@utexas.edu>
Mon, 9 May 2022 17:00:15 +0000 (13:00 -0400)
movement/movement.c
watch-library/hardware/watch/watch.c
watch-library/shared/watch/watch.h
watch-library/simulator/shell.html
watch-library/simulator/watch/watch.c

index 4a5bc04e51e199456e2b8d1bd852da65cc490b3b..72c087e99f0bfe3f2483df49a7eb4584aa938cd5 100644 (file)
 #include <stdio.h>
 #include <string.h>
 #include <limits.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
 #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;
index 32bbccbbb99cbe42bd8cce2a8ce3e846c02781e6..b3dc4e8d168578518c87a5d107e0d20352c06265 100644 (file)
@@ -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;
+}
index b307feca9ac7f0574d2040d611f68fd2bb79c887..b94d36fb8499b0e26da33a9abae9e6ca8331bbf5 100644 (file)
   */
 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
index 2f560abad30fdfeb5aaac2463630409e4e65be36..80e1e2eac05ec8606a33adf62ab43184f725bd73 100644 (file)
 
 <button onclick="getLocation()">Set location register (will prompt for access)</button>
 <br>
+<input id="input" style="width: 500px"></input>
+<button id="submit" onclick="sendText()">Send</button>
+<br>
 <textarea id="output" rows="8" style="width: 100%"></textarea>
 
 <script type='text/javascript'>
   };
   lat = 0;
   lon = 0;
+  tx = "";
   function updateLocation(location) {
     lat = Math.round(location.coords.latitude * 100);
     lon = Math.round(location.coords.longitude * 100);
   }
+  function sendText() {
+    var inputElement = document.getElementById('input');
+    tx = inputElement.value + "\n";
+    inputElement.value = "";
+  }
   function showError(error) {
     switch(error.code) {
       case error.PERMISSION_DENIED:
index 1c965aadfa08d10f2f7badb0886fed466de58e00..749651af23bfe9913fe1a8af0c3ea8dec473568c 100644 (file)
@@ -3,3 +3,7 @@
 bool watch_is_buzzer_or_led_enabled(void) {
     return false;
 }
+
+bool watch_is_usb_enabled(void) {
+    return true;
+}