mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	BFM demod: RDS GUI part #5: prepare groups 1, 2 and 8 implementation. Enhancements in the RDS GUI management
This commit is contained in:
		
							parent
							
								
									9eb271b218
								
							
						
					
					
						commit
						542877a454
					
				@ -250,6 +250,7 @@ void BFMDemodGUI::on_showPilot_clicked()
 | 
				
			|||||||
void BFMDemodGUI::on_rds_clicked()
 | 
					void BFMDemodGUI::on_rds_clicked()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_rdsParser.clearAllFields();
 | 
						m_rdsParser.clearAllFields();
 | 
				
			||||||
 | 
						rdsUpdate(true);
 | 
				
			||||||
	applySettings();
 | 
						applySettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -311,6 +312,9 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
 | 
						ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rdsUpdateFixedFields();
 | 
				
			||||||
 | 
						rdsUpdate(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	applySettings();
 | 
						applySettings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -396,7 +400,7 @@ void BFMDemodGUI::tick()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (ui->rds->isChecked() && (m_rdsTimerCount == 0))
 | 
						if (ui->rds->isChecked() && (m_rdsTimerCount == 0))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		rdsUpdate();
 | 
							rdsUpdate(false);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_rdsTimerCount = (m_rdsTimerCount + 1) % 25;
 | 
						m_rdsTimerCount = (m_rdsTimerCount + 1) % 25;
 | 
				
			||||||
@ -411,7 +415,34 @@ void BFMDemodGUI::channelSampleRateChanged()
 | 
				
			|||||||
	ui->glSpectrum->setSampleRate(m_rate / 2);
 | 
						ui->glSpectrum->setSampleRate(m_rate / 2);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BFMDemodGUI::rdsUpdate()
 | 
					void BFMDemodGUI::rdsUpdateFixedFields()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ui->g00Label->setText(m_rdsParser.rds_group_acronym_tags[0].c_str());
 | 
				
			||||||
 | 
						//ui->g01Label->setText(m_rdsParser.rds_group_acronym_tags[1].c_str());
 | 
				
			||||||
 | 
						//ui->g02Label->setText(m_rdsParser.rds_group_acronym_tags[2].c_str());
 | 
				
			||||||
 | 
						//ui->g03Label->setText(m_rdsParser.rds_group_acronym_tags[3].c_str());
 | 
				
			||||||
 | 
						ui->g04Label->setText(m_rdsParser.rds_group_acronym_tags[4].c_str());
 | 
				
			||||||
 | 
						//ui->g05Label->setText(m_rdsParser.rds_group_acronym_tags[5].c_str());
 | 
				
			||||||
 | 
						//ui->g06Label->setText(m_rdsParser.rds_group_acronym_tags[6].c_str());
 | 
				
			||||||
 | 
						//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->g00CountLabel->setText(m_rdsParser.rds_group_acronym_tags[0].c_str());
 | 
				
			||||||
 | 
						ui->g01CountLabel->setText(m_rdsParser.rds_group_acronym_tags[1].c_str());
 | 
				
			||||||
 | 
						ui->g02CountLabel->setText(m_rdsParser.rds_group_acronym_tags[2].c_str());
 | 
				
			||||||
 | 
						ui->g03CountLabel->setText(m_rdsParser.rds_group_acronym_tags[3].c_str());
 | 
				
			||||||
 | 
						ui->g04CountLabel->setText(m_rdsParser.rds_group_acronym_tags[4].c_str());
 | 
				
			||||||
 | 
						ui->g05CountLabel->setText(m_rdsParser.rds_group_acronym_tags[5].c_str());
 | 
				
			||||||
 | 
						ui->g06CountLabel->setText(m_rdsParser.rds_group_acronym_tags[6].c_str());
 | 
				
			||||||
 | 
						ui->g07CountLabel->setText(m_rdsParser.rds_group_acronym_tags[7].c_str());
 | 
				
			||||||
 | 
						ui->g08CountLabel->setText(m_rdsParser.rds_group_acronym_tags[8].c_str());
 | 
				
			||||||
 | 
						ui->g09CountLabel->setText(m_rdsParser.rds_group_acronym_tags[9].c_str());
 | 
				
			||||||
 | 
						ui->g14CountLabel->setText(m_rdsParser.rds_group_acronym_tags[14].c_str());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BFMDemodGUI::rdsUpdate(bool force)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Quality metrics
 | 
						// Quality metrics
 | 
				
			||||||
	ui->demodQText->setText(QString("%1 %").arg(m_bfmDemod->getDemodQua(), 0, 'f', 0));
 | 
						ui->demodQText->setText(QString("%1 %").arg(m_bfmDemod->getDemodQua(), 0, 'f', 0));
 | 
				
			||||||
@ -421,7 +452,7 @@ void BFMDemodGUI::rdsUpdate()
 | 
				
			|||||||
	ui->fclkText->setText(QString("%1 Hz").arg(m_bfmDemod->getDemodFclk(), 0, 'f', 2));
 | 
						ui->fclkText->setText(QString("%1 Hz").arg(m_bfmDemod->getDemodFclk(), 0, 'f', 2));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// PI group
 | 
						// PI group
 | 
				
			||||||
	if (m_rdsParser.m_pi_updated)
 | 
						if (m_rdsParser.m_pi_updated || force)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ui->piLabel->setStyleSheet("QLabel { background-color : green; }");
 | 
							ui->piLabel->setStyleSheet("QLabel { background-color : green; }");
 | 
				
			||||||
		ui->piCountText->setNum((int) m_rdsParser.m_pi_count);
 | 
							ui->piCountText->setNum((int) m_rdsParser.m_pi_count);
 | 
				
			||||||
@ -443,7 +474,7 @@ void BFMDemodGUI::rdsUpdate()
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// G0 group
 | 
						// G0 group
 | 
				
			||||||
	if (m_rdsParser.m_g0_updated)
 | 
						if (m_rdsParser.m_g0_updated || force)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ui->g00Label->setStyleSheet("QLabel { background-color : green; }");
 | 
							ui->g00Label->setStyleSheet("QLabel { background-color : green; }");
 | 
				
			||||||
		ui->g00CountText->setNum((int) m_rdsParser.m_g0_count);
 | 
							ui->g00CountText->setNum((int) m_rdsParser.m_g0_count);
 | 
				
			||||||
@ -486,7 +517,7 @@ void BFMDemodGUI::rdsUpdate()
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// G4 group
 | 
						// G4 group
 | 
				
			||||||
	if (m_rdsParser.m_g4_updated)
 | 
						if (m_rdsParser.m_g4_updated || force)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ui->g04Label->setStyleSheet("QLabel { background-color : green; }");
 | 
							ui->g04Label->setStyleSheet("QLabel { background-color : green; }");
 | 
				
			||||||
		ui->g04CountText->setNum((int) m_rdsParser.m_g4_count);
 | 
							ui->g04CountText->setNum((int) m_rdsParser.m_g4_count);
 | 
				
			||||||
 | 
				
			|||||||
@ -93,7 +93,8 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void blockApplySettings(bool block);
 | 
					    void blockApplySettings(bool block);
 | 
				
			||||||
	void applySettings();
 | 
						void applySettings();
 | 
				
			||||||
	void rdsUpdate();
 | 
						void rdsUpdate(bool force);
 | 
				
			||||||
 | 
						void rdsUpdateFixedFields();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void leaveEvent(QEvent*);
 | 
						void leaveEvent(QEvent*);
 | 
				
			||||||
	void enterEvent(QEvent*);
 | 
						void enterEvent(QEvent*);
 | 
				
			||||||
 | 
				
			|||||||
@ -124,6 +124,25 @@ const std::string RDSParser::rds_group_acronyms[16] = {
 | 
				
			|||||||
	"___"
 | 
						"___"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string RDSParser::rds_group_acronym_tags[16] = {
 | 
				
			||||||
 | 
						"BAS",
 | 
				
			||||||
 | 
						"PIN",
 | 
				
			||||||
 | 
						"RTX",
 | 
				
			||||||
 | 
						"AID",
 | 
				
			||||||
 | 
						"TIM",
 | 
				
			||||||
 | 
						"TDC",
 | 
				
			||||||
 | 
						"IH_",
 | 
				
			||||||
 | 
						"RP_",
 | 
				
			||||||
 | 
						"TMC",
 | 
				
			||||||
 | 
						"EWS",
 | 
				
			||||||
 | 
						"___",
 | 
				
			||||||
 | 
						"___",
 | 
				
			||||||
 | 
						"___",
 | 
				
			||||||
 | 
						"___",
 | 
				
			||||||
 | 
						"EON",
 | 
				
			||||||
 | 
						"___"
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* page 74, Annex E, table E.1 in the standard: that's the ASCII table!!! */
 | 
					/* page 74, Annex E, table E.1 in the standard: that's the ASCII table!!! */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* see page 84, Annex J in the standard */
 | 
					/* see page 84, Annex J in the standard */
 | 
				
			||||||
@ -224,7 +243,9 @@ void RDSParser::clearUpdateFlags()
 | 
				
			|||||||
	m_pi_updated = false;
 | 
						m_pi_updated = false;
 | 
				
			||||||
	m_g0_updated = false;
 | 
						m_g0_updated = false;
 | 
				
			||||||
	m_g0_af_updated = false;
 | 
						m_g0_af_updated = false;
 | 
				
			||||||
 | 
						m_g2_updated = false;
 | 
				
			||||||
	m_g4_updated = false;
 | 
						m_g4_updated = false;
 | 
				
			||||||
 | 
						m_g8_updated = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RDSParser::clearAllFields()
 | 
					void RDSParser::clearAllFields()
 | 
				
			||||||
@ -238,7 +259,7 @@ void RDSParser::clearAllFields()
 | 
				
			|||||||
	// Group 00 data
 | 
						// Group 00 data
 | 
				
			||||||
	m_g0_count = 0;
 | 
						m_g0_count = 0;
 | 
				
			||||||
	std::memset(m_g0_program_service_name, ' ', sizeof(m_g0_program_service_name));
 | 
						std::memset(m_g0_program_service_name, ' ', sizeof(m_g0_program_service_name));
 | 
				
			||||||
	radiotext[sizeof(m_g0_program_service_name) - 1] = '\0';
 | 
						m_g0_program_service_name[sizeof(m_g0_program_service_name) - 1] = '\0';
 | 
				
			||||||
	m_g0_traffic_announcement = false;
 | 
						m_g0_traffic_announcement = false;
 | 
				
			||||||
	m_g0_music_speech = false;
 | 
						m_g0_music_speech = false;
 | 
				
			||||||
	m_g0_mono_stereo = false;
 | 
						m_g0_mono_stereo = false;
 | 
				
			||||||
@ -247,12 +268,47 @@ void RDSParser::clearAllFields()
 | 
				
			|||||||
	m_g0_static_pty = false;
 | 
						m_g0_static_pty = false;
 | 
				
			||||||
	m_g0_alt_freq.clear();
 | 
						m_g0_alt_freq.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Group 01 data
 | 
				
			||||||
 | 
						m_g1_count = 0;
 | 
				
			||||||
 | 
						m_g1_country_page_index = -1;
 | 
				
			||||||
 | 
						m_g1_country_index = -1;
 | 
				
			||||||
 | 
						m_g1_language_index = -1;
 | 
				
			||||||
 | 
						m_g1_pin_day = 0;
 | 
				
			||||||
 | 
						m_g1_pin_hour = 0;
 | 
				
			||||||
 | 
						m_g1_pin_minute = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Group 02 data
 | 
						// Group 02 data
 | 
				
			||||||
	std::memset(radiotext, ' ', sizeof(radiotext));
 | 
						m_g2_count = 0;
 | 
				
			||||||
	radiotext[sizeof(radiotext) - 1] = '\0';
 | 
						std::memset(m_g2_radiotext, ' ', sizeof(m_g2_radiotext));
 | 
				
			||||||
 | 
						m_g2_radiotext[sizeof(m_g2_radiotext) - 1] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Group 03 data
 | 
				
			||||||
 | 
						m_g3_count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Group 04 data
 | 
						// Group 04 data
 | 
				
			||||||
	m_g4_count = 0;
 | 
						m_g4_count = 0;
 | 
				
			||||||
 | 
						m_g4_hours = 0;
 | 
				
			||||||
 | 
						m_g4_minutes = 0;
 | 
				
			||||||
 | 
						m_g4_seconds = 0;
 | 
				
			||||||
 | 
						m_g4_year = 0;
 | 
				
			||||||
 | 
						m_g4_month = 0;
 | 
				
			||||||
 | 
						m_g4_day = 0;
 | 
				
			||||||
 | 
						m_g4_local_time_offset = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Group 05..07 data
 | 
				
			||||||
 | 
						m_g5_count = 0;
 | 
				
			||||||
 | 
						m_g6_count = 0;
 | 
				
			||||||
 | 
						m_g7_count = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Group 08 data
 | 
				
			||||||
 | 
						m_g8_count = 0;
 | 
				
			||||||
 | 
						m_g8_diversion_recommended = false;
 | 
				
			||||||
 | 
						m_g8_dp_ci = 0;
 | 
				
			||||||
 | 
						m_g8_sign = false;
 | 
				
			||||||
 | 
						m_g8_extent = 0;
 | 
				
			||||||
 | 
						m_g8_event = 0;
 | 
				
			||||||
 | 
						m_g8_label_index = -1;
 | 
				
			||||||
 | 
						m_g8_content = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clearUpdateFlags();
 | 
						clearUpdateFlags();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -513,17 +569,21 @@ void RDSParser::decode_type1(unsigned int *group, bool B)
 | 
				
			|||||||
	char radio_paging_codes     =  group[1]        & 0x1f;
 | 
						char radio_paging_codes     =  group[1]        & 0x1f;
 | 
				
			||||||
	int variant_code            = (group[2] >> 12) & 0x7;
 | 
						int variant_code            = (group[2] >> 12) & 0x7;
 | 
				
			||||||
	unsigned int slow_labelling =  group[2]        & 0xfff;
 | 
						unsigned int slow_labelling =  group[2]        & 0xfff;
 | 
				
			||||||
	int day    = (int)((group[3] >> 11) & 0x1f);
 | 
						m_g1_pin_day    = (unsigned int)((group[3] >> 11) & 0x1f);
 | 
				
			||||||
	int hour   = (int)((group[3] >>  6) & 0x1f);
 | 
						m_g1_pin_hour   = (unsigned int)((group[3] >>  6) & 0x1f);
 | 
				
			||||||
	int minute = (int) (group[3]        & 0x3f);
 | 
						m_g1_pin_minute = (unsigned int) (group[3]        & 0x3f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_g1_count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (radio_paging_codes) {
 | 
						if (radio_paging_codes) {
 | 
				
			||||||
		qDebug() << "RDSParser::decode_type1: paging codes: " << int(radio_paging_codes) << " ";
 | 
							//qDebug() << "RDSParser::decode_type1: paging codes: " << int(radio_paging_codes) << " ";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (day || hour || minute) {
 | 
						if (m_g1_pin_day || m_g1_pin_hour || m_g1_pin_minute) {
 | 
				
			||||||
 | 
							m_g1_updated = true;
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
		std::string s = str(boost::format("program item: %id, %i, %i ") % day % hour % minute);
 | 
							std::string s = str(boost::format("program item: %id, %i, %i ") % day % hour % minute);
 | 
				
			||||||
		qDebug() << "RDSParser::decode_type1: " << s.c_str();
 | 
							qDebug() << "RDSParser::decode_type1: " << s.c_str();*/
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!B)
 | 
						if (!B)
 | 
				
			||||||
@ -534,24 +594,30 @@ void RDSParser::decode_type1(unsigned int *group, bool B)
 | 
				
			|||||||
				paging = (slow_labelling >> 8) & 0x0f;
 | 
									paging = (slow_labelling >> 8) & 0x0f;
 | 
				
			||||||
				ecc    =  slow_labelling       & 0xff;
 | 
									ecc    =  slow_labelling       & 0xff;
 | 
				
			||||||
				if (paging) {
 | 
									if (paging) {
 | 
				
			||||||
					qDebug() << "RDSParser::decode_type1: " << "paging: " << paging << " ";
 | 
										//qDebug() << "RDSParser::decode_type1: " << "paging: " << paging << " ";
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if ((ecc > 223) && (ecc < 229)) {
 | 
									if ((ecc > 223) && (ecc < 229)) {
 | 
				
			||||||
 | 
										m_g1_updated = true;
 | 
				
			||||||
 | 
										m_g1_country_page_index = country_code - 1;
 | 
				
			||||||
 | 
										m_g1_country_index = ecc - 224;
 | 
				
			||||||
 | 
										/*
 | 
				
			||||||
					qDebug() << "RDSParser::decode_type1: " << "extended country code: "
 | 
										qDebug() << "RDSParser::decode_type1: " << "extended country code: "
 | 
				
			||||||
						<< (pi_country_codes[country_code-1][ecc-224]).c_str();
 | 
											<< (pi_country_codes[country_code-1][ecc-224]).c_str();*/
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					qDebug() << "RDSParser::decode_type1: " << "invalid extended country code: " << ecc;
 | 
										qDebug() << "RDSParser::decode_type1: " << "invalid extended country code: " << ecc;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 1: // TMC identification
 | 
								case 1: // TMC identification
 | 
				
			||||||
				qDebug() << "RDSParser::decode_type1: TMC identification code received";
 | 
									//qDebug() << "RDSParser::decode_type1: TMC identification code received";
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 2: // Paging identification
 | 
								case 2: // Paging identification
 | 
				
			||||||
				qDebug() << "RDSParser::decode_type1: Paging identification code received";
 | 
									//qDebug() << "RDSParser::decode_type1: Paging identification code received";
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 3: // language codes
 | 
								case 3: // language codes
 | 
				
			||||||
				if (slow_labelling < 44) {
 | 
									if (slow_labelling < 44) {
 | 
				
			||||||
					qDebug() << "RDSParser::decode_type1: " << "language: " << language_codes[slow_labelling].c_str();
 | 
										m_g1_updated = true;
 | 
				
			||||||
 | 
										m_g1_language_index = slow_labelling;
 | 
				
			||||||
 | 
										//qDebug() << "RDSParser::decode_type1: " << "language: " << language_codes[slow_labelling].c_str();
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					qDebug() << "RDSParser::decode_type1: " << "language: invalid language code " << slow_labelling;
 | 
										qDebug() << "RDSParser::decode_type1: " << "language: invalid language code " << slow_labelling;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@ -566,38 +632,40 @@ void RDSParser::decode_type2(unsigned int *group, bool B)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	unsigned char text_segment_address_code = group[1] & 0x0f;
 | 
						unsigned char text_segment_address_code = group[1] & 0x0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_g2_updated = true;
 | 
				
			||||||
 | 
						m_g2_count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// when the A/B flag is toggled, flush your current radiotext
 | 
						// when the A/B flag is toggled, flush your current radiotext
 | 
				
			||||||
	if (radiotext_AB_flag != ((group[1] >> 4) & 0x01))
 | 
						if (radiotext_AB_flag != ((group[1] >> 4) & 0x01))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		std::memset(radiotext, ' ', sizeof(radiotext));
 | 
							std::memset(m_g2_radiotext, ' ', sizeof(m_g2_radiotext));
 | 
				
			||||||
		radiotext[sizeof(radiotext) - 1] = '\0';
 | 
							m_g2_radiotext[sizeof(m_g2_radiotext) - 1] = '\0';
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	radiotext_AB_flag = (group[1] >> 4) & 0x01;
 | 
						radiotext_AB_flag = (group[1] >> 4) & 0x01;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!B)
 | 
						if (!B)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		radiotext[text_segment_address_code * 4    ] = (group[2] >> 8) & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 4    ] = (group[2] >> 8) & 0xff;
 | 
				
			||||||
		radiotext[text_segment_address_code * 4 + 1] =  group[2]       & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 4 + 1] =  group[2]       & 0xff;
 | 
				
			||||||
		radiotext[text_segment_address_code * 4 + 2] = (group[3] >> 8) & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 4 + 2] = (group[3] >> 8) & 0xff;
 | 
				
			||||||
		radiotext[text_segment_address_code * 4 + 3] =  group[3]       & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 4 + 3] =  group[3]       & 0xff;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		radiotext[text_segment_address_code * 2    ] = (group[3] >> 8) & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 2    ] = (group[3] >> 8) & 0xff;
 | 
				
			||||||
		radiotext[text_segment_address_code * 2 + 1] =  group[3]       & 0xff;
 | 
							m_g2_radiotext[text_segment_address_code * 2 + 1] =  group[3]       & 0xff;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
	qDebug() << "RDSParser::decode_type2: " << "Radio Text " << (radiotext_AB_flag ? 'B' : 'A')
 | 
						qDebug() << "RDSParser::decode_type2: " << "Radio Text " << (radiotext_AB_flag ? 'B' : 'A')
 | 
				
			||||||
		<< ": " << std::string(radiotext, sizeof(radiotext)).c_str();
 | 
							<< ": " << std::string(m_g2_radiotext, sizeof(m_g2_radiotext)).c_str();*/
 | 
				
			||||||
 | 
					 | 
				
			||||||
	//send_message(4,std::string(radiotext, sizeof(radiotext)));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void RDSParser::decode_type3(unsigned int *group, bool B)
 | 
					void RDSParser::decode_type3(unsigned int *group, bool B)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (B) {
 | 
						if (B) {
 | 
				
			||||||
		qDebug() << "RDSParser::decode_type2: type 3B not implemented yet";
 | 
							qDebug() << "RDSParser::decode_type3: type 3B not implemented yet";
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -702,9 +770,13 @@ void RDSParser::decode_type8(unsigned int *group, bool B)
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_g8_updated = true;
 | 
				
			||||||
 | 
						m_g8_count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool T = (group[1] >> 4) & 0x1; // 0 = user message, 1 = tuning info
 | 
						bool T = (group[1] >> 4) & 0x1; // 0 = user message, 1 = tuning info
 | 
				
			||||||
	bool F = (group[1] >> 3) & 0x1; // 0 = multi-group, 1 = single-group
 | 
						bool F = (group[1] >> 3) & 0x1; // 0 = multi-group, 1 = single-group
 | 
				
			||||||
	bool D = (group[2] > 15) & 0x1; // 1 = diversion recommended
 | 
						bool D = (group[2] > 15) & 0x1; // 1 = diversion recommended
 | 
				
			||||||
 | 
						m_g8_diversion_recommended = D;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static unsigned long int free_format[4];
 | 
						static unsigned long int free_format[4];
 | 
				
			||||||
	static int no_groups = 0;
 | 
						static int no_groups = 0;
 | 
				
			||||||
@ -724,24 +796,24 @@ void RDSParser::decode_type8(unsigned int *group, bool B)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	else if (F || D)
 | 
						else if (F || D)
 | 
				
			||||||
	{ // single-group or 1st of multi-group
 | 
						{ // single-group or 1st of multi-group
 | 
				
			||||||
		unsigned int dp_ci    =  group[1]        & 0x7;   // duration & persistence or continuity index
 | 
							m_g8_dp_ci            =  group[1]        & 0x7;   // duration & persistence or continuity index
 | 
				
			||||||
		bool sign             = (group[2] >> 14) & 0x1;   // event direction, 0 = +, 1 = -
 | 
							m_g8_sign             = (group[2] >> 14) & 0x1;   // event direction, 0 = +, 1 = -
 | 
				
			||||||
		unsigned int extent   = (group[2] >> 11) & 0x7;   // number of segments affected
 | 
							m_g8_extent           = (group[2] >> 11) & 0x7;   // number of segments affected
 | 
				
			||||||
		unsigned int event    =  group[2]        & 0x7ff; // event code, defined in ISO 14819-2
 | 
							m_g8_event            =  group[2]        & 0x7ff; // event code, defined in ISO 14819-2
 | 
				
			||||||
		unsigned int location =  group[3];                // location code, defined in ISO 14819-3
 | 
							unsigned int location =  group[3];                // location code, defined in ISO 14819-3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		qDebug() << "RDSParser::decode_type8: #user msg# " << (D ? "diversion recommended, " : "");
 | 
							qDebug() << "RDSParser::decode_type8: #user msg# " << (D ? "diversion recommended, " : "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (F) {
 | 
							if (F) {
 | 
				
			||||||
			qDebug() << "RDSParser::decode_type8: single-grp, duration:" << (tmc_duration[dp_ci][0]).c_str();
 | 
								qDebug() << "RDSParser::decode_type8: single-grp, duration:" << (tmc_duration[m_g8_dp_ci][0]).c_str();
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			qDebug() << "RDSParser::decode_type8: multi-grp, continuity index:" << dp_ci;
 | 
								qDebug() << "RDSParser::decode_type8: multi-grp, continuity index:" << m_g8_dp_ci;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int event_line = RDSTMC::get_tmc_event_code_index(event, 1);
 | 
							int event_line = RDSTMC::get_tmc_event_code_index(m_g8_event, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		qDebug() << "RDSParser::decode_type8: extent:" << (sign ? "-" : "") << extent + 1 << " segments"
 | 
							qDebug() << "RDSParser::decode_type8: extent:" << (m_g8_sign ? "-" : "") << m_g8_extent + 1 << " segments"
 | 
				
			||||||
			<< ", event" << event << ":" << RDSTMC::get_tmc_events(event_line, 1).c_str()
 | 
								<< ", event" << m_g8_event << ":" << RDSTMC::get_tmc_events(event_line, 1).c_str()
 | 
				
			||||||
			<< ", location:" << location;
 | 
								<< ", location:" << location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -772,8 +844,6 @@ void RDSParser::decode_type8(unsigned int *group, bool B)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void RDSParser::decode_optional_content(int no_groups, unsigned long int *free_format)
 | 
					void RDSParser::decode_optional_content(int no_groups, unsigned long int *free_format)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int label          = 0;
 | 
					 | 
				
			||||||
	int content        = 0;
 | 
					 | 
				
			||||||
	int content_length = 0;
 | 
						int content_length = 0;
 | 
				
			||||||
	int ff_pointer     = 0;
 | 
						int ff_pointer     = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -784,13 +854,13 @@ void RDSParser::decode_optional_content(int no_groups, unsigned long int *free_f
 | 
				
			|||||||
		while(ff_pointer > 0)
 | 
							while(ff_pointer > 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ff_pointer -= 4;
 | 
								ff_pointer -= 4;
 | 
				
			||||||
			label = (free_format[i] && (0xf << ff_pointer));
 | 
								m_g8_label_index = (free_format[i] && (0xf << ff_pointer));
 | 
				
			||||||
			content_length = optional_content_lengths[label];
 | 
								content_length = optional_content_lengths[m_g8_label_index];
 | 
				
			||||||
			ff_pointer -= content_length;
 | 
								ff_pointer -= content_length;
 | 
				
			||||||
			content = (free_format[i] && (int(std::pow(2, content_length) - 1) << ff_pointer));
 | 
								m_g8_content = (free_format[i] && (int(std::pow(2, content_length) - 1) << ff_pointer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			qDebug() << "RDSParser::decode_optional_content: TMC optional content (" << label_descriptions[label].c_str()
 | 
								qDebug() << "RDSParser::decode_optional_content: TMC optional content (" << label_descriptions[m_g8_label_index].c_str()
 | 
				
			||||||
				<< "):" << content;
 | 
									<< "):" << m_g8_content;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -48,7 +48,7 @@ public:
 | 
				
			|||||||
	bool           m_g0_updated;
 | 
						bool           m_g0_updated;
 | 
				
			||||||
	bool           m_g0_af_updated;
 | 
						bool           m_g0_af_updated;
 | 
				
			||||||
	unsigned int   m_g0_count;
 | 
						unsigned int   m_g0_count;
 | 
				
			||||||
	char           m_g0_program_service_name[9];
 | 
						char           m_g0_program_service_name[8+1];
 | 
				
			||||||
	bool           m_g0_traffic_announcement;
 | 
						bool           m_g0_traffic_announcement;
 | 
				
			||||||
	bool           m_g0_music_speech;
 | 
						bool           m_g0_music_speech;
 | 
				
			||||||
	bool           m_g0_mono_stereo;
 | 
						bool           m_g0_mono_stereo;
 | 
				
			||||||
@ -57,6 +57,24 @@ public:
 | 
				
			|||||||
	bool           m_g0_static_pty;
 | 
						bool           m_g0_static_pty;
 | 
				
			||||||
	std::set<double> m_g0_alt_freq;
 | 
						std::set<double> m_g0_alt_freq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// G1 data
 | 
				
			||||||
 | 
						bool           m_g1_updated;
 | 
				
			||||||
 | 
						unsigned int   m_g1_count;
 | 
				
			||||||
 | 
						int            m_g1_country_page_index; //!< negative if not received
 | 
				
			||||||
 | 
						int   		   m_g1_country_index;      //!< negative if not received
 | 
				
			||||||
 | 
						int            m_g1_language_index;     //!< negative if not received
 | 
				
			||||||
 | 
						unsigned int   m_g1_pin_day;
 | 
				
			||||||
 | 
						unsigned int   m_g1_pin_hour;
 | 
				
			||||||
 | 
						unsigned int   m_g1_pin_minute;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// G2 data
 | 
				
			||||||
 | 
						bool           m_g2_updated;
 | 
				
			||||||
 | 
						unsigned int   m_g2_count;
 | 
				
			||||||
 | 
						char           m_g2_radiotext[64+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// G3 data
 | 
				
			||||||
 | 
						unsigned int   m_g3_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// G4 data
 | 
						// G4 data
 | 
				
			||||||
	bool           m_g4_updated;
 | 
						bool           m_g4_updated;
 | 
				
			||||||
	unsigned int   m_g4_count;
 | 
						unsigned int   m_g4_count;
 | 
				
			||||||
@ -68,6 +86,22 @@ public:
 | 
				
			|||||||
	unsigned int   m_g4_day;
 | 
						unsigned int   m_g4_day;
 | 
				
			||||||
	double         m_g4_local_time_offset;
 | 
						double         m_g4_local_time_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // G5..G7 data
 | 
				
			||||||
 | 
						unsigned int   m_g5_count;
 | 
				
			||||||
 | 
						unsigned int   m_g6_count;
 | 
				
			||||||
 | 
						unsigned int   m_g7_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// G8 data
 | 
				
			||||||
 | 
						bool           m_g8_updated;
 | 
				
			||||||
 | 
						unsigned int   m_g8_count;
 | 
				
			||||||
 | 
						bool           m_g8_diversion_recommended;
 | 
				
			||||||
 | 
						unsigned int   m_g8_dp_ci;
 | 
				
			||||||
 | 
						bool           m_g8_sign;
 | 
				
			||||||
 | 
						unsigned int   m_g8_extent;
 | 
				
			||||||
 | 
						unsigned int   m_g8_event;
 | 
				
			||||||
 | 
						int            m_g8_label_index; //!< negative if not received
 | 
				
			||||||
 | 
						int            m_g8_content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Static tables
 | 
						// Static tables
 | 
				
			||||||
	static const unsigned int offset_pos[5];
 | 
						static const unsigned int offset_pos[5];
 | 
				
			||||||
	static const unsigned int offset_word[5];
 | 
						static const unsigned int offset_word[5];
 | 
				
			||||||
@ -77,6 +111,7 @@ public:
 | 
				
			|||||||
	static const std::string pi_country_codes[15][5];
 | 
						static const std::string pi_country_codes[15][5];
 | 
				
			||||||
	static const std::string coverage_area_codes[16];
 | 
						static const std::string coverage_area_codes[16];
 | 
				
			||||||
	static const std::string rds_group_acronyms[16];
 | 
						static const std::string rds_group_acronyms[16];
 | 
				
			||||||
 | 
						static const std::string rds_group_acronym_tags[16];
 | 
				
			||||||
	static const std::string language_codes[44];
 | 
						static const std::string language_codes[44];
 | 
				
			||||||
	static const std::string tmc_duration[8][2];
 | 
						static const std::string tmc_duration[8][2];
 | 
				
			||||||
	static const int optional_content_lengths[16];
 | 
						static const int optional_content_lengths[16];
 | 
				
			||||||
@ -104,7 +139,6 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	unsigned char  pi_country_identification;
 | 
						unsigned char  pi_country_identification;
 | 
				
			||||||
	unsigned char  pi_program_reference_number;
 | 
						unsigned char  pi_program_reference_number;
 | 
				
			||||||
	char           radiotext[64+1];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool           radiotext_AB_flag;
 | 
						bool           radiotext_AB_flag;
 | 
				
			||||||
	bool           debug;
 | 
						bool           debug;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user