user_rid.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "user_rid.h"
  2. #include "dronecan.h"
  3. #include <dronecan.remoteid.Location.h>
  4. #include <dronecan.remoteid.ArmStatus.h>
  5. #include <dronecan.remoteid.BasicID.h>
  6. #include <uavcan.protocol.NodeStatus.h>
  7. #include <dronecan.remoteid.OperatorID.h>
  8. #include <dronecan.remoteid.SelfID.h>
  9. #include <dronecan.remoteid.System.h>
  10. #include "string.h"
  11. Connect_check remoteid_link;
  12. _armStatusID_msg StatusId;
  13. _location_msg locationId;
  14. _operatorId_msg operatorId;
  15. _basicId_msg basicId;
  16. _selfId_msg selfId;
  17. _sys_operator_msg systemId;
  18. void send_location_msg( void )
  19. {
  20. static uint8_t transfer_id = 0;
  21. struct dronecan_remoteid_Location msg;
  22. uint8_t buffer[DRONECAN_REMOTEID_LOCATION_MAX_SIZE] = {0};
  23. msg.id_or_mac.len = 20;
  24. memcpy(&msg.id_or_mac.data, &locationId.id_or_mac, msg.id_or_mac.len);
  25. msg.status = locationId.status;
  26. msg.direction = locationId.direction;
  27. msg.speed_horizontal = locationId.speed_horizontal;
  28. msg.speed_vertical = locationId.speed_vertical;
  29. msg.latitude = locationId.latitude;
  30. msg.longitude = locationId.longitude;
  31. msg.altitude_barometric = locationId.altitude_barometric;
  32. msg.altitude_geodetic = locationId.altitude_geodetic;
  33. msg.height_reference = locationId.height_reference;
  34. msg.height = locationId.height;
  35. msg.horizontal_accuracy = locationId.horizontal_accuracy;
  36. msg.vertical_accuracy = locationId.vertical_accuracy;
  37. msg.barometer_accuracy = locationId.barometer_accuracy;
  38. msg.speed_accuracy = locationId.speed_accuracy;
  39. msg.timestamp = locationId.timestamp;
  40. msg.timestamp_accuracy = locationId.timestamp_accuracy;
  41. uint32_t len = dronecan_remoteid_Location_encode(&msg, buffer);
  42. CanardTxTransfer tx_transfer = {
  43. .data_type_signature = DRONECAN_REMOTEID_LOCATION_SIGNATURE,
  44. .data_type_id = DRONECAN_REMOTEID_LOCATION_ID,
  45. .inout_transfer_id = &transfer_id,
  46. .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  47. .transfer_type = CanardTransferTypeBroadcast,
  48. .payload = buffer,
  49. .payload_len = len,
  50. };
  51. dronecan_broadcast(&tx_transfer);
  52. }
  53. void send_basicID(void)
  54. {
  55. static uint8_t transfer_id = 0;
  56. struct dronecan_remoteid_BasicID msg;
  57. uint8_t buffer[DRONECAN_REMOTEID_BASICID_MAX_SIZE] = {0};
  58. msg.id_or_mac.len = 20;
  59. memcpy(&msg.id_or_mac.data, &basicId.id_or_mac, msg.id_or_mac.len);
  60. msg.id_type = basicId.id_type;
  61. msg.ua_type = basicId.ua_type;
  62. msg.uas_id.len = 20;
  63. memcpy(&msg.uas_id.data, &basicId.uas_id, msg.uas_id.len);
  64. uint32_t len = dronecan_remoteid_BasicID_encode(&msg, buffer);
  65. CanardTxTransfer tx_transfer = {
  66. .data_type_signature = DRONECAN_REMOTEID_BASICID_SIGNATURE,
  67. .data_type_id = DRONECAN_REMOTEID_BASICID_ID,
  68. .inout_transfer_id = &transfer_id,
  69. .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  70. .transfer_type = CanardTransferTypeBroadcast,
  71. .payload = buffer,
  72. .payload_len = len,
  73. };
  74. dronecan_broadcast(&tx_transfer);
  75. }
  76. void send_operatorID(void)
  77. {
  78. static uint8_t transfer_id = 0;
  79. struct dronecan_remoteid_OperatorID msg;
  80. uint8_t buffer[DRONECAN_REMOTEID_OPERATORID_MAX_SIZE] = {0};
  81. msg.id_or_mac.len = 20;
  82. memcpy(&msg.id_or_mac.data, &operatorId.id_or_mac, msg.id_or_mac.len);
  83. msg.operator_id_type = operatorId.operator_id_type;
  84. msg.operator_id.len = 20;
  85. memcpy(&msg.operator_id.data, &operatorId.operator_id, msg.operator_id.len);
  86. uint32_t len = dronecan_remoteid_OperatorID_encode(&msg, buffer);
  87. CanardTxTransfer tx_transfer = {
  88. .data_type_signature = DRONECAN_REMOTEID_OPERATORID_SIGNATURE,
  89. .data_type_id = DRONECAN_REMOTEID_OPERATORID_ID,
  90. .inout_transfer_id = &transfer_id,
  91. .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  92. .transfer_type = CanardTransferTypeBroadcast,
  93. .payload = buffer,
  94. .payload_len = len,
  95. };
  96. dronecan_broadcast(&tx_transfer);
  97. }
  98. void send_sysOperatorID(void)
  99. {
  100. static uint8_t transfer_id = 0;
  101. struct dronecan_remoteid_System msg;
  102. uint8_t buffer[DRONECAN_REMOTEID_SYSTEM_MAX_SIZE] = {0};
  103. msg.id_or_mac.len = 20;
  104. memcpy(&msg.id_or_mac.data, &systemId.id_or_mac, msg.id_or_mac.len);
  105. msg.operator_location_type = systemId.operator_location_type;
  106. msg.classification_type = systemId.classification_type;
  107. msg.operator_latitude = systemId.operator_latitude;
  108. msg.operator_longitude = systemId.operator_longitude;
  109. msg.area_count = systemId.area_count;
  110. msg.area_radius = systemId.area_radius;
  111. msg.area_ceiling = systemId.area_ceiling;
  112. msg.area_floor = systemId.area_floor;
  113. msg.category_eu = systemId.category_eu;
  114. msg.class_eu = systemId.class_eu;
  115. msg.operator_altitude_geo = systemId.operator_altitude_geo;
  116. msg.timestamp = systemId.timestamp;
  117. uint32_t len = dronecan_remoteid_System_encode(&msg, buffer);
  118. CanardTxTransfer tx_transfer = {
  119. .data_type_signature = DRONECAN_REMOTEID_SYSTEM_SIGNATURE,
  120. .data_type_id = DRONECAN_REMOTEID_SYSTEM_ID,
  121. .inout_transfer_id = &transfer_id,
  122. .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  123. .transfer_type = CanardTransferTypeBroadcast,
  124. .payload = buffer,
  125. .payload_len = len,
  126. };
  127. dronecan_broadcast(&tx_transfer);
  128. }
  129. void send_selfID(void)
  130. {
  131. static uint8_t transfer_id = 0;
  132. struct dronecan_remoteid_SelfID msg;
  133. uint8_t buffer[DRONECAN_REMOTEID_SELFID_MAX_SIZE] = {0};
  134. msg.id_or_mac.len = 20;
  135. memcpy(&msg.id_or_mac.data, &selfId.id_or_mac, msg.id_or_mac.len);
  136. msg.description_type = selfId.description_type;
  137. msg.description.len = 23;
  138. memcpy(&msg.description.data, &selfId.description, msg.description.len);
  139. uint32_t len = dronecan_remoteid_SelfID_encode(&msg, buffer);
  140. CanardTxTransfer tx_transfer = {
  141. .data_type_signature = DRONECAN_REMOTEID_SELFID_SIGNATURE,
  142. .data_type_id = DRONECAN_REMOTEID_SELFID_ID,
  143. .inout_transfer_id = &transfer_id,
  144. .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  145. .transfer_type = CanardTransferTypeBroadcast,
  146. .payload = buffer,
  147. .payload_len = len,
  148. };
  149. dronecan_broadcast(&tx_transfer);
  150. }
  151. int remoteid_OnRecieved(CanardInstance *canardIns,
  152. CanardRxTransfer *transfer)
  153. {
  154. int ret = 0;
  155. struct dronecan_remoteid_ArmStatus info;
  156. static int TimeDelay = 0;
  157. if (transfer->transfer_type == CanardTransferTypeBroadcast)
  158. {
  159. if( transfer->data_type_id == DRONECAN_REMOTEID_ARMSTATUS_ID)
  160. {
  161. if (!dronecan_remoteid_ArmStatus_decode(transfer, &info)) {
  162. StatusId.status = info.status;
  163. if( StatusId.status != 0 && HAL_GetTick() - TimeDelay > 2500)
  164. {
  165. memcpy(&StatusId.status, &info.status, sizeof(struct dronecan_remoteid_ArmStatus));
  166. }
  167. else
  168. {
  169. StatusId.status = 0;
  170. TimeDelay = HAL_GetTick();
  171. memset(&StatusId.len,0,51);
  172. }
  173. StatusId.len = 50;
  174. remoteid_link.connect_status = COMP_NORMAL;
  175. }
  176. }
  177. }
  178. return ret;
  179. }
  180. bool remoteid_shouldAcceptTransfer(const CanardInstance *ins,
  181. uint64_t *out_data_type_signature,
  182. uint16_t data_type_id,
  183. CanardTransferType transfer_type,
  184. uint8_t source_node_id) {
  185. bool ret = false;
  186. if (data_type_id == DRONECAN_REMOTEID_ARMSTATUS_ID &&
  187. transfer_type == CanardTransferTypeBroadcast) {
  188. *out_data_type_signature = DRONECAN_REMOTEID_ARMSTATUS_SIGNATURE;
  189. ret = true;
  190. }
  191. if (data_type_id == UAVCAN_PROTOCOL_NODESTATUS_ID &&
  192. transfer_type == CanardTransferTypeBroadcast) {
  193. *out_data_type_signature = UAVCAN_PROTOCOL_NODESTATUS_SIGNATURE;
  194. ret = true;
  195. }
  196. return ret;
  197. }
  198. void send_msg_to_remoteid(void)
  199. {
  200. static uint32_t SendTime_N2HZ = 0;
  201. static uint32_t SendTime_N3HZ = 0;
  202. static uint32_t SendTime_N4HZ = 0;
  203. static uint32_t SendTime_N5HZ = 0;
  204. static uint32_t SendTime_N6HZ = 0;
  205. if ( HAL_GetTick() - SendTime_N2HZ > 555 )
  206. {
  207. //send_node_status();
  208. send_location_msg();
  209. SendTime_N2HZ = HAL_GetTick();
  210. }
  211. if ( HAL_GetTick() - SendTime_N3HZ > 666 )
  212. {
  213. send_sysOperatorID();
  214. SendTime_N3HZ = HAL_GetTick();
  215. }
  216. if ( HAL_GetTick() - SendTime_N4HZ > 333 )
  217. {
  218. send_basicID();
  219. SendTime_N4HZ = HAL_GetTick();
  220. }
  221. if ( HAL_GetTick() - SendTime_N6HZ > 1777 )
  222. {
  223. send_operatorID();
  224. SendTime_N6HZ = HAL_GetTick();
  225. }
  226. if ( HAL_GetTick() - SendTime_N5HZ > 1888 )
  227. {
  228. send_selfID();
  229. SendTime_N5HZ = HAL_GetTick();
  230. }
  231. dronecan_tx_processing();
  232. }