source: ntrip/trunk/BNC/src/bncephuser.cpp@ 6807

Last change on this file since 6807 was 6798, checked in by stuerze, 10 years ago

considerationn of the aspect that Galileo navigation messages can be provided for the same epoch but with different flags, e.g.: I/NAV, F/NAV, changed DVS;
simplification for accuracy entries that can be provided as index or in meter

File size: 6.2 KB
Line 
1// converting GNSS data streams from NTRIP broadcasters.
2//
3// Copyright (C) 2007
4// German Federal Agency for Cartography and Geodesy (BKG)
5// http://www.bkg.bund.de
6// Czech Technical University Prague, Department of Geodesy
7// http://www.fsv.cvut.cz
8//
9// Email: euref-ip@bkg.bund.de
10//
11// This program is free software; you can redistribute it and/or
12// modify it under the terms of the GNU General Public License
13// as published by the Free Software Foundation, version 2.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
24/* -------------------------------------------------------------------------
25 * BKG NTRIP Client
26 * -------------------------------------------------------------------------
27 *
28 * Class: bncEphUser
29 *
30 * Purpose: Base for Classes that use Ephemerides
31 *
32 * Author: L. Mervart
33 *
34 * Created: 27-Jan-2011
35 *
36 * Changes:
37 *
38 * -----------------------------------------------------------------------*/
39
40#include <iostream>
41
42#include "bncephuser.h"
43#include "bnccore.h"
44
45using namespace std;
46
47// Constructor
48////////////////////////////////////////////////////////////////////////////
49bncEphUser::bncEphUser(bool connectSlots) {
50 if (connectSlots) {
51 connect(BNC_CORE, SIGNAL(newGPSEph(t_ephGPS)),
52 this, SLOT(slotNewGPSEph(t_ephGPS)), Qt::DirectConnection);
53
54 connect(BNC_CORE, SIGNAL(newGlonassEph(t_ephGlo)),
55 this, SLOT(slotNewGlonassEph(t_ephGlo)), Qt::DirectConnection);
56
57 connect(BNC_CORE, SIGNAL(newGalileoEph(t_ephGal)),
58 this, SLOT(slotNewGalileoEph(t_ephGal)), Qt::DirectConnection);
59
60 connect(BNC_CORE, SIGNAL(newSBASEph(t_ephSBAS)),
61 this, SLOT(slotNewSBASEph(t_ephSBAS)), Qt::DirectConnection);
62
63 connect(BNC_CORE, SIGNAL(newBDSEph(t_ephBDS)),
64 this, SLOT(slotNewBDSEph(t_ephBDS)), Qt::DirectConnection);
65 }
66}
67
68// Destructor
69////////////////////////////////////////////////////////////////////////////
70bncEphUser::~bncEphUser() {
71 QMapIterator<QString, deque<t_eph*> > it(_eph);
72 while (it.hasNext()) {
73 it.next();
74 const deque<t_eph*>& qq = it.value();
75 for (unsigned ii = 0; ii < qq.size(); ii++) {
76 delete qq[ii];
77 }
78 }
79}
80
81// New GPS Ephemeris
82////////////////////////////////////////////////////////////////////////////
83void bncEphUser::slotNewGPSEph(t_ephGPS eph) {
84 putNewEph(&eph, false);
85}
86
87// New Glonass Ephemeris
88////////////////////////////////////////////////////////////////////////////
89void bncEphUser::slotNewGlonassEph(t_ephGlo eph) {
90 putNewEph(&eph, false);
91}
92
93// New Galileo Ephemeris
94////////////////////////////////////////////////////////////////////////////
95void bncEphUser::slotNewGalileoEph(t_ephGal eph) {
96 putNewEph(&eph, false);
97}
98
99// New SBAS Ephemeris
100////////////////////////////////////////////////////////////////////////////
101void bncEphUser::slotNewSBASEph(t_ephSBAS eph) {
102 putNewEph(&eph, false);
103}
104
105// New BDS Ephemeris
106////////////////////////////////////////////////////////////////////////////
107void bncEphUser::slotNewBDSEph(t_ephBDS eph) {
108 putNewEph(&eph, false);
109}
110
111//
112////////////////////////////////////////////////////////////////////////////
113t_irc bncEphUser::putNewEph(t_eph* eph, bool check) {
114
115 QMutexLocker locker(&_mutex);
116
117 if (eph == 0) {
118 return failure;
119 }
120
121 if (check) {
122 checkEphemeris(eph);
123 }
124
125 const t_ephGPS* ephGPS = dynamic_cast<const t_ephGPS*>(eph);
126 const t_ephGlo* ephGlo = dynamic_cast<const t_ephGlo*>(eph);
127 const t_ephGal* ephGal = dynamic_cast<const t_ephGal*>(eph);
128 const t_ephSBAS* ephSBAS = dynamic_cast<const t_ephSBAS*>(eph);
129 const t_ephBDS* ephBDS = dynamic_cast<const t_ephBDS*>(eph);
130
131 t_eph* newEph = 0;
132
133 if (ephGPS) {
134 newEph = new t_ephGPS(*ephGPS);
135 }
136 else if (ephGlo) {
137 newEph = new t_ephGlo(*ephGlo);
138 }
139 else if (ephGal) {
140 newEph = new t_ephGal(*ephGal);
141 }
142 else if (ephSBAS) {
143 newEph = new t_ephSBAS(*ephSBAS);
144 }
145 else if (ephBDS) {
146 newEph = new t_ephBDS(*ephBDS);
147 }
148 else {
149 return failure;
150 }
151
152 QString prn(newEph->prn().toString().c_str());
153
154 const t_eph* ephOld = ephLast(prn);
155
156 if (ephOld == 0 ||
157 newEph->isNewerThan(ephOld) ||
158 newEph->hasOtherFlagsThan(ephOld)) {
159 deque<t_eph*>& qq = _eph[prn];
160 qq.push_back(newEph);
161 if (qq.size() > _maxQueueSize) {
162 delete qq.front();
163 qq.pop_front();
164 }
165 ephBufferChanged();
166 return success;
167 }
168 else {
169 delete newEph;
170 return failure;
171 }
172}
173
174//
175////////////////////////////////////////////////////////////////////////////
176void bncEphUser::checkEphemeris(t_eph* eph) {
177
178 if (!eph || eph->checkState() == t_eph::ok || eph->checkState() == t_eph::bad) {
179 return;
180 }
181
182 // Simple Check - check satellite radial distance
183 // ----------------------------------------------
184 ColumnVector xc(4);
185 ColumnVector vv(3);
186 if (eph->getCrd(eph->TOC(), xc, vv, false) != success) {
187 eph->setCheckState(t_eph::bad);
188 return;
189 }
190
191 double rr = xc.Rows(1,3).norm_Frobenius();
192
193 const double MINDIST = 2.e7;
194 const double MAXDIST = 6.e7;
195 if (rr < MINDIST || rr > MAXDIST) {
196 eph->setCheckState(t_eph::bad);
197 return;
198 }
199
200 // Check consistency with older ephemerides
201 // ----------------------------------------
202 const double MAXDIFF = 1000.0;
203 QString prn = QString(eph->prn().toString().c_str());
204 t_eph* ephL = ephLast(prn);
205 if (ephL) {
206 ColumnVector xcL(4);
207 ColumnVector vvL(3);
208 ephL->getCrd(eph->TOC(), xcL, vvL, false);
209
210 double dt = eph->TOC() - ephL->TOC();
211 double diff = (xc.Rows(1,3) - xcL.Rows(1,3)).norm_Frobenius();
212
213 if (diff < MAXDIFF) {
214 if(dt != 0.0 || eph->hasOtherFlagsThan(ephL)) {
215 eph->setCheckState(t_eph::ok);
216 ephL->setCheckState(t_eph::ok);
217 }
218 }
219 else {
220 if (ephL->checkState() == t_eph::ok) {
221 eph->setCheckState(t_eph::bad);
222 }
223 }
224 }
225}
Note: See TracBrowser for help on using the repository browser.