void ComPort::ProcessChar(char c) { if (ComCheck_ActivePort>=0 && GetPortIndex()==(unsigned)ComCheck_ActivePort) { ComCheck_AddChar(c); } #ifdef RADIO_ACTIVE if(RadioPara.Enabled && devParseStream(devIdx, &c, 1, &GPS_INFO)) { // if this port is used for stream device, leave immediately. return; } #endif // RADIO_ACTIVE // last char need to be reserved for '\0' for avoid buffer overflow // in theory this should never happen because NMEA sentence can't have more than 82 char and _NmeaString size is 160. if (pLastNmea >= std::begin(_NmeaString) && (pLastNmea+1) < std::end(_NmeaString)) { if (c == '\n' || c == '\r') { // abcd\n , now closing the line also with \r *(pLastNmea++) = _T('\n'); *(pLastNmea) = _T('\0'); // terminate string. // process only meaningful sentences, avoid processing a single \n \r etc. if (std::distance(std::begin(_NmeaString), pLastNmea) > 5) { LockFlightData(); devParseNMEA(devIdx, _NmeaString, &GPS_INFO); UnlockFlightData(); } } else { *(pLastNmea++) = c; return; } } // overflow, so reset buffer pLastNmea = std::begin(_NmeaString); }
void ComPort::ProcessChar(char c) { if (bi<(MAX_NMEA_LEN-1)) { BuildingString[bi++] = c; #if 100430 if(c=='\n' || c=='\r') { // abcd\n , now closing the line also with \r BuildingString[bi] = '\0'; if (c == '\r') BuildingString[bi-1]='\n'; // process only meaningful sentences, avoid processing a single \n \r etc. if (bi>5) { // 100430 LockFlightData(); devParseNMEA(devIdx, BuildingString, &GPS_INFO); UnlockFlightData(); } } else { return; } #else if(c=='\n') { // abcd\n BuildingString[bi] = '\0'; // do not consider CR in ProcessChar inside Port // bi-2==\r bi-1==\n bi=\0 if (bi>1 && (BuildingString[bi-2]==0x0d) ) { BuildingString[bi-2] = '\n'; BuildingString[bi-1] = '\0'; } LockFlightData(); devParseNMEA(devIdx, BuildingString, &GPS_INFO); UnlockFlightData(); } else { return; } #endif } // overflow, so reset buffer bi = 0; }