diff options
Diffstat (limited to 'demo/freedv_datac0c1_tx.c')
| -rw-r--r-- | demo/freedv_datac0c1_tx.c | 126 |
1 files changed, 64 insertions, 62 deletions
diff --git a/demo/freedv_datac0c1_tx.c b/demo/freedv_datac0c1_tx.c index ddbe2a0..311742f 100644 --- a/demo/freedv_datac0c1_tx.c +++ b/demo/freedv_datac0c1_tx.c @@ -6,7 +6,7 @@ Transmitting alternate frames of two different raw data modes. See freedv_datac0c1_rx.c - + \*---------------------------------------------------------------------------*/ /* @@ -27,9 +27,9 @@ */ #include <assert.h> -#include <stdlib.h> -#include <stdio.h> #include <stdint.h> +#include <stdio.h> +#include <stdlib.h> #include "freedv_api.h" #include "ofdm_internal.h" @@ -39,69 +39,71 @@ void send_burst(struct freedv *freedv); int main(void) { - struct freedv *freedv_c0, *freedv_c1; - - freedv_c0 = freedv_open(FREEDV_MODE_DATAC0); assert(freedv_c0 != NULL); - freedv_c1 = freedv_open(FREEDV_MODE_DATAC1); assert(freedv_c1 != NULL); - - // send frames in different modes in random order - int c0_frames = 0; - int c1_frames = 0; - while ((c0_frames < FRAMES) || (c1_frames < FRAMES)) { - if (rand() & 1) { - if (c0_frames < FRAMES) { - send_burst(freedv_c0); - c0_frames++; - } - } else { - if (c1_frames < FRAMES) { - send_burst(freedv_c1); - c1_frames++; - } - } + struct freedv *freedv_c0, *freedv_c1; + + freedv_c0 = freedv_open(FREEDV_MODE_DATAC0); + assert(freedv_c0 != NULL); + freedv_c1 = freedv_open(FREEDV_MODE_DATAC1); + assert(freedv_c1 != NULL); + + // send frames in different modes in random order + int c0_frames = 0; + int c1_frames = 0; + while ((c0_frames < FRAMES) || (c1_frames < FRAMES)) { + if (rand() & 1) { + if (c0_frames < FRAMES) { + send_burst(freedv_c0); + c0_frames++; + } + } else { + if (c1_frames < FRAMES) { + send_burst(freedv_c1); + c1_frames++; + } } + } - freedv_close(freedv_c0); - freedv_close(freedv_c1); + freedv_close(freedv_c0); + freedv_close(freedv_c1); - return 0; + return 0; } - void send_burst(struct freedv *freedv) { - size_t bits_per_frame = freedv_get_bits_per_modem_frame(freedv); - size_t bytes_per_modem_frame = bits_per_frame/8; - size_t payload_bytes_per_modem_frame = bytes_per_modem_frame - 2; /* 16 bits used for the CRC */ - size_t n_mod_out = freedv_get_n_tx_modem_samples(freedv); - uint8_t bytes_in[bytes_per_modem_frame]; - short mod_out_short[n_mod_out]; - - /* generate a test frame */ - uint8_t testframe_bits[bits_per_frame]; - ofdm_generate_payload_data_bits(testframe_bits, bits_per_frame); - freedv_pack(bytes_in, testframe_bits, bits_per_frame); - - /* send preamble */ - int n_preamble = freedv_rawdatapreambletx(freedv, mod_out_short); - fwrite(mod_out_short, sizeof(short), n_preamble, stdout); - - /* The raw data modes require a CRC in the last two bytes */ - uint16_t crc16 = freedv_gen_crc16(bytes_in, payload_bytes_per_modem_frame); - bytes_in[bytes_per_modem_frame-2] = crc16 >> 8; - bytes_in[bytes_per_modem_frame-1] = crc16 & 0xff; - - /* modulate and send a data frame */ - freedv_rawdatatx(freedv, mod_out_short, bytes_in); - fwrite(mod_out_short, sizeof(short), n_mod_out, stdout); - - /* send postamble */ - int n_postamble = freedv_rawdatapostambletx(freedv, mod_out_short); - fwrite(mod_out_short, sizeof(short), n_postamble, stdout); - - /* create some silence between bursts */ - int inter_burst_delay_ms = 200; - int samples_delay = FREEDV_FS_8000*inter_burst_delay_ms/1000; - short sil_short[samples_delay]; - for(int i=0; i<samples_delay; i++) sil_short[i] = 0; - fwrite(sil_short, sizeof(short), samples_delay, stdout); + size_t bits_per_frame = freedv_get_bits_per_modem_frame(freedv); + size_t bytes_per_modem_frame = bits_per_frame / 8; + size_t payload_bytes_per_modem_frame = + bytes_per_modem_frame - 2; /* 16 bits used for the CRC */ + size_t n_mod_out = freedv_get_n_tx_modem_samples(freedv); + uint8_t bytes_in[bytes_per_modem_frame]; + short mod_out_short[n_mod_out]; + + /* generate a test frame */ + uint8_t testframe_bits[bits_per_frame]; + ofdm_generate_payload_data_bits(testframe_bits, bits_per_frame); + freedv_pack(bytes_in, testframe_bits, bits_per_frame); + + /* send preamble */ + int n_preamble = freedv_rawdatapreambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_preamble, stdout); + + /* The raw data modes require a CRC in the last two bytes */ + uint16_t crc16 = freedv_gen_crc16(bytes_in, payload_bytes_per_modem_frame); + bytes_in[bytes_per_modem_frame - 2] = crc16 >> 8; + bytes_in[bytes_per_modem_frame - 1] = crc16 & 0xff; + + /* modulate and send a data frame */ + freedv_rawdatatx(freedv, mod_out_short, bytes_in); + fwrite(mod_out_short, sizeof(short), n_mod_out, stdout); + + /* send postamble */ + int n_postamble = freedv_rawdatapostambletx(freedv, mod_out_short); + fwrite(mod_out_short, sizeof(short), n_postamble, stdout); + + /* create some silence between bursts */ + int inter_burst_delay_ms = 200; + int samples_delay = FREEDV_FS_8000 * inter_burst_delay_ms / 1000; + short sil_short[samples_delay]; + for (int i = 0; i < samples_delay; i++) sil_short[i] = 0; + fwrite(sil_short, sizeof(short), samples_delay, stdout); } |
