void sol_interrupt_scheduler_process(msg_t *msg) { switch (msg->type) { case GPIO: { struct interrupt_data *int_data = (void *)msg->content.ptr; gpio_cb_t cb = int_data->cb; if (!int_data->base.deleted) cb(int_data->data); interrupt_data_base_unref(&int_data->base); break; } case UART_RX: { struct uart_rx_interrupt_data *rx_data = (void *)msg->content.ptr; uart_rx_cb_t cb = rx_data->uart_int->rx_cb; if (!rx_data->uart_int->base.deleted) cb(rx_data->uart_int->data, rx_data->char_read); interrupt_data_base_unref(&rx_data->uart_int->base); free(rx_data); break; } case UART_TX: { struct uart_interrupt_data *int_data = (void *)msg->content.ptr; uart_tx_cb_t cb = int_data->tx_cb; if (!int_data->base.deleted) { if (cb(int_data->data)) uart_tx_begin(int_data->uart_id); } interrupt_data_base_unref(&int_data->base); break; } } }
int main(void) { char *status = "I am written to the UART every 2 seconds\n"; char buf[128]; int res; msg_t msg; main_pid = thread_getpid(); printf("Main thread pid %i \n", main_pid); printf("Testing interrupt driven mode of UART driver\n\n"); printf("Setting up buffers...\n"); ringbuffer_init(&rx_buf, rx_mem, 128); ringbuffer_init(&tx_buf, tx_mem, 128); printf("Initializing UART @ %i", BAUD); if (uart_init(DEV, BAUD, rx, NULL, tx, NULL) >= 0) { printf(" ...done\n"); } else { printf(" ...failed\n"); return 1; } ringbuffer_add(&tx_buf, status, strlen(status)); uart_tx_begin(DEV); while (1) { printf("Going into receive message state\n"); //msg_receive(&msg); if (status) { printf("INPUT: "); res = ringbuffer_get(&rx_buf, buf, rx_buf.avail); buf[res] = '\0'; printf("%s", buf); status = 0; } /* printf("got message"); if (msg.type == MSG_LINE_RDY) { printf("INPUT: "); res = ringbuffer_get(&rx_buf, buf, rx_buf.avail); buf[res] = '\0'; printf("%s", buf); } */ } return 0; }
void sol_interrupt_scheduler_process(msg_t *msg) { switch (msg->type) { case GPIO: { struct interrupt_data *int_data = (void *)msg->content.ptr; gpio_cb_t cb = int_data->cb; if (!int_data->base.deleted) cb(int_data->data); interrupt_data_base_unref(&int_data->base); break; } #ifdef USE_UART case UART_RX: { struct uart_rx_interrupt_data *rx_data = (void *)msg->content.ptr; uart_rx_cb_t cb = rx_data->uart_int->rx_cb; if (!rx_data->uart_int->base.deleted) cb(rx_data->uart_int->data, rx_data->char_read); interrupt_data_base_unref(&rx_data->uart_int->base); free(rx_data); break; } case UART_TX: { struct uart_interrupt_data *int_data = (void *)msg->content.ptr; uart_tx_cb_t cb = int_data->tx_cb; if (!int_data->base.deleted) { if (cb(int_data->data)) uart_tx_begin(int_data->uart_id); } interrupt_data_base_unref(&int_data->base); break; } #endif #ifdef NETWORK case GNRC_NETAPI_MSG_TYPE_RCV: case GNRC_NETAPI_MSG_TYPE_SND: case GNRC_NETAPI_MSG_TYPE_SET: case GNRC_NETAPI_MSG_TYPE_GET: sol_network_msg_dispatch(msg); break; #endif } }
static inline void _slip_send_char(ng_slip_dev_t *dev, char c) { ringbuffer_add_one(dev->out_buf, c); uart_tx_begin(dev->uart); }