// Send: version with and without mux void platform_uart_send( unsigned id, u8 data ) { #ifdef BUILD_USB_CDC if( id == CDC_UART_ID ) platform_usb_cdc_send( data ); #endif #ifdef BUILD_SERMUX if( id >= SERMUX_SERVICE_ID_FIRST && id < SERMUX_SERVICE_ID_FIRST + SERMUX_NUM_VUART ) { if( id != uart_service_id_out ) platform_s_uart_send( SERMUX_PHYS_ID, id ); uart_last_sent = data; if( data == SERMUX_ESCAPE_CHAR || data == SERMUX_FORCE_SID_CHAR || ( data >= SERMUX_SERVICE_ID_FIRST && data <= SERMUX_SERVICE_ID_LAST ) ) { platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_ESCAPE_CHAR ); platform_s_uart_send( SERMUX_PHYS_ID, data ^ SERMUX_ESCAPE_XOR_MASK ); uart_last_sent = SERMUX_ESC_MASK | ( data ^ SERMUX_ESCAPE_XOR_MASK ); } else platform_s_uart_send( SERMUX_PHYS_ID, data ); uart_service_id_out = id; } #endif // #ifdef BUILD_SERMUX if( id < NUM_UART ) platform_s_uart_send( id, data ); }
static void all_usart_irqhandler( int resnum ) { int temp; temp = USART_GetFlagStatus( stm32_usart[ resnum ], USART_FLAG_ORE ); cmn_int_handler( INT_UART_RX, resnum ); if( temp == SET ) for( temp = 0; temp < 10; temp ++ ) platform_s_uart_send( resnum, '@' ); }
static void cmn_rx_handler( int usart_id, u8 data ) { #ifdef BUILD_SERMUX if( usart_id == SERMUX_PHYS_ID ) { if( data != SERMUX_ESCAPE_CHAR ) { if( ( data >= SERMUX_SERVICE_ID_FIRST ) && data < ( SERMUX_SERVICE_ID_FIRST + SERMUX_NUM_VUART ) ) uart_service_id_in = data; else if( ( data == SERMUX_FORCE_SID_CHAR ) && ( uart_last_sent != -1 ) ) { // Retransmit service ID and last char platform_s_uart_send( SERMUX_PHYS_ID, uart_service_id_out ); if( uart_last_sent & SERMUX_ESC_MASK ) platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_ESCAPE_CHAR ); platform_s_uart_send( SERMUX_PHYS_ID, uart_last_sent & 0xFF ); uart_last_sent = -1; } else { // Check for an escaped char if( uart_got_esc ) { data ^= SERMUX_ESCAPE_XOR_MASK; uart_got_esc = 0; } if( uart_service_id_in == -1 ) // request full restransmit if needed platform_s_uart_send( SERMUX_PHYS_ID, SERMUX_FORCE_SID_CHAR ); else buf_write( BUF_ID_UART, uart_service_id_in, ( t_buf_data* )&data ); } } else uart_got_esc = 1; } else #endif // #ifdef BUILD_SERMUX buf_write( BUF_ID_UART, usart_id, ( t_buf_data* )&data ); }