1 |
|
---|
2 | #ifndef CGPS_TRANSFORM_H
|
---|
3 | #define CGPS_TRANSFORM_H
|
---|
4 |
|
---|
5 | #include <string.h>
|
---|
6 | #include <stdio.h>
|
---|
7 | #include <math.h>
|
---|
8 | #include <sys/time.h>
|
---|
9 | #include <iostream>
|
---|
10 |
|
---|
11 | using namespace std;
|
---|
12 |
|
---|
13 | #include "rtacp.h"
|
---|
14 | #include "rtstruct.h"
|
---|
15 | #include "rtigs_records.h"
|
---|
16 | #include "gpswro.h"
|
---|
17 |
|
---|
18 | #define MAXCHANNELS_FOR_SOCKETS_TYPE1 12
|
---|
19 | #define MAXSV 32
|
---|
20 | #define ScaleFactor1 4.0914555603263203 //(f1ion + f2ion)
|
---|
21 | #define ScaleFactor2 2 * F1ION
|
---|
22 | #define MAXL1L2 41.94302
|
---|
23 |
|
---|
24 | void SwitchBytes( char *Start, int Size );
|
---|
25 |
|
---|
26 | typedef struct
|
---|
27 | {
|
---|
28 | unsigned char prn; // satellite ID
|
---|
29 | unsigned short epoch_sequence; // like Ashtech seq number of phase epochs
|
---|
30 | // was like this, now modulo 10 hours,
|
---|
31 | // each digit is now 1 sec, not .05 secs like before
|
---|
32 |
|
---|
33 | char ca_range[5]; // ca range in millimeters
|
---|
34 | // first 4 bits are status bits, as follows
|
---|
35 | // if bit 7 on, sucessful packing of ca_range
|
---|
36 | // if bit 6 on, Z track mode or AS is on
|
---|
37 | // if bit 5 on, overflow of L2_block phase
|
---|
38 | // if bit 4 on, overflow of L1_block phase
|
---|
39 | // next 36 bits are the observable
|
---|
40 | // 68719.476735 is the max allowable obsev.
|
---|
41 | // if not packed, L2_block and L1_block is
|
---|
42 | // just then packed with 0s
|
---|
43 |
|
---|
44 | unsigned char CA_snr; // receiver snr for ca in dbHz KML the SNR is (DBHz * 4.25) rounded to an int (max is 60.0)
|
---|
45 |
|
---|
46 | char L2_range_phase[5];
|
---|
47 | // first 2 bytes and 2 bits is for the range, next 6 bits and 2 bytes are for phase.
|
---|
48 | //
|
---|
49 | // range units are in millimeters, from -131071 to 131071 (2^17 - 1)
|
---|
50 | // 0000 0000 0000 0000 01 would be +1 mm
|
---|
51 | // 1000 0000 0000 0000 01 would be -1 mm
|
---|
52 | // 0100 0000 0000 0000 00 would be 65536 mm
|
---|
53 | // 1100 0000 0000 0000 00 would be -65536 mm
|
---|
54 | // 0111 1111 1111 1111 11 would be 131071 mm
|
---|
55 | // 1111 1111 1111 1111 11 woule be -131071 mm
|
---|
56 | // dynamic range must be <= 131.071 meters
|
---|
57 | //
|
---|
58 | // phase units are in 2/100 millimeters from -4194304 to 4194304
|
---|
59 | // 00 0000 0000 0000 0000 0001 would be +.02 mm
|
---|
60 | // 10 0000 0000 0000 0000 0001 would be -.02 mm
|
---|
61 | // 01 1111 1111 1111 1111 1111 ( 2097151) would be 41943.02 mm
|
---|
62 | // 11 1111 1111 1111 1111 1111 (-2097151) would be -41943.02 mm
|
---|
63 | // (2^21 - 1)*2 mm
|
---|
64 | // dynamic range must be <= 41.94302 meters
|
---|
65 | //
|
---|
66 | // note if the limits are exceded, a -0 (minus zero) is returned
|
---|
67 | // indicating not a number
|
---|
68 | //
|
---|
69 | // Note however, we extended this dynamic range to 83.88606 meters as
|
---|
70 | // below with the spare bits in the ca_range field. If this limit
|
---|
71 | // is exceeded we return a -0 ( minus zero )
|
---|
72 | unsigned char L2_snr; // snr for this data type in dbHz KML the SNR is (DBHz * 4.25) rounded to an int (max is 60.0 )
|
---|
73 |
|
---|
74 | char L1_range_phase[5]; // same as format for L2_range_phase
|
---|
75 |
|
---|
76 | unsigned char L1_snr; // snr for this data type in dbHz KML the SNR is (DBHz * 4.25) rounded to an int (max is 60.0 )
|
---|
77 |
|
---|
78 | } JPL_COMP_OBS_T;
|
---|
79 |
|
---|
80 | typedef struct
|
---|
81 | {
|
---|
82 | TNAV_T Eph[MAXSV]; //32 prns
|
---|
83 | } ARR_TNAV_T;
|
---|
84 |
|
---|
85 | typedef struct {
|
---|
86 | CMEAS_T Obs[MAXSV]; //32 obs
|
---|
87 | } ARR_OBS_T ;
|
---|
88 |
|
---|
89 | class CGPS_Transform {
|
---|
90 | friend class RTIGSDecoder;
|
---|
91 | private:
|
---|
92 | ARR_OBS_T DecObs;
|
---|
93 | ARR_TNAV_T TNAV_Eph;
|
---|
94 | short NumObsRead;
|
---|
95 | short CAFlag;
|
---|
96 | short ASFlag;
|
---|
97 | short P2Flag;
|
---|
98 | short P1Flag;
|
---|
99 | bool f_IsLittleEndian;
|
---|
100 | unsigned short PhaseArcStartTime[MAXSV];
|
---|
101 | public:
|
---|
102 | CGPS_Transform();
|
---|
103 | ~CGPS_Transform();
|
---|
104 | void InitEndianFlag();
|
---|
105 | short Decode_Soc_Obs(unsigned char *SocStr, short &StrIndex, short index, short SocBytes);
|
---|
106 | short Decode_RTIGS_Soc_Obs(unsigned char *SocStr, short &StrPos, short CMeasIndex, short SocBytes, unsigned long GPSTime);
|
---|
107 | short RTIGSO_Str_To_CMEAS(unsigned char *RTIGSO_Str, short RTIGS_Bytes, RTIGSO_T &rtigs_obs); //done needs testing KML
|
---|
108 | void print_CMEAS();
|
---|
109 | short Save_TNAV_T_To_Container(TNAV_T *rtcurrent_eph, short &prn);
|
---|
110 | short CA_Extract(char * CAStr, double &CA_Rng); //done
|
---|
111 | short P1_P2_Block_Extract(char * P1P2Str, double CA, double &Rng , double &Phase, double &RngF2Delta,short decode_F1orF2Flag );//done
|
---|
112 | unsigned long JPL_xtractLongVal (unsigned startBitNbr, unsigned xtractNbrBits, const char *msg); //done
|
---|
113 | inline void SwitchIGS_Sta_HdrBytes( RTIGSS_T *StaHdr);
|
---|
114 | inline void SwitchIGS_Obs_HdrBytes( RTIGSO_T *ObsHdr);
|
---|
115 | inline void SwitchIGS_Eph_HdrBytes( RTIGSE_T *EphHdr);
|
---|
116 | inline short SwitchIGS_Met_RecBytes( RTIGSM_T *MetHdr);
|
---|
117 | unsigned short GetRTIGSHdrRecType(unsigned char *RTIGS_Str);
|
---|
118 | unsigned short GetRTIGSHdrStaID(unsigned char *RTIGS_Str);
|
---|
119 | unsigned short GetRTIGSHdrRecBytes(unsigned char *RTIGS_Str);
|
---|
120 | unsigned long GetRTIGSHdrGPSSeconds(unsigned char *RTIGS_Str);
|
---|
121 | short Decode_RTIGS_Sta(unsigned char *RTIGS_Str, unsigned short RTIGS_Bytes, RTIGSS_T &rtigs_sta_dec); // contents of record contain all info
|
---|
122 | short Decode_RTIGS_Obs(unsigned char *RTIGS_Str, unsigned short RTIGS_Bytes, RTIGSO_T &rtigs_obs); // stores obs in class container
|
---|
123 | short Decode_RTIGS_Eph(unsigned char *RTIGS_Str, unsigned short RTIGS_Bytes, RTIGSE_T &rtigs_eph, short arrPRN[]); // stores eph in class container
|
---|
124 | short Decode_RTIGS_Eph(unsigned char *RTIGS_Str, unsigned short RTIGS_Bytes, RTIGSE_T &rtigs_eph, short &PRN); //stors in class and returns prn
|
---|
125 | short Decode_RTIGS_Met(unsigned char *RTIGS_Str, unsigned short RTIGS_Bytes, RTIGSM_T *rtigs_met); // contents of record contain all info.
|
---|
126 | short TNAV_To_BEPH( TNAV_T *rtcurrent_eph, BEPH_T *new_eph); // 2/1/2008 SPG
|
---|
127 | void SwitchEphBytes( TNAV_T *rnav ); // 2/1/2008 SPG
|
---|
128 | };
|
---|
129 |
|
---|
130 |
|
---|
131 | #endif
|
---|