32 VDPTracef(
"Received packet of size %d", (
int)pac.size());
34 const VDP::PacketValidity status = validate_packet(pac);
36 if (status == VDP::PacketValidity::BadChecksum) {
37 VDPWarnf(
"Listener: Bad packet checksum. Skipping");
40 }
else if (status == VDP::PacketValidity::TooSmall) {
42 VDPWarnf(
"Listener: Packet too small to be valid (%d bytes). Skipping",
45 }
else if (status != VDP::PacketValidity::Ok) {
46 VDPWarnf(
"Listener: Unknown validity of packet (BAD). Skipping");
51 if (header.func == VDP::PacketFunction::Send) {
52 VDPTracef(
"Listener: PacketFunction Send");
54 if (header.type == VDP::PacketType::Data) {
56 VDPTracef(
"Listener: PacketType Data");
58 const ChannelID
id = pac[1];
60 const PartPtr part = get_remote_schema(
id);
61 if (part ==
nullptr) {
62 VDPDebugf(
"VDB-Listener: No channel information for id: %d",
id);
66 PacketReader reader{pac, 2};
68 part->read_data_from_message(reader);
70 on_data(Channel{part,
id});
71 }
else if (header.type == VDP::PacketType::Broadcast) {
72 printf(
"got broadcast packet\n");
74 VDPTracef(
"Listener: PacketType Broadcast",
"");
75 auto decoded = VDP::decode_broadcast(pac);
77 VDP::Channel chan{decoded.second, decoded.first};
79 if (channels.size() < chan.id) {
80 VDPWarnf(
"Listener: Out of order broadcast. dropping");
84 channels.push_back(chan);
85 VDPTracef(
"Listener: Got broadcast of channel %d",
int(chan.id));
94 device->send_packet(writer.get_packet());
95 printf(
"Listener: sent channel ack\n");
97 }
else if (header.func == VDP::PacketFunction::Request) {
98 printf(
"got request packet\n");
100 VDPTracef(
"Listener: PacketType Request");
102 if(channel_response_queue.size() > 0){
105 response_queue_mutex.lock();
107 response_queue_mutex.unlock();
108 device->send_packet(writer.get_packet());
109 printf(
"Listener: sent available data\n");
112 printf(
"no data available for response\n");
124 if (type != PacketType::Data) {
125 printf(
"packet type is not data, not usable data\n");
128 VDP::Channel channel_response = channels[id];
129 channel_response.data = data;
130 if (channels.size() <
id) {
131 printf(
"cannot respond to channel: %d, channel does not exist\n",
id);
134 response_queue_mutex.lock();
135 channel_response_queue.push_back(channel_response);
136 response_queue_mutex.unlock();