static __attribute__((noreturn)) msg_t baseband_fn(void *arg) { (void)arg; chRegSetThreadName("baseband"); BasebandStatsCollector stats { chSysGetIdleThread(), thread_main, thread_rssi, chThdSelf() }; while(true) { // TODO: Place correct sampling rate into buffer returned here: const auto buffer_tmp = baseband::dma::wait_for_rx_buffer(); const buffer_c8_t buffer { buffer_tmp.p, buffer_tmp.count, baseband_configuration.sampling_rate }; if( baseband_processor ) { baseband_processor->execute(buffer); } stats.process(buffer, [](const BasebandStatistics statistics) { BasebandStatisticsMessage message; message.statistics = statistics; shared_memory.application_queue.push(message); } ); } }
void process(buffer_c8_t buffer, Callback callback) { samples += buffer.count; const size_t report_samples = buffer.sampling_rate * report_interval; const auto report_delta = samples - samples_last_report; if( report_delta >= report_samples ) { const auto idle_ticks = chSysGetIdleThread()->total_ticks; statistics.idle_ticks = (idle_ticks - last_idle_ticks); last_idle_ticks = idle_ticks; const auto baseband_ticks = chThdSelf()->total_ticks; statistics.baseband_ticks = (baseband_ticks - last_baseband_ticks); last_baseband_ticks = baseband_ticks; statistics.saturation = m4_flag_saturation(); clear_m4_flag_saturation(); callback(statistics); samples_last_report = samples; } }