source: ntrip/trunk/BNC/src/t_prn.cpp@ 11047

Last change on this file since 11047 was 11047, checked in by stuerze, 34 hours ago

updates regarding RTCM-SSR and some ovarall improvements

File size: 4.7 KB
Line 
1#include <sstream>
2#include <iomanip>
3#include <stdlib.h>
4
5#include "t_prn.h"
6
7using namespace std;
8
9// Set from number
10//////////////////////////////////////////////////////////////////////////////
11void t_prn::set(unsigned nn) {
12 const static unsigned maxGPS = MAXPRN_GPS;
13 const static unsigned maxGLONASS = MAXPRN_GPS + MAXPRN_GLONASS;
14 const static unsigned maxGALILEO = MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO;
15 const static unsigned maxQZSS = MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS;
16 const static unsigned maxSBAS = MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + MAXPRN_SBAS;
17 const static unsigned maxBDS = MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + MAXPRN_SBAS + MAXPRN_BDS;
18 const static unsigned maxNavIC = MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + MAXPRN_SBAS + MAXPRN_BDS + MAXPRN_NavIC;
19 _system = 'G';
20 _number = 0;
21 _flag = 0;
22 if (nn <= maxGPS) {
23 _system = 'G';
24 _number = nn;
25 }
26 else if (nn <= maxGLONASS) {
27 _system = 'R';
28 _number = nn - maxGPS;
29 }
30 else if (nn <= maxGALILEO) {
31 _system = 'E';
32 _number = nn - maxGLONASS;
33 }
34 else if (nn <= maxQZSS) {
35 _system = 'J';
36 _number = nn - maxGALILEO;
37 }
38 else if (nn <= maxSBAS) {
39 _system = 'S';
40 _number = nn - maxQZSS;
41 }
42 else if (nn <= maxBDS) {
43 _system = 'C';
44 _number = nn - maxSBAS;
45 }
46 else if (nn <= maxNavIC) {
47 _system = 'I';
48 _number = nn - maxBDS;
49 }
50}
51
52//
53//////////////////////////////////////////////////////////////////////////////
54int t_prn::toInt() const {
55 // Every per-satellite array (size MAXPRN+1) and every map keyed by t_prn
56 // (compared via operator unsigned) relies on this index. A number beyond
57 // its system's range - e.g. a 6-bit SSR satellite ID up to 63 - would
58 // otherwise silently map onto a satellite of the next system (G33 = R01)
59 // or beyond the arrays, so it is mapped to the unused index 0 instead.
60 unsigned maxNum = 0;
61 switch (_system) {
62 case 'G': maxNum = MAXPRN_GPS; break;
63 case 'R': maxNum = MAXPRN_GLONASS; break;
64 case 'E': maxNum = MAXPRN_GALILEO; break;
65 case 'J': maxNum = MAXPRN_QZSS; break;
66 case 'S': maxNum = MAXPRN_SBAS; break;
67 case 'C': maxNum = MAXPRN_BDS; break;
68 case 'I': maxNum = MAXPRN_NavIC; break;
69 }
70 if (_number < 1 || unsigned(_number) > maxNum) {
71 return 0;
72 }
73 if (_system == 'G') {
74 return _number;
75 }
76 else if (_system == 'R') {
77 return MAXPRN_GPS + _number;
78 }
79 else if (_system == 'E') {
80 return MAXPRN_GPS + MAXPRN_GLONASS + _number;
81 }
82 else if (_system == 'J') {
83 return MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + _number;
84 }
85 else if (_system == 'S') {
86 return MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + _number;
87 }
88 else if (_system == 'C') {
89 return MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + MAXPRN_SBAS + _number;
90 }
91 else if (_system == 'I') {
92 return MAXPRN_GPS + MAXPRN_GLONASS + MAXPRN_GALILEO + MAXPRN_QZSS + MAXPRN_SBAS + MAXPRN_BDS + _number;
93 }
94 return 0;
95}
96
97//
98//////////////////////////////////////////////////////////////////////////////
99string t_prn::toString() const {
100 stringstream ss;
101 ss << _system << setfill('0') << setw(2) << _number;
102 return ss.str();
103}
104
105//
106//////////////////////////////////////////////////////////////////////////////
107string t_prn::toInternalString() const {
108 stringstream ss;
109 ss << _system << setfill('0') << setw(2) << _number << '_' << _flag;
110 return ss.str();
111}
112
113// Set from string
114////////////////////////////////////////////////////////////////////////////
115void t_prn::set(const std::string& str) {
116 unsigned prn = 0;
117 char system = '\x0';
118 const char* number = 0;
119 if ( str[0] == 'G' || str[0] == 'R' || str[0] == 'E' ||
120 str[0] == 'J' || str[0] == 'S' || str[0] == 'C' ||
121 str[0] == 'I') {
122 system = str[0];
123 number = str.c_str() + 1;
124 }
125 else if ( isdigit(str[0]) ) {
126 system = 'G';
127 number = str.c_str();
128 }
129 else {
130 throw "t_prn::set: wrong satellite ID: " + str;
131 }
132
133 char* tmpc = 0;
134 prn = strtol(number, &tmpc, 10);
135 if ( tmpc == number || *tmpc != '\x0' ) {
136 throw "t_prn::set: wrong satellite ID: " + str;
137 }
138
139 try {
140 this->set(system, prn);
141 }
142 catch (string exc) {
143 throw "t_prn::set: wrong satellite ID: " + str;
144 }
145}
146
147//
148//////////////////////////////////////////////////////////////////////////////
149t_prn::operator unsigned() const {
150 return toInt();
151}
152
153//
154//////////////////////////////////////////////////////////////////////////////
155istream& operator >> (istream& in, t_prn& prn) {
156 string str;
157 in >> str;
158 if (str.length() == 1 && !isdigit(str[0])) {
159 string str2;
160 in >> str2;
161 str += str2;
162 }
163 prn.set(str);
164 return in;
165}
Note: See TracBrowser for help on using the repository browser.