|
@@ -7,10 +7,7 @@
|
|
|
//#define HZ2MS(X) ((uint64_t)((X * 53000.0)/(SystemCoreClock)))
|
|
|
//
|
|
|
#define BMP180_SOLDERING_OFF_T 190
|
|
|
-#define BMP180_SOLDERING_OFF_P 12050
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+#define BMP180_SOLDERING_OFF_P 11800
|
|
|
|
|
|
void init_uart0(void)
|
|
|
{
|
|
@@ -98,7 +95,7 @@ static void init_i2c0(void)
|
|
|
#define BMP180_OSS_UHR 3
|
|
|
|
|
|
#define BMP180_REG_T 0x2E
|
|
|
-static const uint32_t BMP180_OSS = BMP180_OSS_UHR;
|
|
|
+static const uint32_t BMP180_OSS = BMP180_OSS_UHR;
|
|
|
static const uint8_t BMP180_REG_P_ARRAY[4] = {0x34, 0x74, 0xB4, 0xF4};
|
|
|
static const uint8_t BMP180_REG_P_TIME[4] = {5, 8, 14, 26};
|
|
|
#define BMP180_REG_P BMP180_REG_P_ARRAY[BMP180_OSS]
|
|
@@ -143,7 +140,7 @@ static uint32_t compensate_pressure(uint32_t up)
|
|
|
x1 = (BMP180.creg.AC3 * BMP180.B6) >> 13;
|
|
|
x2 = (BMP180.creg.B1 * ((BMP180.B6 * BMP180.B6) >> 12)) >> 16;
|
|
|
x3 = ((x1 + x2) + 2) >> 2;
|
|
|
- BMP180.B4 = (BMP180.creg.AC4 * (x3 + 32768UL)) >> 15;
|
|
|
+ BMP180.B4 = (BMP180.creg.AC4 * (x3 + 32768UL)) >> 15;
|
|
|
BMP180.B7 = (up - BMP180.B3) * (50000UL >> BMP180_OSS);
|
|
|
if (BMP180.B7 < 0x80000000UL)
|
|
|
p = (BMP180.B7 * 2) / BMP180.B4;
|
|
@@ -329,19 +326,23 @@ static uint32_t bmp180_read_P(void)
|
|
|
return (uint32_t)((data_xlsb + (data_lsb << 8) + (data_msb << 16)) >> (8 - BMP180_OSS));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/* UART/GPS */
|
|
|
+
|
|
|
+static struct minmea_sentence_rmc global_minmea_gps;
|
|
|
+static struct minmea_sentence_gga global_minmea_gga;
|
|
|
+
|
|
|
static char uart_data_receive_blocking(uint32_t usart_periph)
|
|
|
{
|
|
|
while (usart_flag_get(usart_periph, USART_FLAG_RBNE) != SET) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
return usart_data_receive(usart_periph);
|
|
|
}
|
|
|
|
|
|
static void get_nmea_line(char *buf)
|
|
|
{
|
|
|
int i = 0;
|
|
|
-
|
|
|
while (uart_data_receive_blocking(USART1) != '$') {
|
|
|
/* sync with the beginning of the line */
|
|
|
}
|
|
@@ -355,26 +356,43 @@ static void get_nmea_line(char *buf)
|
|
|
buf[i] = 0;
|
|
|
}
|
|
|
|
|
|
-static int read_gps(struct minmea_sentence_gga *frame)
|
|
|
+static int read_gps(void)
|
|
|
{
|
|
|
char nmea_buf[MAX_NMEA];
|
|
|
int ret;
|
|
|
-
|
|
|
+ int gga = 0, rmc = 0;
|
|
|
+ int nmea_id;
|
|
|
do {
|
|
|
get_nmea_line(nmea_buf);
|
|
|
- } while(strncmp(nmea_buf, "$GPGGA", strlen("$GPGGA")) != 0);
|
|
|
-
|
|
|
- ret = minmea_parse_gga(frame, nmea_buf);
|
|
|
+ nmea_id = minmea_sentence_id(nmea_buf, 0);
|
|
|
+ switch(nmea_id) {
|
|
|
+ case MINMEA_SENTENCE_RMC:
|
|
|
+ ret = minmea_parse_rmc(&global_minmea_gps, nmea_buf);
|
|
|
+ rmc++;
|
|
|
+#ifdef DEBUG_NMEA
|
|
|
+ LCD_ShowString(0, 0, (u8 *)nmea_buf, YELLOW);
|
|
|
+ delay_1ms(200);
|
|
|
+#endif
|
|
|
+ break;
|
|
|
+ case MINMEA_SENTENCE_GGA:
|
|
|
+ ret = minmea_parse_gga(&global_minmea_gga, nmea_buf);
|
|
|
+ gga++;
|
|
|
+#ifdef DEBUG_NMEA
|
|
|
+ LCD_ShowString(0, 0, (u8 *)nmea_buf, MAGENTA);
|
|
|
+ delay_1ms(200);
|
|
|
+#endif
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ret = !0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } while((ret != 0) && (gga == 0));
|
|
|
if (!ret) {
|
|
|
LCD_ShowString(0, 0, (u8 *)("PARSING ERROR"), RED);
|
|
|
LCD_ShowString(0, 32, (u8 *)nmea_buf, RED);
|
|
|
delay_1ms(2000);
|
|
|
- } else {
|
|
|
- LCD_ShowString(0, 32, (u8 *)nmea_buf, RED);
|
|
|
- delay_1ms(200);
|
|
|
-
|
|
|
+ return -1;
|
|
|
}
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -391,7 +409,6 @@ int main(void)
|
|
|
uint32_t up;
|
|
|
uint32_t pressure;
|
|
|
int32_t temperature;
|
|
|
- struct minmea_sentence_gga gps_data = { 0 };
|
|
|
|
|
|
SystemInit();
|
|
|
/* Init GPIOs */
|
|
@@ -419,18 +436,44 @@ int main(void)
|
|
|
|
|
|
while (1)
|
|
|
{
|
|
|
- read_gps(&gps_data);
|
|
|
- LCD_Clear(BLACK);
|
|
|
- snprintf(gps, MAX_ROW-1, "%02d:%02d:%02d", gps_data.time.hours, gps_data.time.minutes, gps_data.time.seconds);
|
|
|
- LCD_ShowString (0, 0, (u8 *)gps, GREEN);
|
|
|
- snprintf(gps, MAX_ROW-1, "%d,%d", gps_data.latitude.value, gps_data.longitude.value);
|
|
|
- LCD_ShowString (0, 16, (u8 *)gps, GREEN);
|
|
|
- snprintf(gps, MAX_ROW-1, "H:%d", gps_data.altitude.value/gps_data.altitude.scale);
|
|
|
- LCD_ShowString (0, 32, (u8 *)gps, GREEN);
|
|
|
+ if (read_gps() < 0) {
|
|
|
+ LCD_Clear(BLACK);
|
|
|
+ snprintf(gps, MAX_ROW-1, "Waiting for GPS");
|
|
|
+ LCD_ShowString (8, 0, (u8 *)gps, GREEN);
|
|
|
+ } else {
|
|
|
+ LCD_Clear(BLACK);
|
|
|
+ snprintf(gps, MAX_ROW-1, "t:%02d:%02d:%02d",
|
|
|
+ global_minmea_gga.time.hours,
|
|
|
+ global_minmea_gga.time.minutes,
|
|
|
+ global_minmea_gga.time.seconds);
|
|
|
+
|
|
|
+ if (global_minmea_gga.satellites_tracked > 0) {
|
|
|
+ LCD_ShowString (0, 0, (u8 *)gps, CYAN);
|
|
|
+ } else {
|
|
|
+ LCD_ShowString (0, 0, (u8 *)gps, RED);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //snprintf(gps, MAX_ROW-1, "%d,%d", gps_data.latitude.value, gps_data.longitude.value);
|
|
|
+ snprintf(gps, MAX_ROW-1,"v:%d, sat:%d, q:%d",
|
|
|
+ (int)global_minmea_gps.valid,
|
|
|
+ global_minmea_gga.satellites_tracked,
|
|
|
+ global_minmea_gga.fix_quality);
|
|
|
+ if (global_minmea_gps.valid) {
|
|
|
+ LCD_ShowString (0, 16, (u8 *)gps, GREEN);
|
|
|
+ snprintf(gps, MAX_ROW-1, "H:%d hdop:%d",
|
|
|
+ global_minmea_gga.altitude.value /
|
|
|
+ global_minmea_gga.altitude.scale,
|
|
|
+ global_minmea_gga.hdop);
|
|
|
+ LCD_ShowString (0, 32, (u8 *)gps, GREEN);
|
|
|
+ } else {
|
|
|
+ LCD_ShowString (0, 16, (u8 *)gps, RED);
|
|
|
+ }
|
|
|
+ }
|
|
|
ut = bmp180_read_T();
|
|
|
up = bmp180_read_P();
|
|
|
- LCD_ShowString(0, 48, (u8 *)(prs), GREEN);
|
|
|
- LCD_ShowString(0, 64, (u8 *)(tmp), GREEN);
|
|
|
+ LCD_ShowString(0, 48, (u8 *)(prs), CYAN);
|
|
|
+ LCD_ShowString(0, 64, (u8 *)(tmp), CYAN);
|
|
|
|
|
|
/* Device offset */
|
|
|
ut -= BMP180_SOLDERING_OFF_T;
|