/* Private */
TM_GPS_Result_t TM_GPS_INT_Do(TM_GPS_t* GPS_Data, char c) {
	if (TM_GPS_INT_FlagsOk(GPS_Data)) {
		TM_GPS_INT_ClearFlags(GPS_Data);				/* Data were valid before, new data are coming, not new anymore */
		GPS_Data->Status = TM_GPS_Result_OldData;		/* Data were "new" on last call, now are only "Old data", no NEW data */
	}
	if (c == '$') {										/* Start of string detected */
		TM_GPS_Star = 0;								/* Star detection reset */
		TM_GPS_CRC = 0;									/* Reset CRC */
		GPS_Term_Number = 0;							/* First term in new statement */
		GPS_Term_Pos = 0;								/* At position 0 of a first term */
		GPS_Term[GPS_Term_Pos++] = c;					/* Add character to first term */
	} else if (c == ',') {
		TM_GPS_INT_Add2CRC(c);							/* Add to parity */
		GPS_Term[GPS_Term_Pos++] = 0;					/* End of term */
		TM_GPS_INT_CheckEmpty(GPS_Data);				/* Check if term is empty */
		TM_GPS_INT_CheckTerm(GPS_Data);					/* Check term */
		GPS_Term_Number++;								/* Increase term number */
		GPS_Term_Pos = 0;								/* At position 0 of a first term */
	} else if (c == '\n') {
		GPS_Term_Number = 0;							/* Reset term number */
#ifndef GPS_DISABLE_GPGSV
		/* Check for GPGSV statement */
		if (TM_GPS_Statement == GPS_GPGSV && GPGSV_StatementsCount == GPSGV_StatementNumber) {
			TM_GPS_INT_SetFlag(GPS_FLAG_SATSDESC);		/* Set flag */
		}
#endif
	} else if (c == '\r') {
		GPS_Term[GPS_Term_Pos++] = 0;					/* End of character string */
		TM_GPS_CRC_Received = TM_GPS_INT_Hex2Dec(GPS_Term[0]) * 16 + TM_GPS_INT_Hex2Dec(GPS_Term[1]);	/* Between * and \r are 2 characters of Checksum */
		if (TM_GPS_CRC_Received != TM_GPS_CRC) {		/* CRC is not OK, data failed somewhere */			
			TM_GPS_INT_ClearFlags(GPS_Data);			/* Clear all flags */
		}
		GPS_Term_Number = 0;							/* Reset term number */
	} else if (c == '*') {
		TM_GPS_Star = 1;								/* Star detected */
		GPS_Term[GPS_Term_Pos++] = 0;					/* Add 0 at the end */
		TM_GPS_INT_CheckEmpty(GPS_Data);				/* Check empty */
		TM_GPS_INT_CheckTerm(GPS_Data);					/* Check term */		
		GPS_Term_Number++;								/* Increase term number */
		GPS_Term_Pos = 0;								/* At position 0 of a first term */
	} else {
		/* Other characters detected */
		if (!TM_GPS_Star) {								/* If star is not detected yet */
			TM_GPS_INT_Add2CRC(c);						/* Add to parity */
		}
		GPS_Term[GPS_Term_Pos++] = c;					/* Add to term */
	}
	return TM_GPS_INT_Return(GPS_Data);					/* Return current GPS status */
}
Exemplo n.º 2
0
/* Private */
extern TM_GPS_Result_t TM_GPS_INT_Do(TM_GPS_Data_t* GPS_Data, char c) {
	if (TM_GPS_INT_FlagsOk()) {
		/* Data were valid before, new data are coming, not new anymore */
		TM_GPS_INT_ClearFlags();
		/* Data were "new" on last call, now are only "Old data", no NEW data */
		GPS_Data->Status = TM_GPS_Result_OldData;
	}
	if (c == '$') {		
		/* Star detection reset */
		TM_GPS_Star = 0;
		/* Reset CRC */
		TM_GPS_CRC = 0;
		/* First term in new statement */
		TM_GPS_Term_Number = 0;
		/* At position 0 of a first term */
		TM_GPS_Term_Pos = 0;
		/* Add character to first term */
		TM_GPS_Term[TM_GPS_Term_Pos++] = c;
	} else if (c == ',') {
		/* Add to parity */
		TM_GPS_INT_Add2CRC(c);
		/* Add 0 at the end */
		TM_GPS_Term[TM_GPS_Term_Pos++] = 0;
		
		/* Check term */
		TM_GPS_INT_CheckTerm(GPS_Data);
		
		/* Increase term number */
		TM_GPS_Term_Number++;
		/* At position 0 of a first term */
		TM_GPS_Term_Pos = 0;
	} else if (c == '\n') {
	
	} else if (c == '\r') {
		TM_GPS_Term[TM_GPS_Term_Pos++] = 0;
		
		/* Between * and \r are 2 characters of Checksum */
		TM_GPS_CRC_Received = TM_GPS_INT_Hex2Dec(TM_GPS_Term[0]) * 16 + TM_GPS_INT_Hex2Dec(TM_GPS_Term[1]);
		
		if (TM_GPS_CRC_Received != TM_GPS_CRC) {
			/* CRC is not OK, data failed somewhere */
			/* Clear all flags */
			TM_GPS_INT_ClearFlags();
		}
	} else if (c == '*') {
		/* Star detected */
		TM_GPS_Star = 1;
		/* Add 0 at the end */
		TM_GPS_Term[TM_GPS_Term_Pos++] = 0;
		
		/* Check term */
		TM_GPS_INT_CheckTerm(GPS_Data);
		
		/* Increase term number */
		TM_GPS_Term_Number++;
		/* At position 0 of a first term */
		TM_GPS_Term_Pos = 0;
	} else {
		/* Other characters detected */
		
		/* If star is not detected yet */
		if (!TM_GPS_Star) {
			/* Add to parity */
			TM_GPS_INT_Add2CRC(c);
		}
		
		/* Add to term */
		TM_GPS_Term[TM_GPS_Term_Pos++] = c;
	}
	return TM_GPS_INT_Return(GPS_Data);
}