MCU
Loading...
Searching...
No Matches
ProtobufMsgInterface.h
Go to the documentation of this file.
1#ifndef PROTOBUFMSGINTERFACE
2#define PROTOBUFMSGINTERFACE
3
4#include "pb_encode.h"
5#include "pb_decode.h"
6#include "pb_common.h"
7#include "circular_buffer.h"
8#include <QNEthernet.h>
9
10#include <functional>
11
13{
14};
15
16// this should be usable with arbitrary functions idk something
17template <size_t buffer_size, typename pb_msg_type, class eth_interface>
18void handle_ethernet_socket_receive(const SysTick_s& tick, qindesign::network::EthernetUDP *socket, std::function<void(unsigned long, const uint8_t *, size_t, eth_interface &, const pb_msgdesc_t *)> recv_function, eth_interface &interface, const pb_msgdesc_t *desc_pointer)
19{
20 int packet_size = socket->parsePacket();
21 if (packet_size > 0)
22 {
23 uint8_t buffer[buffer_size];
24 size_t read_bytes = socket->read(buffer, sizeof(buffer));
25 socket->read(buffer, buffer_size);
26 recv_function(tick.millis, buffer, read_bytes, interface, desc_pointer);
27 }
28}
29
30template <typename pb_struct, size_t buffer_size>
31bool handle_ethernet_socket_send_pb(IPAddress addr, uint16_t port, qindesign::network::EthernetUDP *socket, const pb_struct &msg, const pb_msgdesc_t *msg_desc)
32{
33 socket->beginPacket(addr, port);
34 uint8_t buffer[buffer_size];
35 pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
36 if (!pb_encode(&stream, msg_desc, &msg))
37 {
38 // You can handle error more explicitly by looking at stream.errmsg
39 return false;
40 }
41 auto message_length = stream.bytes_written;
42 socket->write(buffer, message_length);
43 socket->endPacket();
44 return true;
45}
46
47template <typename pb_msg_type, class eth_interface>
48void recv_pb_stream_msg(unsigned long curr_millis, const uint8_t *buffer, size_t packet_size, eth_interface &interface, const pb_msgdesc_t *desc_pointer)
49{
50 pb_istream_t stream = pb_istream_from_buffer(buffer, packet_size);
51 pb_msg_type msg = {};
52 if (pb_decode(&stream, desc_pointer, &msg))
53 {
54 interface.receive_pb_msg(msg, curr_millis);
55 }
56}
57
58#endif
void recv_pb_stream_msg(unsigned long curr_millis, const uint8_t *buffer, size_t packet_size, eth_interface &interface, const pb_msgdesc_t *desc_pointer)
void handle_ethernet_socket_receive(const SysTick_s &tick, qindesign::network::EthernetUDP *socket, std::function< void(unsigned long, const uint8_t *, size_t, eth_interface &, const pb_msgdesc_t *)> recv_function, eth_interface &interface, const pb_msgdesc_t *desc_pointer)
bool handle_ethernet_socket_send_pb(IPAddress addr, uint16_t port, qindesign::network::EthernetUDP *socket, const pb_struct &msg, const pb_msgdesc_t *msg_desc)
CAN_message_t msg