DroneCAN.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "CANDriver.h"
  2. #include <canard.h>
  3. #include <canard.h>
  4. #include <uavcan.protocol.NodeStatus.h>
  5. #include <dronecan.remoteid.BasicID.h>
  6. #include <dronecan.remoteid.Location.h>
  7. #include <dronecan.remoteid.SelfID.h>
  8. #include <dronecan.remoteid.System.h>
  9. #include <dronecan.remoteid.OperatorID.h>
  10. #define CAN_POOL_SIZE 4096
  11. class DroneCAN {
  12. public:
  13. DroneCAN();
  14. void init(void);
  15. void update(void);
  16. void set_parse_fail(const char *msg) {
  17. parse_fail = msg;
  18. }
  19. private:
  20. uint32_t last_node_status_ms;
  21. CANDriver can_driver;
  22. CanardInstance canard;
  23. uint32_t canard_memory_pool[CAN_POOL_SIZE/sizeof(uint32_t)];
  24. void node_status_send(void);
  25. void arm_status_send(void);
  26. uint8_t tx_fail_count;
  27. void processTx(void);
  28. void processRx(void);
  29. uint64_t micros64();
  30. uint64_t base_micros64;
  31. uint32_t last_micros32;
  32. void handle_get_node_info(CanardInstance* ins, CanardRxTransfer* transfer);
  33. void readUniqueID(uint8_t id[6]);
  34. bool do_DNA(void);
  35. void handle_allocation_response(CanardInstance* ins, CanardRxTransfer* transfer);
  36. uint32_t send_next_node_id_allocation_request_at_ms;
  37. uint32_t node_id_allocation_unique_id_offset;
  38. uint32_t last_DNA_start_ms;
  39. uavcan_protocol_NodeStatus node_status;
  40. dronecan_remoteid_BasicID msg_BasicID;
  41. dronecan_remoteid_Location msg_Location;
  42. dronecan_remoteid_SelfID msg_SelfID;
  43. dronecan_remoteid_System msg_System;
  44. dronecan_remoteid_OperatorID msg_OperatorID;
  45. uint32_t last_location_ms;
  46. uint32_t last_basic_id_ms;
  47. uint32_t last_self_id_ms;
  48. uint32_t last_operator_id_ms;
  49. uint32_t last_system_ms;
  50. const char *parse_fail;
  51. public:
  52. void onTransferReceived(CanardInstance* ins, CanardRxTransfer* transfer);
  53. bool shouldAcceptTransfer(const CanardInstance* ins,
  54. uint64_t* out_data_type_signature,
  55. uint16_t data_type_id,
  56. CanardTransferType transfer_type,
  57. uint8_t source_node_id);
  58. const dronecan_remoteid_BasicID &get_basic_id(void) { return msg_BasicID; }
  59. const dronecan_remoteid_Location &get_location(void) { return msg_Location; }
  60. const dronecan_remoteid_SelfID &get_self_id(void) { return msg_SelfID; }
  61. const dronecan_remoteid_System &get_system(void) { return msg_System; }
  62. const dronecan_remoteid_OperatorID &get_operator_id(void) { return msg_OperatorID; }
  63. bool system_valid(void);
  64. bool location_valid(void);
  65. };