@@ -14,9 +14,12 @@ int sdlp_tc_create_frame(sdlp_tc_frame_t *frame, uint16_t spacecraft_id,
1414 frame -> header .bypass_flag = 0 ;
1515 frame -> header .control_command_flag = 0 ;
1616 frame -> header .reserved = 0 ;
17- frame -> header .spacecraft_id = spacecraft_id & 0x3FF ;
18- frame -> header .virtual_channel_id = virtual_channel_id & 0x3F ;
19- frame -> header .frame_length = data_length - 1 ;
17+ frame -> header .spacecraft_id = (uint16_t )(spacecraft_id & 0x3FFU );
18+ frame -> header .virtual_channel_id = (uint8_t )(virtual_channel_id & 0x3FU );
19+ #pragma GCC diagnostic push
20+ #pragma GCC diagnostic ignored "-Wconversion"
21+ frame -> header .frame_length = (uint16_t )(data_length - 1U );
22+ #pragma GCC diagnostic pop
2023 frame -> header .frame_sequence_number = frame_seq_num ;
2124
2225 memcpy (frame -> data , data , data_length );
@@ -46,29 +49,29 @@ int sdlp_tc_encode_frame(const sdlp_tc_frame_t *frame, uint8_t *buffer,
4649
4750 size_t offset = 0 ;
4851
49- buffer [offset ++ ] = (frame -> header .transfer_frame_version << 6 ) |
50- ((frame -> header .bypass_flag & 0x01 ) << 5 ) |
51- ((frame -> header .control_command_flag & 0x01 ) << 4 ) |
52- ((frame -> header .reserved & 0x03 ) << 2 ) |
53- ((frame -> header .spacecraft_id >> 8 ) & 0x03 );
54- buffer [offset ++ ] = frame -> header .spacecraft_id & 0xFF ;
55- buffer [offset ++ ] = (( frame -> header .virtual_channel_id & 0x3F ) << 2 ) | 0x00 ;
56- buffer [offset ++ ] = (frame -> header .frame_length >> 8 ) & 0xFF ;
57- buffer [offset ++ ] = frame -> header .frame_length & 0xFF ;
52+ buffer [offset ++ ] = (uint8_t )(( frame -> header .transfer_frame_version << 6 ) |
53+ ((frame -> header .bypass_flag & 0x01U ) << 5 ) |
54+ ((frame -> header .control_command_flag & 0x01U ) << 4 ) |
55+ ((frame -> header .reserved & 0x03U ) << 2 ) |
56+ ((frame -> header .spacecraft_id >> 8 ) & 0x03U ) );
57+ buffer [offset ++ ] = ( uint8_t )( frame -> header .spacecraft_id & 0xFFU ) ;
58+ buffer [offset ++ ] = (uint8_t )((( frame -> header .virtual_channel_id & 0x3FU ) << 2 ) | 0x00U ) ;
59+ buffer [offset ++ ] = (uint8_t )(( frame -> header .frame_length >> 8 ) & 0xFFU ) ;
60+ buffer [offset ++ ] = ( uint8_t )( frame -> header .frame_length & 0xFFU ) ;
5861
5962#ifdef TC_SEGMENT_HEADER_ENABLED
6063 if (!frame -> header .control_command_flag ) {
61- buffer [offset ++ ] = (( frame -> segment_header .sequence_flags & 0x03 ) << 6 ) |
62- (frame -> segment_header .map_id & 0x3F );
64+ buffer [offset ++ ] = (uint8_t )((( frame -> segment_header .sequence_flags & 0x03U ) << 6 ) |
65+ (frame -> segment_header .map_id & 0x3FU ) );
6366 }
6467#endif
6568
6669 memcpy (& buffer [offset ], frame -> data , frame -> data_length );
6770 offset += frame -> data_length ;
6871
6972 uint16_t crc = sdlp_crc16 (buffer , offset );
70- buffer [offset ++ ] = (crc >> 8 ) & 0xFF ;
71- buffer [offset ++ ] = crc & 0xFF ;
73+ buffer [offset ++ ] = (uint8_t )(( crc >> 8 ) & 0xFFU ) ;
74+ buffer [offset ++ ] = ( uint8_t )( crc & 0xFFU ) ;
7275
7376 * encoded_size = offset ;
7477
@@ -85,34 +88,41 @@ int sdlp_tc_decode_frame(const uint8_t *buffer, size_t buffer_size,
8588
8689 size_t offset = 0 ;
8790
88- frame -> header .transfer_frame_version = (buffer [offset ] >> 6 ) & 0x03 ;
89- frame -> header .bypass_flag = (buffer [offset ] >> 5 ) & 0x01 ;
90- frame -> header .control_command_flag = (buffer [offset ] >> 4 ) & 0x01 ;
91- frame -> header .reserved = (buffer [offset ] >> 2 ) & 0x03 ;
92- frame -> header .spacecraft_id = ((buffer [offset ] & 0x03 ) << 8 ) | buffer [offset + 1 ];
91+ /* Suppress -Wconversion: assigning masked values to bitfields is intentional. */
92+ #pragma GCC diagnostic push
93+ #pragma GCC diagnostic ignored "-Wconversion"
94+ frame -> header .transfer_frame_version = (uint8_t )((buffer [offset ] >> 6 ) & 0x03U );
95+ frame -> header .bypass_flag = (uint8_t )((buffer [offset ] >> 5 ) & 0x01U );
96+ frame -> header .control_command_flag = (uint8_t )((buffer [offset ] >> 4 ) & 0x01U );
97+ frame -> header .reserved = (uint8_t )((buffer [offset ] >> 2 ) & 0x03U );
98+ frame -> header .spacecraft_id = (uint16_t )(((uint16_t )(buffer [offset ] & 0x03U ) << 8 ) | buffer [offset + 1 ]);
9399 offset += 2 ;
94100
95- frame -> header .virtual_channel_id = (buffer [offset ] >> 2 ) & 0x3F ;
101+ frame -> header .virtual_channel_id = (uint8_t )(( buffer [offset ] >> 2 ) & 0x3FU ) ;
96102 offset ++ ;
97103
98- frame -> header .frame_length = (buffer [offset ] << 8 ) | buffer [offset + 1 ];
104+ frame -> header .frame_length = (uint16_t )(((uint16_t )buffer [offset ] << 8 ) | buffer [offset + 1 ]);
105+ #pragma GCC diagnostic pop
99106 offset += 2 ;
100107
101108#ifdef TC_SEGMENT_HEADER_ENABLED
102109 if (!frame -> header .control_command_flag ) {
103110 if (buffer_size < TC_PRIMARY_HEADER_SIZE + TC_SEGMENT_HEADER_SIZE + TC_FRAME_ERROR_CONTROL_SIZE ) {
104111 return SDLP_ERROR_INVALID_FRAME ;
105112 }
106- frame -> segment_header .sequence_flags = (buffer [offset ] >> 6 ) & 0x03 ;
107- frame -> segment_header .map_id = buffer [offset ] & 0x3F ;
113+ #pragma GCC diagnostic push
114+ #pragma GCC diagnostic ignored "-Wconversion"
115+ frame -> segment_header .sequence_flags = (uint8_t )((buffer [offset ] >> 6 ) & 0x03U );
116+ frame -> segment_header .map_id = (uint8_t )(buffer [offset ] & 0x3FU );
117+ #pragma GCC diagnostic pop
108118 offset ++ ;
109- frame -> data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_SEGMENT_HEADER_SIZE -
110- TC_FRAME_ERROR_CONTROL_SIZE ;
119+ frame -> data_length = ( uint16_t )( buffer_size - TC_PRIMARY_HEADER_SIZE - TC_SEGMENT_HEADER_SIZE -
120+ TC_FRAME_ERROR_CONTROL_SIZE ) ;
111121 } else {
112- frame -> data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE ;
122+ frame -> data_length = ( uint16_t )( buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE ) ;
113123 }
114124#else
115- frame -> data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE ;
125+ frame -> data_length = ( uint16_t )( buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE ) ;
116126#endif
117127
118128 if (frame -> data_length > TC_MAX_DATA_SIZE ) {
@@ -122,7 +132,7 @@ int sdlp_tc_decode_frame(const uint8_t *buffer, size_t buffer_size,
122132 memcpy (frame -> data , & buffer [offset ], frame -> data_length );
123133 offset += frame -> data_length ;
124134
125- frame -> fecf = (buffer [offset ] << 8 ) | buffer [offset + 1 ];
135+ frame -> fecf = (uint16_t )((( uint16_t ) buffer [offset ] << 8 ) | buffer [offset + 1 ]) ;
126136
127137 uint16_t calculated_crc = sdlp_crc16 (buffer , buffer_size - TC_FRAME_ERROR_CONTROL_SIZE );
128138
@@ -138,8 +148,11 @@ int sdlp_tc_set_segment_header(sdlp_tc_frame_t *frame, sdlp_tc_seq_flag_t sequen
138148 if (!frame ) {
139149 return SDLP_ERROR_INVALID_PARAM ;
140150 }
141- frame -> segment_header .sequence_flags = sequence_flags & 0x03 ;
142- frame -> segment_header .map_id = map_id & 0x3F ;
151+ #pragma GCC diagnostic push
152+ #pragma GCC diagnostic ignored "-Wconversion"
153+ frame -> segment_header .sequence_flags = (uint8_t )(sequence_flags & 0x03U );
154+ frame -> segment_header .map_id = (uint8_t )(map_id & 0x3FU );
155+ #pragma GCC diagnostic pop
143156 return SDLP_SUCCESS ;
144157}
145158#endif
0 commit comments