| @@ -170,6 +170,7 @@ public: | |||
| EventResponder * waitForEvent(EventResponder *list, int listsize, int timeout); | |||
| static void runFromYield() { | |||
| if (!firstYield) return; | |||
| // First, check if yield was called from an interrupt | |||
| // never call normal handler functions from any interrupt context | |||
| uint32_t ipsr; | |||
| @@ -181,6 +181,7 @@ public: | |||
| void enableSerialEvents(); | |||
| void disableSerialEvents(); | |||
| static void processSerialEvents(); | |||
| static uint8_t serial_event_handlers_active; | |||
| using Print::write; | |||
| // Only overwrite some of the virtualWrite functions if we are going to optimize them over Print version | |||
| @@ -236,7 +237,6 @@ private: | |||
| #else | |||
| static SerialEventCheckingFunctionPointer serial_event_handler_checks[7]; | |||
| #endif | |||
| static uint8_t serial_event_handlers_active; | |||
| @@ -265,6 +265,20 @@ extern void serialEvent8(void); | |||
| #endif // __cplusplus | |||
| // c functions to call c++ code in case some programs call the old functions | |||
| // Defined under extern "C" {} | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| extern void serial_print(const char *p); | |||
| extern void serial_phex(uint32_t n); | |||
| extern void serial_phex16(uint32_t n); | |||
| extern void serial_phex32(uint32_t n); | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| // TODO: replace with proper divisor+oversample calculation | |||
| @@ -71,3 +71,40 @@ HardwareSerial Serial1(&IMXRT_LPUART6, &UART6_Hardware, tx_buffer1, SERIAL1_TX_B | |||
| void serialEvent1() __attribute__((weak)); | |||
| void serialEvent1() {Serial1.disableSerialEvents(); } // No use calling this so disable if called... | |||
| // C wrapper functions to help take care of places that used to call these from standard C | |||
| void serial_print(const char *p) | |||
| { | |||
| Serial1.write(p); | |||
| } | |||
| static void serial_phex1(uint32_t n) | |||
| { | |||
| n &= 15; | |||
| if (n < 10) { | |||
| Serial1.write('0' + n); | |||
| } else { | |||
| Serial1.write('A' - 10 + n); | |||
| } | |||
| } | |||
| void serial_phex(uint32_t n) | |||
| { | |||
| serial_phex1(n >> 4); | |||
| serial_phex1(n); | |||
| } | |||
| void serial_phex16(uint32_t n) | |||
| { | |||
| serial_phex(n >> 8); | |||
| serial_phex(n); | |||
| } | |||
| void serial_phex32(uint32_t n) | |||
| { | |||
| serial_phex(n >> 24); | |||
| serial_phex(n >> 16); | |||
| serial_phex(n >> 8); | |||
| serial_phex(n); | |||
| } | |||
| @@ -112,15 +112,16 @@ void ResetHandler(void) | |||
| tempmon_init(); | |||
| while (millis() < 300) ; // wait at least 300ms before calling user code | |||
| printf("before C++ constructors\n"); | |||
| //printf("before C++ constructors\n"); | |||
| __libc_init_array(); | |||
| printf("after C++ constructors\n"); | |||
| printf("before setup\n"); | |||
| //printf("after C++ constructors\n"); | |||
| //printf("before setup\n"); | |||
| setup(); | |||
| printf("after setup\n"); | |||
| //printf("after setup\n"); | |||
| while (1) { | |||
| //printf("loop\n"); | |||
| loop(); | |||
| yield(); | |||
| } | |||
| } | |||
| @@ -84,6 +84,6 @@ usb_seremu_class Serial; | |||
| #endif | |||
| #endif // F_CPU | |||
| uint8_t usb_enable_serial_event_processing = 1; | |||
| void serialEvent() __attribute__((weak)); | |||
| void serialEvent() {} | |||
| void serialEvent() {usb_enable_serial_event_processing = 0;} | |||
| @@ -141,6 +141,10 @@ int usb_serial_getchar(void) | |||
| // peek at the next character, or -1 if nothing received | |||
| int usb_serial_peekchar(void) | |||
| { | |||
| if (rx_index[0] < rx_count[0]) { | |||
| return rx_buffer[rx_index[0]]; | |||
| } | |||
| #if 0 | |||
| if (!rx_packet) { | |||
| if (!usb_configuration) return -1; | |||
| @@ -169,7 +173,20 @@ int usb_serial_available(void) | |||
| // read a block of bytes to a buffer | |||
| int usb_serial_read(void *buffer, uint32_t size) | |||
| { | |||
| #if 0 | |||
| #if 1 | |||
| // Quick and dirty to make it at least limp... | |||
| uint8_t *p = (uint8_t *)buffer; | |||
| uint32_t count=0; | |||
| while (size) { | |||
| int ch = usb_serial_getchar(); | |||
| if (ch == -1) break; | |||
| *p++ = (uint8_t)ch; | |||
| size--; | |||
| count++; | |||
| } | |||
| return count; | |||
| #else | |||
| uint8_t *p = (uint8_t *)buffer; | |||
| uint32_t qty, count=0; | |||
| @@ -57,6 +57,7 @@ extern volatile uint32_t systick_millis_count; | |||
| extern volatile uint8_t usb_cdc_line_rtsdtr; | |||
| extern volatile uint8_t usb_cdc_transmit_flush_timer; | |||
| extern volatile uint8_t usb_configuration; | |||
| extern uint8_t usb_enable_serial_event_processing; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| @@ -39,9 +39,14 @@ void yield(void) | |||
| if (running) return; // TODO: does this need to be atomic? | |||
| running = 1; | |||
| // USB Serail - Add hack to minimize impact... | |||
| if (usb_enable_serial_event_processing && Serial.available()) serialEvent(); | |||
| // Current workaround until integrate with EventResponder. | |||
| HardwareSerial::processSerialEvents(); | |||
| if (HardwareSerial::serial_event_handlers_active) HardwareSerial::processSerialEvents(); | |||
| running = 0; | |||
| EventResponder::runFromYield(); | |||
| }; | |||