Changeset 1311 in ntrip for trunk/BNC/GPSS
- Timestamp:
- Dec 20, 2008, 1:32:04 PM (16 years ago)
- Location:
- trunk/BNC/GPSS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/GPSS/gpssDecoder.cpp
r1310 r1311 18 18 #include "gpssDecoder.h" 19 19 20 #define MODE_SEARCH 0 21 #define MODE_TYPE 1 22 #define MODE_EPOCH 2 23 #define MODE_EPOCH_BODY 3 24 #define MODE_EPOCH_CRC 4 25 #define MODE_EPOCH_ETX 5 26 #define MODE_EPH 6 27 #define MODE_EPH_BODY 7 28 #define MODE_EPH_CRC 8 29 #define MODE_EPH_ETX 9 30 #define MAX_PRN 32 31 20 32 using namespace std; 33 34 typedef struct epochHeader { 35 double t_epoch; 36 int n_svs; 37 } EPOCHHEADER; 21 38 22 39 // Constructor 23 40 //////////////////////////////////////////////////////////////////////////// 24 41 gpssDecoder::gpssDecoder() : GPSDecoder() { 42 _mode = MODE_SEARCH; 25 43 } 26 44 … … 32 50 // 33 51 //////////////////////////////////////////////////////////////////////////// 34 t_irc gpssDecoder::Decode(char* buffer, int bufLen, vector<string>& errmsg) { 52 t_irc gpssDecoder::Decode(char* data, int dataLen, vector<string>& errmsg) { 53 35 54 errmsg.clear(); 36 55 56 _buffer.append(data, dataLen); 57 58 bool haveEpoch = false; 59 bool haveEph = false; 60 int recordSize = 0; 61 unsigned offset = 0; 62 63 EPOCHHEADER epochHdr; 64 t_obsInternal gpsObs[MAX_PRN]; 65 gpsephemeris gpsEph; 66 67 for (offset = 0; offset < _buffer.size(); offset++) { 68 69 switch(_mode) { 70 71 case MODE_SEARCH: 72 if (_buffer[offset] == 0x02) { 73 _mode = MODE_TYPE; 74 } 75 continue; 76 77 case MODE_TYPE: 78 if (_buffer[offset] == 0x00) { 79 _mode = MODE_EPOCH; 80 } else if (_buffer[offset] == 0x01) { 81 _mode = MODE_EPH; 82 } else { 83 errmsg.push_back("Unknown record type"); 84 _mode = MODE_SEARCH; 85 } 86 continue; 87 88 case MODE_EPOCH: 89 case MODE_EPH: 90 if (offset+sizeof(recordSize) > _buffer.size()) { 91 errmsg.push_back("Record size too large (A)"); 92 _mode = MODE_SEARCH; 93 } else { 94 memcpy(&_buffer[offset], &recordSize, sizeof(recordSize)); 95 if (_mode == MODE_EPOCH) { 96 _mode = MODE_EPOCH_BODY; 97 } 98 if (_mode == MODE_EPH) { 99 _mode = MODE_EPH_BODY; 100 } 101 offset += sizeof(recordSize) - 1; 102 } 103 continue; 104 105 case MODE_EPOCH_BODY: 106 if (offset + recordSize > _buffer.size()) { 107 errmsg.push_back("Record size too large (B)"); 108 _mode = MODE_SEARCH; 109 } else { 110 /// memcpy(&_buffer[offset], epoch, recordSize); 111 offset += recordSize - 1; 112 _mode = MODE_EPOCH_CRC; 113 } 114 continue; 115 116 case MODE_EPH_BODY: 117 if (offset + recordSize > _buffer.size()) { 118 errmsg.push_back("Record size too large (B)"); 119 _mode = MODE_SEARCH; 120 } else { 121 /// memcpy(&_buffer[offset], eph, recordSize); 122 offset += recordSize - 1; 123 _mode = MODE_EPH_CRC; 124 } 125 continue; 126 127 case MODE_EPOCH_CRC: 128 _mode = MODE_EPOCH_ETX; // TODO: CRC check 129 continue; 130 131 case MODE_EPH_CRC: 132 _mode = MODE_EPH_ETX; // TODO: CRC check 133 continue; 134 135 case MODE_EPOCH_ETX: 136 haveEpoch = true; 137 _mode = MODE_SEARCH; 138 continue; 139 140 case MODE_EPH_ETX: 141 haveEph = true; 142 _mode = MODE_SEARCH; 143 continue; 144 } 145 146 if (haveEpoch) { 147 haveEpoch = false; 148 } 149 150 if (haveEph) { 151 haveEph = false; 152 } 153 } 37 154 } -
trunk/BNC/GPSS/gpssDecoder.h
r1310 r1311 10 10 class gpssDecoder : public QObject, public GPSDecoder { 11 11 Q_OBJECT 12 12 13 public: 13 14 gpssDecoder(); 14 15 virtual ~gpssDecoder(); 15 16 virtual t_irc Decode(char* buffer, int bufLen, std::vector<std::string>& errmsg); 17 16 18 signals: 17 19 void newMessage(QByteArray msg, bool showOnScreen); 18 20 void newGPSEph(gpsephemeris* gpseph); 21 19 22 private: 23 int _mode; 24 std::string _buffer; 20 25 } ; 21 26
Note:
See TracChangeset
for help on using the changeset viewer.