Skip to content

Commit 1f1a773

Browse files
committed
ADDS CCSDS create secondary header
1 parent 5ae862a commit 1f1a773

6 files changed

Lines changed: 224 additions & 33 deletions

File tree

‎playground/ccsds-c-implementation/ccsds_tm.c‎

Lines changed: 137 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/**
2-
* @author Edwin Mwiti emwiti658@gmail.com
2+
* @author Edwin Mwiti
3+
* emwiti658@gmail.com
34
*
45
*/
56

@@ -10,7 +11,7 @@
1011

1112
char* mission_id = "PSF_ADVENT_1";
1213
uint32_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 */
1617
CCSDS_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 */
3338
void 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 */
80174
void 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+
*/
93192
void 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
}

‎playground/ccsds-c-implementation/ccsds_tm.h‎

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,28 @@
2828
#define TFPH_MASTER_CHANNEL_FRAME_COUNT_MASK (0xFF)
2929
#define TFPH_VIRTUAL_CHANNEL_FRAME_COUNT_MASK (0xFF)
3030
#define TPFH_TRANSFER_FRAME_DATA_FIELD_STATUS (0xFFFF)
31+
#define TPFH_TRANSFER_FRAME_DATA_FIELD_STATUS_DISABLE (0x01) ///< set to 0 to define transfer frame data field status
3132

3233
/**
3334
* transfer frame data field status (TF)
3435
* transfer frame secondary header status (TFSHS)
3536
*/
3637
#define TFSHS_FLAG_MASK (0x01)
3738
#define TFSHS_SYNC_FLAG_MASK (0x01)
38-
#define TFSHS_packet_ORDER_FLAG_MASK (0x01)
39+
#define TFSHS_PACKET_ORDER_FLAG_MASK (0x01)
3940
#define TFSHS_SEGMENT_LENGTH_ID_MASK (0x02)
4041
#define TFSHS_FIRST_HEADER_POINTER_MASK (0x7FF)
4142

4243
/**
4344
* Transfer frame secondary header TFSH
4445
*/
46+
#define TFSH_ENABLE 0
4547
#define TFSH_TRANSFER_FRAME_SECONDARY_HEADER_VERSION_NUMBER_MASK (0x02)
4648
#define TFSH_SYNC_FLAG_MASK (0x3F)
4749

4850
#define TFSH_DATA_FIELD_MAX_LENGTH (64)
4951

50-
#define VERSION_NUMBER 0x00
52+
#define VERSION_NUMBER 0x01
5153
extern char* mission_id;
5254
extern uint32_t spacecraft_id; // YYXXXAA -> see telemetry packet diagram
5355

@@ -71,30 +73,63 @@ struct CCSDS_packet {
7173
char* mission_id;
7274
uint32_t spacecraft_id;
7375

76+
/* packet */
77+
uint64_t transfer_frame_primary_header;
78+
uint8_t transfer_frame_version_number;
79+
7480
/* member functions */
7581
void (*_CCSDS_packet_set_spacecraft_id)(CCSDS_packet*, uint32_t);
7682
uint32_t (*_CCSDS_packet_get_spacecraft_id)(CCSDS_packet*);
83+
84+
// consolidation functions
85+
void (*_CCSDS_packet_create_transfer_frame_primary_header)(CCSDS_packet*);
86+
void (*_CCSDS_packet_create_transfer_frame_data_status)(CCSDS_packet*);
87+
void (*_CCSDS_packet_create_transfer_frame_secondary_header)(CCSDS_packet*);
88+
89+
90+
// extraction functions
91+
void (*_CCSDS_packet_extract_packet_primary_header)(CCSDS_packet*);
92+
void (*_CCSDS_packet_extract_data_field_status)(CCSDS_packet*);
93+
void (*_CCSDS_packet_extract_transfer_frame_seconday_header)(CCSDS_packet*);
94+
void (*CCSDS_packet_extract_transfer_frame_data_field)(CCSDS_packet*);
7795
void (*_CCSDS_packet_dump_metadata)(CCSDS_packet*);
78-
void (*_CCSDS_packet_telemetry_faker)(CCSDS_packet* p);
96+
void (*_CCSDS_packet_telemetry_faker)(CCSDS_packet*);
7997
void (*_CCSDS_packet_cleanup)(CCSDS_packet*);
98+
void (*_CCSDS_packet_print_bin)(int);
8099
};
81100

