DroneCAN.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "CANDriver.h"
  2. #include "transport.h"
  3. #include <canard.h>
  4. #include <canard.h>
  5. #include <uavcan.protocol.NodeStatus.h>
  6. #include <dronecan.remoteid.BasicID.h>
  7. #include <dronecan.remoteid.Location.h>
  8. #include <dronecan.remoteid.SelfID.h>
  9. #include <dronecan.remoteid.System.h>
  10. #include <dronecan.remoteid.OperatorID.h>
  11. #include <dronecan.remoteid.SecureCommand.h>
  12. #define CAN_POOL_SIZE 4096
  13. class DroneCAN : public Transport {
  14. public:
  15. using Transport::Transport;
  16. void init(void) override;
  17. void update(void) override;
  18. private:
  19. uint32_t last_node_status_ms;
  20. CANDriver can_driver;
  21. CanardInstance canard;
  22. uint32_t canard_memory_pool[CAN_POOL_SIZE/sizeof(uint32_t)];
  23. void node_status_send(void);
  24. void arm_status_send(void);
  25. uint8_t tx_fail_count;
  26. void processTx(void);
  27. void processRx(void);
  28. uint64_t micros64();
  29. uint64_t base_micros64;
  30. uint32_t last_micros32;
  31. void handle_get_node_info(CanardInstance* ins, CanardRxTransfer* transfer);
  32. void readUniqueID(uint8_t id[6]);
  33. bool do_DNA(void);
  34. void handle_allocation_response(CanardInstance* ins, CanardRxTransfer* transfer);
  35. uint32_t send_next_node_id_allocation_request_at_ms;
  36. uint32_t node_id_allocation_unique_id_offset;
  37. uint32_t last_DNA_start_ms;
  38. uavcan_protocol_NodeStatus node_status;
  39. void handle_BasicID(CanardRxTransfer* transfer);
  40. void handle_SelfID(CanardRxTransfer* transfer);
  41. void handle_OperatorID(CanardRxTransfer* transfer);
  42. void handle_System(CanardRxTransfer* transfer);
  43. void handle_Location(CanardRxTransfer* transfer);
  44. void handle_param_getset(CanardInstance* ins, CanardRxTransfer* transfer);
  45. void handle_SecureCommand(CanardInstance* ins, CanardRxTransfer* transfer);
  46. void can_printf(const char *fmt, ...);
  47. public:
  48. void onTransferReceived(CanardInstance* ins, CanardRxTransfer* transfer);
  49. bool shouldAcceptTransfer(const CanardInstance* ins,
  50. uint64_t* out_data_type_signature,
  51. uint16_t data_type_id,
  52. CanardTransferType transfer_type,
  53. uint8_t source_node_id);
  54. };