fixing range frequencies and index skipping

This commit is contained in:
GullCode 2023-04-01 19:56:44 +02:00
parent 9540776afd
commit 7da322f926

View File

@ -150,9 +150,11 @@ namespace ui {
return 0; return 0;
} }
void ReconThread::run() { void ReconThread::run()
{
if (frequency_list_.size() > 0 ) { //IF THERE IS A FREQUENCY LIST ... //IF THERE IS A FREQUENCY LIST ...
if (frequency_list_.size() > 0 )
{
int64_t minfreq = 0 ; int64_t minfreq = 0 ;
int64_t maxfreq = 0 ; int64_t maxfreq = 0 ;
bool has_looped = false ; bool has_looped = false ;
@ -200,121 +202,93 @@ namespace ui {
last_entry . bandwidth = -1 ; last_entry . bandwidth = -1 ;
last_entry . step = -1 ; last_entry . step = -1 ;
bool restart_recon = false; //Flag whenever scanning is restarting after a pause bool restart_recon = false; //Flag whenever scanning is restarting after a pause
int16_t last_index = -1 ;
while( !chThdShouldTerminate() && frequency_list_.size() > 0 ) { while( !chThdShouldTerminate() && frequency_list_.size() > 0 )
has_looped = false ; {
entry_has_changed = false ;
if( !_freq_delete ) if( !_freq_delete )
{ {
if( _recon || _stepper != 0 || _index_stepper != 0 || last_index !=frequency_index ) has_looped = false ;
if( last_entry . frequency_a != freq || entry_has_changed )
{ {
last_index = frequency_index ; last_entry . frequency_a = freq ;
if( last_entry . frequency_a != freq ) receiver_model.set_tuning_frequency( freq ); // Retune
message.freq = freq ;
message.range = frequency_index ;
EventDispatcher::send_message(message);
}
entry_has_changed = false ;
// Set modulation if any
if( last_entry . modulation != frequency_list_[ frequency_index ] . modulation && frequency_list_[ frequency_index ] . modulation >= 0 )
{
last_entry . modulation = frequency_list_[ frequency_index ]. modulation;
message.freq = last_entry . modulation ;
message.range = MSG_RECON_SET_MODULATION ;
EventDispatcher::send_message(message);
}
// Set bandwidth if any
if( last_entry . bandwidth != frequency_list_[ frequency_index ] . bandwidth && frequency_list_[ frequency_index ] . bandwidth >= 0 )
{
last_entry . bandwidth = frequency_list_[ frequency_index ]. bandwidth;
message.freq = last_entry . bandwidth ;
message.range = MSG_RECON_SET_BANDWIDTH ;
EventDispatcher::send_message(message);
}
if( last_entry . step != frequency_list_[ frequency_index ] . step && frequency_list_[ frequency_index ] . step >= 0 )
{
last_entry . step = frequency_list_[ frequency_index ]. step ;
message.freq = last_entry . step ;
message.range = MSG_RECON_SET_STEP ;
EventDispatcher::send_message(message);
step = freqman_entry_get_step_value( last_entry . step );
}
if( _recon || _stepper != 0 || _index_stepper != 0 )
{
if( _freq_lock == 0 || _stepper != 0 || _index_stepper != 0 ) //normal recon (not performing freq_lock)
{ {
last_entry . frequency_a = freq ; if( !restart_recon || _stepper != 0 || _index_stepper != 0 )
receiver_model.set_tuning_frequency( freq ); // Retune
message.freq = freq ;
message.range = frequency_index ;
EventDispatcher::send_message(message);
}
// Set modulation if any
if( last_entry . modulation != frequency_list_[ frequency_index ] . modulation && frequency_list_[ frequency_index ] . modulation >= 0 )
{
last_entry . modulation = frequency_list_[ frequency_index ]. modulation;
message.freq = last_entry . modulation ;
message.range = MSG_RECON_SET_MODULATION ;
EventDispatcher::send_message(message);
}
// Set bandwidth if any
if( last_entry . bandwidth != frequency_list_[ frequency_index ] . bandwidth && frequency_list_[ frequency_index ] . bandwidth >= 0 )
{
last_entry . bandwidth = frequency_list_[ frequency_index ]. bandwidth;
message.freq = last_entry . bandwidth ;
message.range = MSG_RECON_SET_BANDWIDTH ;
EventDispatcher::send_message(message);
}
if( last_entry . step != frequency_list_[ frequency_index ] . step && frequency_list_[ frequency_index ] . step >= 0 )
{
last_entry . step = frequency_list_[ frequency_index ]. step ;
message.freq = last_entry . step ;
message.range = MSG_RECON_SET_STEP ;
EventDispatcher::send_message(message);
step = freqman_entry_get_step_value( last_entry . step );
}
if( _freq_lock == 0 || _stepper != 0 ) //normal recon (not performing freq_lock)
{
if( !restart_recon || _stepper != 0 )
{ {
/* we are doing a range */ if( _index_stepper == 0 )
if( frequency_list_[ frequency_index ] . type == RANGE ) {
if ( ( _fwd && _stepper == 0 ) || _stepper > 0 ) {
//forward
freq += step ;
// if bigger than range max
if (freq > maxfreq ) {
// when going forward we already know that we can skip a whole range => two values in the list
frequency_index ++ ;
entry_has_changed = true ;
// looping
if( (uint32_t)frequency_index >= frequency_list_.size() )
{
has_looped = true ;
frequency_index = 0 ;
}
}
}
else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) {
//reverse
freq -= step ;
// if lower than range min
if (freq < minfreq ) {
// when back we have to check one step at a time
frequency_index -- ;
entry_has_changed = true ;
// looping
if( frequency_index < 0 )
{
has_looped = true ;
frequency_index = frequency_list_.size() - 1 ;
}
}
}
}
else if( frequency_list_[ frequency_index ] . type == SINGLE ) {
if ( (_fwd && _stepper == 0 ) || _stepper > 0 ) { //forward
frequency_index++;
entry_has_changed = true ;
// looping
if( (uint32_t)frequency_index >= frequency_list_.size() )
{
has_looped = true ;
frequency_index = 0 ;
}
}
else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) {
//reverse
frequency_index--;
entry_has_changed = true ;
// if previous if under the list => go back from end
if( frequency_index < 0 )
{
has_looped = true ;
frequency_index = frequency_list_.size() - 1 ;
}
}
}
else if( frequency_list_[ frequency_index ] . type == HAMRADIO )
{ {
if ( (_fwd && _stepper == 0 ) || _stepper > 0 ) { //forward /* we are doing a range */
if( ( minfreq != maxfreq ) && freq == minfreq ) if( frequency_list_[ frequency_index ] . type == RANGE ) {
{ if ( ( _fwd && _stepper == 0 ) || _stepper > 0 ) {
freq = maxfreq ; //forward
freq += step ;
// if bigger than range max
if (freq > maxfreq ) {
// when going forward we already know that we can skip a whole range => two values in the list
frequency_index ++ ;
entry_has_changed = true ;
// looping
if( (uint32_t)frequency_index >= frequency_list_.size() )
{
has_looped = true ;
frequency_index = 0 ;
}
}
} }
else else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) {
{ //reverse
freq -= step ;
// if lower than range min
if (freq < minfreq ) {
// when back we have to check one step at a time
frequency_index -- ;
entry_has_changed = true ;
// looping
if( frequency_index < 0 )
{
has_looped = true ;
frequency_index = frequency_list_.size() - 1 ;
}
}
}
}
else if( frequency_list_[ frequency_index ] . type == SINGLE ) {
if ( (_fwd && _stepper == 0 ) || _stepper > 0 ) { //forward
frequency_index++; frequency_index++;
entry_has_changed = true ; entry_has_changed = true ;
// looping // looping
@ -324,15 +298,8 @@ namespace ui {
frequency_index = 0 ; frequency_index = 0 ;
} }
} }
} else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) {
else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) { //reverse
//reverse
if( ( minfreq != maxfreq ) && freq == maxfreq )
{
freq = minfreq ;
}
else
{
frequency_index--; frequency_index--;
entry_has_changed = true ; entry_has_changed = true ;
// if previous if under the list => go back from end // if previous if under the list => go back from end
@ -343,98 +310,131 @@ namespace ui {
} }
} }
} }
else if( frequency_list_[ frequency_index ] . type == HAMRADIO )
{
if ( (_fwd && _stepper == 0 ) || _stepper > 0 ) { //forward
if( ( minfreq != maxfreq ) && freq == minfreq )
{
freq = maxfreq ;
}
else
{
frequency_index++;
entry_has_changed = true ;
// looping
if( (uint32_t)frequency_index >= frequency_list_.size() )
{
has_looped = true ;
frequency_index = 0 ;
}
}
}
else if( (!_fwd && _stepper == 0 ) || _stepper < 0 ) {
//reverse
if( ( minfreq != maxfreq ) && freq == maxfreq )
{
freq = minfreq ;
}
else
{
frequency_index--;
entry_has_changed = true ;
// if previous if under the list => go back from end
if( frequency_index < 0 )
{
has_looped = true ;
frequency_index = frequency_list_.size() - 1 ;
}
}
}
}
// set index to boundary if !continuous
if( has_looped && !_continuous )
{
entry_has_changed = true ;
/* prepare values for the next run, when user will resume */
if( ( _fwd && _stepper == 0 ) || _stepper > 0 )
{
frequency_index = 0 ;
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 )
{
frequency_index = frequency_list_.size() - 1 ;
}
}
} }
// set index to boundary if !continuous else
{
if( _index_stepper > 0 )
frequency_index ++ ;
if( _index_stepper < 0 )
frequency_index -- ;
if( frequency_index < 0 )
frequency_index = frequency_list_.size() - 1 ;
if( (unsigned)frequency_index >= frequency_list_.size() )
frequency_index = 0 ;
entry_has_changed = true ;
}
// reload entry if changed
if( entry_has_changed ){
switch( frequency_list_[ frequency_index ] . type ){
case SINGLE:
freq = frequency_list_[ frequency_index ] . frequency_a ;
break;
case RANGE:
minfreq = frequency_list_[ frequency_index ] . frequency_a ;
maxfreq = frequency_list_[ frequency_index ] . frequency_b ;
if( ( _fwd && _stepper == 0 ) || _stepper > 0 || _index_stepper > 0 )
{
freq = minfreq ;
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 || _index_stepper < 0 )
{
freq = maxfreq ;
}
break;
case HAMRADIO:
minfreq = frequency_list_[ frequency_index ] . frequency_a ;
maxfreq = frequency_list_[ frequency_index ] . frequency_b ;
if( ( _fwd && _stepper == 0 ) || _stepper > 0 || _index_stepper > 0 )
{
freq = minfreq ;
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 || _index_stepper < 0 )
{
freq = maxfreq ;
}
break;
default:
break;
}
}
// send a pause message with the right freq
if( has_looped && !_continuous ) if( has_looped && !_continuous )
{ {
entry_has_changed = true ; // signal pause to handle_retune
/* prepare values for the next run, when user will resume */ receiver_model.set_tuning_frequency( freq ); // Retune to actual freq
if( ( _fwd && _stepper == 0 ) || _stepper > 0 ) message.freq = freq ;
{ message.range = MSG_RECON_PAUSE ;
frequency_index = 0 ; EventDispatcher::send_message(message);
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 )
{
frequency_index = frequency_list_.size() - 1 ;
}
} }
} if( _stepper < 0 ) _stepper ++ ;
if( _stepper > 0 ) _stepper -- ;
if( _index_stepper < 0 ) _index_stepper ++ ;
if( _index_stepper > 0 ) _index_stepper -- ;
} // if( !restart_recon || _stepper != 0 || _index_stepper != 0 )
else else
{ {
restart_recon = false ; restart_recon = false ;
} }
} } // if( _freq_lock == 0 || _stepper != 0 || _index_stepper != 0 )
} } // if( _recon || _stepper != 0 || _index_stepper != 0 )
else } // if( !freq_delete )
{
restart_recon = true ;
}
if( _index_stepper != 0 )
{
if( _index_stepper > 0 )
frequency_index ++ ;
if( _index_stepper < 0 )
frequency_index -- ;
if( frequency_index < 0 )
frequency_index = frequency_list_.size() - 1 ;
if( (unsigned)frequency_index >= frequency_list_.size() )
frequency_index = 0 ;
entry_has_changed = true ;
}
// reload entry if changed
if( entry_has_changed ){
switch( frequency_list_[ frequency_index ] . type ){
case SINGLE:
freq = frequency_list_[ frequency_index ] . frequency_a ;
break;
case RANGE:
minfreq = frequency_list_[ frequency_index ] . frequency_a ;
maxfreq = frequency_list_[ frequency_index ] . frequency_b ;
if( ( _fwd && _stepper == 0 ) || _stepper > 0 || _index_stepper > 0 )
{
freq = minfreq ;
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 || _index_stepper < 0 )
{
freq = maxfreq ;
}
break;
case HAMRADIO:
minfreq = frequency_list_[ frequency_index ] . frequency_a ;
maxfreq = frequency_list_[ frequency_index ] . frequency_b ;
if( ( _fwd && _stepper == 0 ) || _stepper > 0 || _index_stepper > 0 )
{
freq = minfreq ;
}
else if( ( !_fwd && _stepper == 0 ) || _stepper < 0 || _index_stepper < 0 )
{
freq = maxfreq ;
}
break;
default:
break;
}
}
// send a pause message with the right freq
if( has_looped && !_continuous )
{
// signal pause to handle_retune
receiver_model.set_tuning_frequency( freq ); // Retune to actual freq
message.freq = freq ;
message.range = MSG_RECON_PAUSE ;
EventDispatcher::send_message(message);
}
if( _stepper < 0 ) _stepper ++ ;
if( _stepper > 0 ) _stepper -- ;
if( _index_stepper < 0 ) _index_stepper ++ ;
if( _index_stepper > 0 ) _index_stepper -- ;
}
chThdSleepMilliseconds( _lock_duration ); //Needed to (eventually) stabilize the receiver into new freq chThdSleepMilliseconds( _lock_duration ); //Needed to (eventually) stabilize the receiver into new freq
} } //while( !chThdShouldTerminate() && frequency_list_.size() > 0 )
} }//if (frequency_list_.size() > 0 )
} } //ReconThread::run
bool ReconView::check_sd_card() bool ReconView::check_sd_card()
{ {