Beispiel #1
0
void receiver_therad(void *arg)
{
    chRegSetThreadName("USB receiver");
    struct io_dev_s *dev = (struct io_dev_s *)arg;

    static char response_buffer[100];
    service_call_handler.service_table = service_calls;
    service_call_handler.response_buffer = response_buffer;
    service_call_handler.response_buffer_sz = sizeof(response_buffer);
    service_call_handler.send_cb = io_dev_send;
    service_call_handler.send_cb_arg = dev;

    serial_datagram_rcv_handler_t rcv;
    static char datagram_buf[64];
    serial_datagram_rcv_handler_init(
        &rcv,
        datagram_buf,
        sizeof(datagram_buf),
        (serial_datagram_cb_t)msg_dispatcher,
        messages);

    while (1) {
        static uint8_t buf[32];
        int len = chnReadTimeout(dev->channel, buf, sizeof(buf), MS2ST(1));
        if (len == 0) {
            continue;
        }
        serial_datagram_receive(&rcv, buf, len);
    }
}
Beispiel #2
0
static THD_FUNCTION(net_rx1_thd, arg) {
    if_list[1].arg = arg;
    serial_datagram_rcv_handler_init(&port1_rx, port1_rx_buf, sizeof(port1_rx_buf), serial_datagram_rx_cb, &port_1_if_idx);
    while (1) {
        uint8_t buf;
        size_t len = streamRead((BaseSequentialStream*)arg, &buf, 1);
        serial_datagram_receive(&port1_rx, &buf, len);
        if (len == 0) {
            chThdSleepMilliseconds(10); // queue is probably reset, avoid busy loop
        }
    }
}
Beispiel #3
0
void rpc_server_thread(void *p)
{
    struct netconn *conn, *client_conn;
    int error;

    (void)p;

    struct netbuf *buf;
    char *data;
    u16_t len;
    err_t err;

    serial_datagram_rcv_handler_t handler;

    chRegSetThreadName("rpc_service_call");

    /* Creates a TCP server */
    conn = netconn_new(NETCONN_TCP);
    if (conn == NULL) {
        chSysHalt("Cannot create SimpleRPC service call server connection (out of memory).");
    }

    netconn_bind(conn, IP_ADDR_ANY, RPC_SERVER_PORT);
    netconn_listen(conn);

    while (1) {
        serial_datagram_rcv_handler_init(&handler,
                                         input_buffer, sizeof input_buffer,
                                         serial_datagram_recv_cb,
                                         NULL);

        error = netconn_accept(conn, &client_conn);

        if (error != ERR_OK) {
            continue;
        }

        /* method_called will be set to true once a callback is fired. */
        method_called = false;
        output_bytes_written = 0;

        while (!method_called) {
            /* Tries to receive something from the connection. */
            err = netconn_recv(client_conn, &buf);

            /* If connection closed early */
            if (err != ERR_OK) {
                break;
            }

            do {
                netbuf_data(buf, (void **)&data, &len);
                err = serial_datagram_receive(&handler, data, len);
            } while (netbuf_next(buf) >= 0);
            netbuf_delete(buf);
        }

        if (output_bytes_written > 0) {
            netconn_write(client_conn, output_buffer, output_bytes_written, NETCONN_COPY);
        }

        netconn_close(client_conn);
        netconn_delete(client_conn);
    }
}