mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-19 01:05:35 -04:00
Add support for choosing metric or imperial units as per #829
This commit is contained in:
parent
cb657c72a1
commit
ab0cda90b6
@ -363,7 +363,11 @@ bool APRSGUI::handleMessage(const Message& message)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
swgMapItem->setImage(new QString(QString("qrc:///%1").arg(aprs->m_symbolImage)));
|
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);
|
swgMapItem->setImageMinZoom(11);
|
||||||
|
|
||||||
@ -609,6 +613,7 @@ void APRSGUI::displaySettings()
|
|||||||
ui->igate->setChecked(m_settings.m_igateEnabled);
|
ui->igate->setChecked(m_settings.m_igateEnabled);
|
||||||
ui->stationFilter->setCurrentIndex((int)m_settings.m_stationFilter);
|
ui->stationFilter->setCurrentIndex((int)m_settings.m_stationFilter);
|
||||||
ui->filterAddressee->setText(m_settings.m_filterAddressee);
|
ui->filterAddressee->setText(m_settings.m_filterAddressee);
|
||||||
|
setUnits();
|
||||||
|
|
||||||
// Order and size columns
|
// Order and size columns
|
||||||
displayTableSettings(ui->packetsTable, packetsTableMenu, m_settings.m_packetsTableColumnSizes, m_settings.m_packetsTableColumnIndexes, APRS_PACKETS_TABLE_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->status->setText(station->m_latestStatus);
|
||||||
ui->comment->setText(station->m_latestComment);
|
ui->comment->setText(station->m_latestComment);
|
||||||
ui->position->setText(station->m_latestPosition);
|
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->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->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->antennaGain->setText(station->m_antennaGainDB);
|
||||||
ui->antennaDirectivity->setText(station->m_antennaDirectivity);
|
ui->antennaDirectivity->setText(station->m_antennaDirectivity);
|
||||||
ui->radioRange->setText(station->m_radioRange);
|
ui->radioRange->setText(station->m_radioRange);
|
||||||
@ -779,17 +784,17 @@ void APRSGUI::addPacketToGUI(APRSStation *station, APRSPacket *aprs)
|
|||||||
if (aprs->m_hasGust)
|
if (aprs->m_hasGust)
|
||||||
gustsItem->setData(Qt::DisplayRole, aprs->m_gust);
|
gustsItem->setData(Qt::DisplayRole, aprs->m_gust);
|
||||||
if (aprs->m_hasTemp)
|
if (aprs->m_hasTemp)
|
||||||
temperatureItem->setData(Qt::DisplayRole, aprs->m_temp);
|
temperatureItem->setData(Qt::DisplayRole, convertTemperature(aprs->m_temp));
|
||||||
if (aprs->m_hasHumidity)
|
if (aprs->m_hasHumidity)
|
||||||
humidityItem->setData(Qt::DisplayRole, aprs->m_humidity);
|
humidityItem->setData(Qt::DisplayRole, aprs->m_humidity);
|
||||||
if (aprs->m_hasBarometricPressure)
|
if (aprs->m_hasBarometricPressure)
|
||||||
pressureItem->setData(Qt::DisplayRole, aprs->m_barometricPressure/10.0f);
|
pressureItem->setData(Qt::DisplayRole, aprs->m_barometricPressure/10.0f);
|
||||||
if (aprs->m_hasRainLastHr)
|
if (aprs->m_hasRainLastHr)
|
||||||
rainLastHourItem->setData(Qt::DisplayRole, aprs->m_rainLastHr);
|
rainLastHourItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainLastHr));
|
||||||
if (aprs->m_hasRainLast24Hrs)
|
if (aprs->m_hasRainLast24Hrs)
|
||||||
rainLast24HoursItem->setData(Qt::DisplayRole, aprs->m_rainLast24Hrs);
|
rainLast24HoursItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainLast24Hrs));
|
||||||
if (aprs->m_hasRainSinceMidnight)
|
if (aprs->m_hasRainSinceMidnight)
|
||||||
rainSinceMidnightItem->setData(Qt::DisplayRole, aprs->m_rainSinceMidnight);
|
rainSinceMidnightItem->setData(Qt::DisplayRole, convertRainfall(aprs->m_rainSinceMidnight));
|
||||||
if (aprs->m_hasLuminsoity)
|
if (aprs->m_hasLuminsoity)
|
||||||
luminosityItem->setData(Qt::DisplayRole, aprs->m_luminosity);
|
luminosityItem->setData(Qt::DisplayRole, aprs->m_luminosity);
|
||||||
if (aprs->m_hasSnowfallLast24Hrs)
|
if (aprs->m_hasSnowfallLast24Hrs)
|
||||||
@ -939,11 +944,11 @@ void APRSGUI::addPacketToGUI(APRSStation *station, APRSPacket *aprs)
|
|||||||
longitudeItem->setData(Qt::DisplayRole, aprs->m_longitude);
|
longitudeItem->setData(Qt::DisplayRole, aprs->m_longitude);
|
||||||
}
|
}
|
||||||
if (aprs->m_hasAltitude)
|
if (aprs->m_hasAltitude)
|
||||||
altitudeItem->setData(Qt::DisplayRole, aprs->m_altitudeFt);
|
altitudeItem->setData(Qt::DisplayRole, convertAltitude(aprs->m_altitudeFt));
|
||||||
if (aprs->m_hasCourseAndSpeed)
|
if (aprs->m_hasCourseAndSpeed)
|
||||||
{
|
{
|
||||||
courseItem->setData(Qt::DisplayRole, aprs->m_course);
|
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)
|
else if (plotSelectIdx == 2 && aprs->m_hasGust)
|
||||||
addToSeries(series, dt, aprs->m_gust, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_gust, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 3 && aprs->m_hasTemp)
|
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)
|
else if (plotSelectIdx == 4 && aprs->m_hasHumidity)
|
||||||
addToSeries(series, dt, aprs->m_humidity, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_humidity, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 5 && aprs->m_hasBarometricPressure)
|
else if (plotSelectIdx == 5 && aprs->m_hasBarometricPressure)
|
||||||
addToSeries(series, dt, aprs->m_barometricPressure/10.0, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_barometricPressure/10.0, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 6 && aprs->m_hasRainLastHr)
|
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)
|
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)
|
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)
|
else if (plotSelectIdx == 9 && aprs->m_hasLuminsoity)
|
||||||
addToSeries(series, dt, aprs->m_luminosity, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_luminosity, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 10 && aprs->m_hasSnowfallLast24Hrs)
|
else if (plotSelectIdx == 10 && aprs->m_hasSnowfallLast24Hrs)
|
||||||
@ -1383,11 +1388,11 @@ void APRSGUI::plotMotion()
|
|||||||
else if (plotSelectIdx == 1 && aprs->m_hasPosition)
|
else if (plotSelectIdx == 1 && aprs->m_hasPosition)
|
||||||
addToSeries(series, dt, aprs->m_longitude, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_longitude, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 2 && aprs->m_hasAltitude)
|
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)
|
else if (plotSelectIdx == 3 && aprs->m_hasCourseAndSpeed)
|
||||||
addToSeries(series, dt, aprs->m_course, minValue, maxValue);
|
addToSeries(series, dt, aprs->m_course, minValue, maxValue);
|
||||||
else if (plotSelectIdx == 4 && aprs->m_hasCourseAndSpeed)
|
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_LATITUDE, new QTableWidgetItem("Latitude"));
|
||||||
ui->motionTable->setItem(row, MOTION_COL_LONGITUDE, new QTableWidgetItem("Longitude"));
|
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("Message No"));
|
||||||
ui->motionTable->setItem(row, MOTION_COL_ALTITUDE, new QTableWidgetItem("Course"));
|
ui->motionTable->setItem(row, MOTION_COL_COURSE, new QTableWidgetItem("Course"));
|
||||||
ui->motionTable->setItem(row, MOTION_COL_ALTITUDE, new QTableWidgetItem("Speed"));
|
ui->motionTable->setItem(row, MOTION_COL_SPEED, new QTableWidgetItem("Speed"));
|
||||||
ui->motionTable->resizeColumnsToContents();
|
ui->motionTable->resizeColumnsToContents();
|
||||||
ui->motionTable->removeRow(row);
|
ui->motionTable->removeRow(row);
|
||||||
|
|
||||||
@ -1905,17 +1910,79 @@ QAction *APRSGUI::motionTable_createCheckableItem(QString &text, int idx, bool c
|
|||||||
return action;
|
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
|
// Show settings dialog
|
||||||
void APRSGUI::on_displaySettings_clicked()
|
void APRSGUI::on_displaySettings_clicked()
|
||||||
{
|
{
|
||||||
APRSSettingsDialog dialog(m_settings.m_igateServer, m_settings.m_igateCallsign,
|
APRSSettingsDialog dialog(&m_settings);
|
||||||
m_settings.m_igatePasscode, m_settings.m_igateFilter);
|
|
||||||
if (dialog.exec() == QDialog::Accepted)
|
if (dialog.exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
m_settings.m_igateServer = dialog.m_igateServer;
|
setUnits();
|
||||||
m_settings.m_igateCallsign = dialog.m_igateCallsign;
|
|
||||||
m_settings.m_igatePasscode = dialog.m_igatePasscode;
|
|
||||||
m_settings.m_igateFilter = dialog.m_igateFilter;
|
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,6 +169,13 @@ private:
|
|||||||
|
|
||||||
void updateSummary(APRSStation *station);
|
void updateSummary(APRSStation *station);
|
||||||
void addPacketToGUI(APRSStation *station, APRSPacket *aprs);
|
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:
|
private slots:
|
||||||
void onMenuDialogCalled(const QPoint &p);
|
void onMenuDialogCalled(const QPoint &p);
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
const PluginDescriptor APRSPlugin::m_pluginDescriptor = {
|
const PluginDescriptor APRSPlugin::m_pluginDescriptor = {
|
||||||
APRS::m_featureId,
|
APRS::m_featureId,
|
||||||
QStringLiteral("APRS"),
|
QStringLiteral("APRS"),
|
||||||
QStringLiteral("6.5.0"),
|
QStringLiteral("6.7.1"),
|
||||||
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
QStringLiteral("(c) Jon Beniston, M7RCE"),
|
||||||
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
QStringLiteral("https://github.com/f4exb/sdrangel"),
|
||||||
true,
|
true,
|
||||||
|
@ -33,6 +33,23 @@ const QStringList APRSSettings::m_pipeURIs = {
|
|||||||
QStringLiteral("sdrangel.channel.chirpchatdemod")
|
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()
|
APRSSettings::APRSSettings()
|
||||||
{
|
{
|
||||||
resetToDefaults();
|
resetToDefaults();
|
||||||
@ -48,6 +65,10 @@ void APRSSettings::resetToDefaults()
|
|||||||
m_igateEnabled = false;
|
m_igateEnabled = false;
|
||||||
m_stationFilter = ALL;
|
m_stationFilter = ALL;
|
||||||
m_filterAddressee = "";
|
m_filterAddressee = "";
|
||||||
|
m_altitudeUnits = FEET;
|
||||||
|
m_speedUnits = KNOTS;
|
||||||
|
m_temperatureUnits = FAHRENHEIT;
|
||||||
|
m_rainfallUnits = HUNDREDTHS_OF_AN_INCH;
|
||||||
m_title = "APRS";
|
m_title = "APRS";
|
||||||
m_rgbColor = QColor(225, 25, 99).rgb();
|
m_rgbColor = QColor(225, 25, 99).rgb();
|
||||||
m_useReverseAPI = false;
|
m_useReverseAPI = false;
|
||||||
@ -106,6 +127,10 @@ QByteArray APRSSettings::serialize() const
|
|||||||
s.writeU32(13, m_reverseAPIPort);
|
s.writeU32(13, m_reverseAPIPort);
|
||||||
s.writeU32(14, m_reverseAPIFeatureSetIndex);
|
s.writeU32(14, m_reverseAPIFeatureSetIndex);
|
||||||
s.writeU32(15, m_reverseAPIFeatureIndex);
|
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++)
|
for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; i++)
|
||||||
s.writeS32(100 + i, m_packetsTableColumnIndexes[i]);
|
s.writeS32(100 + i, m_packetsTableColumnIndexes[i]);
|
||||||
@ -177,6 +202,11 @@ bool APRSSettings::deserialize(const QByteArray& data)
|
|||||||
d.readU32(15, &utmp, 0);
|
d.readU32(15, &utmp, 0);
|
||||||
m_reverseAPIFeatureIndex = utmp > 99 ? 99 : utmp;
|
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++)
|
for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; i++)
|
||||||
d.readS32(100 + i, &m_packetsTableColumnIndexes[i], i);
|
d.readS32(100 + i, &m_packetsTableColumnIndexes[i], i);
|
||||||
for (int i = 0; i < APRS_PACKETS_TABLE_COLUMNS; 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
|
ALL, STATIONS, OBJECTS, WEATHER, TELEMETRY, COURSE_AND_SPEED
|
||||||
} m_stationFilter;
|
} m_stationFilter;
|
||||||
QString m_filterAddressee;
|
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;
|
QString m_title;
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
bool m_useReverseAPI;
|
bool m_useReverseAPI;
|
||||||
@ -74,6 +86,10 @@ struct APRSSettings
|
|||||||
|
|
||||||
static const QStringList m_pipeTypes;
|
static const QStringList m_pipeTypes;
|
||||||
static const QStringList m_pipeURIs;
|
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_
|
#endif // INCLUDE_FEATURE_APRSSETTINGS_H_
|
||||||
|
@ -17,15 +17,20 @@
|
|||||||
|
|
||||||
#include "aprssettingsdialog.h"
|
#include "aprssettingsdialog.h"
|
||||||
|
|
||||||
APRSSettingsDialog::APRSSettingsDialog(QString igateServer, QString igateCallsign, QString igatePasscode, QString igateFilter, QWidget* parent) :
|
APRSSettingsDialog::APRSSettingsDialog(APRSSettings* settings, QWidget* parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
ui(new Ui::APRSSettingsDialog)
|
ui(new Ui::APRSSettingsDialog),
|
||||||
|
m_settings(settings)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->igateServer->setCurrentText(igateServer);
|
ui->igateServer->setCurrentText(m_settings->m_igateServer);
|
||||||
ui->igateCallsign->setText(igateCallsign);
|
ui->igateCallsign->setText(m_settings->m_igateCallsign);
|
||||||
ui->igatePasscode->setText(igatePasscode);
|
ui->igatePasscode->setText(m_settings->m_igatePasscode);
|
||||||
ui->igateFilter->setText(igateFilter);
|
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()
|
APRSSettingsDialog::~APRSSettingsDialog()
|
||||||
@ -35,9 +40,13 @@ APRSSettingsDialog::~APRSSettingsDialog()
|
|||||||
|
|
||||||
void APRSSettingsDialog::accept()
|
void APRSSettingsDialog::accept()
|
||||||
{
|
{
|
||||||
m_igateServer = ui->igateServer->currentText();
|
m_settings->m_igateServer = ui->igateServer->currentText();
|
||||||
m_igateCallsign = ui->igateCallsign->text();
|
m_settings->m_igateCallsign = ui->igateCallsign->text();
|
||||||
m_igatePasscode = ui->igatePasscode->text();
|
m_settings->m_igatePasscode = ui->igatePasscode->text();
|
||||||
m_igateFilter = ui->igateFilter->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();
|
QDialog::accept();
|
||||||
}
|
}
|
||||||
|
@ -25,19 +25,15 @@ class APRSSettingsDialog : public QDialog {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit APRSSettingsDialog(QString igateServer, QString igateCallsign, QString igatePasscode, QString igateFilter, QWidget* parent = 0);
|
explicit APRSSettingsDialog(APRSSettings* settings, QWidget* parent = 0);
|
||||||
~APRSSettingsDialog();
|
~APRSSettingsDialog();
|
||||||
|
|
||||||
QString m_igateServer;
|
|
||||||
QString m_igateCallsign;
|
|
||||||
QString m_igatePasscode;
|
|
||||||
QString m_igateFilter;
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void accept();
|
void accept();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::APRSSettingsDialog* ui;
|
Ui::APRSSettingsDialog* ui;
|
||||||
|
APRSSettings *m_settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_APRSSETTINGSDIALOG_H
|
#endif // INCLUDE_APRSSETTINGSDIALOG_H
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>351</width>
|
<width>351</width>
|
||||||
<height>179</height>
|
<height>275</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -23,6 +23,64 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<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">
|
<item row="0" column="1">
|
||||||
<widget class="QComboBox" name="igateServer">
|
<widget class="QComboBox" name="igateServer">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -58,40 +116,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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">
|
<item row="3" column="1">
|
||||||
<widget class="QLineEdit" name="igateFilter">
|
<widget class="QLineEdit" name="igateFilter">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -99,10 +123,10 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="igateFilterLabel">
|
<widget class="QLabel" name="igateSeverLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>IGate Filter</string>
|
<string>IGate Server</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -120,6 +144,83 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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
|
* 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.
|
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
|
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>
|
<h2>Map</h2>
|
||||||
|
|
||||||
|
@ -322,7 +322,8 @@ struct SDRBASE_API APRSPacket {
|
|||||||
return bytes;
|
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;
|
QStringList text;
|
||||||
|
|
||||||
@ -351,9 +352,21 @@ struct SDRBASE_API APRSPacket {
|
|||||||
if (includePosition && m_hasPosition)
|
if (includePosition && m_hasPosition)
|
||||||
text.append(QString("Latitude: %1 Longitude: %2").arg(m_latitude).arg(m_longitude));
|
text.append(QString("Latitude: %1 Longitude: %2").arg(m_latitude).arg(m_longitude));
|
||||||
if (m_hasAltitude)
|
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)
|
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)
|
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));
|
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");
|
air.append("Air");
|
||||||
if (m_hasTemp)
|
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)
|
if (m_hasHumidity)
|
||||||
air.append(QString("Humidity %1%").arg(m_humidity));
|
air.append(QString("Humidity %1%").arg(m_humidity));
|
||||||
if (m_hasBarometricPressure)
|
if (m_hasBarometricPressure)
|
||||||
@ -391,11 +409,26 @@ struct SDRBASE_API APRSPacket {
|
|||||||
{
|
{
|
||||||
rain.append("Rain");
|
rain.append("Rain");
|
||||||
if (m_hasRainLastHr)
|
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)
|
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)
|
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(' '));
|
weather.append(rain.join(' '));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,16 @@ public:
|
|||||||
return (int)std::round(knotsToKPH(knots));
|
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)
|
static float kmpsToKPH(float kps)
|
||||||
{
|
{
|
||||||
return kps * (60.0 * 60.0);
|
return kps * (60.0 * 60.0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user