dataframe.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * @file dataframe.c
  3. *
  4. * @date: 31. 12. 2022
  5. * @author: juraj
  6. *
  7. * @brief Simple Data Frame
  8. *
  9. * Structure of data frame:
  10. * - starting byte (0xCC)
  11. * - length of frame: count of bytes in payload. Maximum length: 254 (0xFE)h
  12. * - payload
  13. *
  14. * Supported data types:
  15. * - uint8_t, int8_t
  16. * - uint16_t, int16_t
  17. * - uint32_t, int32_t
  18. * - float
  19. *
  20. * \code{.c}
  21. void main(){
  22. uint8_t data[128];
  23. packet_create(data, 128);
  24. packet_add_uint8(0xAB);
  25. packet_add_uint16(0xABCD);
  26. packet_add_uint32(0x12345678);
  27. packet_add_float(0.265);
  28. int data_length = packet_commit();
  29. }
  30. * \endcode
  31. *
  32. */
  33. #include "dataframe.h"
  34. uint8_t *packet;
  35. static volatile uint8_t length;
  36. static volatile uint8_t capacity;
  37. void packet_create(uint8_t *usr_packet, uint8_t size) {
  38. packet = usr_packet;
  39. capacity = size;
  40. packet[0] = HEADER_CHAR;
  41. packet[1] = 0; //length of packet
  42. length = 2;
  43. }
  44. uint8_t packet_add_uint8(uint8_t d)
  45. {
  46. if((length+1) >= capacity){
  47. return VALUE_ERR;
  48. }
  49. packet[length] = d;
  50. length++;
  51. return VALUE_OK;
  52. }
  53. uint8_t packet_add_uint16(uint16_t d)
  54. {
  55. if((length+2) >= capacity){
  56. return VALUE_ERR;
  57. }
  58. packet[length++] = (d >> 8) & 0xFF;
  59. packet[length++] = d & 0xFF;
  60. return VALUE_OK;
  61. }
  62. uint8_t packet_add_uint32(uint32_t d)
  63. {
  64. if((length+4) >= capacity){
  65. return VALUE_ERR;
  66. }
  67. packet[length++] = (d >> 24) & 0xFF;
  68. packet[length++] = (d >> 16) & 0xFF;
  69. packet[length++] = (d >> 8) & 0xFF;
  70. packet[length++] = d & 0xFF;
  71. return VALUE_OK;
  72. }
  73. uint8_t packet_add_int8(int8_t d)
  74. {
  75. return packet_add_uint8((uint8_t)d);
  76. }
  77. uint8_t packet_add_int16(int16_t d)
  78. {
  79. return packet_add_uint16((uint16_t)d);
  80. }
  81. uint8_t packet_add_int32(int32_t d)
  82. {
  83. return packet_add_uint32((uint32_t)d);
  84. }
  85. uint8_t packet_add_float(float f)
  86. {
  87. if((length+4) >= capacity){
  88. return VALUE_ERR;
  89. }
  90. uint8_t *ptr;
  91. ptr = (unsigned char *)&f;
  92. packet[length++] = *(ptr);
  93. packet[length++] = *(ptr+1);
  94. packet[length++] = *(ptr+2);
  95. packet[length++] = *(ptr+3);
  96. return VALUE_OK;
  97. }
  98. uint8_t packet_commit()
  99. {
  100. packet[1] = length;
  101. return length;
  102. }