summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Castillo <joeycastillo@utexas.edu>2022-05-08 20:19:20 -0400
committerJoey Castillo <joeycastillo@utexas.edu>2022-05-08 20:19:20 -0400
commit661e2b6a731da3b4b309b331bfbd40a29a69d7e9 (patch)
tree817515509e5e6e4d6c020d0a1042487b369dd43b
parent838102a7e9ccfddf8f901def6cad35e66bf2d0fd (diff)
downloadSensor-Watch-661e2b6a731da3b4b309b331bfbd40a29a69d7e9.tar.gz
Sensor-Watch-661e2b6a731da3b4b309b331bfbd40a29a69d7e9.tar.bz2
Sensor-Watch-661e2b6a731da3b4b309b331bfbd40a29a69d7e9.zip
add ability to read from USB serial
-rw-r--r--watch-library/hardware/watch/watch_private.c21
-rw-r--r--watch-library/shared/watch/watch.h8
-rw-r--r--watch-library/shared/watch/watch_private.h5
3 files changed, 30 insertions, 4 deletions
diff --git a/watch-library/hardware/watch/watch_private.c b/watch-library/hardware/watch/watch_private.c
index e4a03926..a0525d3c 100644
--- a/watch-library/hardware/watch/watch_private.c
+++ b/watch-library/hardware/watch/watch_private.c
@@ -255,8 +255,15 @@ int _write(int file, char *ptr, int len) {
return 0;
}
-// this method could be overridden to read stuff from the USB console? but no need rn.
-int _read(void) {
+char buf[256] = {0};
+
+int _read(int file, char *ptr, int len) {
+ (void)file;
+ int actual_length = strlen(buf);
+ if (actual_length) {
+ memcpy(ptr, buf, min(len, actual_length));
+ return actual_length;
+ }
return 0;
}
@@ -264,8 +271,18 @@ void USB_Handler(void) {
tud_int_handler(0);
}
+static void cdc_task(void) {
+ if (tud_cdc_n_available(0)) {
+ tud_cdc_n_read(0, buf, sizeof(buf));
+ } else {
+ memset(buf, 0, 64);
+ // buf[0] = 0;
+ }
+}
+
void TC0_Handler(void) {
tud_task();
+ cdc_task();
TC0->COUNT8.INTFLAG.reg |= TC_INTFLAG_OVF;
}
diff --git a/watch-library/shared/watch/watch.h b/watch-library/shared/watch/watch.h
index 1dd8e7f7..b307feca 100644
--- a/watch-library/shared/watch/watch.h
+++ b/watch-library/shared/watch/watch.h
@@ -76,4 +76,12 @@
*/
bool watch_is_buzzer_or_led_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
+ * @param len the number of bytes you wish to read, max 256.
+ * @return The number of bytes read, or zero if no bytes were read.
+ */
+int read(int file, char *ptr, int len);
+
#endif /* WATCH_H_ */ \ No newline at end of file
diff --git a/watch-library/shared/watch/watch_private.h b/watch-library/shared/watch/watch_private.h
index 7bb91d1f..9d55bc21 100644
--- a/watch-library/shared/watch/watch_private.h
+++ b/watch-library/shared/watch/watch_private.h
@@ -44,7 +44,8 @@ void _watch_enable_usb(void);
// this function ends up getting called by printf to log stuff to the USB console.
int _write(int file, char *ptr, int len);
-// this method could be overridden to read stuff from the USB console? but no need rn.
-int _read(void);
+// i thought this would be called by gets but it doesn't? anyway it does get called by read()
+// so that's our mechanism for reading data from the USB serial console.
+int _read(int file, char *ptr, int len);
#endif