init
This commit is contained in:
119
HARDWARE/GPS/gps.c
Normal file
119
HARDWARE/GPS/gps.c
Normal file
@@ -0,0 +1,119 @@
|
||||
#include "gps.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "math.h"
|
||||
|
||||
uint32_t UTC;
|
||||
char SetTimeZone[25] = {0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xf1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
|
||||
|
||||
u8 NMEA_Comma_Pos(u8 *buf, u8 cx)
|
||||
{
|
||||
u8 *p = buf;
|
||||
while (cx)
|
||||
{
|
||||
if (*buf == '*' || *buf < ' ' || *buf > 'z')
|
||||
return 0XFF; // <20><><EFBFBD><EFBFBD>'*'<27><><EFBFBD>߷Ƿ<DFB7><C7B7>ַ<EFBFBD>,<2C><EFBFBD><F2B2BBB4>ڵ<EFBFBD>cx<63><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (*buf == ',')
|
||||
cx--;
|
||||
buf++;
|
||||
}
|
||||
return buf - p;
|
||||
}
|
||||
|
||||
u32 NMEA_Pow(u8 m, u8 n)
|
||||
{
|
||||
u32 result = 1;
|
||||
while (n--)
|
||||
result *= m;
|
||||
return result;
|
||||
}
|
||||
|
||||
int NMEA_Str2num(u8 *buf, u8 *dx)
|
||||
{
|
||||
u8 *p = buf;
|
||||
u32 ires = 0, fres = 0;
|
||||
u8 ilen = 0, flen = 0, i;
|
||||
u8 mask = 0;
|
||||
int res;
|
||||
while (1) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
||||
{
|
||||
if (*p == '-')
|
||||
{
|
||||
mask |= 0X02;
|
||||
p++;
|
||||
} // <20>Ǹ<EFBFBD><C7B8><EFBFBD>
|
||||
if (*p == ',' || (*p == '*'))
|
||||
break; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (*p == '.')
|
||||
{
|
||||
mask |= 0X01;
|
||||
p++;
|
||||
} // <20><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else if (*p > '9' || (*p < '0')) // <20>зǷ<D0B7><C7B7>ַ<EFBFBD>
|
||||
{
|
||||
ilen = 0;
|
||||
flen = 0;
|
||||
break;
|
||||
}
|
||||
if (mask & 0X01)
|
||||
flen++;
|
||||
else
|
||||
ilen++;
|
||||
p++;
|
||||
}
|
||||
if (mask & 0X02)
|
||||
buf++; // ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for (i = 0; i < ilen; i++) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
ires += NMEA_Pow(10, ilen - 1 - i) * (buf[i] - '0');
|
||||
}
|
||||
if (flen > 5)
|
||||
flen = 5; // <20><><EFBFBD><EFBFBD>ȡ5λС<CEBB><D0A1>
|
||||
*dx = flen; // С<><D0A1><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
||||
for (i = 0; i < flen; i++) // <20>õ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
fres += NMEA_Pow(10, flen - 1 - i) * (buf[ilen + 1 + i] - '0');
|
||||
}
|
||||
res = ires * NMEA_Pow(10, flen) + fres;
|
||||
if (mask & 0X02)
|
||||
res = -res;
|
||||
return res;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>GPRMC<4D><43>Ϣ
|
||||
// gpsx: nmea<65><61>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
// buf: <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>GPS<50><53><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
void NMEA_GPRMC_Analysis(nmea_msg *gpsx, u8 *buf)
|
||||
{
|
||||
u8 *p1, dx;
|
||||
u8 posx;
|
||||
u32 temp;
|
||||
p1 = (u8 *)strstr((const char *)buf, "RMC"); // "$GPRMC", <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>&<26><>GPRMC<4D>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ֻ<EFBFBD>ж<EFBFBD>GPRMC.
|
||||
posx = NMEA_Comma_Pos(p1, 1); // <20>õ<EFBFBD>UTCʱ<43><CAB1>
|
||||
if (posx != 0XFF)
|
||||
{
|
||||
UTC = NMEA_Str2num(p1 + posx, &dx) / NMEA_Pow(10, dx);
|
||||
temp = (NMEA_Str2num(p1 + posx, &dx) / NMEA_Pow(10, dx)); // <20>õ<EFBFBD>UTCʱ<43><CAB1>, ȥ<><C8A5>ms
|
||||
|
||||
gpsx->utc.hour = temp / 10000 + 8; // UTCʱ<43><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
gpsx->utc.min = (temp / 100) % 100;
|
||||
gpsx->utc.sec = temp % 100;
|
||||
}
|
||||
|
||||
posx = NMEA_Comma_Pos(p1, 9); // <20>õ<EFBFBD>UTC<54><43><EFBFBD><EFBFBD>
|
||||
if (posx != 0XFF)
|
||||
{
|
||||
temp = NMEA_Str2num(p1 + posx, &dx); // <20>õ<EFBFBD>UTC<54><43><EFBFBD><EFBFBD>
|
||||
gpsx->utc.date = temp / 10000;
|
||||
gpsx->utc.month = (temp / 100) % 100;
|
||||
gpsx->utc.year = 2000 + temp % 100;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ȡNMEA-0183<38><33>Ϣ
|
||||
// gpsx: nmea<65><61>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
// buf: <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>GPS<50><53><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
void GPS_Analysis(nmea_msg *gpsx, u8 *buf)
|
||||
{
|
||||
NMEA_GPRMC_Analysis(gpsx, buf); // GPRMC<4D><43><EFBFBD><EFBFBD>
|
||||
}
|
||||
Reference in New Issue
Block a user