kobuki_protocol.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-05-28 hw630 the first version
  9. */
  10. #ifndef KOBUKI_PROTOCOL_H_
  11. #define KOBUKI_PROTOCOL_H_
  12. #include <stdint.h>
  13. #include "kobuki_serial.h"
  14. // Command Packets
  15. #define KOBUKI_BYTE_STREAM_HEADER_0 0xAA
  16. #define KOBUKI_BYTE_STREAM_HEADER_1 0x55
  17. #define KOBUKI_BASE_CONTROL_HEADER 0x01
  18. #define KOBUKI_BASE_CONTROL_LENGTH 0x04
  19. #define KOBUKI_SOUND_HEADER 0x03
  20. #define KOBUKI_SOUND_LENGTH 0x03
  21. #define KOBUKI_SOUND_SEQUENCE_HEADER 0x04
  22. #define KOBUKI_SOUND_SEQUENCE_LENGTH 0x01
  23. #define KOBUKI_REQUEST_EXTRA_HEADER 0x09
  24. #define KOBUKI_REQUEST_EXTRA_LENGTH 0x02
  25. #define KOBUKI_GENERAL_OUTPUT_HEADER 0x0C
  26. #define KOBUKI_GENERAL_OUTPUT_LENGTH 0x02
  27. #define KOBUKI_SET_CONTROLLER_GAIN_HEADER 0x0D // Possible typo in documentation
  28. #define KOBUKI_SET_CONTROLLER_GAIN_LENGTH 0x0D
  29. #define KOBUKI_GET_CONTROLLER_GAIN_HEADER 0x0E // Possible typo in documentation
  30. #define KOBUKI_GET_CONTROLLER_GAIN_LENGTH 0x0E
  31. // Feedback Packets
  32. #define KOBUKI_BASIC_SENSOR_DATA_HEADER 0x01
  33. #define KOBUKI_BASIC_SENSOR_DATA_LENGTH 0x0F
  34. #define KOBUKI_DOCKING_IR_HEADER 0x03
  35. #define KOBUKI_DOCKING_ID_LENGTH 0x03
  36. #define KOBUKI_INERTIAL_SENSOR_DATA_HEADER 0x04
  37. #define KOBUKI_INERTIAL_SENSOR_DATA_LENGTH 0x07
  38. #define KOBUKI_CLIFF_SENSOR_DATA_HEADER 0x05
  39. #define KOBUKI_CLIFFL_SENSOR_DATA_LENGTH 0x06
  40. #define KOBUKI_CURRENT_HEADER 0x06
  41. #define KOBUKI_CURRENT_LENGTH 0x02
  42. #define KOBUKI_HARDWARE_VERSION_HEADER 0x0A
  43. #define KOBUKI_HARDWARE_VERSION_LENGTH 0x04
  44. #define KOBUKI_FIRMWARE_VERSION_HEADER 0x0B
  45. #define KOBUKI_FIRMWARE_VERSION_LENGTH 0x04
  46. #define KOBUKI_3D_GYRO_RAW_DATA_HEADER 0x0D
  47. #define KOBUKI_GENERAL_PURPOSE_INPUT_HEADER 0x10
  48. #define KOBUKI_GENERAL_PURPOSE_INPUT_LENGTH 0x10
  49. #define KOBUKI_UUID_HEADER 0x13
  50. #define KOBUKI_UUID_LENGTH 0x0C
  51. #define KOBUKI_CONTROLLER_INFO_HEADER 0x21 // Possible typo in documentation
  52. #define KOBUKI_CONTROLLER_INFO_LENGTH 0x15
  53. #define KOBUKI_LEFT_BUMPER_FLAG 0x04
  54. #define KOBUKI_CENTRAL_BUMPER_FLAG 0x02
  55. #define KOBUKI_RIGHT_BUMPER_FLAG 0x01
  56. #define KOBUKI_LEFT_WHEEL_DROP_FLAG 0x02
  57. #define KOBUKI_RIGHT_WHEEL_DROP_FLAG 0x01
  58. #define KOBUKI_LEFT_CLIFF_FLAG 0x04
  59. #define KOBUKI_CENTRAL_CLIFF_FLAG 0x02
  60. #define KOBUKI_RIGHT_CLIFF_FLAG 0x01
  61. #define KOBUKI_BUTTON_0_FLAG 0x01
  62. #define KOBUKI_BUTTON_1_FLAG 0x02
  63. #define KOBUKI_BUTTON_2_FLAG 0x04
  64. #define KOBUKI_DISCHARGING_FLAG 0x00
  65. #define KOBUKI_DOCKING_CHARGED_FLAG 0x02
  66. #define KOBUKI_DOCKING_CHARGING_FLAG 0x06
  67. #define KOBUKI_ADAPTER_CHARGED_FLAG 0x18
  68. #define KOBUKI_ADAPTER_CHARGING_FLAG 0x22
  69. #define KOBUKI_LEFT_WHEEL_OVERCURRENT_FLAG 0x01
  70. #define KOBUKI_RIGHT_WHEEL_OVERCURRENT_FLAG 0x02
  71. #define KOBUKI_DOCKING_IR_NEAR_LEFT_FLAG 0x01
  72. #define KOBUKI_DOCKING_IR_NEAR_CENTER_FLAG 0x02
  73. #define KOBUKI_DOCKING_IR_NEAR_RIGHT_FLAG 0x04
  74. #define KOBUKI_DOCKING_IR_FAR_LEFT_FLAG 0x08
  75. #define KOBUKI_DOCKING_IR_FAR_CENTER_FLAG 0x10
  76. #define KOBUKI_DOCKING_IR_FAR_RIGHT_FLAG 0x20
  77. /* Sound Sequence */
  78. typedef enum
  79. {
  80. KOBUKI_SOUND_SEQUENCE_ON,
  81. KOBUKI_SOUND_SEQUENCE_OFF,
  82. KOBUKI_SOUND_SEQUENCE_RECHARGE,
  83. KOBUKI_SOUND_SEQUENCE_BUTTON,
  84. KOBUKI_SOUND_SEQUENCE_ERROR,
  85. KOBUKI_SOUND_SEQUENCE_CLEANING_START,
  86. KOBUKI_SOUND_SEQUENCE_CLEANING_END
  87. } kobuki_sound_sequence;
  88. /* Request extra */
  89. typedef enum
  90. {
  91. KOBUKI_REQUEST_HARDWARE_VERSION_ID = 0x01,
  92. KOBUKI_REQUEST_FIRMWARE_VERSION_ID = 0x02,
  93. KOBUKI_REQUEST_UUID = 0x08,
  94. } kobuki_request_id;
  95. /* Request extra */
  96. typedef enum
  97. {
  98. KOBUKI_GPIO0_HIGH_FLAG = 0x0001,
  99. KOBUKI_GPIO1_HIGH_FLAG = 0x0002,
  100. KOBUKI_GPIO2_HIGH_FLAG = 0x0004,
  101. KOBUKI_GPIO3_HIGH_FLAG = 0x0008,
  102. KOBUKI_ENABLE_3V3_FLAG = 0X010,
  103. KOBUKI_ENABLE_5V_FLAG = 0x0020,
  104. KOBUKI_ENABLE_12V_5A_FLAG = 0x0040,
  105. KOBUKI_ENABLE_12V_1_5_A_FLAG = 0x0080,
  106. KOBUKI_LED1_RED_FLAG = 0x0100,
  107. KOBUKI_LED1_GREEN_FLAG = 0x0200,
  108. KOBUKI_LED2_RED_FLAG = 0x0400,
  109. KOBUKI_LED2_GREEN_FLAG = 0x0800
  110. } kobuki_gpio_id;
  111. // Bytestream
  112. typedef struct _kobuki_bytestream {
  113. uint8_t header_0;
  114. uint8_t header_1;
  115. uint8_t length;
  116. uint8_t* payloads;
  117. uint8_t checksum;
  118. } __attribute__((packed)) kobuki_bytestream_t;
  119. /* ---------------- */
  120. /* Command Packets */
  121. /* ---------------- */
  122. // Base Control
  123. typedef struct _kobuki_base_control_payload {
  124. uint8_t header;
  125. uint8_t length;
  126. uint16_t speed;
  127. uint16_t radius;
  128. } __attribute__((packed)) kobuki_base_control_payload_t;
  129. // Sound
  130. typedef struct _kobuki_sound_payload {
  131. uint8_t header;
  132. uint8_t length;
  133. uint16_t note;
  134. uint8_t duration;
  135. } __attribute__((packed)) kobuki_sound_payload_t;
  136. // Sound Sequence
  137. typedef struct _kobuki_sound_sequence_payload {
  138. uint8_t header;
  139. uint8_t length;
  140. uint8_t number;
  141. } __attribute__((packed)) kobuki_sound_sequence_payload_t;
  142. // Request Extra
  143. typedef struct _kobuki_request_extra_payload {
  144. uint8_t header;
  145. uint8_t length;
  146. uint16_t flags;
  147. } __attribute__((packed)) kobuki_request_extra_payload_t;
  148. // General Purpose Output
  149. typedef struct _kobuki_general_output_payload {
  150. uint8_t header;
  151. uint8_t length;
  152. uint16_t flags;
  153. } __attribute__((packed)) kobuki_general_output_payload_t;
  154. // Set Controller Gain
  155. typedef struct _kobuki_set_controller_gain_payload {
  156. uint8_t header;
  157. uint8_t length;
  158. uint8_t type;
  159. uint32_t p_gain;
  160. uint32_t i_gain;
  161. uint32_t d_gain;
  162. } __attribute__((packed)) kobuki_set_controller_gain_payload_t;
  163. // Get Controller Gain
  164. typedef struct _kobuki_get_controller_gain_payload {
  165. uint8_t header;
  166. uint8_t length;
  167. uint8_t unused;
  168. } __attribute__((packed)) kobuki_get_controller_gain_payload_t;
  169. /* ---------------- */
  170. /* Feedback Packets */
  171. /* ---------------- */
  172. // Basic Sensor Data
  173. typedef struct _kobuki_basic_sensor_data_payload {
  174. uint8_t header;
  175. uint8_t length;
  176. uint16_t timestamp;
  177. uint8_t bumper_flag;
  178. uint8_t wheel_drop_flag;
  179. uint8_t cliff_flag;
  180. uint16_t left_encoder;
  181. uint16_t right_encoder;
  182. int8_t left_pwm;
  183. int8_t right_pwm;
  184. uint8_t button_flag;
  185. uint8_t charger_flag;
  186. uint8_t battery;
  187. uint8_t overcurrent_flag;
  188. } __attribute__((packed)) kobuki_basic_sensor_data_payload_t;
  189. // Docking IR
  190. typedef struct _kobuki_docking_ir_payload {
  191. uint8_t header;
  192. uint8_t length;
  193. uint8_t right_signal;
  194. uint8_t central_signal;
  195. uint8_t left_signal;
  196. } __attribute__((packed)) kobuki_docking_ir_payload_t;
  197. // Inertial Sensor Data
  198. typedef struct _kobuki_inertial_sensor_data_payload {
  199. uint8_t header;
  200. uint8_t length;
  201. int16_t angle;
  202. int16_t angle_rate;
  203. uint8_t unused_0;
  204. uint8_t unused_1;
  205. uint8_t unused_2;
  206. } __attribute__((packed)) kobuki_inertial_sensor_data_payload_t;
  207. // Cliff Sensor Data
  208. typedef struct _kobuki_cliff_sensor_data_payload {
  209. uint8_t header;
  210. uint8_t length;
  211. uint8_t right_cliff_sensor;
  212. uint8_t central_cliff_sensor;
  213. uint8_t left_cliff_sensor;
  214. } __attribute__((packed)) kobuki_cliff_sensor_data_payload_t;
  215. // Current
  216. typedef struct _kobuki_current_payload {
  217. uint8_t header;
  218. uint8_t length;
  219. uint8_t left_motor;
  220. uint8_t right_motor;
  221. } __attribute__((packed)) kobuki_current_payload_t;
  222. // Hardware Version
  223. typedef struct _kobuki_hardware_version_payload {
  224. uint8_t header;
  225. uint8_t length;
  226. uint8_t pathch;
  227. uint8_t minor;
  228. uint8_t major;
  229. uint8_t unused;
  230. } __attribute__((packed)) kobuki_hardware_version_payload_t;
  231. // Firmware Version
  232. typedef struct _kobuki_firmware_version_payload {
  233. uint8_t header;
  234. uint8_t length;
  235. uint8_t pathch;
  236. uint8_t minor;
  237. uint8_t major;
  238. uint8_t unused;
  239. } __attribute__((packed)) kobuki_firmware_version_payload_t;
  240. // Raw Data Of 3D Gyro
  241. // We don't need raw data because angle and angular velocity can be retrieved from Inertial Sensor Data
  242. //typedef struct _kobuki_3d_gyro_raw_data {
  243. // uint8_t x;
  244. // uint8_t y;
  245. // uint8_t z;
  246. //} __attribute__((packed)) kobuki_3d_gyro_raw_data_t;
  247. //
  248. //typedef struct _kobuki_3d_gyro_raw_data_payload {
  249. // uint8_t header;
  250. // uint8_t length;
  251. // uint8_t frame_id;
  252. // uint8_t followed_data_length;
  253. // kobuki_3d_gyro_raw_data_t raw_data[3];
  254. //} __attribute__((packed)) kobuki_3d_gyro_raw_data_payload_t;
  255. // General Purpose Input
  256. typedef struct _kobuki_general_purpose_input_payload {
  257. uint8_t header;
  258. uint8_t length;
  259. uint16_t digital_input;
  260. uint16_t analog_input_ch_0;
  261. uint16_t analog_input_ch_1;
  262. uint16_t analog_input_ch_2;
  263. uint16_t analog_input_ch_3;
  264. uint16_t unused_0;
  265. uint16_t unused_1;
  266. uint16_t unused_2;
  267. } __attribute__((packed)) kobuki_general_purpose_input_payload_t;
  268. // Unique Device IDentifier(UDID)
  269. typedef struct _kobuki_uuid_payload {
  270. uint8_t header;
  271. uint8_t length;
  272. uint32_t uuid_0;
  273. uint32_t uuid_1;
  274. uint32_t uuid_2;
  275. } __attribute__((packed)) kobuki_uuid_payload_t;
  276. // Controller Info
  277. typedef struct _kobuki_controller_info_payload {
  278. uint8_t header;
  279. uint8_t length;
  280. uint8_t type;
  281. uint32_t p_gain;
  282. uint32_t i_gain;
  283. uint32_t d_gain;
  284. } __attribute__((packed)) kobuki_controller_info_payload_t;
  285. int kobuki_protocol_send_payload(uint8_t* payload, uint8_t len);
  286. void kobuki_play_sound_sequence(uint8_t number);
  287. void kobuki_set_gpio(uint16_t flag);
  288. void kobuki_request_extra(uint16_t flag);
  289. void kobuki_set_controller_gain_(uint8_t type, uint32_t kp, uint32_t ki, uint32_t kd);
  290. void kobuki_get_controller_gain_(void);
  291. int8_t kobuki_protocol_loop(uint8_t* packet, uint8_t len);
  292. #endif /* KOBUKI_PROTOCOL_H_ */