Stima V4 Slave RAIN  4.2
canard_class_rain.hpp
Go to the documentation of this file.
1 
30 // Configurazione modulo, definizioni ed utility generiche
31 #include "canard_config.hpp"
32 #include "local_typedef.h"
33 // Arduino
34 #include <Arduino.h>
35 // Libcanard
36 #include <o1heap.h>
37 #include <canard.h>
38 // Namespace UAVCAN
39 #include <uavcan/node/Heartbeat_1_0.h>
40 #include <uavcan/node/GetInfo_1_0.h>
41 #include <uavcan/node/ExecuteCommand_1_1.h>
42 #include <uavcan/node/port/List_0_1.h>
43 #include <uavcan/_register/Access_1_0.h>
44 #include <uavcan/_register/List_1_0.h>
45 #include <uavcan/file/Read_1_1.h>
46 #include <uavcan/time/Synchronization_1_0.h>
47 #include <uavcan/pnp/NodeIDAllocationData_1_0.h>
48 // Namespace RMAP
49 #include <rmap/_module/Rain_1_0.h>
50 #include <rmap/service/_module/Rain_1_0.h>
51 
52 #ifndef _CANARD_CLASS_H
53 #define _CANARD_CLASS_H
54 
55 class canardClass {
56 
57  // ***************** PUBLIC ACCESS *****************
58  public:
59 
60  // ******************** Tipi di Dati *****************
61 
62  // Tipologie elaborazioni/sensori modulo(i)
63  // tbr (Standard rain), tbm (Rain with full maintenance data value)
64  enum Sensor_Type : uint8_t {
65  tbr,
66  tpr,
67  tbm
68  };
69 
70  // Modalità di accesso a getMicros()
71  enum GetMonotonicTime_Type : uint8_t {
74  };
75 
76  // Gestione porte e subject di Canard
77  enum Introspection_Port : uint8_t {
82  };
83 
84  // Gestione comandi privati di Canard / Rmap
85  enum Command_Private : uint8_t {
95  remote_test_value = 100
96  };
97 
98  // Interprete heartBeat VSC (Vendor Status Code) x Comunicazioni messaggi Master<->Slave
99  typedef union {
100  // Bit field
101  struct {
103  uint8_t traceLog : 1;
104  uint8_t fwUploading : 1;
105  uint8_t dataReady : 1;
106  uint8_t moduleReady : 1;
107  uint8_t moduleError : 1;
108  };
109  // uint8 value
110  uint8_t uint8_val;
111  } heartbeat_VSC;
112 
113  // Coda di ricezione dati per gestione rapida in Interrupt (STM32 IRQ_CB bxCan)
114  // Gestisce l'inserimento dei dati sulla coda locale, prima della gestione
115  // Con Canard con il passaggio dalla coda bufferizzata ai frame di Canard_Rx
116  typedef struct CanardRxQueue
117  {
118  // CanardTxQueue (Frame e Buffer x Interrupt gestione Coda FiFo)
119  uint8_t wr_ptr;
120  uint8_t rd_ptr;
121  struct msg {
122  CanardFrame frame;
123  uint8_t buf[CANARD_MTU_MAX];
126 
127  // ******************** Dati e Funzioni ******************
128 
129  // Constructor di classe
130  canardClass();
131 
132  // Timings Function e Dati associati
133  static CanardMicrosecond getMicros();
134  static CanardMicrosecond getMicros(GetMonotonicTime_Type syncro_type);
135  static uint32_t getUpTimeSecond(void);
136 
137  // *************************************************
138  // Canard SendData
139  // *************************************************
140  // Wrapper per send e sendresponse con Canard
141  void send(CanardMicrosecond tx_deadline_usec,
142  const CanardTransferMetadata* const metadata,
143  const size_t payload_size,
144  const void* const payload);
145  // Risposte con inversione meta.transfer_kind alle Request
146  void sendResponse(const CanardMicrosecond tx_deadline_usec,
147  const CanardTransferMetadata* const request_metadata,
148  const size_t payload_size,
149  const void* const payload);
150 
151  // Gestione messaggi e coda di trasmissione
152  bool transmitQueueDataPresent(void);
153  void transmitQueue(void);
154 
155  // *************************************************
156  // Canard Local ISR Buffer ReceiveData
157  // *************************************************
158  // Gestione messaggi e coda di ricezione in buffer FIFO
159  void receiveQueueEmpty(void);
160  bool receiveQueueDataPresent(void);
161  uint8_t receiveQueueElement(void);
162  uint8_t receiveQueueNextElement(uint8_t currElement);
163 
164  // Ricezione messaggi per elementi in RX, con logger opzionale
165  void receiveQueue(void);
166  void receiveQueue(char *logMessage);
167 
168  // CallBack esterna per rxCanardAccept dei messaggi dal buffer RX (valid message)
169  // Richiamata se canardAccept accetta il pacchetto ricomposto dei frame in RX
170  void setReceiveMessage_CB (void (*ptrFunction) (canardClass&, const CanardRxTransfer*, void *), void *param);
171  void enableReceiveMessage_CB (void);
172  void disableReceiveMessage_CB (void);
173 
174  // *************************************************
175  // Canard Metodi di sottoscrizione
176  // *************************************************
177 
178  // Sottoscrizione ai metodi Canard
179  bool rxSubscribe(const CanardTransferKind transfer_kind,
180  const CanardPortID port_id,
181  const size_t extent,
182  const CanardMicrosecond transfer_id_timeout_usec);
183  uint8_t rxSubscriptionAvaiable(void);
184  void rxUnSubscribe(const CanardTransferKind transfer_kind,
185  const CanardPortID port_id);
186 
187  // ****************************************************************************************
188  // Comandi Server per gestione del modulo locale tramite classe Master e pending o Diretti
189  // ****************************************************************************************
190  bool send_file_read_block(CanardNodeID server_id, char * fileName, uint64_t remoteOffset);
191  bool master_file_read_block_pending(uint32_t timeout_us);
192 
193  // *************************************************
194  // Sottoclassi MASTER locale per gestione di Stato
195  // *************************************************
196  class master
197  {
198  public:
199 
200  // Heartbeat Online e Stato
201  class heartbeat {
202 
203  public:
204 
205  bool is_online(bool is_heart_syncronized);
206  void set_online(uint32_t dead_line_us);
207  CanardMicrosecond last_online(void);
208 
209  private:
210 
211  uint64_t _timeout_us;
212 
214 
215  // Time stamp
216  class timestamp {
217 
218  public:
219 
220  bool check_valid_syncronization(uint8_t current_transfer_id,
221  CanardMicrosecond previous_tx_timestamp_us);
222  CanardMicrosecond get_timestamp_syncronized(CanardMicrosecond current_rx_timestamp_us,
223  CanardMicrosecond previous_tx_timestamp_us);
224  CanardMicrosecond get_timestamp_syncronized();
225  CanardMicrosecond update_timestamp_message(CanardMicrosecond current_rx_timestamp_us,
226  CanardMicrosecond previous_tx_timestamp_us);
227  private:
228 
229  CanardMicrosecond _syncronized_timestamp_us;
231  CanardMicrosecond _previous_local_timestamp_us;
232  CanardMicrosecond _previous_msg_monotonic_us;
234 
236 
237  // File upload (node_id può essere differente dal master, es. yakut e lo riporto)
238  class file
239  {
240 
241  public:
242 
243  void start_request(uint8_t remote_node, uint8_t *param_request_name,
244  uint8_t param_request_len, bool is_firmware);
245  char *get_name(void);
246  CanardNodeID get_server_node(void);
247  bool download_request(void);
248  bool is_download_complete(void);
249  void download_end(void);
250  bool is_firmware(void);
251  uint64_t get_offset_rx(void);
252  void set_offset_rx(uint64_t remote_file_offset);
253  bool is_first_data_block(void);
254  bool next_retry(void);
255  bool next_retry(uint8_t *avaiable_retry);
256  void start_pending(uint32_t timeout_us);
257  void reset_pending(void);
258  void reset_pending(size_t message_len);
259  bool event_timeout(void);
260  bool is_pending(void);
261 
262  private:
263 
264  uint8_t _node_id;
267  bool _updating;
270  uint64_t _offset;
271  uint64_t _timeout_us; // Time command Remoto x Verifica deadLine Request
272  bool _is_pending; // Funzione in pending (inviato, attesa risposta o timeout)
273 
274  } file;
275 
277 
278  // ****************************************************************************************
279  // Comandi Server per gestione del modulo locale tramite classe locale e pending o Diretti
280  // ****************************************************************************************
281  bool slave_heartbeat_send_message(void);
282  bool slave_pnp_send_request(uint64_t serial_number);
284 
285  // *************************************************
286  // Sottoclassi e dati locali per gestione di Stato
287  // *************************************************
288 
289  // Dati e Metadati del modulo locale
290  rmap_module_Rain_1_0 module_rain;
291 
292  // Subject ID porte e servizi modulo locale
293  class port_id
294  {
295  public:
296 
297  CanardPortID publisher_module_rain;
298  CanardPortID service_module_rain;
299 
301 
302  // Abilitazione delle pubblicazioni falcoltative sulla rete (ON/OFF a richiesta)
304  {
305  public:
306 
308  bool port_list;
309 
311 
312  // Tranfer ID (CAN Interfaccia ID -> uint8) servizi attivi del modulo locale
314  {
315  public:
316 
317  uint8_t uavcan_node_heartbeat(void);
318  uint8_t uavcan_node_port_list(void);
319  uint8_t uavcan_pnp_allocation(void);
320  uint8_t uavcan_file_read_data(void);
321  uint8_t module_rain(void);
322 
323  private:
324 
329  uint8_t _module_rain;
330 
332 
333  // Flag di stato
334  class flag
335  {
336 
337  public:
338 
339  // Funzioni Locali per gestione sistema
340  void request_system_restart(void);
341  bool is_requested_system_restart(void);
342  void request_sleep(void);
343  bool is_module_sleep(void);
344  void disable_sleep(void);
345  void enable_sleep(void);
346  // Funzioni Locali per gestione interna e VSC x HeartBeat VendorStatusCode a Bit MASK
347  void set_local_power_mode(Power_Mode powerMode);
348  void set_local_fw_uploading(bool fwUploading);
349  void set_local_data_ready(bool dataReady);
350  void set_local_module_ready(bool moduleReady);
351  void set_local_module_error(bool moduleError);
353  bool get_local_fw_uploading(void);
354  bool get_local_data_ready(void);
355  bool get_local_module_ready(void);
356  bool get_local_module_error(void);
357  uint8_t get_local_value_heartbeat_VSC(void);
358  // Funzioni Locali per gestione interna e VSC x HeartBeat VendorStatusCode a Bit MASK
359  void set_local_node_mode(uint8_t heartLocalMODE);
360  uint8_t get_local_node_mode(void);
361 
362  private:
363 
364  bool _restart_required; // Forza reboot
365  bool _enter_sleep; // Avvia la procedura di sleep del modulo
366  bool _inibith_sleep; // Inibisce lo sleep del modulo
367  // Var per Status locale da utilizzare, RW in Heart_beat
370 
371  } flag;
372 
373  // Local address
374  void set_canard_node_id(CanardNodeID local_id);
375  CanardNodeID get_canard_node_id(void);
376  bool is_canard_node_anonymous(void);
377  // Master address
378  void set_canard_master_id(CanardNodeID remote_id);
379  CanardNodeID get_canard_master_id(void);
380 
381  // ***************** PRIVATE ACCESS *****************
382  private:
383 
384  // Istanza del modulo canard
385  CanardInstance _canard;
386 
387  // Node ID del MASTER remoto utilizzato per riferimento Set Flag e Comandi locali
388  // automatici come gestione flag modalità power, Sleep, errori ecc.
389  CanardNodeID _master_id;
390 
391  // Buffer dati e trasmissione delle code di tx e quella di rx
394 
395  // Timings var per getMicros();
396  inline static uint32_t _lastMicros;
397  inline static uint64_t _currMicros;
398  inline static uint64_t _syncMicros;
399  inline static uint64_t _mastMicros;
400 
401  // Funzioni di utility private (sezione publish list_message)
402  void _fillSubscriptions(const CanardTreeNode* const tree, uavcan_node_port_SubjectIDList_0_1* const obj);
403  void _fillServers(const CanardTreeNode* const tree, uavcan_node_port_ServiceIDList_0_1* const obj);
404 
405  // Canard O1HEAP, Gestita RAM e CallBack internamente alla classe
406  O1HeapInstance* _heap;
407  _Alignas(O1HEAP_ALIGNMENT) uint8_t _heap_arena[HEAP_ARENA_SIZE];
408 
409  // Gestione O1Heap Static Funzioni x Canard Memory Allocate/Free
410  static void* _memAllocate(CanardInstance* const ins, const size_t amount);
411  static void _memFree(CanardInstance* const ins, void* const pointer);
412 
413  O1HeapDiagnostics _memGetDiagnostics(void);
414 
415  // Indirizzo della funzione di CallBack Esterna su Rx Messaggio Canard
417  void (*_attach_rx_callback_PTR) (canardClass&, const CanardRxTransfer*, void *);
419 
420  // Gestione subscription locali
421  CanardRxSubscription _rxSubscription[MAX_SUBSCRIPTION];
423 };
424 
425 #endif
Uavcan Canard Configuration file.
#define HEAP_ARENA_SIZE
#define CAN_FILE_NAME_SIZE_MAX
#define CAN_RX_QUEUE_CAPACITY
#define MAX_SUBSCRIPTION
#define CAN_REDUNDANCY_FACTOR
bool get_local_data_ready(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void set_local_power_mode(Power_Mode powerMode)
Proprietà SET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali La proprietà è im...
void set_local_fw_uploading(bool fwUploading)
Proprietà SET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
Power_Mode get_local_power_mode(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void set_local_data_ready(bool dataReady)
Proprietà SET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void disable_sleep(void)
Permetto l'attivazione sleep, funzioni ed hardware, del modulo.
uint8_t get_local_node_mode(void)
Ritorna la modalità node mode locale standard UAVCAN per la gestione heartbeat.
void set_local_node_mode(uint8_t heartLocalMODE)
Imposta la modalità nodo standard UAVCAN, gestita nelle funzioni heartbeat.
bool get_local_module_error(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
bool is_requested_system_restart(void)
Verifica una richiesta di riavvio del sistema standard UAVCAN.
void set_local_module_ready(bool moduleReady)
Proprietà SET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void set_local_module_error(bool moduleError)
Proprietà SET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
uint8_t get_local_value_heartbeat_VSC(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void enable_sleep(void)
Inibisce l'attivazione sleep, funzioni ed hardware, del modulo.
heartbeat_VSC _heartLocalVSC
bool get_local_fw_uploading(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
bool is_module_sleep(void)
Verifica se attiva la funzione dello sleep del modulo Canard e hardware relativo.
bool get_local_module_ready(void)
Proprietà GET per il valore VendorStatusCode di Heartbeat e per gli utilizzi locali.
void request_sleep(void)
Avvia la richiesta di sleep del modulo. Da chiamare prima di attivare il basso consumo generale.
void request_system_restart(void)
Avvia una richiesta standard UAVCAN per il riavvio del sistema.
CanardNodeID get_server_node(void)
Legge il nodo master file server che richiede il caricamento del file.
uint64_t get_offset_rx(void)
Legge l'offset corrente.
bool download_request(void)
Gestione file, verifica richiesta di download da un nodo remoto.
char * get_name(void)
Nome del file in download.
bool event_timeout(void)
Gestione timeout pending file. Controlla il raggiungimento del timeout.
bool is_pending(void)
Verifica se un comando per il relativo modulo è in attesa. Diventerà false o verrà attivato il timeou...
bool is_first_data_block(void)
Verifica se è il primo blocco di un file. Da utilizzare per rewrite file o init E2Prom Space.
void set_offset_rx(uint64_t remote_file_offset)
Imposta l'offset RX per la lettura di un blocco specifico del file in donload remoto.
void start_pending(uint32_t timeout_us)
Avvia un comando per il metodo corrente con timeOut di validità
char _filename[CAN_FILE_NAME_SIZE_MAX]
void download_end(void)
Gestione file, abbandona o termina richiesta di download da un nodo remoto. Il nodo non risponde più ...
bool is_firmware(void)
Controlla se il file è di tipo firmware o altra tipologia.
void reset_pending(void)
Resetta lo stato dei flag pending per il metodo corrente.
bool next_retry(void)
Gestione automatica totale retry del comando file all'interno della classe MAX retry è gestito nel fi...
bool is_download_complete(void)
Gestione file, fine con successo del download file da un nodo remoto. Il nodo non risponde più alle r...
void start_request(uint8_t remote_node, uint8_t *param_request_name, uint8_t param_request_len, bool is_firmware)
Avvia una richiesta remota di download file ed inizializza le risorse nella classe.
void set_online(uint32_t dead_line_us)
Imposta il nodo OnLine, richiamato in heartbeat o altre comunicazioni client.
CanardMicrosecond last_online(void)
Imposta il nodo OnLine, richiamato in heartbeat o altre comunicazioni client.
bool is_online(bool is_heart_syncronized)
Controlla se il modulo master è online.
CanardMicrosecond _previous_syncronized_timestamp_us
bool check_valid_syncronization(uint8_t current_transfer_id, CanardMicrosecond previous_tx_timestamp_us)
Controlla se messaggio valido (coerenza sequenza e validità di time_stamp)
CanardMicrosecond update_timestamp_message(CanardMicrosecond current_rx_timestamp_us, CanardMicrosecond previous_tx_timestamp_us)
Aggiorna i time stamp della classe sul messaggio standard UAVCAN per le successive sincronizzazioni.
CanardMicrosecond _syncronized_timestamp_us
CanardMicrosecond _previous_local_timestamp_us
CanardMicrosecond get_timestamp_syncronized()
Legge il tempo sincronizzato dal master, in Overload, regolato sui microsecondi locali a partire dall...
CanardMicrosecond _previous_msg_monotonic_us
class canardClass::master::file file
class canardClass::master::timestamp timestamp
class canardClass::master::heartbeat heartbeat
uint8_t uavcan_node_heartbeat(void)
Gestione transfer ID UAVCAN per la classe relativa.
uint8_t uavcan_pnp_allocation(void)
Gestione transfer ID UAVCAN per la classe relativa.
uint8_t uavcan_file_read_data(void)
Gestione transfer ID UAVCAN per la classe relativa.
uint8_t module_rain(void)
Gestione transfer ID UAVCAN per la classe relativa.
uint8_t uavcan_node_port_list(void)
Gestione transfer ID UAVCAN per la classe relativa.
CanardPortID publisher_module_rain
CanardPortID service_module_rain
static uint32_t _lastMicros
class canardClass::port_id port_id
canardClass()
Contruttore della classe Canard.
rmap_module_Rain_1_0 module_rain
struct canardClass::CanardRxQueue CanardRxQueue
void rxUnSubscribe(const CanardTransferKind transfer_kind, const CanardPortID port_id)
Rimozione di una sottoscrizione di una funzione Canard.
bool master_file_read_block_pending(uint32_t timeout_us)
Avvia la richiesta di un blocco file contiguo al file_server tramite classe e controllo Master.
void(* _attach_rx_callback_PTR)(canardClass &, const CanardRxTransfer *, void *)
CanardNodeID get_canard_node_id(void)
Legge l'ID Nodo locale per l'istanza Canard privata della classe Canard.
static CanardMicrosecond getMicros()
Get MonotonicTime Interno realTime.
void send(CanardMicrosecond tx_deadline_usec, const CanardTransferMetadata *const metadata, const size_t payload_size, const void *const payload)
Send messaggio Canard con daeadline del tempo sincronizzato.
class canardClass::publisher_enabled publisher_enabled
bool slave_heartbeat_send_message(void)
Invia il messaggio di HeartBeat ai nodi remoti.
static uint64_t _mastMicros
void set_canard_node_id(CanardNodeID local_id)
Imposta l'ID Nodo locale per l'istanza Canard privata della classe Canard.
void _fillSubscriptions(const CanardTreeNode *const tree, uavcan_node_port_SubjectIDList_0_1 *const obj)
Prepara la lista delle sottoscrizioni Canard (privata)
class canardClass::master master
class canardClass::flag flag
CanardNodeID _master_id
CanardInstance _canard
void receiveQueue(void)
Gestione metodo ricezione coda messaggi dal buffer FIFO preparato di BxCAN Il buffer gestito nella IS...
CanardTxQueue _canard_tx_queues[CAN_REDUNDANCY_FACTOR]
static uint64_t _syncMicros
void _fillServers(const CanardTreeNode *const tree, uavcan_node_port_ServiceIDList_0_1 *const obj)
Prepara la lista dei servizi Canard (privata)
void setReceiveMessage_CB(void(*ptrFunction)(canardClass &, const CanardRxTransfer *, void *), void *param)
Setta il CallBack Function per il processo esterno di interprete su messaggio ricevuto e conforme a C...
uint8_t receiveQueueNextElement(uint8_t currElement)
Ritorna il prossimo elemento del buffer.
void transmitQueue(void)
Trasmette la coda con timeStamp sincronizzato. Per inviare con real_time va aggiornata la sincronizza...
_Alignas(O1HEAP_ALIGNMENT) uint8_t _heap_arena[HEAP_ARENA_SIZE]
void receiveQueueEmpty(void)
Azzera il buffer di ricezione dati collegato a BxCAN e ISR Interrupt.
class canardClass::next_transfer_id next_transfer_id
uint8_t receiveQueueElement(void)
Ritorna l'elemento corrente del buffer di BxCAN, pronto ad essere gestito con Canard.
CanardRxSubscription _rxSubscription[MAX_SUBSCRIPTION]
bool slave_servicelist_send_message(void)
Invia il messaggio dei servizi attivi ai nodi remoti.
bool is_canard_node_anonymous(void)
Controlla se il nodo è anonimo (senza ID Impostato)
void sendResponse(const CanardMicrosecond tx_deadline_usec, const CanardTransferMetadata *const request_metadata, const size_t payload_size, const void *const payload)
Send risposta al messaggio Canard con daeadline del tempo sincronizzato.
static void * _memAllocate(CanardInstance *const ins, const size_t amount)
Gestione O1Heap Memory Canard Allocate.
bool slave_pnp_send_request(uint64_t serial_number)
Invia il messaggio di PNP request (richiesta di node_id valido) al nodo server PNP (master)
CanardRxQueue _canard_rx_queue
CanardNodeID get_canard_master_id(void)
Get master node id for local set and flag operation automatic (sleep, power...)
bool send_file_read_block(CanardNodeID server_id, char *fileName, uint64_t remoteOffset)
Avvia la richiesta di un blocco file contiguo al file_server con ID Fisico.
void set_canard_master_id(CanardNodeID remote_id)
Set node master ID (slave respond to RMAP command and flag with master ID)
void disableReceiveMessage_CB(void)
Disabilita il CallBack Function Canard RX Message CanardRxAccept.
static uint32_t getUpTimeSecond(void)
Ritorna i secondi dall'avvio Canard per UpTime in (in formato 64 BIT necessario per UAVCAN) Non perme...
bool transmitQueueDataPresent(void)
Test coda presenza dati in trasmissione di Canard.
O1HeapDiagnostics _memGetDiagnostics(void)
Diagnostica Heap Data per Heartbeat e/o azioni interne.
bool rxSubscribe(const CanardTransferKind transfer_kind, const CanardPortID port_id, const size_t extent, const CanardMicrosecond transfer_id_timeout_usec)
Sottoscrizione di una funzione Canard.
uint8_t rxSubscriptionAvaiable(void)
Ritorna il numero di sottoscrizioni ancora disponibili.
O1HeapInstance * _heap
void enableReceiveMessage_CB(void)
Abilita il CallBack Function Canard RX Message CanardRxAccept.
uint8_t _rxSubscriptionIdx
bool receiveQueueDataPresent(void)
Ritorna true se ci sono dati utili da gestire dal buffer di RX per BxCAN.
static void _memFree(CanardInstance *const ins, void *const pointer)
Gestione O1Heap Memory Canard Free.
static uint64_t _currMicros
Power_Mode
Power mode (Canard and general Node)
Definition: local_typedef.h:31
struct canardClass::CanardRxQueue::msg msg[CAN_RX_QUEUE_CAPACITY]