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;
    }
    }
}
示例#2
0
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
    }
}
示例#4
0
文件: ng_slip.c 项目: robby14/RIOT
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);
}