This commit is contained in:
Qiea
2024-12-19 14:06:05 +08:00
parent 1c0f3b676f
commit dcd484c1bd
58 changed files with 14859 additions and 863 deletions

119
HARDWARE/GPS/gps.c Normal file
View 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>
}

30
HARDWARE/GPS/gps.h Normal file
View File

@@ -0,0 +1,30 @@
#ifndef __GPS_H
#define __GPS_H
#include "sys.h"
// UTCʱ<43><CAB1><EFBFBD><EFBFBD>Ϣ
__packed typedef struct
{
u16 year; //<2F><><EFBFBD><EFBFBD>
u8 month; //<2F>·<EFBFBD>
u8 date; //<2F><><EFBFBD><EFBFBD>
u8 hour; //Сʱ
u8 min; //<2F><><EFBFBD><EFBFBD>
u8 sec; //<2F><><EFBFBD><EFBFBD>
}nmea_utc_time;
// NMEA 0183 Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>Žṹ<C5BD><E1B9B9>
__packed typedef struct
{
nmea_utc_time utc; // UTCʱ<43><CAB1>
}nmea_msg;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int NMEA_Str2num(u8 *buf,u8*dx);
void NMEA_GPRMC_Analysis(nmea_msg *gpsx, u8 *buf);
void GPS_Analysis(nmea_msg *gpsx, u8 *buf);
#endif