From 044e0bfc2742f4c578cd7e99cfeb266d3f5a803d Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 16 Dec 2015 03:12:38 +0100 Subject: [PATCH] BFM demod: RDS GUI part #9: group14 full implementation. Separate clear RDS data button --- plugins/channel/bfm/bfmdemodgui.cpp | 76 +++++++++++++++++++- plugins/channel/bfm/bfmdemodgui.h | 3 + plugins/channel/bfm/bfmdemodgui.ui | 106 ++++++++++++++++++++++++++-- plugins/channel/bfm/rdsparser.cpp | 81 +++++++++++++++++---- plugins/channel/bfm/rdsparser.h | 1 + sdrbase/resources/recycle.png | Bin 0 -> 791 bytes sdrbase/resources/res.qrc | 1 + 7 files changed, 245 insertions(+), 23 deletions(-) create mode 100644 sdrbase/resources/recycle.png diff --git a/plugins/channel/bfm/bfmdemodgui.cpp b/plugins/channel/bfm/bfmdemodgui.cpp index c27217784..8636ab8d1 100644 --- a/plugins/channel/bfm/bfmdemodgui.cpp +++ b/plugins/channel/bfm/bfmdemodgui.cpp @@ -250,12 +250,60 @@ void BFMDemodGUI::on_showPilot_clicked() void BFMDemodGUI::on_rds_clicked() { - if (ui->rds->isChecked()) { + applySettings(); +} + +void BFMDemodGUI::on_clearData_clicked(bool checked) +{ + if (ui->rds->isChecked()) + { m_rdsParser.clearAllFields(); + + ui->g14ProgServiceNames->clear(); + ui->g14MappedFrequencies->clear(); + ui->g14AltFrequencies->clear(); + rdsUpdate(true); } +} - applySettings(); +void BFMDemodGUI::on_g14ProgServiceNames_currentIndexChanged(int index) +{ + if (index < m_g14ComboIndex.size()) + { + unsigned int piKey = m_g14ComboIndex[index]; + RDSParser::freqs_map_t::const_iterator mIt = m_rdsParser.m_g14_mapped_freqs.find(piKey); + + if (mIt != m_rdsParser.m_g14_mapped_freqs.end()) + { + ui->g14MappedFrequencies->clear(); + RDSParser::freqs_set_t::iterator sIt = (mIt->second).begin(); + const RDSParser::freqs_set_t::iterator sItEnd = (mIt->second).end(); + + for (sIt; sIt != sItEnd; ++sIt) + { + std::ostringstream os; + os << std::fixed << std::showpoint << std::setprecision(2) << *sIt; + ui->g14MappedFrequencies->addItem(os.str().c_str()); + } + } + + mIt = m_rdsParser.m_g14_alt_freqs.find(piKey); + + if (mIt != m_rdsParser.m_g14_alt_freqs.end()) + { + ui->g14AltFrequencies->clear(); + RDSParser::freqs_set_t::iterator sIt = (mIt->second).begin(); + const RDSParser::freqs_set_t::iterator sItEnd = (mIt->second).end(); + + for (sIt; sIt != sItEnd; ++sIt) + { + std::ostringstream os; + os << std::fixed << std::showpoint << std::setprecision(2) << *sIt; + ui->g14AltFrequencies->addItem(os.str().c_str()); + } + } + } } void BFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) @@ -431,7 +479,7 @@ void BFMDemodGUI::rdsUpdateFixedFields() //ui->g07Label->setText(m_rdsParser.rds_group_acronym_tags[7].c_str()); ui->g08Label->setText(m_rdsParser.rds_group_acronym_tags[8].c_str()); //ui->g09Label->setText(m_rdsParser.rds_group_acronym_tags[9].c_str()); - //ui->g14Label->setText(m_rdsParser.rds_group_acronym_tags[14].c_str()); + ui->g14Label->setText(m_rdsParser.rds_group_acronym_tags[14].c_str()); ui->g00CountLabel->setText(m_rdsParser.rds_group_acronym_tags[0].c_str()); ui->g01CountLabel->setText(m_rdsParser.rds_group_acronym_tags[1].c_str()); @@ -625,6 +673,28 @@ void BFMDemodGUI::rdsUpdate(bool force) if (m_rdsParser.m_g14_updated || force) { ui->g14CountText->setNum((int) m_rdsParser.m_g14_count); + + if (m_rdsParser.m_g14_data_available) + { + ui->g14Label->setStyleSheet("QLabel { background-color : green; }"); + m_g14ComboIndex.clear(); + ui->g14ProgServiceNames->clear(); + + RDSParser::psns_map_t::iterator it = m_rdsParser.m_g14_program_service_names.begin(); + const RDSParser::psns_map_t::iterator itEnd = m_rdsParser.m_g14_program_service_names.end(); + int i = 0; + + for (it; it != itEnd; ++it, i++) + { + m_g14ComboIndex.push_back(it->first); + QString pistring(str(boost::format("%04X:%s") % it->first % it->second).c_str()); + ui->g14ProgServiceNames->addItem(pistring); + } + } + else + { + ui->g14Label->setStyleSheet("QLabel { background:rgb(79,79,79); }"); + } } m_rdsParser.clearUpdateFlags(); diff --git a/plugins/channel/bfm/bfmdemodgui.h b/plugins/channel/bfm/bfmdemodgui.h index da85febe7..28b5950bb 100644 --- a/plugins/channel/bfm/bfmdemodgui.h +++ b/plugins/channel/bfm/bfmdemodgui.h @@ -65,6 +65,8 @@ private slots: void on_audioStereo_toggled(bool stereo); void on_showPilot_clicked(); void on_rds_clicked(); + void on_g14ProgServiceNames_currentIndexChanged(int index); + void on_clearData_clicked(bool checked); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDoubleClicked(); void tick(); @@ -85,6 +87,7 @@ private: BFMDemod* m_bfmDemod; MovingAverage m_channelPowerDbAvg; int m_rate; + std::vector m_g14ComboIndex; static const int m_rfBW[]; diff --git a/plugins/channel/bfm/bfmdemodgui.ui b/plugins/channel/bfm/bfmdemodgui.ui index 87ed8994b..923a63664 100644 --- a/plugins/channel/bfm/bfmdemodgui.ui +++ b/plugins/channel/bfm/bfmdemodgui.ui @@ -6,7 +6,7 @@ 0 0 - 676 + 712 729 @@ -436,7 +436,7 @@ 10 150 - 561 + 661 301 @@ -665,6 +665,20 @@ + + + + Clear RDS data + + + + + + + :/recycle.png:/recycle.png + + + @@ -1195,9 +1209,15 @@ + + + 70 + 0 + + - 80 + 16777215 16777215 @@ -1280,7 +1300,7 @@ - 80 + 50 0 @@ -1357,7 +1377,7 @@ - + Qt::Vertical @@ -1367,13 +1387,13 @@ - 0 + 160 0 - 150 + 16777215 16777215 @@ -1395,6 +1415,78 @@ + + + + Qt::Vertical + + + + + + + + 0 + 0 + + + + + 30 + 16777215 + + + + G14 + + + + + + + Qt::Vertical + + + + + + + + 120 + 0 + + + + Stations (PI and Program service names) + + + + + + + + 50 + 0 + + + + Station mapped frequencies + + + + + + + + 50 + 0 + + + + Station altermate freqiuencies + + + diff --git a/plugins/channel/bfm/rdsparser.cpp b/plugins/channel/bfm/rdsparser.cpp index 274321f22..09e669b88 100644 --- a/plugins/channel/bfm/rdsparser.cpp +++ b/plugins/channel/bfm/rdsparser.cpp @@ -338,7 +338,6 @@ void RDSParser::clearAllFields() m_g14_alt_freq_set.clear(); m_g14_mapped_freq_set.clear(); m_g14_psn_updated = false; - m_g14_data_available = false; // Group 15 m_g15_count = 0; @@ -968,7 +967,7 @@ void RDSParser::decode_type14(unsigned int *group, bool B) m_g14_program_service_name[variant_code * 2 ] = (information >> 8) & 0xff; m_g14_program_service_name[variant_code * 2 + 1] = information & 0xff; m_g14_psn_updated = true; - qDebug() << "RDSParser::decode_type14: PS(ON): \"" << std::string(m_g14_program_service_name, 8).c_str() << "\""; + //qDebug() << "RDSParser::decode_type14: PS(ON): \"" << std::string(m_g14_program_service_name, 8).c_str() << "\""; break; } case 4: // AF @@ -977,8 +976,9 @@ void RDSParser::decode_type14(unsigned int *group, bool B) af_2 = 100.0 * ((information & 0xff) + 875); m_g14_alt_freq_set.insert(af_1/1000.0); m_g14_alt_freq_set.insert(af_2/1000.0); + /* std::string s = str(boost::format("AF:%3.2fMHz %3.2fMHz") % (af_1/1000) % (af_2/1000)); - qDebug() << "RDSParser::decode_type14: " << s.c_str(); + qDebug() << "RDSParser::decode_type14: " << s.c_str();*/ break; } case 5: // mapped frequencies @@ -989,8 +989,9 @@ void RDSParser::decode_type14(unsigned int *group, bool B) af_1 = 100.0 * (((information >> 8) & 0xff) + 875); af_2 = 100.0 * ((information & 0xff) + 875); m_g14_mapped_freq_set.insert(af_2/1000.0); + /* std::string s = str(boost::format("TN:%3.2fMHz - ON:%3.2fMHz") % (af_1/1000) % (af_2/1000)); - qDebug() << "RDSParser::decode_type14: " << s.c_str(); + qDebug() << "RDSParser::decode_type14: " << s.c_str();*/ break; } case 9: // mapped frequencies (AM) @@ -998,8 +999,9 @@ void RDSParser::decode_type14(unsigned int *group, bool B) af_1 = 100.0 * (((information >> 8) & 0xff) + 875); af_2 = 9.0 * ((information & 0xff) - 16) + 531; m_g14_mapped_freq_set.insert(af_2/1000.0); + /* std::string s = str(boost::format("TN:%3.2fMHz - ON:%ikHz") % (af_1/1000) % int(af_2)); - qDebug() << "RDSParser::decode_type14: " << s.c_str(); + qDebug() << "RDSParser::decode_type14: " << s.c_str();*/ break; } case 10: // unallocated @@ -1010,6 +1012,7 @@ void RDSParser::decode_type14(unsigned int *group, bool B) { if (m_g14_psn_updated) { + qDebug("RDSParser::decode_type14: m_g14_psn_updated"); std::pair ret = m_g14_program_service_names.insert(psns_map_kv_t(pi_on, std::string(m_g14_program_service_name))); std::memset(m_g14_program_service_name, ' ', sizeof(m_g14_program_service_name)); m_g14_psn_updated = false; @@ -1018,36 +1021,87 @@ void RDSParser::decode_type14(unsigned int *group, bool B) if (m_g14_alt_freq_set.size() > 0) { - std::pair ret = m_g14_alt_freqs.insert(freqs_map_kv_t(pi_on, m_g14_alt_freq_set)); + qDebug("RDSParser::decode_type14: m_g14_alt_freq_set updated"); + + std::pair retMap; + std::pair retSet; + bool updated = false; + + freqs_map_t::iterator mIt = m_g14_alt_freqs.find(pi_on); + + if (mIt == m_g14_alt_freqs.end()) // key does not exist yet => insert the whole set + { + retMap = m_g14_alt_freqs.insert(freqs_map_kv_t(pi_on, m_g14_alt_freq_set)); + updated |= retMap.second; + } + else // merge sets + { + freqs_set_t::iterator sIt = m_g14_alt_freq_set.begin(); + const freqs_set_t::iterator sItEnd = m_g14_alt_freq_set.end(); + + for (sIt; sIt != sItEnd; ++sIt) + { + retSet = (mIt->second).insert(*sIt); + updated |= retSet.second; + } + } + m_g14_alt_freq_set.clear(); - m_g14_data_available = ret.second; + m_g14_data_available |= updated; } if (m_g14_mapped_freq_set.size() > 0) { - std::pair ret = m_g14_mapped_freqs.insert(freqs_map_kv_t(pi_on, m_g14_mapped_freq_set)); + qDebug("RDSParser::decode_type14: m_g14_mapped_freq_set updated"); + + std::pair retMap; + std::pair retSet; + bool updated = false; + + freqs_map_t::iterator mIt = m_g14_mapped_freqs.find(pi_on); + + if (mIt == m_g14_mapped_freqs.end()) // key does not exist yet => insert the whole set + { + retMap = m_g14_mapped_freqs.insert(freqs_map_kv_t(pi_on, m_g14_mapped_freq_set)); + updated |= retMap.second; + } + else // merge sets + { + freqs_set_t::iterator sIt = m_g14_mapped_freq_set.begin(); + const freqs_set_t::iterator sItEnd = m_g14_mapped_freq_set.end(); + + for (sIt; sIt != sItEnd; ++sIt) + { + retSet = (mIt->second).insert(*sIt); + updated |= retSet.second; + } + } + m_g14_mapped_freq_set.clear(); - m_g14_data_available = ret.second; + m_g14_data_available |= updated; } + /* std::string s = str(boost::format("Linkage information: %x%x") % ((information >> 8) & 0xff) % (information & 0xff)); - qDebug() << "RDSParser::decode_type14: " << s.c_str(); + qDebug() << "RDSParser::decode_type14: " << s.c_str();*/ break; } case 13: // PTY(ON), TA(ON) { ta_on = information & 0x01; pty_on = (information >> 11) & 0x1f; + /* qDebug() << "RDSParser::decode_type14: PTY(ON):" << pty_table[int(pty_on)].c_str(); if(ta_on) { qDebug() << "RDSParser::decode_type14: - TA"; - } + }*/ break; } case 14: // PIN(ON) { + /* std::string s = str(boost::format("PIN(ON):%x%x") % ((information >> 8) & 0xff) % (information & 0xff)); - qDebug() << "RDSParser::decode_type14: " << s.c_str(); + qDebug() << "RDSParser::decode_type14: " << s.c_str();*/ break; } case 15: // Reserved for broadcasters use @@ -1058,6 +1112,7 @@ void RDSParser::decode_type14(unsigned int *group, bool B) } } + /* if (pi_on) { std::string pistring = str(boost::format("%04X") % pi_on); @@ -1066,7 +1121,7 @@ void RDSParser::decode_type14(unsigned int *group, bool B) if (tp_on) { qDebug() << "RDSParser::decode_type14: TP(ON)"; } - } + }*/ } void RDSParser::decode_type15(unsigned int *group, bool B){ diff --git a/plugins/channel/bfm/rdsparser.h b/plugins/channel/bfm/rdsparser.h index 1c61e98ce..934845951 100644 --- a/plugins/channel/bfm/rdsparser.h +++ b/plugins/channel/bfm/rdsparser.h @@ -29,6 +29,7 @@ public: typedef std::pair psns_map_kv_t; typedef std::map > freqs_map_t; typedef std::pair > freqs_map_kv_t; + typedef std::set freqs_set_t; RDSParser(); ~RDSParser(); diff --git a/sdrbase/resources/recycle.png b/sdrbase/resources/recycle.png new file mode 100644 index 0000000000000000000000000000000000000000..4e188a18fc11048226c90e4754a574967fe11103 GIT binary patch literal 791 zcmV+y1L*vTP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00MtWL_t(Y$E{U8XcR#de!JnK zf|Wl>2xxv9Nvj|!Y(!KLv=Hqq1T|n2Yy^u4g4YNVQ^!hztq7+vsjjdPjV1<-2@%c{ zbC*4r++J>OcXn>(&9ev>?>4)48_%zr$9(g?dGo&A2M~gVg?X5ro!O3axwS*S=baTo zT$fVb@O}SMu~;0a?XRpXLo9fnH>8xBtHnZy5v5d?B7lfY2r;&}IKL;BfDqz55s~M* zcMy@{LTgQ&^J@SA1$pu9qb7J!1U`^e~G^D z4-=6jB1S|dBHAFLg4TMSbMIx8K&ey$+qO@HJk=wJi;3~aEjd!ksX*m<004OSV9cyk zDp!c81KL0`nM?$$SpK$j02tdmR#(>hY$ntFuOf)JS})*v-bJ&sbMN6AA(2R&Jlfy? zu8l%|)(56(9x)LW{6`oKfnlIot;+QP>0lcIef5Dx{IRvr4K^mrvW9k>Ih9K73pROl z^md|VvFU)tKJQjQO8GpHV|9CzbAB$U&KMgZqLzuv<+9;8&Z*#eA;jGVqEhO6kmS1V z%~k@A z6C%zbq7}vSegA&bl3llQHR!6i;GEwB0C+k%+5BB?+wNCNeT|zK5%cBp<}d)j#FO#X zmaDnPb=?a}sTo96AxR09dRv>tQI0cO2^q!~C6mc?^>lUhAyEfo>{oAZZ!XUF@dqDP V{svc>w;=!k002ovPDHLkV1i|wPQm~H literal 0 HcmV?d00001 diff --git a/sdrbase/resources/res.qrc b/sdrbase/resources/res.qrc index cd631d96d..79d3f8c12 100644 --- a/sdrbase/resources/res.qrc +++ b/sdrbase/resources/res.qrc @@ -47,5 +47,6 @@ flip_rl.png carrier.png rds.png + recycle.png