@@ -48,9 +48,9 @@ typedef struct State
48
48
{
49
49
CanardMicrosecond started_at ;
50
50
51
- O1HeapInstance * heap ;
52
- CanardInstance canard ;
53
- CanardTxQueue canard_tx_queues [CAN_REDUNDANCY_FACTOR ];
51
+ O1HeapInstance * heap ;
52
+ struct CanardInstance canard ;
53
+ struct CanardTxQueue canard_tx_queues [CAN_REDUNDANCY_FACTOR ];
54
54
55
55
/// These values are read from the registers at startup. You can also implement hot reloading if desired.
56
56
struct
@@ -149,11 +149,11 @@ static CanardPortID getPublisherSubjectID(const char* const port_name, const cha
149
149
return result ;
150
150
}
151
151
152
- static void send (State * const state ,
153
- const CanardMicrosecond tx_deadline_usec ,
154
- const CanardTransferMetadata * const metadata ,
155
- const size_t payload_size ,
156
- const void * const payload_data )
152
+ static void send (State * const state ,
153
+ const CanardMicrosecond tx_deadline_usec ,
154
+ const struct CanardTransferMetadata * const metadata ,
155
+ const size_t payload_size ,
156
+ const void * const payload_data )
157
157
{
158
158
for (uint8_t ifidx = 0 ; ifidx < CAN_REDUNDANCY_FACTOR ; ifidx ++ )
159
159
{
@@ -162,14 +162,14 @@ static void send(State* const state,
162
162
}
163
163
}
164
164
165
- static void sendResponse (State * const state ,
166
- const CanardMicrosecond tx_deadline_usec ,
167
- const CanardTransferMetadata * const request_metadata ,
168
- const size_t payload_size ,
169
- const void * const payload_data )
165
+ static void sendResponse (State * const state ,
166
+ const CanardMicrosecond tx_deadline_usec ,
167
+ const struct CanardTransferMetadata * const request_metadata ,
168
+ const size_t payload_size ,
169
+ const void * const payload_data )
170
170
{
171
- CanardTransferMetadata meta = * request_metadata ;
172
- meta .transfer_kind = CanardTransferKindResponse ;
171
+ struct CanardTransferMetadata meta = * request_metadata ;
172
+ meta .transfer_kind = CanardTransferKindResponse ;
173
173
send (state , tx_deadline_usec , & meta , payload_size , payload_data );
174
174
}
175
175
@@ -190,7 +190,7 @@ static void handleFastLoop(State* const state, const CanardMicrosecond monotonic
190
190
assert (err >= 0 );
191
191
if (err >= 0 )
192
192
{
193
- const CanardTransferMetadata meta = {
193
+ const struct CanardTransferMetadata meta = {
194
194
.priority = CanardPriorityHigh ,
195
195
.transfer_kind = CanardTransferKindMessage ,
196
196
.port_id = state -> port_id .pub .differential_pressure ,
@@ -228,7 +228,7 @@ static void handle1HzLoop(State* const state, const CanardMicrosecond monotonic_
228
228
assert (err >= 0 );
229
229
if (err >= 0 )
230
230
{
231
- const CanardTransferMetadata meta = {
231
+ const struct CanardTransferMetadata meta = {
232
232
.priority = CanardPriorityNominal ,
233
233
.transfer_kind = CanardTransferKindMessage ,
234
234
.port_id = uavcan_node_Heartbeat_1_0_FIXED_PORT_ID_ ,
@@ -261,7 +261,7 @@ static void handle1HzLoop(State* const state, const CanardMicrosecond monotonic_
261
261
assert (err >= 0 );
262
262
if (err >= 0 )
263
263
{
264
- const CanardTransferMetadata meta = {
264
+ const struct CanardTransferMetadata meta = {
265
265
.priority = CanardPrioritySlow ,
266
266
.transfer_kind = CanardTransferKindMessage ,
267
267
.port_id = uavcan_pnp_NodeIDAllocationData_2_0_FIXED_PORT_ID_ ,
@@ -289,7 +289,7 @@ static void handle1HzLoop(State* const state, const CanardMicrosecond monotonic_
289
289
assert (err >= 0 );
290
290
if (err >= 0 )
291
291
{
292
- const CanardTransferMetadata meta = {
292
+ const struct CanardTransferMetadata meta = {
293
293
.priority = CanardPriorityNominal ,
294
294
.transfer_kind = CanardTransferKindMessage ,
295
295
.port_id = state -> port_id .pub .static_air_temperature ,
@@ -302,12 +302,12 @@ static void handle1HzLoop(State* const state, const CanardMicrosecond monotonic_
302
302
}
303
303
304
304
/// This is needed only for constructing uavcan_node_port_List_0_1.
305
- static void fillSubscriptions (const CanardTreeNode * const tree , uavcan_node_port_SubjectIDList_0_1 * const obj )
305
+ static void fillSubscriptions (const struct CanardTreeNode * const tree , uavcan_node_port_SubjectIDList_0_1 * const obj )
306
306
{
307
307
if (NULL != tree )
308
308
{
309
309
fillSubscriptions (tree -> lr [0 ], obj );
310
- const CanardRxSubscription * crs = (const CanardRxSubscription * ) tree ;
310
+ const struct CanardRxSubscription * crs = (const struct CanardRxSubscription * ) tree ;
311
311
assert (crs -> port_id <= CANARD_SUBJECT_ID_MAX );
312
312
assert (obj -> sparse_list .count < uavcan_node_port_SubjectIDList_0_1_sparse_list_ARRAY_CAPACITY_ );
313
313
obj -> sparse_list .elements [obj -> sparse_list .count ++ ].value = crs -> port_id ;
@@ -316,12 +316,12 @@ static void fillSubscriptions(const CanardTreeNode* const tree, uavcan_node_port
316
316
}
317
317
318
318
/// This is needed only for constructing uavcan_node_port_List_0_1.
319
- static void fillServers (const CanardTreeNode * const tree , uavcan_node_port_ServiceIDList_0_1 * const obj )
319
+ static void fillServers (const struct CanardTreeNode * const tree , uavcan_node_port_ServiceIDList_0_1 * const obj )
320
320
{
321
321
if (NULL != tree )
322
322
{
323
323
fillServers (tree -> lr [0 ], obj );
324
- const CanardRxSubscription * crs = (const CanardRxSubscription * ) tree ;
324
+ const struct CanardRxSubscription * crs = (const struct CanardRxSubscription * ) tree ;
325
325
assert (crs -> port_id <= CANARD_SERVICE_ID_MAX );
326
326
(void ) nunavutSetBit (& obj -> mask_bitpacked_ [0 ], sizeof (obj -> mask_bitpacked_ ), crs -> port_id , true);
327
327
fillServers (tree -> lr [1 ], obj );
@@ -366,7 +366,7 @@ static void handle01HzLoop(State* const state, const CanardMicrosecond monotonic
366
366
size_t serialized_size = uavcan_node_port_List_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_ ;
367
367
if (uavcan_node_port_List_0_1_serialize_ (& m , & serialized [0 ], & serialized_size ) >= 0 )
368
368
{
369
- const CanardTransferMetadata meta = {
369
+ const struct CanardTransferMetadata meta = {
370
370
.priority = CanardPriorityOptional , // Mind the priority.
371
371
.transfer_kind = CanardTransferKindMessage ,
372
372
.port_id = uavcan_node_port_List_0_1_FIXED_PORT_ID_ ,
@@ -516,7 +516,7 @@ static uavcan_node_GetInfo_Response_1_0 processRequestNodeGetInfo()
516
516
return resp ;
517
517
}
518
518
519
- static void processReceivedTransfer (State * const state , const CanardRxTransfer * const transfer )
519
+ static void processReceivedTransfer (State * const state , const struct CanardRxTransfer * const transfer )
520
520
{
521
521
if (transfer -> metadata .transfer_kind == CanardTransferKindMessage )
522
522
{
@@ -733,8 +733,8 @@ int main(const int argc, char* const argv[])
733
733
// Message subscriptions:
734
734
if (state .canard .node_id > CANARD_NODE_ID_MAX )
735
735
{
736
- static CanardRxSubscription rx ;
737
- const int8_t res = //
736
+ static struct CanardRxSubscription rx ;
737
+ const int8_t res = //
738
738
canardRxSubscribe (& state .canard ,
739
739
CanardTransferKindMessage ,
740
740
uavcan_pnp_NodeIDAllocationData_2_0_FIXED_PORT_ID_ ,
@@ -748,8 +748,8 @@ int main(const int argc, char* const argv[])
748
748
}
749
749
// Service servers:
750
750
{
751
- static CanardRxSubscription rx ;
752
- const int8_t res = //
751
+ static struct CanardRxSubscription rx ;
752
+ const int8_t res = //
753
753
canardRxSubscribe (& state .canard ,
754
754
CanardTransferKindRequest ,
755
755
uavcan_node_GetInfo_1_0_FIXED_PORT_ID_ ,
@@ -762,8 +762,8 @@ int main(const int argc, char* const argv[])
762
762
}
763
763
}
764
764
{
765
- static CanardRxSubscription rx ;
766
- const int8_t res = //
765
+ static struct CanardRxSubscription rx ;
766
+ const int8_t res = //
767
767
canardRxSubscribe (& state .canard ,
768
768
CanardTransferKindRequest ,
769
769
uavcan_node_ExecuteCommand_1_1_FIXED_PORT_ID_ ,
@@ -776,8 +776,8 @@ int main(const int argc, char* const argv[])
776
776
}
777
777
}
778
778
{
779
- static CanardRxSubscription rx ;
780
- const int8_t res = //
779
+ static struct CanardRxSubscription rx ;
780
+ const int8_t res = //
781
781
canardRxSubscribe (& state .canard ,
782
782
CanardTransferKindRequest ,
783
783
uavcan_register_Access_1_0_FIXED_PORT_ID_ ,
@@ -790,8 +790,8 @@ int main(const int argc, char* const argv[])
790
790
}
791
791
}
792
792
{
793
- static CanardRxSubscription rx ;
794
- const int8_t res = //
793
+ static struct CanardRxSubscription rx ;
794
+ const int8_t res = //
795
795
canardRxSubscribe (& state .canard ,
796
796
CanardTransferKindRequest ,
797
797
uavcan_register_List_1_0_FIXED_PORT_ID_ ,
@@ -833,15 +833,18 @@ int main(const int argc, char* const argv[])
833
833
// Transmit pending frames from the prioritized TX queues managed by libcanard.
834
834
for (uint8_t ifidx = 0 ; ifidx < CAN_REDUNDANCY_FACTOR ; ifidx ++ )
835
835
{
836
- CanardTxQueue * const que = & state .canard_tx_queues [ifidx ];
837
- const CanardTxQueueItem * tqi = canardTxPeek (que ); // Find the highest-priority frame.
836
+ struct CanardTxQueue * const que = & state .canard_tx_queues [ifidx ];
837
+ struct CanardTxQueueItem * tqi = canardTxPeek (que ); // Find the highest-priority frame.
838
838
while (tqi != NULL )
839
839
{
840
840
// Attempt transmission only if the frame is not yet timed out while waiting in the TX queue.
841
841
// Otherwise just drop it and move on to the next one.
842
842
if ((tqi -> tx_deadline_usec == 0 ) || (tqi -> tx_deadline_usec > monotonic_time ))
843
843
{
844
- const int16_t result = socketcanPush (sock [ifidx ], & tqi -> frame , 0 ); // Non-blocking write attempt.
844
+ const struct CanardFrame canard_frame = {.extended_can_id = tqi -> frame .extended_can_id ,
845
+ .payload = {.size = tqi -> frame .payload .size ,
846
+ .data = tqi -> frame .payload .data }};
847
+ const int16_t result = socketcanPush (sock [ifidx ], & canard_frame , 0 ); // Non-blocking write attempt.
845
848
if (result == 0 )
846
849
{
847
850
break ; // The queue is full, we will try again on the next iteration.
@@ -851,8 +854,10 @@ int main(const int argc, char* const argv[])
851
854
return - result ; // SocketCAN interface failure (link down?)
852
855
}
853
856
}
854
- CanardTxQueueItem * const mut_tqi = canardTxPop (que , tqi );
855
- que -> memory .deallocate (que -> memory .user_reference , mut_tqi -> allocated_size , mut_tqi );
857
+
858
+ struct CanardTxQueueItem * const mut_tqi = canardTxPop (que , tqi );
859
+ canardTxFree (que , & state .canard , mut_tqi );
860
+
856
861
tqi = canardTxPeek (que );
857
862
}
858
863
}
@@ -863,9 +868,9 @@ int main(const int argc, char* const argv[])
863
868
// them out and remove duplicates automatically.
864
869
for (uint8_t ifidx = 0 ; ifidx < CAN_REDUNDANCY_FACTOR ; ifidx ++ )
865
870
{
866
- CanardFrame frame = {0 };
867
- uint8_t buf [CANARD_MTU_CAN_FD ] = {0 };
868
- const int16_t socketcan_result = socketcanPop (sock [ifidx ], & frame , NULL , sizeof (buf ), buf , 0 , NULL );
871
+ struct CanardFrame frame = {0 };
872
+ uint8_t buf [CANARD_MTU_CAN_FD ] = {0 };
873
+ const int16_t socketcan_result = socketcanPop (sock [ifidx ], & frame , NULL , sizeof (buf ), buf , 0 , NULL );
869
874
if (socketcan_result == 0 ) // The read operation has timed out with no frames, nothing to do here.
870
875
{
871
876
break ;
@@ -877,7 +882,7 @@ int main(const int argc, char* const argv[])
877
882
// The SocketCAN adapter uses the wall clock for timestamping, but we need monotonic.
878
883
// Wall clock can only be used for time synchronization.
879
884
const CanardMicrosecond timestamp_usec = getMonotonicMicroseconds ();
880
- CanardRxTransfer transfer = {0 };
885
+ struct CanardRxTransfer transfer = {0 };
881
886
const int8_t canard_result = canardRxAccept (& state .canard , timestamp_usec , & frame , ifidx , & transfer , NULL );
882
887
if (canard_result > 0 )
883
888
{
0 commit comments