From 9da49fa5e3c1c87eead950b9d7335f566981f8aa Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Sat, 10 Jun 2023 14:07:36 +0100 Subject: [PATCH] Add `can_init()` and `can_isr()` --- demo/can | 4 ++++ demo/can.cpp | 22 ++++++++++++++++++++++ demo/main.cpp | 14 ++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/demo/can b/demo/can index 400166e..608dfa4 100644 --- a/demo/can +++ b/demo/can @@ -21,3 +21,7 @@ uint32_t can_mask_read(void); void can_mask_write(uint32_t value); can_frame can_read(void); + +void can_isr(void); + +void can_init(void); diff --git a/demo/can.cpp b/demo/can.cpp index 5d2f4ef..37ca739 100644 --- a/demo/can.cpp +++ b/demo/can.cpp @@ -1,6 +1,10 @@ #include "can" #include +#include #include +#include + +char *readstr(bool); #ifdef CSR_CAN_BASE uint32_t can_id_read(void) { @@ -32,4 +36,22 @@ can_frame can_read(void) { frame.data[7] = can_rcv_data7_read(); return frame; } + +void can_isr(void) { + can_ev_pending_frame_write(1); // Should use `can_ev_pending_read()` and check which interrupt, but there is only 1 + leds_out_write(leds_out_read() ^ 0xFF0000); // Toggle Red LED + can_frame frame = can_read(); + printf("\033[F\033[F\33[2K\nCAN frame received, ID: 0x%03X, data: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", + frame.id, frame.data[0], frame.data[1], frame.data[2], frame.data[3], frame.data[4], frame.data[5], + frame.data[6], frame.data[7]); // Print CAN frame to UART + can_ev_enable_frame_write(1); // Re-enable event handler, same as in `can_init()` + printf("\e[92;1mStackSynth\e[0m> "); // Print prompt to UART + readstr(true); // Print current user input (if any) +} + +void can_init(void) { + irq_setmask(irq_getmask() | (1 << CAN_INTERRUPT)); // Enable CAN interrupt + can_ev_enable_frame_write(1); // Should be `can_ev_enable_frame_write(1)` but it is equivalent + printf("CAN INIT\n"); // Print debug message to UART +} #endif diff --git a/demo/main.cpp b/demo/main.cpp index d09d689..749f116 100644 --- a/demo/main.cpp +++ b/demo/main.cpp @@ -17,12 +17,14 @@ /* Uart */ /*-----------------------------------------------------------------------*/ -static char *readstr(void) { +char *readstr(bool print) { char c[2]; static char s[64]; static unsigned int ptr = 0; - if (readchar_nonblock()) { + if (print) { + fputs(s, stdout); + } else if (readchar_nonblock()) { c[0] = getchar(); c[1] = 0; switch (c[0]) { @@ -54,6 +56,10 @@ static char *readstr(void) { return NULL; } +static char *readstr(void) { + return readstr(false); +} + static char *get_token(char **str) { char *c, *d; @@ -439,17 +445,21 @@ static void console_service(void) { prompt(); } +void isr(void); + int main(void) { #ifdef CONFIG_CPU_HAS_INTERRUPT irq_setmask(0); irq_setie(1); #endif uart_init(); + can_init(); help(); prompt(); while (1) { + isr(); console_service(); } }