Line data Source code
1 : #pragma once 2 : 3 : #include "AP_RCProtocol_config.h" 4 : 5 : #if AP_RCPROTOCOL_DRONECAN_ENABLED 6 : 7 : #include "AP_RCProtocol_Backend.h" 8 : 9 : #include <AP_DroneCAN/AP_DroneCAN.h> 10 : 11 : #include <AP_Common/missing/endian.h> 12 : 13 : class AP_RCProtocol_DroneCAN : public AP_RCProtocol_Backend { 14 : public: 15 : 16 2094 : AP_RCProtocol_DroneCAN(AP_RCProtocol &_frontend) : 17 2094 : AP_RCProtocol_Backend(_frontend) { 18 2094 : _singleton = this; 19 2094 : } 20 : 21 : static bool subscribe_msgs(AP_DroneCAN* ap_dronecan); 22 : 23 : void update() override; 24 : 25 : private: 26 : 27 : static class AP_RCProtocol_DroneCAN *_singleton; 28 : 29 : static void handle_rcinput(AP_DroneCAN *ap_dronecan, const CanardRxTransfer& transfer, const dronecan_sensors_rc_RCInput &msg); 30 : 31 : static AP_RCProtocol_DroneCAN* get_dronecan_backend(AP_DroneCAN* ap_dronecan, uint8_t node_id); 32 : 33 : enum QualityType { 34 : RSSI = 0, 35 : LQ_ACTIVE_ANTENNA = 1, 36 : RSSI_DBM = 2, 37 : SNR = 3, 38 : TX_POWER = 4 39 : }; 40 : 41 : struct { 42 : uint8_t quality; 43 : union { 44 : uint16_t status; 45 : struct { 46 : uint8_t QUALITY_VALID : 1; 47 : uint8_t FAILSAFE : 1; 48 : uint8_t QUALITY_TYPE : 3; 49 : } bits; 50 : }; 51 : uint8_t num_channels; 52 : uint16_t channels[MAX_RCIN_CHANNELS]; 53 : 54 : uint32_t last_sample_time_ms; 55 : HAL_Semaphore sem; 56 : } rcin; 57 : 58 : int16_t _rssi = -1; 59 : 60 : // Module Detection Registry 61 : static struct Registry { 62 : struct DetectedDevice { 63 : AP_DroneCAN* ap_dronecan; 64 : uint8_t node_id; 65 : AP_RCProtocol_DroneCAN *driver; 66 : } detected_devices[1]; 67 : HAL_Semaphore sem; 68 : } registry; 69 : 70 : uint32_t last_receive_ms; 71 : }; 72 : 73 : 74 : #endif // AP_RCPROTOCOL_DRONECAN_ENABLED