Added some better scheduling logic around station band switching

This commit is contained in:
Jordan Sherer 2018-08-09 12:52:48 -04:00
parent 2989c20175
commit e51cc6c3b5
4 changed files with 62 additions and 23 deletions

View File

@ -293,17 +293,14 @@ public:
{
auto band = all_bands_->find(freq_.frequency());
int offset = 0;
if(switch_until_.time() <= switch_at_.time()){
offset += 1;
}
auto a = QDateTime(QDate(2000, 1, 1), switch_at_.time(), Qt::UTC);
auto b = QDateTime(QDate(2000, 1, 1), switch_until_.time(), Qt::UTC);
return {
//band_.currentText (),
band,
freq_.frequency(),
QDateTime(QDate(2000, 1, 1), switch_at_.time(), Qt::UTC),
QDateTime(QDate(2000, 1, 1 + offset), switch_until_.time(), Qt::UTC),
qMin(a, b),
qMax(a, b),
description_.text ()};
}

View File

@ -486,25 +486,29 @@ bool StationList::impl::setData (QModelIndex const& model_index, QVariant const&
s = QString("0").repeated(5-s.length()) + s;
}
auto t = QTime::fromString(s);
auto dt = QDateTime(QDate(2000,1,1), t);
stations_[row].switch_at_ = dt;
auto at = QDateTime(QDate(2000,1,1), t, Qt::UTC);
auto until = stations_[row].switch_until_;
stations_[row].switch_at_ = qMin(at, until);
stations_[row].switch_until_ = qMax(at, until);
Q_EMIT dataChanged (model_index, model_index, roles);
changed = true;
break;
}
case switch_until_column:
{
int o = 0;
QString s = value.toString();
if(s.length() < 5){
s = QString("0").repeated(5-s.length()) + s;
}
auto t = QTime::fromString(s);
if(t < stations_[row].switch_at_.time()){
o += 1;
}
auto dt = QDateTime(QDate(2000,1,1+o), t);
stations_[row].switch_until_ = dt;
auto until = QDateTime(QDate(2000,1,1), t, Qt::UTC);
auto at = stations_[row].switch_at_;
stations_[row].switch_at_ = qMin(at, until);
stations_[row].switch_until_ = qMax(at, until);
Q_EMIT dataChanged (model_index, model_index, roles);
changed = true;
break;

View File

@ -1348,22 +1348,54 @@ void MainWindow::on_the_minute ()
{
tx_watchdog (false);
}
}
void MainWindow::tryBandHop(){
// see if we need to hop bands...
auto const& band_name = ui->bandComboBox->currentText();
if(!m_config.auto_switch_bands()){
return;
}
qDebug() << "Checking for automatic band hop";
// get the current band
Frequency dialFreq {m_rigState.ptt () && m_rigState.split () ?
m_rigState.tx_frequency () : m_rigState.frequency ()};
auto currentBand = m_config.bands()->find(dialFreq);
// get the stations list
auto stations = m_config.stations()->station_list();
// order stations by (switch_at, switch_until) time tuple
qSort(stations.begin(), stations.end(), [](StationList::Station const &a, StationList::Station const &b){
return (a.switch_at_ < b.switch_at_) || (a.switch_at_ == b.switch_at_ && a.switch_until_ < b.switch_until_);
});
foreach(auto station, stations){
// we just set it to a known date to make the comparisons easier ;)
// we just set the date to a known y/m/d to make the comparisons easier
QDateTime d = QDateTime::currentDateTimeUtc();
d.setDate(QDate(2000, 1, 1));
bool canSwitch = station.switch_at_ <= d && d < station.switch_until_;
if(canSwitch && station.band_name_ != band_name){
qDebug() << "should switch to" << station.band_name_ << station.frequency_;
// see if we can find a needed band switch...
foreach(auto station, stations){
// we can switch to this frequency if we're in the time range, inclusive of switch_at, exclusive of switch_until
// and if we are switching within 30 seconds of the switch_at time. this allows us to switch bands at that time,
// but then later we can later switch to a different band if needed without the automatic band switching to take over
bool canSwitch = station.switch_at_ <= d && d <= station.switch_until_ && station.switch_at_.secsTo(d) <= 30;
//qDebug() << "Can switch to" << station.band_name_ << "=" << canSwitch << station.switch_at_.time().toString("hh:mm") << "<=" << d.time().toString("hh:mm") << "<=" << station.switch_until_.time().toString("hh:mm");
// switch, if we can and the band is different than our current band
if(canSwitch && station.band_name_ != currentBand){
qDebug() << "Automatic band hop from" << currentBand << "to" << station.band_name_ << "at" << Radio::frequency_MHz_string(station.frequency_);
// TODO: jsherer - is this the right way to switch the rig freq?
setRig(station.frequency_);
// TODO: jsherer - potentially cache the fact that we switched and mark it as an override, so we don't revert back?
break;
}
}
}
@ -4326,6 +4358,11 @@ void MainWindow::guiUpdate()
m_sec0=nsec;
// once per period
if(m_sec0 % m_TRperiod == 0){
tryBandHop();
}
// once per period/3
bool forceDirty = false;
if(m_sec0 % (m_TRperiod/3) == 0){
// force rx dirty three times per period

View File

@ -863,6 +863,7 @@ private:
void statusUpdate () const;
void update_watchdog_label ();
void on_the_minute ();
void tryBandHop();
void add_child_to_event_filter (QObject *);
void remove_child_from_event_filter (QObject *);
void setup_status_bar (bool vhf);