swift
atcstationmodel.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "core/afv/model/atcstationmodel.h"
5 
6 #include <QtMath>
7 
8 using namespace swift::core::afv;
9 
10 namespace swift::core::afv::model
11 {
12  CSampleAtcStation::CSampleAtcStation(const QString &callsign, const TransceiverDto &transceiver)
13  : m_callsign(callsign), m_transceiver(transceiver)
14  {}
15 
16  double CSampleAtcStation::latitude() const { return m_transceiver.LatDeg; }
17 
18  double CSampleAtcStation::longitude() const { return m_transceiver.LonDeg; }
19 
20  quint32 CSampleAtcStation::frequency() const { return m_transceiver.frequencyHz; }
21 
23  {
24  return QString::number(m_transceiver.frequencyHz / 1000000.0, 'f', 3);
25  }
26 
28  {
29  const double sqrtAltM = qSqrt(m_transceiver.HeightMslM);
30  const double radioFactor = 4193.18014745372;
31  return radioFactor * sqrtAltM;
32  }
33 
35 
37  {
38  // Add stations which didn't exist yet
39  for (const auto &station : atcStations)
40  {
41  if (!m_atcStations.contains(station)) { addStation(station); }
42  }
43 
44  // Remove all stations which are no longer there
45  for (int i = m_atcStations.size() - 1; i >= 0; i--)
46  {
47  CSampleAtcStation &station = m_atcStations[i];
48  if (!m_atcStations.contains(station)) { removeStationAtPosition(i); }
49  }
50  }
51 
52  void CSampleAtcStationModel::addStation(const CSampleAtcStation &atcStation)
53  {
55  m_atcStations << atcStation;
56  endInsertRows();
57  }
58 
59  void CSampleAtcStationModel::removeStationAtPosition(int i)
60  {
62  m_atcStations.removeAt(i);
63  endRemoveRows();
64  }
65 
67  {
68  Q_UNUSED(parent)
69  return m_atcStations.count();
70  }
71 
72  QVariant CSampleAtcStationModel::data(const QModelIndex &index, int role) const
73  {
74  if (index.row() < 0 || index.row() >= m_atcStations.count()) return {};
75 
76  const CSampleAtcStation &atcStation = m_atcStations[index.row()];
77  if (role == CallsignRole) return atcStation.callsign();
78  if (role == LatitudeRole) return atcStation.latitude();
79  if (role == LongitudeRole) return atcStation.longitude();
80  if (role == RadioDistanceRole) return atcStation.radioDistanceM();
81  if (role == FrequencyRole) return atcStation.formattedFrequency();
82  if (role == FrequencyKhzRole) return atcStation.frequency() / 1000;
83  return {};
84  }
85 
87  {
89  roles[CallsignRole] = "callsign";
90  roles[LatitudeRole] = "latitude";
91  roles[LongitudeRole] = "longitude";
92  roles[RadioDistanceRole] = "radioDistanceM";
93  roles[FrequencyRole] = "frequencyAsString";
94  roles[FrequencyKhzRole] = "frequencyKhz";
95  return roles;
96  }
97 } // namespace swift::core::afv::model
const QString & callsign() const
Getter.
void updateAtcStations(const QVector< CSampleAtcStation > &atcStations)
Update the stations.
QHash< int, QByteArray > roleNames() const
copydoc QAbstractListModel::roleNames
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
copydoc QAbstractListModel::data
CSampleAtcStationModel(QObject *parent=nullptr)
Ctor.
int rowCount(const QModelIndex &parent=QModelIndex()) const
copydoc QAbstractListModel::rowCount
void beginInsertRows(const QModelIndex &parent, int first, int last)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
int row() const const
QObject * parent() const const
QString number(double n, char format, int precision)
Transceiver DTO.
Definition: dto.h:117
double LonDeg
Properties.
Definition: dto.h:123
double LatDeg
Properties.
Definition: dto.h:122
double HeightMslM
Properties.
Definition: dto.h:124
quint32 frequencyHz
Properties.
Definition: dto.h:121