#include <gr_ofdm_bpsk_mapper.h>
#include <gr_io_signature.h>
-#include <vector>
+#include <stdexcept>
gr_ofdm_bpsk_mapper_sptr
gr_make_ofdm_bpsk_mapper (unsigned int msgq_limit,
- unsigned int occupied_carriers, unsigned int fft_length,
- const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2)
+ unsigned int occupied_carriers, unsigned int fft_length)
{
- return gr_ofdm_bpsk_mapper_sptr (new gr_ofdm_bpsk_mapper (msgq_limit, occupied_carriers, fft_length,
- known_symbol1, known_symbol2));
+ return gr_ofdm_bpsk_mapper_sptr (new gr_ofdm_bpsk_mapper (msgq_limit, occupied_carriers, fft_length));
}
// Consumes 1 packet and produces as many OFDM symbols of fft_length to hold the full packet
gr_ofdm_bpsk_mapper::gr_ofdm_bpsk_mapper (unsigned int msgq_limit,
- unsigned int occupied_carriers, unsigned int fft_length,
- const std::vector<gr_complex> &known_symbol1,
- const std::vector<gr_complex> &known_symbol2)
+ unsigned int occupied_carriers, unsigned int fft_length)
: gr_sync_block ("ofdm_bpsk_mapper",
gr_make_io_signature (0, 0, 0),
gr_make_io_signature2 (1, 2, sizeof(gr_complex)*fft_length, sizeof(char))),
d_occupied_carriers(occupied_carriers),
d_fft_length(fft_length),
d_bit_offset(0),
- d_header_sent(0),
- d_known_symbol1(known_symbol1),
- d_known_symbol2(known_symbol2)
+ d_pending_flag(0)
{
- assert(d_occupied_carriers <= d_fft_length);
- assert(d_occupied_carriers == d_known_symbol1.size());
- assert(d_occupied_carriers == d_known_symbol2.size());
+ if (!(d_occupied_carriers <= d_fft_length))
+ throw std::invalid_argument("gr_ofdm_bpsk_mapper: occupied carriers must be <= fft_length");
}
gr_ofdm_bpsk_mapper::~gr_ofdm_bpsk_mapper(void)
{
}
-float randombit()
+static float
+randombit()
{
int r = rand()&1;
return (float)(-1 + 2*r);
d_msg = d_msgq->delete_head(); // block, waiting for a message
d_msg_offset = 0;
d_bit_offset = 0;
- d_header_sent = 0;
+ d_pending_flag = 1; // new packet, write start of packet flag
if((d_msg->length() == 0) && (d_msg->type() == 1)) {
d_msg.reset();
- return -1;
+ return -1; // We're done; no more messages coming.
}
}
- if(output_items.size() == 2) {
- char *sig = (char *)output_items[1];
- if(d_header_sent == 1) {
- sig[0] = 1;
- }
- else {
- sig[0] = 0;
- }
- }
+ char *out_flag = 0;
+ if(output_items.size() == 2)
+ out_flag = (char *) output_items[1];
+
// Build a single symbol:
+
// Initialize all bins to 0 to set unused carriers
memset(out, 0, d_fft_length*sizeof(gr_complex));
- if(d_header_sent == 0) {
- for(i=0; i < d_occupied_carriers; i++) {
- out[i+zeros_on_left] = d_known_symbol1[i];
- }
- d_header_sent++;
-
- return 1;
- }
-
- if(d_header_sent == 1) {
- for(i=0; i < d_occupied_carriers; i++) {
- out[i+zeros_on_left] = d_known_symbol2[i];
- }
- d_header_sent++;
-
- return 1;
- }
-
i = 0;
while((d_msg_offset < d_msg->length()) && (i < d_occupied_carriers)) {
unsigned char bit = (d_msg->msg()[d_msg_offset] >> (d_bit_offset)) & 0x01;
i++;
}
- if (d_msg->type() == 1) // type == 1 sets EOF
+ if (d_msg->type() == 1) // type == 1 sets EOF
d_eof = true;
- d_msg.reset(); // finished packet, free message
-
+ d_msg.reset(); // finished packet, free message
assert(d_bit_offset == 0);
- return 1; // produced one symbol
}
-
+
+ if (out_flag)
+ out_flag[0] = d_pending_flag;
+ d_pending_flag = 0;
+
return 1; // produced symbol
}