static uint32_t write(t_hydra_console *con, uint8_t *tx_data, uint8_t nb_data) { int i; uint32_t status; mode_config_proto_t* proto = &con->mode->proto; status = bsp_uart_write_u8(proto->dev_num, tx_data, nb_data); if(status == BSP_OK) { if(nb_data == 1) { /* Write 1 data */ cprintf(con, hydrabus_mode_str_write_one_u8, tx_data[0]); } else if(nb_data > 1) { /* Write n data */ cprintf(con, hydrabus_mode_str_mul_write); for(i = 0; i < nb_data; i++) { cprintf(con, hydrabus_mode_str_mul_value_u8, tx_data[i]); } cprintf(con, hydrabus_mode_str_mul_br); } } return status; }
msg_t bridge_thread (void *arg) { t_hydra_console *con; con = arg; chRegSetThreadName("UART bridge"); chThdSleepMilliseconds(10); uint8_t rx_data; uint8_t tx_data; mode_config_proto_t* proto = &con->mode->proto; while (!USER_BUTTON) { if(bsp_uart_rxne(proto->dev_num)) { bsp_uart_read_u8(proto->dev_num, &rx_data ,1); chSequentialStreamWrite(con->sdu, &rx_data, 1); } if(chnReadTimeout(con->sdu, &tx_data, 1, 1)) { bsp_uart_write_u8(proto->dev_num, &tx_data, 1); //chSequentialStreamWrite(con->sdu, &tx_data, 1); } } return (msg_t)1; }
static void bridge(t_hydra_console *con) { uint8_t tx_data[UART_BRIDGE_BUFF_SIZE]; uint8_t bytes_read; //uint8_t bytes_read; mode_config_proto_t* proto = &con->mode->proto; cprintf(con, "Interrupt by pressing user button.\r\n"); cprint(con, "\r\n", 2); thread_t *bthread = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, "bridge_thread", LOWPRIO, bridge_thread, con); while(!USER_BUTTON) { bytes_read = chnReadTimeout(con->sdu, tx_data, UART_BRIDGE_BUFF_SIZE, US2ST(100)); if(bytes_read > 0) { bsp_uart_write_u8(proto->dev_num, tx_data, bytes_read); } } chThdTerminate(bthread); chThdWait(bthread); }