Skip to content

Commit d312ac2

Browse files
support frame building
1 parent 13ccb76 commit d312ac2

3 files changed

Lines changed: 67 additions & 7 deletions

File tree

examples/main.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,20 @@
55

66
int main(void) {
77
const uint8_t payload[] = {'H', 'e', 'l', 'l', 'o', ' ', 'S', 'P'};
8-
sp_packet_t pkt = {0};
9-
pkt.ph.apid = 0x100;
10-
pkt.ph.seq_count = 1;
8+
sp_packet_t pkt;
9+
sp_packet_init(&pkt);
10+
sp_set_primary_header(&pkt, 0 /*version*/, 0 /*type*/, 1 /*sec hdr*/, 0x100, 0 /*seq flags*/, 1);
1111
/* Example with a minimal secondary header containing flags and zero extra
1212
* bytes. flags byte LSB=1 requests CRC; byte1=0 indicates zero remaining sec
1313
* header bytes.
1414
*/
1515
const uint8_t sec_hdr[] = {0x1, 0x0};
16-
pkt.ph.sec_hdr_flag = 1;
17-
pkt.sec_hdr = sec_hdr;
18-
pkt.sec_hdr_len = sizeof(sec_hdr);
16+
sp_set_secondary_header(&pkt, sec_hdr, sizeof(sec_hdr));
1917
pkt.payload = payload;
2018
pkt.payload_len = sizeof(payload);
2119

2220
uint8_t buf[256];
23-
size_t n = sp_packet_serialize(&pkt, buf, sizeof(buf));
21+
size_t n = sp_packet_build_frame(&pkt, buf, sizeof(buf));
2422
if (n == 0) {
2523
printf("serialize failed\n");
2624
return 1;

include/space_packet.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,27 @@ int sp_packet_parse(sp_packet_t *out, uint8_t *buf, size_t buf_len);
7171
* 16-bit CRC. */
7272
uint16_t sp_crc16_ccitt(const uint8_t *data, size_t len);
7373

74+
/* High-level helpers to build packets programmatically */
75+
/* Initialize packet structure to safe defaults (zeroed header and no payload). */
76+
void sp_packet_init(sp_packet_t *pkt);
77+
78+
/* Configure primary header fields. Values will be masked to valid bit widths. */
79+
void sp_set_primary_header(sp_packet_t *pkt,
80+
uint8_t version,
81+
uint8_t type,
82+
uint8_t sec_hdr_flag,
83+
uint16_t apid,
84+
uint8_t seq_flags,
85+
uint16_t seq_count);
86+
87+
/* Set secondary header pointer and length (application-owned memory). */
88+
void sp_set_secondary_header(sp_packet_t *pkt, const uint8_t *sec_hdr, uint16_t sec_hdr_len);
89+
90+
/* Set payload pointer and length (application-owned memory). */
91+
void sp_set_payload(sp_packet_t *pkt, const uint8_t *payload, uint16_t payload_len);
92+
93+
/* Build full packet frame into `buf` (header+data[+crc]). Returns bytes written or
94+
* 0 on error. */
95+
size_t sp_packet_build_frame(const sp_packet_t *pkt, uint8_t *buf, size_t buf_len);
96+
7497
#endif /* SPACE_PACKET_H */

src/space_packet.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,42 @@ uint16_t sp_crc16_ccitt(const uint8_t *data, size_t len) {
179179
}
180180
return crc & 0xFFFF;
181181
}
182+
183+
/* High-level helpers implementation */
184+
void sp_packet_init(sp_packet_t *pkt) {
185+
if (!pkt) return;
186+
memset(pkt, 0, sizeof(*pkt));
187+
}
188+
189+
void sp_set_primary_header(sp_packet_t *pkt,
190+
uint8_t version,
191+
uint8_t type,
192+
uint8_t sec_hdr_flag,
193+
uint16_t apid,
194+
uint8_t seq_flags,
195+
uint16_t seq_count) {
196+
if (!pkt) return;
197+
pkt->ph.version = version & 0x7;
198+
pkt->ph.type = type & 0x1;
199+
pkt->ph.sec_hdr_flag = sec_hdr_flag ? 1 : 0;
200+
pkt->ph.apid = apid & 0x07FF;
201+
pkt->ph.seq_flags = seq_flags & 0x3;
202+
pkt->ph.seq_count = seq_count & 0x3FFF;
203+
}
204+
205+
void sp_set_secondary_header(sp_packet_t *pkt, const uint8_t *sec_hdr, uint16_t sec_hdr_len) {
206+
if (!pkt) return;
207+
pkt->sec_hdr = sec_hdr;
208+
pkt->sec_hdr_len = sec_hdr_len;
209+
pkt->ph.sec_hdr_flag = (sec_hdr && sec_hdr_len) ? 1 : 0;
210+
}
211+
212+
void sp_set_payload(sp_packet_t *pkt, const uint8_t *payload, uint16_t payload_len) {
213+
if (!pkt) return;
214+
pkt->payload = payload;
215+
pkt->payload_len = payload_len;
216+
}
217+
218+
size_t sp_packet_build_frame(const sp_packet_t *pkt, uint8_t *buf, size_t buf_len) {
219+
return sp_packet_serialize(pkt, buf, buf_len);
220+
}

0 commit comments

Comments
 (0)