diff --git a/plugins/channel/bfm/rdsparser.cpp b/plugins/channel/bfm/rdsparser.cpp index a2ccf200a..274321f22 100644 --- a/plugins/channel/bfm/rdsparser.cpp +++ b/plugins/channel/bfm/rdsparser.cpp @@ -256,6 +256,7 @@ void RDSParser::clearUpdateFlags() m_g12_updated = false; m_g13_updated = false; m_g14_updated = false; + m_g14_data_available = false; m_g15_updated = false; } @@ -321,13 +322,25 @@ void RDSParser::clearAllFields() m_g8_label_index = -1; m_g8_content = 0; - // Group 09..15 data + // Group 09..13 data m_g9_count = 0; m_g10_count = 0; m_g11_count = 0; m_g12_count = 0; m_g13_count = 0; + + // Group 14 m_g14_count = 0; + m_g14_program_service_names.clear(); + m_g14_alt_freqs.clear(); + m_g14_mapped_freqs.clear(); + std::memset(m_g14_program_service_name, ' ', sizeof(m_g14_program_service_name)); + 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; clearUpdateFlags(); @@ -952,15 +965,18 @@ void RDSParser::decode_type14(unsigned int *group, bool B) case 2: // PS(ON) case 3: // PS(ON) { - ps_on[variant_code * 2 ] = (information >> 8) & 0xff; - ps_on[variant_code * 2 + 1] = information & 0xff; - qDebug() << "RDSParser::decode_type14: PS(ON): \"" << std::string(ps_on, 8).c_str() << "\""; + 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() << "\""; break; } case 4: // AF { af_1 = 100.0 * (((information >> 8) & 0xff) + 875); 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(); break; @@ -972,6 +988,7 @@ 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(); break; @@ -980,6 +997,7 @@ 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(); break; @@ -990,6 +1008,28 @@ void RDSParser::decode_type14(unsigned int *group, bool B) break; case 12: // linkage information { + if (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; + m_g14_data_available = ret.second; + } + + 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)); + m_g14_alt_freq_set.clear(); + m_g14_data_available = ret.second; + } + + 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)); + m_g14_mapped_freq_set.clear(); + m_g14_data_available = ret.second; + } + std::string s = str(boost::format("Linkage information: %x%x") % ((information >> 8) & 0xff) % (information & 0xff)); qDebug() << "RDSParser::decode_type14: " << s.c_str(); break; diff --git a/plugins/channel/bfm/rdsparser.h b/plugins/channel/bfm/rdsparser.h index 0ad74a225..1c61e98ce 100644 --- a/plugins/channel/bfm/rdsparser.h +++ b/plugins/channel/bfm/rdsparser.h @@ -20,10 +20,16 @@ #include #include +#include class RDSParser { public: + typedef std::map psns_map_t; + typedef std::pair psns_map_kv_t; + typedef std::map > freqs_map_t; + typedef std::pair > freqs_map_kv_t; + RDSParser(); ~RDSParser(); @@ -107,20 +113,32 @@ public: int m_g8_label_index; //!< negative if not received int m_g8_content; - // G9..G15 data + // G9..G13 data bool m_g9_updated; bool m_g10_updated; bool m_g11_updated; bool m_g12_updated; bool m_g13_updated; - bool m_g14_updated; - bool m_g15_updated; unsigned int m_g9_count; unsigned int m_g10_count; unsigned int m_g11_count; unsigned int m_g12_count; unsigned int m_g13_count; + + // G14 data + bool m_g14_updated; unsigned int m_g14_count; + psns_map_t m_g14_program_service_names; //!< key: PI, value: PSN + freqs_map_t m_g14_alt_freqs; //!< key: PI, value: set of alternate frequencies (MHz) + freqs_map_t m_g14_mapped_freqs; //!< key: PI, value: set of mapped frequencies (MHz) + char m_g14_program_service_name[8+1]; + std::set m_g14_alt_freq_set; + std::set m_g14_mapped_freq_set; + bool m_g14_psn_updated; + bool m_g14_data_available; + + // G15 data + bool m_g15_updated; unsigned int m_g15_count; // Static tables