diff --git a/sa_core.c b/sa_core.c index 183f5d9..6f6c34c 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1524,47 +1524,43 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) // M + get_frequency_correction(f) + getSI4432_RSSI_correction(); // calcuate the RSSI correction for later use + if (i == 0 && t == 0) // if first point in scan (here is get 1 point data) + start_of_sweep_timestamp = chVTGetSystemTimeX(); // initialize start sweep time + int16_t pureRSSI; + // if ( i < 3) + // shell_printf("%d %.3f %.3f %.1f\r\n", i, local_IF/1000000.0, lf/1000000.0, subRSSI); + + // ************** trigger mode if need #define T_LEVEL_UNDEF (1<<(16-2)) // should drop after 2 shifts left #define T_LEVEL_BELOW 1 #define T_LEVEL_ABOVE 0 #define T_LEVEL_CLEAN ~(1<<2) // cleanup old trigger data - int wait_for_trigger = false; - // Cache trigger search mode - register uint16_t t_mode; - uint16_t trigger_lvl; - uint16_t data_level = T_LEVEL_UNDEF; + if (i == 0 && setting.frequency_step == 0 && setting.trigger != T_AUTO) { // if in zero span mode and wait for trigger to happen and NOT in trigger mode - wait_for_trigger = true; // signal the wait for trigger + register uint16_t t_mode; + uint16_t trigger_lvl; + uint16_t data_level = T_LEVEL_UNDEF; // Calculate trigger level - trigger_lvl = (setting.trigger_level - correct_RSSI)*32; + trigger_lvl = (setting.trigger_level - correct_RSSI) * 32; if (setting.trigger_direction == T_UP) t_mode = (T_LEVEL_BELOW<<1)|T_LEVEL_ABOVE; // from bottom to up else t_mode = (T_LEVEL_ABOVE<<1)|T_LEVEL_BELOW; // from up to bottom - } - if (i == 0 && t == 0) // if first point in scan (here is get 1 point data) - start_of_sweep_timestamp = chVTGetSystemTimeX(); // initialize start sweep time + do{ // wait for trigger to happen + pureRSSI = SI4432_Read_Byte(SI4432_REG_RSSI)<<4; + if (break_on_operation && operation_requested) // allow aborting a wait for trigger + break; // abort - int16_t pureRSSI; -// if ( i < 3) -// shell_printf("%d %.3f %.3f %.1f\r\n", i, local_IF/1000000.0, lf/1000000.0, subRSSI); - - if (wait_for_trigger) { // wait for trigger to happen - pureRSSI = SI4432_Read_Byte(SI4432_REG_RSSI)<<4; - if (break_on_operation && operation_requested) // allow aborting a wait for trigger - break; // abort - - // Store data level bitfield (remember only last 2 states) - // T_LEVEL_UNDEF mode bit drop after 2 shifts - data_level = ((data_level<<1) | (pureRSSI < trigger_lvl ? T_LEVEL_BELOW : T_LEVEL_ABOVE))&(T_LEVEL_CLEAN); - // wait trigger - if (data_level != t_mode) // trigger level change - continue; // get next rssi + // Store data level bitfield (remember only last 2 states) + // T_LEVEL_UNDEF mode bit drop after 2 shifts + data_level = ((data_level<<1) | (pureRSSI < trigger_lvl ? T_LEVEL_BELOW : T_LEVEL_ABOVE))&(T_LEVEL_CLEAN); + // wait trigger + }while(data_level != t_mode); // trigger level change #ifdef __FAST_SWEEP__ if (setting.spur == 0 && SI4432_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < 100*ONE_MS_TIME) { - SI4432_Fill(MODE_SELECT(setting.mode), 1); // fast mode possible to pre-fill RSSI buffer + SI4432_Fill(MODE_SELECT(setting.mode), 1); // fast mode possible to pre-fill RSSI buffer } #endif if (setting.trigger == T_SINGLE) @@ -1572,7 +1568,7 @@ float perform(bool break_on_operation, int i, uint32_t f, int tracking) // M start_of_sweep_timestamp = chVTGetSystemTimeX(); } else - pureRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode)); // Get RSSI, either from pre-filled buffer or by reading SI4432 RSSI need divide on 32!! + pureRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode)); // Get RSSI, either from pre-filled buffer float subRSSI = pureRSSI / 32.0; // add correction