@@ -899,7 +899,6 @@ uint_least8_t canard_pending_ifaces(const canard_t* const self)
899899 return out ;
900900}
901901
902- // Common Cyphal v1.0 service TX path for both request and response.
903902static bool tx_1v0_service (canard_t * const self ,
904903 const canard_us_t deadline ,
905904 const canard_prio_t priority ,
@@ -908,7 +907,19 @@ static bool tx_1v0_service(canard_t* const self,
908907 const bool request_not_response ,
909908 const uint_least8_t transfer_id ,
910909 const canard_bytes_chain_t payload ,
911- const canard_user_context_t context );
910+ const canard_user_context_t context )
911+ {
912+ bool ok = (self != NULL ) && (priority < CANARD_PRIO_COUNT ) && bytes_chain_valid (payload ) &&
913+ (service_id <= CANARD_SERVICE_ID_MAX ) && (destination_node_id <= CANARD_NODE_ID_MAX );
914+ if (ok ) {
915+ const uint32_t can_id = (((uint32_t )priority ) << PRIO_SHIFT ) | (UINT32_C (1 ) << 25U ) |
916+ (request_not_response ? (UINT32_C (1 ) << 24U ) : 0U ) | (((uint32_t )service_id ) << 14U ) |
917+ (((uint32_t )destination_node_id ) << 7U );
918+ canard_txfer_t * const tr = txfer_new (self , deadline , transfer_id , can_id , self -> tx .fd , context );
919+ ok = (tr != NULL ) && tx_push (self , tr , false, CANARD_IFACE_BITMAP_ALL , payload , CRC_INITIAL );
920+ }
921+ return ok ;
922+ }
912923
913924bool canard_publish (canard_t * const self ,
914925 const canard_us_t deadline ,
@@ -938,23 +949,17 @@ bool canard_unicast(canard_t* const self,
938949 const canard_bytes_chain_t payload ,
939950 const canard_user_context_t context )
940951{
941- // Keep transfer-ID map behavior: increment only if basic argument validation succeeds.
942- bool ok = (self != NULL ) && (priority < CANARD_PRIO_COUNT ) && bytes_chain_valid (payload ) &&
943- (destination_node_id <= CANARD_NODE_ID_MAX );
944- if (ok ) {
945- const byte_t tr_id = (byte_t )self -> unicast_transfer_id [destination_node_id ]++ ;
946- // Per Cyphal v1.1, unicast is a service request with fixed service-ID 511.
947- ok = tx_1v0_service (self ,
948- deadline ,
949- priority ,
950- (uint16_t )CANARD_SERVICE_ID_UNICAST ,
951- destination_node_id ,
952- true,
953- tr_id ,
954- payload ,
955- context );
956- }
957- return ok ;
952+ const bool ok = (self != NULL ) && (priority < CANARD_PRIO_COUNT ) && bytes_chain_valid (payload ) &&
953+ (destination_node_id <= CANARD_NODE_ID_MAX );
954+ return ok && tx_1v0_service (self ,
955+ deadline ,
956+ priority ,
957+ CANARD_SERVICE_ID_UNICAST ,
958+ destination_node_id ,
959+ true,
960+ self -> unicast_transfer_id [destination_node_id ]++ ,
961+ payload ,
962+ context );
958963}
959964
960965bool canard_1v0_publish (canard_t * const self ,
@@ -979,29 +984,6 @@ bool canard_1v0_publish(canard_t* const self,
979984 return ok ;
980985}
981986
982- static bool tx_1v0_service (canard_t * const self ,
983- const canard_us_t deadline ,
984- const canard_prio_t priority ,
985- const uint16_t service_id ,
986- const uint_least8_t destination_node_id ,
987- const bool request_not_response ,
988- const uint_least8_t transfer_id ,
989- const canard_bytes_chain_t payload ,
990- const canard_user_context_t context )
991- {
992- bool ok = (self != NULL ) && (priority < CANARD_PRIO_COUNT ) && bytes_chain_valid (payload ) &&
993- (service_id <= CANARD_SERVICE_ID_MAX ) && (destination_node_id <= CANARD_NODE_ID_MAX );
994- if (ok ) {
995- const uint32_t can_id = (((uint32_t )priority ) << PRIO_SHIFT ) | //
996- (UINT32_C (1 ) << 25U ) | // service
997- (request_not_response ? (UINT32_C (1 ) << 24U ) : 0U ) | (((uint32_t )service_id ) << 14U ) |
998- (((uint32_t )destination_node_id ) << 7U );
999- canard_txfer_t * const tr = txfer_new (self , deadline , transfer_id , can_id , self -> tx .fd , context );
1000- ok = (tr != NULL ) && tx_push (self , tr , false, CANARD_IFACE_BITMAP_ALL , payload , CRC_INITIAL );
1001- }
1002- return ok ;
1003- }
1004-
1005987bool canard_1v0_request (canard_t * const self ,
1006988 const canard_us_t deadline ,
1007989 const canard_prio_t priority ,
@@ -1063,9 +1045,9 @@ static bool tx_0v1_service(canard_t* const self,
10631045 bool ok = (self != NULL ) && (priority < CANARD_PRIO_COUNT ) && bytes_chain_valid (payload ) && (self -> node_id != 0U ) &&
10641046 (destination_node_id > 0U ) && (destination_node_id <= CANARD_NODE_ID_MAX );
10651047 if (ok ) {
1066- const uint32_t can_id = (((((uint32_t )priority ) << 2U ) | UINT32_C (3 )) << 24U ) | //
1048+ const uint32_t can_id = (((((uint32_t )priority ) << 2U ) | UINT32_C (3 )) << 24U ) |
10671049 (((uint32_t )data_type_id ) << 16U ) | (request_not_response ? (UINT32_C (1 ) << 15U ) : 0U ) |
1068- (((uint32_t )destination_node_id ) << 8U ) | (UINT32_C (1 ) << 7U ); // service
1050+ (((uint32_t )destination_node_id ) << 8U ) | (UINT32_C (1 ) << 7U );
10691051 canard_txfer_t * const tr = txfer_new (self , deadline , transfer_id , can_id , false, context );
10701052 ok = (tr != NULL ) && tx_push (self , tr , true, CANARD_IFACE_BITMAP_ALL , payload , crc_seed );
10711053 }
0 commit comments