TDME2  1.9.200
UDPClientMessage.cpp
Go to the documentation of this file.
2 
3 #include <cstring>
4 
5 #include <string>
6 #include <string_view>
7 
8 #include <tdme/tdme.h>
11 #include <tdme/utilities/Console.h>
12 #include <tdme/utilities/Integer.h>
13 #include <tdme/utilities/Time.h>
14 
16 
17 using std::memcpy;
18 using std::string;
19 using std::string_view;
20 using std::to_string;
21 
27 
28 UDPClientMessage* UDPClientMessage::parse(const char message[512], uint16_t bytes) {
29  // decode header
30  MessageType messageType = MessageType::MESSAGETYPE_NONE;
31  switch(message[0]) {
32  case 'A':
33  messageType = MessageType::MESSAGETYPE_ACKNOWLEDGEMENT;
34  break;
35  case 'C':
36  messageType = MessageType::MESSAGETYPE_CONNECT;
37  break;
38  case 'M':
39  messageType = MessageType::MESSAGETYPE_MESSAGE;
40  break;
41  default:
42  Console::println("UDPClientMessage::parse(): invalid message type: '" + (string() + message[0]) + "' (" + to_string(message[0]) + ")");
43  return nullptr;
44  }
45 
46  //
47  auto clientId = Integer::viewDecode(string_view(&message[1], 6));
48  auto messageId = Integer::viewDecode(string_view(&message[7], 6));
49  auto retries = Integer::viewDecode(string_view(&message[13], 1));
50 
51  // decode data
52  UDPPacket* packet = nullptr;
53  if (bytes > 14) {
54  packet = new UDPPacket();
55  packet->putBytes((const uint8_t*)&message[14], bytes - 14);
56  packet->reset();
57  }
58 
59  // construct UDP client message
61 }
62 
65 }
66 
67 void UDPClientMessage::generate(char message[512], uint16_t& bytes) {
68  UDPPacket generatedPacket;
69  string datagram;
70  switch(messageType) {
72  generatedPacket.putByte('A');
73  break;
75  generatedPacket.putByte('C');
76  break;
77  case MESSAGETYPE_MESSAGE :
78  generatedPacket.putByte('M');
79  break;
80  default:
81  // FIXME
82  break;
83  }
84  auto clientIdEncoded = Integer::encode(clientId);
85  auto messageIdEncoded = Integer::encode(messageId);
86  auto retriesEncoded = Integer::encode(retries);
87  generatedPacket.putBytes((const uint8_t*)clientIdEncoded.data(), clientIdEncoded.size());
88  generatedPacket.putBytes((const uint8_t*)messageIdEncoded.data(), messageIdEncoded.size());
89  generatedPacket.putByte(retriesEncoded[retriesEncoded.size() - 1]);
90  if (packet != nullptr) generatedPacket.putPacket(packet.get());
91  bytes = generatedPacket.getPosition();
92  memcpy(message, generatedPacket.getData().data(), bytes);
93 }
const array< uint8_t, 512 > & getData() const
Get data.
Definition: UDPPacket.h:46
uint16_t getPosition() const
Get position.
Definition: UDPPacket.h:53
UDPPacket * putByte(uint8_t value)
Puts a byte into packet.
Definition: UDPPacket.h:123
UDPPacket * putPacket(const UDPPacket *packet)
Puts another packet into this packet.
Definition: UDPPacket.h:300
UDPPacket * putBytes(const uint8_t *bytes, uint16_t byteCount)
Puts raw bytes into packet.
Definition: UDPPacket.h:290
UDPClientMessage(const MessageType messageType, const uint32_t clientId, const uint32_t messageId, const uint8_t retries, const UDPPacket *packet)
Public constructor.
unique_ptr< const UDPPacket > packet
void generate(char message[512], uint16_t &bytes)
Generate datagram.
static uint64_t getRetryTime(const uint8_t retries)
Get retry time for given retry count.
Definition: UDPClient.h:55
Console class.
Definition: Console.h:29
Integer class.
Definition: Integer.h:25
Time utility class.
Definition: Time.h:20