diff --git a/impl/src/packet_mod.c b/impl/src/packet_mod.c index 45b851c..0f380f9 100644 --- a/impl/src/packet_mod.c +++ b/impl/src/packet_mod.c @@ -15,6 +15,9 @@ result_t packet_mod_init(packet_mod_ctx_t *ctx) ctx->fec = fec_create(CHANNEL_CODE, NULL); ctx->modem = modem_create(MODULATION); + ctx->hdr_fec = fec_create(HEADER_CHANNEL_CODE, NULL); + ctx->hdr_modem = modem_create(HEADER_MODULATION); + ctx->state = NOT_STARTED; return OK; @@ -48,6 +51,9 @@ result_t packet_mod_free(packet_mod_ctx_t *ctx) fec_destroy(ctx->fec); modem_destroy(ctx->modem); + fec_destroy(ctx->hdr_fec); + modem_destroy(ctx->hdr_modem); + return OK; } @@ -153,18 +159,16 @@ result_t packet_mod_add_header(packet_mod_ctx_t *ctx) header[2] = (ctx->raw_data_crc >> 8) & 0xFF; header[3] = (ctx->raw_data_crc >> 0) & 0xFF; - // the header is coded and modulated differently than the data. - fec hdr_fec = fec_create(HEADER_CHANNEL_CODE, NULL); - modem hdr_modem = modem_create(HEADER_MODULATION); + // note: the header is coded and modulated differently than the data. // encode the header unsigned int hdr_enc_length = fec_get_enc_msg_length(HEADER_CHANNEL_CODE, sizeof(header)); unsigned char header_encoded[hdr_enc_length]; - ERR_CHECK_LIQUID(fec_encode(hdr_fec, sizeof(header), header, header_encoded)); + ERR_CHECK_LIQUID(fec_encode(ctx->hdr_fec, sizeof(header), header, header_encoded)); // modulate the header - unsigned int bps = modem_get_bps(hdr_modem); + unsigned int bps = modem_get_bps(ctx->hdr_modem); unsigned int nsyms = (hdr_enc_length * 8 + bps/2) / bps; unsigned char header_sym_idcs[nsyms]; @@ -173,7 +177,7 @@ result_t packet_mod_add_header(packet_mod_ctx_t *ctx) ERR_CHECK_LIQUID(liquid_repack_bytes(header_encoded, 8, hdr_enc_length, header_sym_idcs, bps, nsyms, &nsyms)); for(size_t i = 0; i < nsyms; i++) { - ERR_CHECK_LIQUID(modem_modulate(hdr_modem, header_sym_idcs[i], &header_mod[i])); + ERR_CHECK_LIQUID(modem_modulate(ctx->hdr_modem, header_sym_idcs[i], &header_mod[i])); } // concatenate the modulated header and message @@ -228,6 +232,29 @@ result_t packet_mod_add_preamble(packet_mod_ctx_t *ctx) } +result_t packet_mod_get_result_b(packet_mod_ctx_t *ctx, unsigned char *data, size_t *length) +{ + if(!((ctx->state == DATA_RAW) || (ctx->state == DATA_CODED))) { + return ERR_INVALID_STATE; + } + + if(!data) { + // data is NULL, so we only return the required length + *length = ctx->length; + return OK; + } + + if(*length < ctx->length) { + return ERR_NO_MEM; + } + + *length = ctx->length; + memcpy(data, ctx->pkt_bytes, *length * sizeof(unsigned char)); + + return OK; +} + + result_t packet_mod_get_result_cf(packet_mod_ctx_t *ctx, float complex *data, size_t *length) { if(!((ctx->state == DATA_MODULATED) || (ctx->state == HEADER_ADDED) || (ctx->state == PREAMBLE_ADDED))) { diff --git a/impl/src/packet_mod.h b/impl/src/packet_mod.h index 5109d3d..03d1b59 100644 --- a/impl/src/packet_mod.h +++ b/impl/src/packet_mod.h @@ -1,5 +1,5 @@ -#ifndef PACKET_MOD -#define PACKET_MOD +#ifndef PACKET_MOD_H +#define PACKET_MOD_H #include #include @@ -28,6 +28,9 @@ typedef struct modem modem; fec fec; + modem hdr_modem; + fec hdr_fec; + uint16_t raw_data_crc; size_t length; @@ -121,19 +124,6 @@ result_t packet_mod_add_header(packet_mod_ctx_t *ctx); */ result_t packet_mod_add_preamble(packet_mod_ctx_t *ctx); - -/*!\brief Dump the internal data to the given file. - * - * The format of the resulting file depends on the current state of the packet - * modulation context. - * - * \param[in] ctx The context to use for this operation. - * \param[in] filename Name of the file to write to. - * \returns An result code (see results.h). - */ -result_t packet_mod_dump(packet_mod_ctx_t *ctx, const char *filename); - - /*!\brief Get the result data as raw bytes. * * Raw bytes can be retrieved after \ref packet_mod_set_data() and \ref @@ -175,4 +165,4 @@ result_t packet_mod_get_result_b(packet_mod_ctx_t *ctx, unsigned char *data, siz */ result_t packet_mod_get_result_cf(packet_mod_ctx_t *ctx, float complex *data, size_t *length); -#endif // PACKET_MOD +#endif // PACKET_MOD_H