40     HAL_CAN_IRQHandler(&
hcan1);
 
   95     _heap = o1heapInit(_heap_arena, 
sizeof(_heap_arena));
 
  101     _canard.node_id = CANARD_NODE_ID_UNSET;
 
  137     uint32_t ts = micros();
 
  176                         const CanardTransferMetadata* 
const metadata,
 
  177                         const size_t payload_size,
 
  178                         const void* 
const payload) {
 
  195                                 const CanardTransferMetadata* 
const request_metadata,
 
  196                                 const size_t payload_size,
 
  197                                 const void* 
const payload) {
 
  198     CanardTransferMetadata meta = *request_metadata;
 
  199     meta.transfer_kind = CanardTransferKindResponse;
 
  200     send(tx_deadline_usec, &meta, payload_size, payload);
 
  210         const CanardTxQueueItem* tqi = canardTxPeek(que);  
 
  211         if(tqi != NULL) 
return true;
 
  223         const CanardTxQueueItem* tqi = canardTxPeek(que);  
 
  231             #if (CAN_DELAY_US_SEND > 0) 
  236             if ((tqi->tx_deadline_usec == 0) || (tqi->tx_deadline_usec > 
_syncMicros)) {
 
  240                     tqi->tx_deadline_usec,
 
  241                     tqi->frame.extended_can_id,
 
  242                     tqi->frame.payload_size,
 
  243                     tqi->frame.payload)) {
 
  246                     tqi = canardTxPeek(que);
 
  257                 tqi = canardTxPeek(que);
 
  305     const CanardMicrosecond timestamp_usec = 
getMicros();
 
  306     CanardRxTransfer        transfer;
 
  308     if (canard_result > 0) {
 
  311     } 
else if ((canard_result == 0) || (canard_result == -CANARD_ERROR_OUT_OF_MEMORY)) {
 
  331     strcpy(logMessage, 
",Val:");
 
  334         strcpy(logMessage, 
" 0x");
 
  337             strcpy(logMessage, 
"0");
 
  350     const CanardMicrosecond timestamp_usec = 
getMicros();
 
  351     CanardRxTransfer        transfer;
 
  353     if (canard_result > 0) {
 
  356     } 
else if ((canard_result == 0) || (canard_result == -CANARD_ERROR_OUT_OF_MEMORY)) {
 
  395         const CanardTransferKind    transfer_kind,
 
  398         const CanardMicrosecond     transfer_id_timeout_usec) {
 
  402     const int8_t res = canardRxSubscribe(&
_canard,
 
  406         transfer_id_timeout_usec,
 
  421         const CanardTransferKind    transfer_kind,
 
  453     uavcan_file_Read_Request_1_1 remotefile = {0};
 
  454     remotefile.path.path.count = strlen(fileName);
 
  455     memcpy(remotefile.path.path.elements, fileName, remotefile.path.path.count);
 
  456     remotefile.offset = remoteOffset;
 
  458     uint8_t      serialized[uavcan_file_Read_Request_1_1_SERIALIZATION_BUFFER_SIZE_BYTES_] = {0};
 
  459     size_t       serialized_size                                                           = 
sizeof(serialized);
 
  460     const int8_t err = uavcan_file_Read_Request_1_1_serialize_(&remotefile, &serialized[0], &serialized_size);
 
  464         const CanardTransferMetadata meta = {
 
  465             .priority       = CanardPriorityHigh,
 
  466             .transfer_kind  = CanardTransferKindRequest,
 
  467             .port_id        = uavcan_file_Read_1_1_FIXED_PORT_ID_,
 
  468             .remote_node_id = server_id,
 
  472         send(
MEGA, &meta, serialized_size, &serialized[0]);
 
  494         if(is_heart_syncronized) {
 
  527                                             CanardMicrosecond previous_tx_timestamp_us) {
 
  531     if((++_previous_transfer_id == current_transfer_id) &&
 
  536     _previous_transfer_id = current_transfer_id;
 
  545                                             CanardMicrosecond previous_tx_timestamp_us) {
 
  548     _syncronized_timestamp_us = previous_tx_timestamp_us + current_rx_timestamp_us - _previous_local_timestamp_us;
 
  550     _previous_syncronized_timestamp_us = 
getMicros();
 
  551     _syncronized_timestamp_us += (_previous_syncronized_timestamp_us - current_rx_timestamp_us);
 
  552     return _syncronized_timestamp_us;
 
  560     CanardMicrosecond realtime_us = 
getMicros();
 
  561     CanardMicrosecond diff_synconized_us = realtime_us - _previous_syncronized_timestamp_us;
 
  562     _previous_syncronized_timestamp_us = realtime_us;
 
  563     _syncronized_timestamp_us += diff_synconized_us;
 
  564     return _syncronized_timestamp_us;
 
  572                                 CanardMicrosecond previous_tx_timestamp_us) {
 
  574     CanardMicrosecond difference_timestamp_us = previous_tx_timestamp_us - _previous_msg_monotonic_us;
 
  577     _previous_local_timestamp_us = current_rx_timestamp_us;
 
  579     _previous_msg_monotonic_us = previous_tx_timestamp_us;
 
  580     return difference_timestamp_us;
 
  591                                     uint8_t param_request_len, 
bool is_firmware) {
 
  592     _node_id = remote_node;
 
  594     memcpy(_filename, param_request_name, param_request_len);
 
  595     _filename[param_request_len] = 
'\0';
 
  597     _is_firmware = is_firmware;
 
  599     _updating_eof = 
false;
 
  629     return _updating_eof;
 
  636     _node_id = CANARD_NODE_ID_UNSET;
 
  656     _offset = remote_file_offset;
 
  712     _offset += message_len;
 
  714     _updating_eof = (message_len != uavcan_primitive_Unstructured_1_0_value_ARRAY_CAPACITY_);
 
  742     uavcan_node_Heartbeat_1_0 
heartbeat = {0};
 
  745     if (heap_diag.oom_count > 0) {
 
  746         heartbeat.health.value = uavcan_node_Health_1_0_CAUTION;
 
  748         heartbeat.health.value = uavcan_node_Health_1_0_NOMINAL;
 
  754     uint8_t serialized[uavcan_node_Heartbeat_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_] = {0};
 
  755     size_t serialized_size = 
sizeof(serialized);
 
  756     const int8_t err = uavcan_node_Heartbeat_1_0_serialize_(&
heartbeat, &serialized[0], &serialized_size);
 
  759         const CanardTransferMetadata meta = {
 
  760             .priority = CanardPriorityNominal,
 
  761             .transfer_kind = CanardTransferKindMessage,
 
  762             .port_id = uavcan_node_Heartbeat_1_0_FIXED_PORT_ID_,
 
  763             .remote_node_id = CANARD_NODE_ID_UNSET,
 
  767         send(
MEGA, &meta, serialized_size, &serialized[0]);
 
  777     uavcan_pnp_NodeIDAllocationData_1_0 msg = {0};
 
  783     uint8_t serialized[uavcan_pnp_NodeIDAllocationData_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_] = {0};
 
  784     size_t serialized_size = 
sizeof(serialized);
 
  785     const int8_t err = uavcan_pnp_NodeIDAllocationData_1_0_serialize_(&msg, &serialized[0], &serialized_size);
 
  788         const CanardTransferMetadata meta = {
 
  789             .priority = CanardPrioritySlow,
 
  790             .transfer_kind = CanardTransferKindMessage,
 
  791             .port_id = uavcan_pnp_NodeIDAllocationData_1_0_FIXED_PORT_ID_,
 
  792             .remote_node_id = CANARD_NODE_ID_UNSET,
 
  796         send(
MEGA, &meta, serialized_size, &serialized[0]);
 
  809         const CanardRxSubscription* crs = (
const CanardRxSubscription*)tree;
 
  810         if (crs->port_id <= CANARD_SUBJECT_ID_MAX) {
 
  811             LOCAL_ASSERT(obj->sparse_list.count < uavcan_node_port_SubjectIDList_0_1_sparse_list_ARRAY_CAPACITY_);
 
  812             obj->sparse_list.elements[obj->sparse_list.count++].value = crs->port_id;
 
  825         const CanardRxSubscription* crs = (
const CanardRxSubscription*)tree;
 
  826         if (crs->port_id <= CANARD_SERVICE_ID_MAX) {
 
  827             (void)nunavutSetBit(&obj->mask_bitpacked_[0], 
sizeof(obj->mask_bitpacked_), crs->port_id, 
true);
 
  841         (
_canard.node_id <= CANARD_NODE_ID_MAX))
 
  843         uavcan_node_port_List_0_1 m = {0};
 
  844         uavcan_node_port_List_0_1_initialize_(&m);
 
  845         uavcan_node_port_SubjectIDList_0_1_select_sparse_list_(&m.publishers);
 
  846         uavcan_node_port_SubjectIDList_0_1_select_sparse_list_(&m.subscribers);
 
  850             size_t* 
const cnt = &m.publishers.sparse_list.count;
 
  851             m.publishers.sparse_list.elements[(*cnt)++].value = uavcan_node_Heartbeat_1_0_FIXED_PORT_ID_;
 
  852             m.publishers.sparse_list.elements[(*cnt)++].value = uavcan_node_port_List_0_1_FIXED_PORT_ID_;
 
  869         uint8_t serialized[256] = {0};
 
  870         size_t  serialized_size = uavcan_node_port_List_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_;
 
  871         if (uavcan_node_port_List_0_1_serialize_(&m, &serialized[0], &serialized_size) >= 0)
 
  873             const CanardTransferMetadata meta = {
 
  874                 .priority       = CanardPriorityOptional,  
 
  875                 .transfer_kind  = CanardTransferKindMessage,
 
  876                 .port_id        = uavcan_node_port_List_0_1_FIXED_PORT_ID_,
 
  877                 .remote_node_id = CANARD_NODE_ID_UNSET,
 
  881             send(
MEGA * 2, &meta, serialized_size, &serialized[0]);
 
  930     _restart_required = 
true;
 
  936     return _restart_required;
 
  942     if(_inibith_sleep) 
return;
 
  956     _inibith_sleep = 
true;
 
  961     _inibith_sleep = 
false;
 
  971     _heartLocalVSC.powerMode = powerMode;
 
  977     _heartLocalVSC.fwUploading = fwUploading;
 
  983     _heartLocalVSC.dataReady = dataReady;
 
  989     _heartLocalVSC.moduleReady = moduleReady;
 
  995     _heartLocalVSC.moduleError = moduleError;
 
 1001     return _heartLocalVSC.powerMode;
 
 1007     return _heartLocalVSC.fwUploading;
 
 1013     return _heartLocalVSC.dataReady;
 
 1019     return _heartLocalVSC.moduleReady;
 
 1025     return _heartLocalVSC.moduleError;
 
 1031     return _heartLocalVSC.uint8_val;
 
 1039     _heartLocalMODE = heartLocalMODE;
 
 1045     return _heartLocalMODE;
 
 1070     return _canard.node_id > CANARD_NODE_ID_MAX;
 
 1096     O1HeapInstance* 
const heap = ((
canardClass*)ins->user_reference)->_heap;
 
 1098     return o1heapAllocate(heap, amount);
 
 1105     O1HeapInstance* 
const heap = ((
canardClass*)ins->user_reference)->_heap;
 
 1106     o1heapFree(heap, pointer);
 
 1112     return o1heapGetDiagnostics(
_heap);
 
canardClass::CanardRxQueue * __CAN1_RX0_IRQHandler_PTR
ISR di sistema CAN1_RX0_IRQHandler HAL_CAN_IRQHandler STM32.
 
void CAN1_RX0_IRQHandler(void)
 
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
 
Uavcan Canard Class LibCanard, bxCan, o1Heap.
 
Uavcan Canard Configuration file.
 
#define NODE_GETFILE_MAX_RETRY
 
#define TIME_PUBLISH_HEARTBEAT
 
#define NODE_GETFILE_TIMEOUT_US
 
#define MASTER_MAXSYNCRO_VALID_US
 
#define DEFAULT_PUBLISH_PORT_LIST
 
#define HASH_SERNUMB_MASK
 
#define CAN_RX_QUEUE_CAPACITY
 
#define CAN_DELAY_US_SEND
 
#define CAN_TX_QUEUE_CAPACITY
 
#define HASH_EXCLUDING_BIT
 
#define DEFAULT_PUBLISH_MODULE_DATA
 
#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.
 
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à
 
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.
 
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 get_timestamp_syncronized()
Legge il tempo sincronizzato dal master, in Overload, regolato sui microsecondi locali a partire dall...
 
class canardClass::master::file file
 
class canardClass::master::heartbeat heartbeat
 
uint8_t _uavcan_file_read_data
 
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_node_heartbeat
 
uint8_t _uavcan_pnp_allocation
 
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
 
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
 
canardClass()
Contruttore della classe Canard.
 
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.
 
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)
 
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...
 
void receiveQueueEmpty(void)
Azzera il buffer di ricezione dati collegato a BxCAN e ISR Interrupt.
 
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.
 
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
 
#define MODULE_TYPE
Type of module. It is defined in registers.h.
 
Power_Mode
Power mode (Canard and general Node)
 
Interface STM32 hardware_hal STIMAV4 Header config.
 
uint8_t buf[CANARD_MTU_MAX]
 
struct canardClass::CanardRxQueue::msg msg[CAN_RX_QUEUE_CAPACITY]