kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			Add support for choosing metric or imperial units as per #829
							rodzic
							
								
									cb657c72a1
								
							
						
					
					
						commit
						ab0cda90b6
					
				|  | @ -363,7 +363,11 @@ bool APRSGUI::handleMessage(const Message& message) | |||
|                             else | ||||
|                             { | ||||
|                                 swgMapItem->setImage(new QString(QString("qrc:///%1").arg(aprs->m_symbolImage))); | ||||
|                                 swgMapItem->setText(new QString(aprs->toText())); | ||||
|                                 swgMapItem->setText(new QString(aprs->toText(true, false, '\n', | ||||
|                                                                         m_settings.m_altitudeUnits == APRSSettings::METRES, | ||||
|                                                                         (int)m_settings.m_speedUnits, | ||||
|                                                                         m_settings.m_temperatureUnits == APRSSettings::CELSIUS, | ||||
|                                                                         m_settings.m_rainfallUnits == APRSSettings::MILLIMETRE))); | ||||
|                             } | ||||
|                             swgMapItem->setImageMinZoom(11); | ||||
| 
 | ||||
|  | @ -609,6 +613,7 @@ void APRSGUI::displaySettings() | |||
|     ui->igate->setChecked(m_settings.m_igateEnabled); | ||||
|     ui->stationFilter->setCurrentIndex((int)m_settings.m_stationFilter); | ||||
|     ui->filterAddressee->setText(m_settings.m_filterAddressee); | ||||
|     setUnits(); | ||||
| 
 | ||||
|     // Order and size columns
 | ||||
