|
|
@@ -0,0 +1,122 @@
|
|
|
+/*
|
|
|
+ * @file dataframe.c
|
|
|
+ *
|
|
|
+ * @date: 31. 12. 2022
|
|
|
+ * @author: juraj
|
|
|
+ *
|
|
|
+ * @brief Simple Data Frame
|
|
|
+ *
|
|
|
+ * Structure of data frame:
|
|
|
+ * - starting byte (0xCC)
|
|
|
+ * - length of frame: count of bytes in payload. Maximum length: 254 (0xFE)h
|
|
|
+ * - payload
|
|
|
+ *
|
|
|
+ * Supported data types:
|
|
|
+ * - uint8_t, int8_t
|
|
|
+ * - uint16_t, int16_t
|
|
|
+ * - uint32_t, int32_t
|
|
|
+ * - float
|
|
|
+ *
|
|
|
+ * \code{.c}
|
|
|
+ void main(){
|
|
|
+ uint8_t data[128];
|
|
|
+
|
|
|
+ packet_create(data, 128);
|
|
|
+ packet_add_uint8(0xAB);
|
|
|
+ packet_add_uint16(0xABCD);
|
|
|
+ packet_add_uint32(0x12345678);
|
|
|
+ packet_add_float(0.265);
|
|
|
+
|
|
|
+ int data_length = packet_commit();
|
|
|
+ }
|
|
|
+ * \endcode
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+#include "dataframe.h"
|
|
|
+
|
|
|
+uint8_t *packet;
|
|
|
+static volatile uint8_t length;
|
|
|
+static volatile uint8_t capacity;
|
|
|
+
|
|
|
+void packet_create(uint8_t *usr_packet, uint8_t size) {
|
|
|
+ packet = usr_packet;
|
|
|
+ capacity = size;
|
|
|
+ packet[0] = HEADER_CHAR;
|
|
|
+ packet[1] = 0; //length of packet
|
|
|
+ length = 2;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+uint8_t packet_add_uint8(uint8_t d)
|
|
|
+{
|
|
|
+ if((length+1) >= capacity){
|
|
|
+ return VALUE_ERR;
|
|
|
+ }
|
|
|
+ packet[length] = d;
|
|
|
+ length++;
|
|
|
+ return VALUE_OK;
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_add_uint16(uint16_t d)
|
|
|
+{
|
|
|
+ if((length+2) >= capacity){
|
|
|
+ return VALUE_ERR;
|
|
|
+ }
|
|
|
+
|
|
|
+ packet[length++] = (d >> 8) & 0xFF;
|
|
|
+ packet[length++] = d & 0xFF;
|
|
|
+
|
|
|
+ return VALUE_OK;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+uint8_t packet_add_uint32(uint32_t d)
|
|
|
+{
|
|
|
+ if((length+4) >= capacity){
|
|
|
+ return VALUE_ERR;
|
|
|
+ }
|
|
|
+ packet[length++] = (d >> 24) & 0xFF;
|
|
|
+ packet[length++] = (d >> 16) & 0xFF;
|
|
|
+ packet[length++] = (d >> 8) & 0xFF;
|
|
|
+ packet[length++] = d & 0xFF;
|
|
|
+ return VALUE_OK;
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_add_int8(int8_t d)
|
|
|
+{
|
|
|
+ return packet_add_uint8((uint8_t)d);
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_add_int16(int16_t d)
|
|
|
+{
|
|
|
+ return packet_add_uint16((uint16_t)d);
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_add_int32(int32_t d)
|
|
|
+{
|
|
|
+ return packet_add_uint32((uint32_t)d);
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_add_float(float f)
|
|
|
+{
|
|
|
+ if((length+4) >= capacity){
|
|
|
+ return VALUE_ERR;
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t *ptr;
|
|
|
+ ptr = (unsigned char *)&f;
|
|
|
+
|
|
|
+ packet[length++] = *(ptr);
|
|
|
+ packet[length++] = *(ptr+1);
|
|
|
+ packet[length++] = *(ptr+2);
|
|
|
+ packet[length++] = *(ptr+3);
|
|
|
+ return VALUE_OK;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+uint8_t packet_commit()
|
|
|
+{
|
|
|
+ packet[1] = length;
|
|
|
+ return length;
|
|
|
+}
|