101+
/* member function prototypes */
82102
CCSDS_packet *CCSDS_packet_create();
83-
84103
void CCSDS_packet_set_spacecraft_id(CCSDS_packet* p, uint32_t);
85104
uint32_t CCSDS_packet_get_spacecraft_id(CCSDS_packet* p);
105+
106+
/* packet creation functions prototypes */
107+
void CCSDS_packet_create_transfer_frame_primary_header(CCSDS_packet*);
108+
void CCSDS_packet_create_transfer_frame_secondary_header(CCSDS_packet*);
109+
110+
/* packet data extraction functions */
111+
void CCSDS_packet_extract_packet_primary_header(CCSDS_packet*);
112+
113+
/* member data simulation functions */
114+
void CCSDS_packet_telemetry_faker(CCSDS_packet* p);
86115
void CCSDS_packet_dump_metadata(CCSDS_packet* p);
87116
void CCSDS_packet_cleanup_function (CCSDS_packet* p);
88-
void CCSDS_packet_telemetry_faker(CCSDS_packet* p);
89117
void CCSDS_packet_telemetry_cleanup(CCSDS_packet* p);
90118

119+
/* utility functions */
120+
void CCSDS_packet_print_bin();
121+
91122
void CCSDS_packet_init(
92123
CCSDS_packet* p,
93124
void (*_CCSDS_packet_set_spacecraft_id)(CCSDS_packet*, uint32_t),
94125
uint32_t (*_CCSDS_packet_get_spacecraft_id)(CCSDS_packet*),
126+
void (*_CCSDS_packet_create_transfer_frame_primary_header)(CCSDS_packet*),
127+
void (*_CCSDS_packet_create_transfer_frame_secondary_header)(CCSDS_packet*),
128+
void (*_CCSDS_packet_extract_packet_primary_header)(CCSDS_packet*),
95129
void (*_CCSDS_packet_dump_metadata)(CCSDS_packet*),
96-
void (*_CCSDS_packet_telemetry_faker)(CCSDS_packet* p),
97-
void (*_CCSDS_packet_cleanup)(CCSDS_packet*)
130+
void (*_CCSDS_packet_telemetry_faker)(CCSDS_packet*),
131+
void (*_CCSDS_packet_cleanup)(CCSDS_packet*),
132+
void (*_CCSDS_packet_print_bin)(int x)
98133
);
99134

100135
#endif

‎playground/ccsds-c-implementation/packet_test.c‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@ int main() {
88

99
ccsds_tm->_CCSDS_packet_dump_metadata(ccsds_tm);
1010

11+
/* test primary header frame creation and extraction */
12+
ccsds_tm->_CCSDS_packet_create_transfer_frame_primary_header(ccsds_tm);
13+
ccsds_tm->_CCSDS_packet_extract_packet_primary_header(ccsds_tm);
14+
1115
return 0;
1216
}
963 Bytes
Binary file not shown.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
SECTION | IMPLEMENTED
3+
Transfer frame version header -> YES
4+
Transfer frame spacecraft ID -> YES
5+
virtual channel ID -> NO
6+
operational control flag -> NO
7+
master channel frame count -> NO
8+
virtual channel frame count -> NO
9+
transfer frame data field status -> 0
10+
11+
transfer frame secondary header -> NO
12+
13+
transfer frame data -> YES
14+
15+
operational control field -> NO
16+
17+
frame error control field -> YES
18+
19+
20+
21+
Purpose
22+
get the data from HAL
23+
package the data into the transfer frame header
24+
25+
Then calculate the dynamic metadata e.g CHECKSUM

0 commit comments

Comments
 (0)