STATIC void UARTGenericIntHandler(uint32_t uart_id) { pyb_uart_obj_t *self; uint32_t status; if ((self = pyb_uart_find(uart_id))) { status = MAP_UARTIntStatus(self->reg, true); // receive interrupt if (status & (UART_INT_RX | UART_INT_RT)) { MAP_UARTIntClear(self->reg, UART_INT_RX | UART_INT_RT); while (UARTCharsAvail(self->reg)) { int data = MAP_UARTCharGetNonBlocking(self->reg); if (MICROPY_STDIO_UART == self->uart_id && data == user_interrupt_char) { // raise exception when interrupts are finished mpexception_keyboard_nlr_jump(); } else if (self->read_buf_len != 0) { uint16_t next_head = (self->read_buf_head + 1) % self->read_buf_len; if (next_head != self->read_buf_tail) { // only store data if room in buf self->read_buf[self->read_buf_head] = data; self->read_buf_head = next_head; } } } } } }
static void telnet_parse_input (uint8_t *str, int16_t *len) { int16_t b_len = *len; uint8_t *b_str = str; for (uint8_t *_str = b_str; _str < b_str + b_len; ) { if (*_str <= 127) { if (telnet_data.state == E_TELNET_STE_LOGGED_IN && *_str == user_interrupt_char) { // raise a keyboard exception mpexception_keyboard_nlr_jump(); (*len)--; _str++; } else if (*_str > 0) { *str++ = *_str++; } else { _str++; *len -= 1; } } else { // in case we have received an incomplete telnet option, unlikely, but possible _str += MIN(3, *len); *len -= MIN(3, *len); } } }
static void telnet_parse_input (uint8_t *str, int16_t *len) { int16_t b_len = *len; uint8_t *b_str = str; for (uint8_t *_str = b_str; _str < b_str + b_len; ) { if (*_str <= 127) { if (telnet_data.state == E_TELNET_STE_LOGGED_IN && *_str == user_interrupt_char) { // raise a keyboard exception mpexception_keyboard_nlr_jump(); (*len)--; _str++; } else { *str++ = *_str++; } } else { _str += 3; *len -= 3; } } }