11/**
2- * @author Edwin Mwiti emwiti658@gmail.com
2+ * @author Edwin Mwiti
3+ * emwiti658@gmail.com
34 *
45 */
56
1011
1112char * mission_id = "PSF_ADVENT_1" ;
1213uint32_t spacecraft_id = 26001001 ; // YYXXXAA -> see telemetry packet diagram
13-
14+ uint8_t craft_id = 100 ; // to fit into 10 bit value
1415
1516/* create CCDS packet struct */
1617CCSDS_packet * CCSDS_packet_create () {
@@ -21,37 +22,51 @@ CCSDS_packet* CCSDS_packet_create() {
2122 pkt ,
2223 CCSDS_packet_set_spacecraft_id ,
2324 CCSDS_packet_get_spacecraft_id ,
25+ CCSDS_packet_create_transfer_frame_primary_header ,
26+ CCSDS_packet_create_transfer_frame_secondary_header ,
27+ CCSDS_packet_extract_packet_primary_header ,
2428 CCSDS_packet_dump_metadata ,
2529 CCSDS_packet_telemetry_faker ,
26- CCSDS_packet_telemetry_cleanup
30+ CCSDS_packet_telemetry_cleanup ,
31+ CCSDS_packet_print_bin
2732 );
2833
2934 }
3035}
3136
3237/* call init with the created functions */
3338void CCSDS_packet_init (
34- CCSDS_packet * p ,
39+ CCSDS_packet * p ,
3540 void (* CCSDS_packet_set_spacecraft_id )(CCSDS_packet * , uint32_t ),
3641 uint32_t (* CCSDS_packet_get_spacecraft_id )(CCSDS_packet * ),
42+ void (* CCSDS_packet_create_transfer_frame_primary_header )(CCSDS_packet * ),
43+ void (* CCSDS_packet_create_transfer_frame_secondary_header )(CCSDS_packet * ),
44+ void (* CCSDS_packet_extract_packet_primary_header )(CCSDS_packet * ),
3745 void (* CCSDS_packet_dump_metadata )(CCSDS_packet * ),
3846 void (* CCSDS_packet_telemetry_faker )(CCSDS_packet * p ),
39- void (* CCSDS_packet_cleanup )(CCSDS_packet * )
47+ void (* CCSDS_packet_cleanup )(CCSDS_packet * ),
48+ void (* CCSDS_packet_print_bin )(int )
4049) {
4150 if (p != NULL ){
4251
4352 p -> version_number = VERSION_NUMBER ;
44- p -> spacecraft_id = spacecraft_id ;
53+ p -> spacecraft_id = craft_id ;
4554 strncpy (p -> mission_id , mission_id , strlen (mission_id ) + 1 );
4655
4756 // assign function pointer objects
4857 p -> _CCSDS_packet_set_spacecraft_id = CCSDS_packet_set_spacecraft_id ;
4958 p -> _CCSDS_packet_get_spacecraft_id = CCSDS_packet_get_spacecraft_id ;
50- p -> _CCSDS_packet_dump_metadata = CCSDS_packet_dump_metadata ;
59+ p -> _CCSDS_packet_create_transfer_frame_primary_header = CCSDS_packet_create_transfer_frame_primary_header ;
60+ p -> _CCSDS_packet_create_transfer_frame_secondary_header = CCSDS_packet_create_transfer_frame_secondary_header ,
61+ p -> _CCSDS_packet_extract_packet_primary_header = CCSDS_packet_extract_packet_primary_header ;
5162 p -> _CCSDS_packet_cleanup = CCSDS_packet_cleanup ;
63+ p -> _CCSDS_packet_dump_metadata = CCSDS_packet_dump_metadata ;
5264 p -> _CCSDS_packet_telemetry_faker = CCSDS_packet_telemetry_faker ;
65+ p -> _CCSDS_packet_print_bin = CCSDS_packet_print_bin ;
5366
54- p -> version_number = 9 ;
67+ /* initialize defaults packet headers according to CCSDS protocol */
68+ p -> version_number = VERSION_NUMBER ;
69+ p -> transfer_frame_primary_header = 0x00 ;
5570
5671 } else {
5772 // only for embedded todo: log to logger on MCU
@@ -76,6 +91,85 @@ void CCSDS_packet_telemetry_cleanup(CCSDS_packet* p) {
7691 }
7792}
7893
94+ /**
95+ * @brief Create the transfer frame primary header
96+ */
97+ void CCSDS_packet_create_transfer_frame_primary_header (CCSDS_packet * p ) {
98+ /* package the version number */
99+ uint8_t v_num = 0x00 ;
100+ v_num |= VERSION_NUMBER ;
101+
102+ /* package the craft ID */
103+ uint16_t id = 0x00 ;
104+ id |= ( (id >> 6 ) | (craft_id ));
105+
106+ /* package the virtual channel ID, op control flag, master channel frame count and virtual channel frame count */
107+ uint8_t virtual_channel_id = 0x00 ;
108+ uint8_t op_control_flag = 0x00 ;
109+ uint8_t master_channel_frame_count = 0x00 ;
110+ uint8_t virtual_channel_frame_count = 0x00 ;
111+
112+ /* set the transfer frame data field status to 0 -> can be packed later */
113+ #if TPFH_TRANSFER_FRAME_DATA_FIELD_STATUS_DISABLE
114+ uint64_t transfer_frame_data_status = 0x0000 ; // todo: optimize
115+ #endif
116+
117+ /* final packaged primary header 0 -> primary header is the first 48 bits(from LSB) */
118+ p -> transfer_frame_primary_header |= (
119+ (v_num ) | // LSB
120+ (id << 2 ) |
121+ (virtual_channel_id << 12 ) |
122+ (op_control_flag << 15 ) |
123+ (master_channel_frame_count << 16 ) |
124+ (virtual_channel_frame_count << 24 ) |
125+ (transfer_frame_data_status << 32 )
126+ );
127+
128+ printf ("version num: %d\n" , v_num );
129+ printf ("Craft ID: %d\n" , id );
130+ //printf("TFPH:%d\n", p->transfer_frame_primary_header);
131+ }
132+
133+ /**
134+ * @brief create transfer frame secondary header
135+ * in this version, this header contains metadata about the data frame
136+ */
137+ void CCSDS_packet_create_transfer_frame_secondary_header (CCSDS_packet * p ) {
138+ uint32_t secondary_header = 0 ;
139+ uint8_t secondary_version_num = 0x00 ;
140+ uint8_t secondary_sync_flag = 0x00 ;
141+ uint16_t secondary_header_data_field = 0x0000 ;
142+
143+ /* pack the header */
144+ secondary_header |= ( (secondary_version_num ) | (secondary_sync_flag << 2 ) );
145+
146+ /* get the length of data field */
147+ // uint16_t data_len = p->_data_field_length;
148+
149+ // if(data_len > CCSDS_MAX_PACKET_SIZE) {
150+ // puts("Data field too long\r\n"); // todo: log
151+ // } else {
152+ // secondary_header_data_field |= data_len;
153+ // }
154+
155+ secondary_header |= (secondary_header_data_field << 8 );
156+
157+ // return ?
158+
159+ }
160+
161+ /**
162+ * @brief extract primary header fields
163+ */
164+ void CCSDS_packet_extract_packet_primary_header (CCSDS_packet * p ) {
165+ uint8_t version = p -> transfer_frame_primary_header & ( (1 << 1UL ) | (1 << 0UL ) );
166+ uint16_t cr_id = (p -> transfer_frame_primary_header >> 2 ) & (0b1111111111 );
167+
168+ puts ("\n===== Primary frame extracted data =======\n" );
169+ printf ("version num: %d\n" , version );
170+ printf ("spacecraft ID: %d\n" , cr_id );
171+ }
172+
79173/* print the spacecraft metadata */
80174void CCSDS_packet_dump_metadata (CCSDS_packet * p ) {
81175 char metadata [256 ];
@@ -87,9 +181,14 @@ void CCSDS_packet_dump_metadata(CCSDS_packet* p) {
87181 );
88182
89183 puts (metadata );
184+
185+ uint64_t a = 45500 ;
186+ //p->_CCSDS_packet_print_bin(a);
90187}
91188
92- /* generates dummy test data */
189+ /**
190+ * @brief generate dummy telemetry data
191+ */
93192void CCSDS_packet_telemetry_faker (CCSDS_packet * p ) {
94193 /*generate OBS data */
95194 uint32_t obs_timestamp = UINT32_MAX ; // timestamp
@@ -98,13 +197,38 @@ void CCSDS_packet_telemetry_faker(CCSDS_packet* p) {
98197 uint32_t obs_uptime = 45500 ; // uptime in seconds
99198 uint8_t obs_reset_count = 10 ; // number_of_resets
100199
101- /*generate EPS data */
102-
103200 /*generate ADCS data*/
104201 float adcs_x_acc = 0.3 ;
105202 float adcs_y_acc = 6.3 ;
106203 float adcs_z_acc = 0.3 ;
107204
108- /*generate COMMS data */
109- /*generate PAYLOAD data */
205+ /* generate COMMS data */
206+ /* generate PAYLOAD data */
207+ /* generate EPS data */
208+ }
209+
210+ /**
211+ * @brief print integer in binary
212+ */
213+ void CCSDS_packet_print_bin (int x ) {
214+ int leading_zero ;
215+
216+ if (x == 0 ) {
217+ puts ("0\n" );
218+ return ;
219+ } else {
220+ for (int k = 32 ; k >= 0 ; k -- ) {
221+ int b = (x >> k ) & 1 ;
222+
223+ if (b == 1 ) {
224+ leading_zero = 0 ;
225+ }
226+
227+ if (!leading_zero ) {
228+ printf ("%d" , b );
229+ }
230+ }
231+ }
232+
233+ puts ("\n" );
110234}
0 commit comments