| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- /*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-05-28 hw630 the first version
- */
- #ifndef KOBUKI_PROTOCOL_H_
- #define KOBUKI_PROTOCOL_H_
- #include <stdint.h>
- #include "kobuki_serial.h"
- // Command Packets
- #define KOBUKI_BYTE_STREAM_HEADER_0 0xAA
- #define KOBUKI_BYTE_STREAM_HEADER_1 0x55
- #define KOBUKI_BASE_CONTROL_HEADER 0x01
- #define KOBUKI_BASE_CONTROL_LENGTH 0x04
- #define KOBUKI_SOUND_HEADER 0x03
- #define KOBUKI_SOUND_LENGTH 0x03
- #define KOBUKI_SOUND_SEQUENCE_HEADER 0x04
- #define KOBUKI_SOUND_SEQUENCE_LENGTH 0x01
- #define KOBUKI_REQUEST_EXTRA_HEADER 0x09
- #define KOBUKI_REQUEST_EXTRA_LENGTH 0x02
- #define KOBUKI_GENERAL_OUTPUT_HEADER 0x0C
- #define KOBUKI_GENERAL_OUTPUT_LENGTH 0x02
- #define KOBUKI_SET_CONTROLLER_GAIN_HEADER 0x0D // Possible typo in documentation
- #define KOBUKI_SET_CONTROLLER_GAIN_LENGTH 0x0D
- #define KOBUKI_GET_CONTROLLER_GAIN_HEADER 0x0E // Possible typo in documentation
- #define KOBUKI_GET_CONTROLLER_GAIN_LENGTH 0x0E
- // Feedback Packets
- #define KOBUKI_BASIC_SENSOR_DATA_HEADER 0x01
- #define KOBUKI_BASIC_SENSOR_DATA_LENGTH 0x0F
- #define KOBUKI_DOCKING_IR_HEADER 0x03
- #define KOBUKI_DOCKING_ID_LENGTH 0x03
- #define KOBUKI_INERTIAL_SENSOR_DATA_HEADER 0x04
- #define KOBUKI_INERTIAL_SENSOR_DATA_LENGTH 0x07
- #define KOBUKI_CLIFF_SENSOR_DATA_HEADER 0x05
- #define KOBUKI_CLIFFL_SENSOR_DATA_LENGTH 0x06
- #define KOBUKI_CURRENT_HEADER 0x06
- #define KOBUKI_CURRENT_LENGTH 0x02
- #define KOBUKI_HARDWARE_VERSION_HEADER 0x0A
- #define KOBUKI_HARDWARE_VERSION_LENGTH 0x04
- #define KOBUKI_FIRMWARE_VERSION_HEADER 0x0B
- #define KOBUKI_FIRMWARE_VERSION_LENGTH 0x04
- #define KOBUKI_3D_GYRO_RAW_DATA_HEADER 0x0D
- #define KOBUKI_GENERAL_PURPOSE_INPUT_HEADER 0x10
- #define KOBUKI_GENERAL_PURPOSE_INPUT_LENGTH 0x10
- #define KOBUKI_UUID_HEADER 0x13
- #define KOBUKI_UUID_LENGTH 0x0C
- #define KOBUKI_CONTROLLER_INFO_HEADER 0x21 // Possible typo in documentation
- #define KOBUKI_CONTROLLER_INFO_LENGTH 0x15
- #define KOBUKI_LEFT_BUMPER_FLAG 0x04
- #define KOBUKI_CENTRAL_BUMPER_FLAG 0x02
- #define KOBUKI_RIGHT_BUMPER_FLAG 0x01
- #define KOBUKI_LEFT_WHEEL_DROP_FLAG 0x02
- #define KOBUKI_RIGHT_WHEEL_DROP_FLAG 0x01
- #define KOBUKI_LEFT_CLIFF_FLAG 0x04
- #define KOBUKI_CENTRAL_CLIFF_FLAG 0x02
- #define KOBUKI_RIGHT_CLIFF_FLAG 0x01
- #define KOBUKI_BUTTON_0_FLAG 0x01
- #define KOBUKI_BUTTON_1_FLAG 0x02
- #define KOBUKI_BUTTON_2_FLAG 0x04
- #define KOBUKI_DISCHARGING_FLAG 0x00
- #define KOBUKI_DOCKING_CHARGED_FLAG 0x02
- #define KOBUKI_DOCKING_CHARGING_FLAG 0x06
- #define KOBUKI_ADAPTER_CHARGED_FLAG 0x18
- #define KOBUKI_ADAPTER_CHARGING_FLAG 0x22
- #define KOBUKI_LEFT_WHEEL_OVERCURRENT_FLAG 0x01
- #define KOBUKI_RIGHT_WHEEL_OVERCURRENT_FLAG 0x02
- #define KOBUKI_DOCKING_IR_NEAR_LEFT_FLAG 0x01
- #define KOBUKI_DOCKING_IR_NEAR_CENTER_FLAG 0x02
- #define KOBUKI_DOCKING_IR_NEAR_RIGHT_FLAG 0x04
- #define KOBUKI_DOCKING_IR_FAR_LEFT_FLAG 0x08
- #define KOBUKI_DOCKING_IR_FAR_CENTER_FLAG 0x10
- #define KOBUKI_DOCKING_IR_FAR_RIGHT_FLAG 0x20
- /* Sound Sequence */
- typedef enum
- {
- KOBUKI_SOUND_SEQUENCE_ON,
- KOBUKI_SOUND_SEQUENCE_OFF,
- KOBUKI_SOUND_SEQUENCE_RECHARGE,
- KOBUKI_SOUND_SEQUENCE_BUTTON,
- KOBUKI_SOUND_SEQUENCE_ERROR,
- KOBUKI_SOUND_SEQUENCE_CLEANING_START,
- KOBUKI_SOUND_SEQUENCE_CLEANING_END
- } kobuki_sound_sequence;
- /* Request extra */
- typedef enum
- {
- KOBUKI_REQUEST_HARDWARE_VERSION_ID = 0x01,
- KOBUKI_REQUEST_FIRMWARE_VERSION_ID = 0x02,
- KOBUKI_REQUEST_UUID = 0x08,
- } kobuki_request_id;
- /* Request extra */
- typedef enum
- {
- KOBUKI_GPIO0_HIGH_FLAG = 0x0001,
- KOBUKI_GPIO1_HIGH_FLAG = 0x0002,
- KOBUKI_GPIO2_HIGH_FLAG = 0x0004,
- KOBUKI_GPIO3_HIGH_FLAG = 0x0008,
- KOBUKI_ENABLE_3V3_FLAG = 0X010,
- KOBUKI_ENABLE_5V_FLAG = 0x0020,
- KOBUKI_ENABLE_12V_5A_FLAG = 0x0040,
- KOBUKI_ENABLE_12V_1_5_A_FLAG = 0x0080,
- KOBUKI_LED1_RED_FLAG = 0x0100,
- KOBUKI_LED1_GREEN_FLAG = 0x0200,
- KOBUKI_LED2_RED_FLAG = 0x0400,
- KOBUKI_LED2_GREEN_FLAG = 0x0800
- } kobuki_gpio_id;
- // Bytestream
- typedef struct _kobuki_bytestream {
- uint8_t header_0;
- uint8_t header_1;
- uint8_t length;
- uint8_t* payloads;
- uint8_t checksum;
- } __attribute__((packed)) kobuki_bytestream_t;
- /* ---------------- */
- /* Command Packets */
- /* ---------------- */
- // Base Control
- typedef struct _kobuki_base_control_payload {
- uint8_t header;
- uint8_t length;
- uint16_t speed;
- uint16_t radius;
- } __attribute__((packed)) kobuki_base_control_payload_t;
- // Sound
- typedef struct _kobuki_sound_payload {
- uint8_t header;
- uint8_t length;
- uint16_t note;
- uint8_t duration;
- } __attribute__((packed)) kobuki_sound_payload_t;
- // Sound Sequence
- typedef struct _kobuki_sound_sequence_payload {
- uint8_t header;
- uint8_t length;
- uint8_t number;
- } __attribute__((packed)) kobuki_sound_sequence_payload_t;
- // Request Extra
- typedef struct _kobuki_request_extra_payload {
- uint8_t header;
- uint8_t length;
- uint16_t flags;
- } __attribute__((packed)) kobuki_request_extra_payload_t;
- // General Purpose Output
- typedef struct _kobuki_general_output_payload {
- uint8_t header;
- uint8_t length;
- uint16_t flags;
- } __attribute__((packed)) kobuki_general_output_payload_t;
- // Set Controller Gain
- typedef struct _kobuki_set_controller_gain_payload {
- uint8_t header;
- uint8_t length;
- uint8_t type;
- uint32_t p_gain;
- uint32_t i_gain;
- uint32_t d_gain;
- } __attribute__((packed)) kobuki_set_controller_gain_payload_t;
- // Get Controller Gain
- typedef struct _kobuki_get_controller_gain_payload {
- uint8_t header;
- uint8_t length;
- uint8_t unused;
- } __attribute__((packed)) kobuki_get_controller_gain_payload_t;
- /* ---------------- */
- /* Feedback Packets */
- /* ---------------- */
- // Basic Sensor Data
- typedef struct _kobuki_basic_sensor_data_payload {
- uint8_t header;
- uint8_t length;
- uint16_t timestamp;
- uint8_t bumper_flag;
- uint8_t wheel_drop_flag;
- uint8_t cliff_flag;
- uint16_t left_encoder;
- uint16_t right_encoder;
- int8_t left_pwm;
- int8_t right_pwm;
- uint8_t button_flag;
- uint8_t charger_flag;
- uint8_t battery;
- uint8_t overcurrent_flag;
- } __attribute__((packed)) kobuki_basic_sensor_data_payload_t;
- // Docking IR
- typedef struct _kobuki_docking_ir_payload {
- uint8_t header;
- uint8_t length;
- uint8_t right_signal;
- uint8_t central_signal;
- uint8_t left_signal;
- } __attribute__((packed)) kobuki_docking_ir_payload_t;
- // Inertial Sensor Data
- typedef struct _kobuki_inertial_sensor_data_payload {
- uint8_t header;
- uint8_t length;
- int16_t angle;
- int16_t angle_rate;
- uint8_t unused_0;
- uint8_t unused_1;
- uint8_t unused_2;
- } __attribute__((packed)) kobuki_inertial_sensor_data_payload_t;
- // Cliff Sensor Data
- typedef struct _kobuki_cliff_sensor_data_payload {
- uint8_t header;
- uint8_t length;
- uint8_t right_cliff_sensor;
- uint8_t central_cliff_sensor;
- uint8_t left_cliff_sensor;
- } __attribute__((packed)) kobuki_cliff_sensor_data_payload_t;
- // Current
- typedef struct _kobuki_current_payload {
- uint8_t header;
- uint8_t length;
- uint8_t left_motor;
- uint8_t right_motor;
- } __attribute__((packed)) kobuki_current_payload_t;
- // Hardware Version
- typedef struct _kobuki_hardware_version_payload {
- uint8_t header;
- uint8_t length;
- uint8_t pathch;
- uint8_t minor;
- uint8_t major;
- uint8_t unused;
- } __attribute__((packed)) kobuki_hardware_version_payload_t;
- // Firmware Version
- typedef struct _kobuki_firmware_version_payload {
- uint8_t header;
- uint8_t length;
- uint8_t pathch;
- uint8_t minor;
- uint8_t major;
- uint8_t unused;
- } __attribute__((packed)) kobuki_firmware_version_payload_t;
- // Raw Data Of 3D Gyro
- // We don't need raw data because angle and angular velocity can be retrieved from Inertial Sensor Data
- //typedef struct _kobuki_3d_gyro_raw_data {
- // uint8_t x;
- // uint8_t y;
- // uint8_t z;
- //} __attribute__((packed)) kobuki_3d_gyro_raw_data_t;
- //
- //typedef struct _kobuki_3d_gyro_raw_data_payload {
- // uint8_t header;
- // uint8_t length;
- // uint8_t frame_id;
- // uint8_t followed_data_length;
- // kobuki_3d_gyro_raw_data_t raw_data[3];
- //} __attribute__((packed)) kobuki_3d_gyro_raw_data_payload_t;
- // General Purpose Input
- typedef struct _kobuki_general_purpose_input_payload {
- uint8_t header;
- uint8_t length;
- uint16_t digital_input;
- uint16_t analog_input_ch_0;
- uint16_t analog_input_ch_1;
- uint16_t analog_input_ch_2;
- uint16_t analog_input_ch_3;
- uint16_t unused_0;
- uint16_t unused_1;
- uint16_t unused_2;
- } __attribute__((packed)) kobuki_general_purpose_input_payload_t;
- // Unique Device IDentifier(UDID)
- typedef struct _kobuki_uuid_payload {
- uint8_t header;
- uint8_t length;
- uint32_t uuid_0;
- uint32_t uuid_1;
- uint32_t uuid_2;
- } __attribute__((packed)) kobuki_uuid_payload_t;
- // Controller Info
- typedef struct _kobuki_controller_info_payload {
- uint8_t header;
- uint8_t length;
- uint8_t type;
- uint32_t p_gain;
- uint32_t i_gain;
- uint32_t d_gain;
- } __attribute__((packed)) kobuki_controller_info_payload_t;
- int kobuki_protocol_send_payload(uint8_t* payload, uint8_t len);
- void kobuki_play_sound_sequence(uint8_t number);
- void kobuki_set_gpio(uint16_t flag);
- void kobuki_request_extra(uint16_t flag);
- void kobuki_set_controller_gain_(uint8_t type, uint32_t kp, uint32_t ki, uint32_t kd);
- void kobuki_get_controller_gain_(void);
- int8_t kobuki_protocol_loop(uint8_t* packet, uint8_t len);
- #endif /* KOBUKI_PROTOCOL_H_ */
|