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]