diff options
| -rw-r--r-- | serial_link/system/system.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/serial_link/system/system.c b/serial_link/system/system.c index f74d8c9e9..5a47d8b83 100644 --- a/serial_link/system/system.c +++ b/serial_link/system/system.c | |||
| @@ -58,6 +58,8 @@ static SerialConfig config = { | |||
| 58 | .sc_speed = SERIAL_LINK_BAUD | 58 | .sc_speed = SERIAL_LINK_BAUD |
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | //#define DEBUG_LINK_ERRORS | ||
| 62 | |||
| 61 | static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) { | 63 | static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) { |
| 62 | const uint32_t buffer_size = 16; | 64 | const uint32_t buffer_size = 16; |
| 63 | uint8_t buffer[buffer_size]; | 65 | uint8_t buffer[buffer_size]; |
| @@ -71,6 +73,37 @@ static uint32_t read_from_serial(SerialDriver* driver, uint8_t link) { | |||
| 71 | return bytes_read; | 73 | return bytes_read; |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 76 | static void print_error(char* str, eventflags_t flags, SerialDriver* driver) { | ||
| 77 | #ifdef DEBUG_LINK_ERRORS | ||
| 78 | if (flags & SD_PARITY_ERROR) { | ||
| 79 | print(str); | ||
| 80 | print(" Parity error\n"); | ||
| 81 | } | ||
| 82 | if (flags & SD_FRAMING_ERROR) { | ||
| 83 | print(str); | ||
| 84 | print(" Framing error\n"); | ||
| 85 | } | ||
| 86 | if (flags & SD_OVERRUN_ERROR) { | ||
| 87 | print(str); | ||
| 88 | uint32_t size = qSpaceI(&(driver->iqueue)); | ||
| 89 | xprintf(" Overrun error, queue size %d\n", size); | ||
| 90 | |||
| 91 | } | ||
| 92 | if (flags & SD_NOISE_ERROR) { | ||
| 93 | print(str); | ||
| 94 | print(" Noise error\n"); | ||
| 95 | } | ||
| 96 | if (flags & SD_BREAK_DETECTED) { | ||
| 97 | print(str); | ||
| 98 | print(" Break detected\n"); | ||
| 99 | } | ||
| 100 | #else | ||
| 101 | (void)str; | ||
| 102 | (void)flags; | ||
| 103 | (void)driver; | ||
| 104 | #endif | ||
| 105 | } | ||
| 106 | |||
| 74 | // TODO: Optimize the stack size, this is probably way too big | 107 | // TODO: Optimize the stack size, this is probably way too big |
| 75 | static THD_WORKING_AREA(serialThreadStack, 1024); | 108 | static THD_WORKING_AREA(serialThreadStack, 1024); |
| 76 | static THD_FUNCTION(serialThread, arg) { | 109 | static THD_FUNCTION(serialThread, arg) { |
| @@ -79,20 +112,33 @@ static THD_FUNCTION(serialThread, arg) { | |||
| 79 | event_listener_t sd1_listener; | 112 | event_listener_t sd1_listener; |
| 80 | event_listener_t sd2_listener; | 113 | event_listener_t sd2_listener; |
| 81 | chEvtRegister(&new_data_event, &new_data_listener, 0); | 114 | chEvtRegister(&new_data_event, &new_data_listener, 0); |
| 115 | eventflags_t events = CHN_INPUT_AVAILABLE | ||
| 116 | | SD_PARITY_ERROR | SD_FRAMING_ERROR | SD_OVERRUN_ERROR | SD_NOISE_ERROR | SD_BREAK_DETECTED; | ||
| 82 | chEvtRegisterMaskWithFlags(chnGetEventSource(&SD1), | 117 | chEvtRegisterMaskWithFlags(chnGetEventSource(&SD1), |
| 83 | &sd1_listener, | 118 | &sd1_listener, |
| 84 | EVENT_MASK(1), | 119 | EVENT_MASK(1), |
| 85 | CHN_INPUT_AVAILABLE); | 120 | events); |
| 86 | chEvtRegisterMaskWithFlags(chnGetEventSource(&SD2), | 121 | chEvtRegisterMaskWithFlags(chnGetEventSource(&SD2), |
| 87 | &sd2_listener, | 122 | &sd2_listener, |
| 88 | EVENT_MASK(2), | 123 | EVENT_MASK(2), |
| 89 | CHN_INPUT_AVAILABLE); | 124 | events); |
| 90 | bool need_wait = false; | 125 | bool need_wait = false; |
| 91 | bool is_master = false; | 126 | bool is_master = false; |
| 92 | while(true) { | 127 | while(true) { |
| 128 | eventflags_t flags1 = 0; | ||
| 129 | eventflags_t flags2 = 0; | ||
| 93 | if (need_wait) { | 130 | if (need_wait) { |
| 94 | chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); | 131 | eventmask_t mask = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); |
| 132 | if (mask & EVENT_MASK(1)) { | ||
| 133 | flags1 = chEvtGetAndClearFlags(&sd1_listener); | ||
| 134 | print_error("DOWNLINK", flags1, &SD1); | ||
| 135 | } | ||
| 136 | if (mask & EVENT_MASK(2)) { | ||
| 137 | flags2 = chEvtGetAndClearFlags(&sd2_listener); | ||
| 138 | print_error("UPLINK", flags2, &SD2); | ||
| 139 | } | ||
| 95 | } | 140 | } |
| 141 | |||
| 96 | // Always stay as master, even if the USB goes into sleep mode | 142 | // Always stay as master, even if the USB goes into sleep mode |
| 97 | is_master |= usbGetDriverStateI(&USBD1) == USB_ACTIVE; | 143 | is_master |= usbGetDriverStateI(&USBD1) == USB_ACTIVE; |
| 98 | router_set_master(is_master); | 144 | router_set_master(is_master); |
