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); } }
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 } } }
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); } }