You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
4.0 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include "errorcode.h"
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. #define HAND_ACID_BLE_BASE_SIZE 6 //
  9. #define PACKET_H1 (0xAA)
  10. #define PACKET_H2 (0xBB)
  11. #define PACKET_TAIL (0xCC)
  12. typedef enum {
  13. kproto_cmd = 1,
  14. kproto_cmd_receipt = 2,
  15. kproto_report = 3,
  16. kproto_error_receipt = 4,
  17. } hand_acid_ble_proto_packet_type_t;
  18. typedef enum {
  19. kproto_cmd_set_state = 1, // set_state
  20. kproto_cmd_reset = 2, //
  21. kproto_cmd_setlong_key_delayms = 3, //
  22. kproto_cmd_read_power = 4, //
  23. kproto_cmd_read_version = 5, //
  24. kproto_cmd_ble_master_start_scan = 50, // process by ble master ble_master_start_scan
  25. kproto_cmd_ble_master_enter_dfu = 51, // process by ble master ble_master_enter_dfu
  26. kproto_cmd_ble_master_reset = 52, // process by ble master
  27. kproto_cmd_ble_master_read_version = 53, // process by ble master
  28. kproto_report_key_event = 101, // key_event
  29. kproto_report_connected_event = 102, // generater by ble master and slave
  30. kproto_report_heart = 104, //
  31. } hand_acid_ble_proto_cmd_t;
  32. typedef enum {
  33. khand_acid_m_unset_mode = 0, // unset_mode
  34. khand_acid_m_jog_mode = 1, // jog_mode
  35. khand_acid_m_continuous_mode = 2, // continuous_mode
  36. } hand_acid_mode_t;
  37. typedef enum {
  38. khand_acid_pump_is_idle = 0, //
  39. khand_acid_pump_is_working = 1, //
  40. } hand_pump_working_state_t;
  41. typedef enum {
  42. kkey_short_press_event = 0, //
  43. kkey_long_press_event = 1, //
  44. } key_event_t;
  45. typedef enum {
  46. kkey_id_mode_and_action_butt,
  47. kkey_id_liquid_reflux_butt,
  48. } key_id_t;
  49. #pragma pack(1)
  50. typedef struct {
  51. uint8_t h1;
  52. uint8_t h2;
  53. uint8_t packetlen;
  54. uint8_t frame_type;
  55. uint8_t frame_index;
  56. uint8_t cmd;
  57. union {
  58. struct {
  59. uint8_t hand_acid_mode; // hand_acid_mode_t
  60. uint8_t hand_pump_working_state; // hand_pump_working_state_t
  61. } set_state;
  62. //
  63. struct {
  64. uint8_t scanid[20]; // scan id
  65. } ble_master_start_scan;
  66. struct {
  67. uint8_t keyid; // key_id_t
  68. uint8_t keyevent; // key_event_t
  69. } key_event;
  70. struct {
  71. uint8_t connected;
  72. uint8_t from_ble_master;
  73. } connected_event;
  74. struct {
  75. uint8_t powerlevel;
  76. } heart;
  77. struct {
  78. uint32_t longkeydelay;
  79. } setlong_key_delayms;
  80. struct {
  81. int32_t ecode;
  82. } errreceipt;
  83. struct {
  84. int32_t power;
  85. } read_power;
  86. struct {
  87. int32_t firmware_version;
  88. int32_t blestack_version;
  89. int32_t bootloader_version;
  90. int32_t hardware_version;
  91. } read_version;
  92. } data;
  93. } hand_acid_ble_proto_t;
  94. static inline bool hand_acid_ble_proto_check_packet(hand_acid_ble_proto_t *packet) {
  95. uint8_t *pu8 = (uint8_t *)packet;
  96. if (packet->packetlen < (HAND_ACID_BLE_BASE_SIZE + 2)) {
  97. return false;
  98. }
  99. if (packet->h1 != PACKET_H1 || packet->h2 != PACKET_H2) {
  100. return false;
  101. }
  102. if (pu8[packet->packetlen - 1] != PACKET_TAIL) {
  103. return false;
  104. }
  105. uint8_t checksum = 0;
  106. for (int i = 0; i < packet->packetlen - 2; i++) {
  107. checksum += pu8[i];
  108. }
  109. if (checksum != pu8[packet->packetlen - 2]) {
  110. return false;
  111. }
  112. return true;
  113. }
  114. static inline uint8_t hand_acid_ble_proto_sum(hand_acid_ble_proto_t *packet) {
  115. uint8_t *_packet = (uint8_t *)packet;
  116. uint8_t sum = 0;
  117. for (int i = 0; i < packet->packetlen - 2; i++) {
  118. sum += _packet[i];
  119. }
  120. return sum;
  121. }
  122. #define PACKET_SET_TAIL(packet) \
  123. { \
  124. uint8_t *__data = (uint8_t *)packet; \
  125. __data[packet->packetlen - 1] = PACKET_TAIL; \
  126. }
  127. #define PACKET_SET_CHECKSUM(packet) \
  128. { \
  129. uint8_t *__data = (uint8_t *)packet; \
  130. __data[packet->packetlen - 2] = hand_acid_ble_proto_sum(packet); \
  131. }
  132. #pragma pack()
  133. #ifdef __cplusplus
  134. }
  135. #endif