int main(void) { gpio_init(); rng_init(); clock_init(); radio_init(); average_init(); while (true){ sniffer_loop(); } }
void average_config(average *avg, jd_var *v, const char *ns) { average_init(avg, model_get_real(v, 0, "$.%s_decay", ns), model_get_real(v, 1, "$.%s_ow", ns), model_get_real(v, 1, "$.%s_nw", ns)); }
static void power_thread(void) { long next_power_hist; /* Delay reading the first battery level */ #ifdef MROBE_100 while (_battery_voltage() > 4200) /* gives false readings initially */ #elif defined(DX50) || defined(DX90) while (_battery_voltage() < 1) /* can give false readings initially */ #endif { sleep(HZ/100); } #if CONFIG_CHARGING /* Initialize power input status before calling other routines. */ power_thread_inputs = power_input_status(); #endif /* initialize voltage averaging (if available) */ average_init(); /* get initial battery level value (in %) */ init_battery_percent(); /* get some initial data for the power curve */ collect_power_history(); /* call target specific init now */ powermgmt_init_target(); next_power_hist = current_tick + HZ*60; while (1) { #if CONFIG_CHARGING unsigned int pwr = power_input_status(); #ifdef HAVE_BATTERY_SWITCH if ((pwr ^ power_thread_inputs) & POWER_INPUT_BATTERY) { sleep(HZ/10); reset_battery_filter(_battery_voltage()); } #endif power_thread_inputs = pwr; if (!detect_charger(pwr)) #endif /* CONFIG_CHARGING */ { /* Steady state */ sleep(POWER_THREAD_STEP_TICKS); /* Do common power tasks */ power_thread_step(); } /* Perform target tasks */ charging_algorithm_step(); /* check if some idle or sleep timer wears off */ handle_auto_poweroff(); if (TIME_AFTER(current_tick, next_power_hist)) { /* increment to ensure there is a record for every minute * rather than go forward from the current tick */ next_power_hist += HZ*60; collect_power_history(); } } } /* power_thread */