|     displayTableSettings(ui->packetsTable, packetsTableMenu, m_settings.m_packetsTableColumnSizes, m_settings.m_packetsTableColumnIndexes, APRS_PACKETS_TABLE_COLUMNS); | ||||
|  | @ -693,11 +698,11 @@ void APRSGUI::updateSummary(APRSStation *station) | |||
|     ui->status->setText(station->m_latestStatus); | ||||
|     ui->comment->setText(station->m_latestComment); | ||||
|     ui->position->setText(station->m_latestPosition); | ||||
|     ui->altitude->setText(station->m_latestAltitude); | ||||
|     ui->altitude->setText(convertAltitude(station->m_latestAltitude)); | ||||
|     ui->course->setText(station->m_latestCourse); | ||||
|     ui->speed->setText(station->m_latestSpeed); | ||||
|     ui->speed->setText(convertSpeed(station->m_latestSpeed)); | ||||
|     ui->txPower->setText(station->m_powerWatts); | ||||
|     ui->antennaHeight->setText(station->m_antennaHeightFt); | ||||
|     ui->antennaHeight->setText(convertAltitude(station->m_antennaHeightFt)); | ||||
|     ui->antennaGain->setText(station->m_antennaGainDB); | ||||
|     ui->antennaDirectivity->setText(station->m_antennaDirectivity); | ||||
|     ui->radioRange->setText(station->m_radioRange); | ||||
|  | @ -779,17 +784,17 @@ void APRSGUI::addPacketToGUI(APRSStation *station, APRSPacket *aprs) | |||
|         if (aprs->m_hasGust) | ||||
|             gustsItem->setData(Qt::DisplayRole, aprs->m_gust); | ||||
|         if (aprs->m_hasTemp) | ||||
|             temperatureItem->setData(Qt::DisplayRole, aprs->m_temp); | ||||
|             temperatureItem->setData(Qt::DisplayRole, convertTemperature(aprs->m_temp)); | ||||
|         if (aprs->m_hasHumidity) | ||||
|             humidityItem->setData(Qt::DisplayRole, aprs->m_humidity); | ||||
|         if (aprs->m_hasBarometricPressure) | ||||
|             pressureItem->setData(Qt::DisplayRole, aprs->m_barometricPressure/10.0f); | ||||
|         if (aprs->m_hasRainLastHr) | ||||
|             rainLastHourItem->setData(Qt::DisplayRole, aprs->m_rainLastHr); | ||||
|             rainLastHourItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainLastHr)); | ||||
|         if (aprs->m_hasRainLast24Hrs) | ||||
|             rainLast24HoursItem->setData(Qt::DisplayRole, aprs->m_rainLast24Hrs); | ||||
|             rainLast24HoursItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainLast24Hrs)); | ||||
|         if (aprs->m_hasRainSinceMidnight) | ||||
|             rainSinceMidnightItem->setData(Qt::DisplayRole, aprs->m_rainSinceMidnight); | ||||
|             rainSinceMidnightItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainSinceMidnight)); | ||||
|         if (aprs->m_hasLuminsoity) | ||||
|             luminosityItem->setData(Qt::DisplayRole, aprs->m_luminosity); | ||||
|         if (aprs->m_hasSnowfallLast24Hrs) | ||||
|  | @ -939,11 +944,11 @@ void APRSGUI::addPacketToGUI(APRSStation *station, APRSPacket *aprs) | |||
|             longitudeItem->setData(Qt::DisplayRole, aprs->m_longitude); | ||||
|         } | ||||
|         if (aprs->m_hasAltitude) | ||||
|             altitudeItem->setData(Qt::DisplayRole, aprs->m_altitudeFt); | ||||
|             altitudeItem->setData(Qt::DisplayRole, convertAltitude(aprs->m_altitudeFt)); | ||||
|         if (aprs->m_hasCourseAndSpeed) | ||||
|         { | ||||
|             courseItem->setData(Qt::DisplayRole, aprs->m_course); | ||||
|             speedItem->setData(Qt::DisplayRole, aprs->m_speed); | ||||
|             speedItem->setData(Qt::DisplayRole, convertSpeed(aprs->m_speed)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -1155,17 +1160,17 @@ void APRSGUI::plotWeather() | |||
|                 else if (plotSelectIdx == 2 && aprs->m_hasGust) | ||||
|                     addToSeries(series, dt, aprs->m_gust, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 3 && aprs->m_hasTemp) | ||||
|                     addToSeries(series, dt, aprs->m_temp, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertTemperature(aprs->m_temp), minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 4 && aprs->m_hasHumidity) | ||||
|                     addToSeries(series, dt, aprs->m_humidity, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 5 && aprs->m_hasBarometricPressure) | ||||
|                     addToSeries(series, dt, aprs->m_barometricPressure/10.0, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 6 && aprs->m_hasRainLastHr) | ||||
|                     addToSeries(series, dt, aprs->m_rainLastHr, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertRainfall(aprs->m_rainLastHr), minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 7 && aprs->m_hasRainLast24Hrs) | ||||
|                     addToSeries(series, dt, aprs->m_rainLast24Hrs, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertRainfall(aprs->m_rainLast24Hrs), minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 8 && aprs->m_hasRainSinceMidnight) | ||||
|                     addToSeries(series, dt, aprs->m_rainSinceMidnight, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertRainfall(aprs->m_rainSinceMidnight), minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 9 && aprs->m_hasLuminsoity) | ||||
|                     addToSeries(series, dt, aprs->m_luminosity, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 10 && aprs->m_hasSnowfallLast24Hrs) | ||||
|  | @ -1383,11 +1388,11 @@ void APRSGUI::plotMotion() | |||
|                 else if (plotSelectIdx == 1 && aprs->m_hasPosition) | ||||
|                     addToSeries(series, dt, aprs->m_longitude, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 2 && aprs->m_hasAltitude) | ||||
|                     addToSeries(series, dt, aprs->m_altitudeFt, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertAltitude(aprs->m_altitudeFt), minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 3 && aprs->m_hasCourseAndSpeed) | ||||
|                     addToSeries(series, dt, aprs->m_course, minValue, maxValue); | ||||
|                 else if (plotSelectIdx == 4 && aprs->m_hasCourseAndSpeed) | ||||
|                     addToSeries(series, dt, aprs->m_speed, minValue, maxValue); | ||||
|                     addToSeries(series, dt, convertSpeed(aprs->m_speed), minValue, maxValue); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | @ -1606,8 +1611,8 @@ void APRSGUI::resizeTable() | |||
|     ui->motionTable->setItem(row, MOTION_COL_LATITUDE, new QTableWidgetItem("Latitude")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_LONGITUDE, new QTableWidgetItem("Longitude")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_ALTITUDE, new QTableWidgetItem("Message No")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_ALTITUDE, new QTableWidgetItem("Course")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_ALTITUDE, new QTableWidgetItem("Speed")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_COURSE, new QTableWidgetItem("Course")); | ||||
|     ui->motionTable->setItem(row, MOTION_COL_SPEED, new QTableWidgetItem("Speed")); | ||||
|     ui->motionTable->resizeColumnsToContents(); | ||||
|     ui->motionTable->removeRow(row); | ||||
| 
 | ||||
|  | @ -1905,17 +1910,79 @@ QAction *APRSGUI::motionTable_createCheckableItem(QString &text, int idx, bool c | |||
|     return action; | ||||
| } | ||||
| 
 | ||||
| void APRSGUI::setUnits() | ||||
| { | ||||
|     ui->altitudeUnitsLabel->setText(APRSSettings::m_altitudeUnitNames[m_settings.m_altitudeUnits]); | ||||
|     ui->antennaHeightUnitsLabel->setText(APRSSettings::m_altitudeUnitNames[m_settings.m_altitudeUnits]); | ||||
|     ui->speedUnitsLabel->setText(APRSSettings::m_speedUnitNames[m_settings.m_speedUnits]); | ||||
| 
 | ||||
|     ui->weatherTable->horizontalHeaderItem(WEATHER_COL_TEMPERATURE)->setText(QString("Temp (%1)").arg(APRSSettings::m_temperatureUnitNames[m_settings.m_temperatureUnits])); | ||||
| 
 | ||||
|     // Display data using new units
 | ||||
|     int idx = ui->stationSelect->currentIndex(); | ||||
|     if (idx >= 0) | ||||
|         on_stationSelect_currentIndexChanged(idx); | ||||
| } | ||||
| 
 | ||||
| QString APRSGUI::convertAltitude(const QString& altitude) | ||||
| { | ||||
|     if ((m_settings.m_altitudeUnits == APRSSettings::FEET) || altitude.isEmpty()) | ||||
|         return altitude; | ||||
|     else | ||||
|         return QString::number((int)std::round(Units::feetToMetres(altitude.toFloat()))); | ||||
| } | ||||
| 
 | ||||
| float APRSGUI::convertAltitude(float altitude) | ||||
| { | ||||
|     if (m_settings.m_altitudeUnits == APRSSettings::FEET) | ||||
|         return altitude; | ||||
|     else | ||||
|         return std::round(Units::feetToMetres(altitude)); | ||||
| } | ||||
| 
 | ||||
| QString APRSGUI::convertSpeed(const QString& speed) | ||||
| { | ||||
|     if ((m_settings.m_speedUnits == APRSSettings::KNOTS) || speed.isEmpty()) | ||||
|         return speed; | ||||
|     else if (m_settings.m_speedUnits == APRSSettings::MPH) | ||||
|         return QString::number(Units::knotsToIntegerMPH(speed.toFloat())); | ||||
|     else | ||||
|         return QString::number(Units::knotsToIntegerKPH(speed.toFloat())); | ||||
| } | ||||
| 
 | ||||
| int APRSGUI::convertSpeed(int speed) | ||||
| { | ||||
|     if (m_settings.m_speedUnits == APRSSettings::KNOTS) | ||||
|         return speed; | ||||
|     else if (m_settings.m_speedUnits == APRSSettings::MPH) | ||||
|         return Units::knotsToIntegerMPH(speed); | ||||
|     else | ||||
|         return Units::knotsToIntegerKPH(speed); | ||||
| } | ||||
| 
 | ||||
| int APRSGUI::convertTemperature(int temperature) | ||||
| { | ||||
|     if (m_settings.m_temperatureUnits == APRSSettings::FAHRENHEIT) | ||||
|         return temperature; | ||||
|     else | ||||
|         return (int)std::round(Units::fahrenheitToCelsius(temperature)); | ||||
| } | ||||
| 
 | ||||
| int APRSGUI::convertRainfall(int rainfall) | ||||
| { | ||||
|     if (m_settings.m_rainfallUnits == APRSSettings::HUNDREDTHS_OF_AN_INCH) | ||||
|         return rainfall; | ||||
|     else | ||||
|         return (int)std::round(Units::inchesToMilimetres(rainfall/100.0f)); | ||||
| } | ||||
| 
 | ||||
| // Show settings dialog
 | ||||
| void APRSGUI::on_displaySettings_clicked() | ||||
| { | ||||
|     APRSSettingsDialog dialog(m_settings.m_igateServer, m_settings.m_igateCallsign, | ||||
|                                 m_settings.m_igatePasscode, m_settings.m_igateFilter); | ||||
|     APRSSettingsDialog dialog(&m_settings); | ||||
|     if (dialog.exec() == QDialog::Accepted) | ||||
|     { | ||||
|         m_settings.m_igateServer = dialog.m_igateServer; | ||||
|         m_settings.m_igateCallsign = dialog.m_igateCallsign; | ||||
|         m_settings.m_igatePasscode = dialog.m_igatePasscode; | ||||
|         m_settings.m_igateFilter = dialog.m_igateFilter; | ||||
|         setUnits(); | ||||
|         applySettings(); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -169,6 +169,13 @@ private: | |||
| 
 | ||||
|     void updateSummary(APRSStation *station); | ||||
|     void addPacketToGUI(APRSStation *station, APRSPacket *aprs); | ||||
|     void setUnits(); | ||||
|     QString convertAltitude(const QString& altitude); | ||||
|     float convertAltitude(float altitude); | ||||
|     QString convertSpeed(const QString& speed); | ||||
|     int convertSpeed(int speed); | ||||
|     int convertTemperature(int temperature); | ||||
|     int convertRainfall(int rainfall); | ||||
| 
 | ||||
| private slots: | ||||
|     void onMenuDialogCalled(const QPoint &p); | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ | |||
| const PluginDescriptor APRSPlugin::m_pluginDescriptor = { | ||||
|     APRS::m_featureId, | ||||
|     QStringLiteral("APRS"), | ||||
|     QStringLiteral("6.5.0"), | ||||
|     QStringLiteral("6.7.1"), | ||||
|     QStringLiteral("(c) Jon Beniston, M7RCE"), | ||||
|     QStringLiteral("https://github.com/f4exb/sdrangel"), | ||||
|     true, | ||||
|  |  | |||
|  | @ -33,6 +33,23 @@ const QStringList APRSSettings::m_pipeURIs = { | |||
|     QStringLiteral("sdrangel.channel.chirpchatdemod") | ||||
| }; | ||||
| 
 | ||||
| const QStringList APRSSettings::m_altitudeUnitNames = { | ||||
|     QStringLiteral("Feet"), | ||||
|     QStringLiteral("Metres") | ||||
| }; | ||||
| 
 | ||||
| const QStringList APRSSettings::m_speedUnitNames = { | ||||
|     QStringLiteral("Knots"), | ||||
|     QStringLiteral("MPH"), | ||||
|     QStringLiteral("KPH") | ||||
| }; | ||||
| 
 | ||||
| const QStringList APRSSettings::m_temperatureUnitNames = { | ||||
|     QStringLiteral("F"), | ||||
|     QStringLiteral("C") | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| APRSSettings::APRSSettings() | ||||
| { | ||||
|     resetToDefaults(); | ||||
|  | @ -48,6 +65,10 @@ void APRSSettings::resetToDefaults() | |||
|     m_igateEnabled = false; | ||||
|     m_stationFilter = ALL; | ||||
|     m_filterAddressee = ""; | ||||
|     m_altitudeUnits = FEET; | ||||
|     m_speedUnits = KNOTS; | ||||
|     m_temperatureUnits = FAHRENHEIT; | ||||
|     m_rainfallUnits = HUNDREDTHS_OF_AN_INCH; | ||||
|     m_title = "APRS"; | ||||
|     m_rgbColor = QColor(225, 25, 99).rgb(); | ||||
|     m_useReverseAPI = false; | ||||
|  | @ -106,6 +127,10 @@ QByteArray APRSSettings::serialize() const | |||
|     s.writeU32(13, m_reverseAPIPort); | ||||
|     s.writeU32(14, m_reverseAPIFeatureSetIndex); | ||||
|     s.writeU32(15, m_reverseAPIFeatureIndex); | ||||
|     s.writeS32(16, (int)m_altitudeUnits); | ||||
|     s.writeS32(17, (int)m_speedUnits); | ||||
|     s.writeS32(18, (int)m_temperatureUnits); | ||||
|     s.writeS32(19, (int)m_rainfallUnits); | ||||
| 
 | ||||
|     for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; i++) | ||||
|         s.writeS32(100 + i, m_packetsTableColumnIndexes[i]); | ||||
|  | @ -177,6 +202,11 @@ bool APRSSettings::deserialize(const QByteArray& data) | |||
|         d.readU32(15, &utmp, 0); | ||||
|         m_reverseAPIFeatureIndex = utmp > 99 ? 99 : utmp; | ||||
| 
 | ||||
|         d.readS32(16, (int *)&m_altitudeUnits, (int)FEET); | ||||
|         d.readS32(17, (int *)&m_speedUnits, (int)KNOTS); | ||||
|         d.readS32(18, (int *)&m_temperatureUnits, (int)FAHRENHEIT); | ||||
|         d.readS32(19, (int *)&m_rainfallUnits, (int)HUNDREDTHS_OF_AN_INCH); | ||||
| 
 | ||||
|         for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; i++) | ||||
|             d.readS32(100 + i, &m_packetsTableColumnIndexes[i], i); | ||||
|         for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; i++) | ||||
|  |  | |||
|  | @ -46,6 +46,18 @@ struct APRSSettings | |||
|         ALL, STATIONS, OBJECTS, WEATHER, TELEMETRY, COURSE_AND_SPEED | ||||
|     } m_stationFilter; | ||||
|     QString m_filterAddressee; | ||||
|     enum AltitudeUnits { | ||||
|         FEET, METRES | ||||
|     } m_altitudeUnits; | ||||
|     enum SpeedUnits { | ||||
|         KNOTS, MPH, KPH | ||||
|     } m_speedUnits; | ||||
|     enum TemperatureUnits { | ||||
|         FAHRENHEIT, CELSIUS | ||||
|     } m_temperatureUnits; | ||||
|     enum RainfallUnits { | ||||
|         HUNDREDTHS_OF_AN_INCH, MILLIMETRE | ||||
|     } m_rainfallUnits; | ||||
|     QString m_title; | ||||
|     quint32 m_rgbColor; | ||||
|     bool m_useReverseAPI; | ||||
|  | @ -74,6 +86,10 @@ struct APRSSettings | |||
| 
 | ||||
|     static const QStringList m_pipeTypes; | ||||
|     static const QStringList m_pipeURIs; | ||||
| 
 | ||||
|     static const QStringList m_altitudeUnitNames; | ||||
|     static const QStringList m_speedUnitNames; | ||||
|     static const QStringList m_temperatureUnitNames; | ||||
| }; | ||||
| 
 | ||||
| #endif // INCLUDE_FEATURE_APRSSETTINGS_H_
 | ||||
|  |  | |||
|  | @ -17,15 +17,20 @@ | |||
| 
 | ||||
| #include "aprssettingsdialog.h" | ||||
| 
 | ||||
| APRSSettingsDialog::APRSSettingsDialog(QString igateServer, QString igateCallsign, QString igatePasscode, QString igateFilter, QWidget* parent) : | ||||
| APRSSettingsDialog::APRSSettingsDialog(APRSSettings* settings, QWidget* parent) : | ||||
|     QDialog(parent), | ||||
|     ui(new Ui::APRSSettingsDialog) | ||||
|     ui(new Ui::APRSSettingsDialog), | ||||
|     m_settings(settings) | ||||
| { | ||||
|     ui->setupUi(this); | ||||
|     ui->igateServer->setCurrentText(igateServer); | ||||
|     ui->igateCallsign->setText(igateCallsign); | ||||
|     ui->igatePasscode->setText(igatePasscode); | ||||
|     ui->igateFilter->setText(igateFilter); | ||||
|     ui->igateServer->setCurrentText(m_settings->m_igateServer); | ||||
|     ui->igateCallsign->setText(m_settings->m_igateCallsign); | ||||
|     ui->igatePasscode->setText(m_settings->m_igatePasscode); | ||||
|     ui->igateFilter->setText(m_settings->m_igateFilter); | ||||
|     ui->altitudeUnits->setCurrentIndex((int)m_settings->m_altitudeUnits); | ||||
|     ui->speedUnits->setCurrentIndex((int)m_settings->m_speedUnits); | ||||
|     ui->temperatureUnits->setCurrentIndex((int)m_settings->m_temperatureUnits); | ||||
|     ui->rainfallUnits->setCurrentIndex((int)m_settings->m_rainfallUnits); | ||||
| } | ||||
| 
 | ||||
| APRSSettingsDialog::~APRSSettingsDialog() | ||||
|  | @ -35,9 +40,13 @@ APRSSettingsDialog::~APRSSettingsDialog() | |||
| 
 | ||||
| void APRSSettingsDialog::accept() | ||||
| { | ||||
|     m_igateServer = ui->igateServer->currentText(); | ||||
|     m_igateCallsign = ui->igateCallsign->text(); | ||||
|     m_igatePasscode = ui->igatePasscode->text(); | ||||
|     m_igateFilter = ui->igateFilter->text(); | ||||
|     m_settings->m_igateServer = ui->igateServer->currentText(); | ||||
|     m_settings->m_igateCallsign = ui->igateCallsign->text(); | ||||
|     m_settings->m_igatePasscode = ui->igatePasscode->text(); | ||||
|     m_settings->m_igateFilter = ui->igateFilter->text(); | ||||
|     m_settings->m_altitudeUnits = (APRSSettings::AltitudeUnits)ui->altitudeUnits->currentIndex(); | ||||
|     m_settings->m_speedUnits = (APRSSettings::SpeedUnits)ui->speedUnits->currentIndex(); | ||||
|     m_settings->m_temperatureUnits = (APRSSettings::TemperatureUnits)ui->temperatureUnits->currentIndex(); | ||||
|     m_settings->m_rainfallUnits = (APRSSettings::RainfallUnits)ui->rainfallUnits->currentIndex(); | ||||
|     QDialog::accept(); | ||||
| } | ||||
|  |  | |||
|  | @ -25,19 +25,15 @@ class APRSSettingsDialog : public QDialog { | |||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit APRSSettingsDialog(QString igateServer, QString igateCallsign, QString igatePasscode, QString igateFilter, QWidget* parent = 0); | ||||
|     explicit APRSSettingsDialog(APRSSettings* settings, QWidget* parent = 0); | ||||
|     ~APRSSettingsDialog(); | ||||
| 
 | ||||
|     QString m_igateServer; | ||||
|     QString m_igateCallsign; | ||||
|     QString m_igatePasscode; | ||||
|     QString m_igateFilter; | ||||
| 
 | ||||
| private slots: | ||||
|     void accept(); | ||||
| 
 | ||||
| private: | ||||
|     Ui::APRSSettingsDialog* ui; | ||||
|     APRSSettings *m_settings; | ||||
| }; | ||||
| 
 | ||||
| #endif // INCLUDE_APRSSETTINGSDIALOG_H
 | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>351</width> | ||||
|     <height>179</height> | ||||
|     <height>275</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|  | @ -23,6 +23,64 @@ | |||
|    <item> | ||||
|     <widget class="QGroupBox" name="groupBox"> | ||||
|      <layout class="QGridLayout" name="gridLayout"> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="igateCallsignLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Callsign</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="0"> | ||||
|        <widget class="QLabel" name="altitudeUnitsLabel"> | ||||
|         <property name="text"> | ||||
|          <string>Altitude Units</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="1"> | ||||
|        <widget class="QComboBox" name="altitudeUnits"> | ||||
|         <property name="toolTip"> | ||||
|          <string>Units used for displaying altitudes</string> | ||||
|         </property> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Feet</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Metres</string> | ||||
|          </property> | ||||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="5" column="0"> | ||||
|        <widget class="QLabel" name="speedUnitsLabel"> | ||||
|         <property name="text"> | ||||
|          <string>Speed Units</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="8" column="1"> | ||||
|        <spacer name="verticalSpacer"> | ||||
|         <property name="orientation"> | ||||
|          <enum>Qt::Vertical</enum> | ||||
|         </property> | ||||
|         <property name="sizeHint" stdset="0"> | ||||
|          <size> | ||||
|           <width>20</width> | ||||
|           <height>40</height> | ||||
|          </size> | ||||
|         </property> | ||||
|        </spacer> | ||||
|       </item> | ||||
|       <item row="3" column="0"> | ||||
|        <widget class="QLabel" name="igateFilterLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Filter</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QComboBox" name="igateServer"> | ||||
|         <property name="toolTip"> | ||||
|  | @ -58,40 +116,6 @@ | |||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="igateSeverLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Server</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="0"> | ||||
|        <widget class="QLabel" name="igatePasscodeLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Passcode</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="1"> | ||||
|        <spacer name="verticalSpacer"> | ||||
|         <property name="orientation"> | ||||
|          <enum>Qt::Vertical</enum> | ||||
|         </property> | ||||
|         <property name="sizeHint" stdset="0"> | ||||
|          <size> | ||||
|           <width>20</width> | ||||
|           <height>40</height> | ||||
|          </size> | ||||
|         </property> | ||||
|        </spacer> | ||||
|       </item> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="igateCallsignLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Callsign</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="1"> | ||||
|        <widget class="QLineEdit" name="igateFilter"> | ||||
|         <property name="toolTip"> | ||||
|  | @ -99,10 +123,10 @@ | |||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="0"> | ||||
|        <widget class="QLabel" name="igateFilterLabel"> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="igateSeverLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Filter</string> | ||||
|          <string>IGate Server</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|  | @ -120,6 +144,83 @@ | |||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="5" column="1"> | ||||
|        <widget class="QComboBox" name="speedUnits"> | ||||
|         <property name="toolTip"> | ||||
|          <string>Units used for displaying speeds</string> | ||||
|         </property> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Knots</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>MPH</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>KPH</string> | ||||
|          </property> | ||||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="0"> | ||||
|        <widget class="QLabel" name="igatePasscodeLabel"> | ||||
|         <property name="text"> | ||||
|          <string>IGate Passcode</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="1"> | ||||
|        <widget class="QComboBox" name="temperatureUnits"> | ||||
|         <property name="toolTip"> | ||||
|          <string>Units used for displaying temperatures</string> | ||||
|         </property> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Fahrenheit</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Celsius</string> | ||||
|          </property> | ||||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="0"> | ||||
|        <widget class="QLabel" name="temperatureUnitsLabel"> | ||||
|         <property name="text"> | ||||
|          <string>Temperature Units</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="7" column="0"> | ||||
|        <widget class="QLabel" name="rainfallUnitsLabel"> | ||||
|         <property name="text"> | ||||
|          <string>Rainfall Units</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="7" column="1"> | ||||
|        <widget class="QComboBox" name="rainfallUnits"> | ||||
|         <property name="toolTip"> | ||||
|          <string>Units used for displaying rainfall</string> | ||||
|         </property> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Hundredths of an inch</string> | ||||
|          </property> | ||||
|         </item> | ||||
|         <item> | ||||
|          <property name="text"> | ||||
|           <string>Millimetres</string> | ||||
|          </property> | ||||
|         </item> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|  |  | |||
|  | @ -28,6 +28,10 @@ Pressing this button shows the APRS Settings Dialog. This dialog allows you to e | |||
| * A serverside filter, that specifies which packets should be forwarded from the internet to SDRangel. See http://www.aprs-is.net/javAPRSFilter.aspx | ||||
| m/50 will send you packets within 50 km of the last known position of the station corresponding to the callsign used to log in with. | ||||
| If you do not have a corresponding station, you can specify a location by passing a latitude and longitude. E.g: r/lat/lon/50 | ||||
| * The units in which altitudes are displyed (Feet or metres). | ||||
| * The units in which object speeds are displayed (Knots, MPH or KPH). | ||||
| * The units in which temperature is displayed (Fahrenheit or Celsius). | ||||
| * The units in which rainfall is displayed (Hundredths of an inch or millimetres). | ||||
| 
 | ||||
| <h2>Map</h2> | ||||
| 
 | ||||
|  |  | |||
|  | @ -322,7 +322,8 @@ struct SDRBASE_API APRSPacket { | |||
|         return bytes; | ||||
|     } | ||||
| 
 | ||||
|     QString toText(bool includeFrom=true, bool includePosition=false, char separator='\n') | ||||
|     QString toText(bool includeFrom=true, bool includePosition=false, char separator='\n', | ||||
|                         bool altitudeMetres=false, int speedUnits=0, bool tempCelsius=false, bool rainfallMM=false) | ||||
|     { | ||||
|         QStringList text; | ||||
| 
 | ||||
|  | @ -351,9 +352,21 @@ struct SDRBASE_API APRSPacket { | |||
|         if (includePosition && m_hasPosition) | ||||
|             text.append(QString("Latitude: %1 Longitude: %2").arg(m_latitude).arg(m_longitude)); | ||||
|         if (m_hasAltitude) | ||||
|             text.append(QString("Altitude: %1 ft").arg(m_altitudeFt)); | ||||
|         { | ||||
|             if (altitudeMetres) | ||||
|                 text.append(QString("Altitude: %1 m").arg((int)std::round(Units::feetToMetres(m_altitudeFt)))); | ||||
|             else | ||||
|                 text.append(QString("Altitude: %1 ft").arg(m_altitudeFt)); | ||||
|         } | ||||
|         if (m_hasCourseAndSpeed) | ||||
|             text.append(QString("Course: %1%3 Speed: %2 knts").arg(m_course).arg(m_speed).arg(QChar(0xb0))); | ||||
|         { | ||||
|             if (speedUnits == 0) | ||||
|                 text.append(QString("Course: %1%3 Speed: %2 knts").arg(m_course).arg(m_speed).arg(QChar(0xb0))); | ||||
|             else if (speedUnits == 1) | ||||
|                 text.append(QString("Course: %1%3 Speed: %2 mph").arg(m_course).arg(Units::knotsToIntegerMPH(m_speed)).arg(QChar(0xb0))); | ||||
|             else | ||||
|                 text.append(QString("Course: %1%3 Speed: %2 kph").arg(m_course).arg(Units::knotsToIntegerKPH(m_speed)).arg(QChar(0xb0))); | ||||
|         } | ||||
| 
 | ||||
|         if (m_hasStationDetails) | ||||
|             text.append(QString("TX Power: %1 Watts Antenna Height: %2 m Gain: %3 dB Direction: %4").arg(m_powerWatts).arg(std::round(Units::feetToMetres(m_antennaHeightFt))).arg(m_antennaGainDB).arg(m_antennaDirectivity)); | ||||
|  | @ -379,7 +392,12 @@ struct SDRBASE_API APRSPacket { | |||
|             { | ||||
|                 air.append("Air"); | ||||
|                 if (m_hasTemp) | ||||
|                     air.append(QString("Temperature %1C").arg(Units::fahrenheitToCelsius(m_temp), 0, 'f', 1)); | ||||
|                 { | ||||
|                     if (tempCelsius) | ||||
|                         air.append(QString("Temperature %1C").arg(Units::fahrenheitToCelsius(m_temp), 0, 'f', 1)); | ||||
|                     else | ||||
|                         air.append(QString("Temperature %1F").arg(m_temp)); | ||||
|                 } | ||||
|                 if (m_hasHumidity) | ||||
|                     air.append(QString("Humidity %1%").arg(m_humidity)); | ||||
|                 if (m_hasBarometricPressure) | ||||
|  | @ -391,11 +409,26 @@ struct SDRBASE_API APRSPacket { | |||
|             { | ||||
|                 rain.append("Rain"); | ||||
|                 if (m_hasRainLastHr) | ||||
|                     rain.append(QString("%1 mm last hour").arg(std::round(Units::inchesToMilimetres(m_rainLastHr/100.0)))); | ||||
|                 { | ||||
|                     if (rainfallMM) | ||||
|                         rain.append(QString("%1 mm last hour").arg(std::round(Units::inchesToMilimetres(m_rainLastHr/100.0)))); | ||||
|                     else | ||||
|                         rain.append(QString("%1 1/100\" last hour").arg(m_rainLastHr)); | ||||
|                 } | ||||
|                 if (m_hasRainLast24Hrs) | ||||
|                     rain.append(QString("%1 mm last 24 hours").arg(std::round(Units::inchesToMilimetres(m_rainLast24Hrs/100.0)))); | ||||
|                 { | ||||
|                     if (rainfallMM) | ||||
|                         rain.append(QString("%1 mm last 24 hours").arg(std::round(Units::inchesToMilimetres(m_rainLast24Hrs/100.0)))); | ||||
|                     else | ||||
|                         rain.append(QString("%1 1/100\" last 24 hours").arg(m_rainLast24Hrs)); | ||||
|                 } | ||||
|                 if (m_hasRainSinceMidnight) | ||||
|                     rain.append(QString("%1 mm since midnight").arg(std::round(Units::inchesToMilimetres(m_rainSinceMidnight/100.0)))); | ||||
|                 { | ||||
|                     if (rainfallMM) | ||||
|                         rain.append(QString("%1 mm since midnight").arg(std::round(Units::inchesToMilimetres(m_rainSinceMidnight/100.0)))); | ||||
|                     else | ||||
|                         rain.append(QString("%1 1/100\" since midnight").arg(m_rainSinceMidnight)); | ||||
|                 } | ||||
|                 weather.append(rain.join(' ')); | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -61,6 +61,16 @@ public: | |||
|         return (int)std::round(knotsToKPH(knots)); | ||||
|     } | ||||
| 
 | ||||
|     static float knotsToMPH(float knots) | ||||
|     { | ||||
|         return knots * 1.15078f; | ||||
|     } | ||||
| 
 | ||||
|     static int knotsToIntegerMPH(float knots) | ||||
|     { | ||||
|         return (int)std::round(knotsToMPH(knots)); | ||||
|     } | ||||
| 
 | ||||
|     static float kmpsToKPH(float kps) | ||||
|     { | ||||
|         return kps * (60.0 * 60.0); | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Jon Beniston
						Jon Beniston