Files
SM-1000M/IAPV1.1/Driver/L76X/L76X.c
2026-04-23 10:50:18 +08:00

354 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "L76X.h"
#include "usart.h"
#include <math.h>
_SaveData Save_Data;
static const double pi = 3.14159265358979324;
static const double a = 6378245.0;
static const double ee = 0.00669342162296594323;
static const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
static double Lat_f,Lon_f;
void L76X_POWER_ON(void)
{
PWR_CTRLL76C_H;
}
void L76X_POWER_OFF(void)
{
PWR_CTRLL76C_L;
}
/******************************************************************************
function:
Latitude conversion
******************************************************************************/
static double transformLat(double x,double y)
{
double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 *sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;
ret += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;
return ret;
}
/******************************************************************************
function:
Longitude conversion
******************************************************************************/
static double transformLon(double x,double y)
{
double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));
ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;
ret += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;
ret += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;
return ret;
}
/******************************************************************************
function:
GCJ-02 international standard converted to Baidu map BD-09 standard
******************************************************************************/
static Coordinates bd_encrypt(Coordinates gg)
{
Coordinates bd;
double x = gg.Lon, y = gg.Lat;
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
bd.Lon = z * cos(theta) + 0.0065;
bd.Lat = z * sin(theta) + 0.006;
return bd;
}
/******************************************************************************
function:
GPS's WGS-84 standard is converted into GCJ-02 international standard
******************************************************************************/
static Coordinates transform(Coordinates gps)
{
Coordinates gg;
double sqrtMagic;
double dLat = transformLat(gps.Lon - 105.0, gps.Lat - 35.0);
double dLon = transformLon(gps.Lon - 105.0, gps.Lat - 35.0);
double radLat = gps.Lat / 180.0 * pi;
double magic = sin(radLat);
magic = 1 - ee * magic * magic;
sqrtMagic = sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);
gg.Lat = gps.Lat + dLat;
gg.Lon = gps.Lon + dLon;
return gg;
}
/******************************************************************************
function:
Convert GPS latitude and longitude into GPS84 coordinates
******************************************************************************/
Coordinates L76X_GPS84_Coordinates()
{
Coordinates temp;
temp.Lat =((int)(Lat_f)) + (Lat_f - ((int)(Lat_f)))*100 / 60;
temp.Lon =((int)(Lon_f)) + (Lon_f - ((int)(Lon_f)))*100 / 60;
// temp = transform(temp);
return temp;
}
/******************************************************************************
function:
Convert GPS latitude and longitude into Google Maps coordinates
******************************************************************************/
Coordinates L76X_Google_Coordinates()
{
Coordinates temp;
temp.Lat =((int)(Lat_f)) + (Lat_f - ((int)(Lat_f)))*100 / 60;
temp.Lon =((int)(Lon_f)) + (Lon_f - ((int)(Lon_f)))*100 / 60;
temp = transform(temp);
return temp;
}
/******************************************************************************
function:
Convert GPS latitude and longitude into Baidu map coordinates
******************************************************************************/
Coordinates L76X_Baidu_Coordinates()
{
Coordinates temp;
temp.Lat =((int)(Lat_f)) + (Lat_f - ((int)(Lat_f)))*100 / 60;
temp.Lon =(int)(Lon_f) + (Lon_f - ((int)(Lon_f)))*100 / 60;
temp = transform(temp);
temp = bd_encrypt(temp);
return temp;
}
/******************************************************************************
function:
Send a command to the L76XAutomatic calculation of the code
parameter:
data The end of the command ends with \0 or it will go wrong,
no need to increase the validation code.
******************************************************************************/
void L76X_Send_Command(char *data)
{
// char Check = data[1], Check_char[3]={0};
// u8 i = 0;
// //printf(" 1i = %d Check =%x \n", i, Check);
// for(i=2; data[i] != '\0'; i++){
// Check ^= data[i]; //Calculate the check value
// }
//printf(" i = %d Check =%x \n", i, Check);
// Check_char[0] = Temp[Check/16%16];
// Check_char[1] = Temp[Check%16];
// Check_char[2] = '\0';
// DEV_Uart_SendString(data);
// DEV_Uart_SendByte('*');
// DEV_Uart_SendString(Check_char);
// DEV_Uart_SendByte('\r');
// DEV_Uart_SendByte('\n');
}
/**************清除GPS数据***********************/
void L76X_Sturct_Clear(void)
{
memset(Save_Data.GPS_Buffer,0,GPS_Buffer_Length-1) ;
Save_Data.isGetData=0;
Save_Data.isParseData=0;
memset(Save_Data.UTCTime,0,UTCTime_Length) ;
memset(Save_Data.latitude,0,latitude_Length) ;
memset(Save_Data.N_S,0,N_S_Length) ;
memset(Save_Data.longitude,0,longitude_Length) ;
memset(Save_Data.E_W,0,E_W_Length) ;
Save_Data.isUsefull=0;
}
void parseGpsBuffer(void)
{
char *subString;
char *subStringNext;
char i = 0;
char TempBuffer[10];
char temp_time;
if (Save_Data.isGetData)
{
Save_Data.isGetData = false;
for (i = 0 ; i <= 9 ; i++)
{
if (i == 0)
{
if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
;//解析错误
}
else
{
subString++;
if ((subStringNext = strstr(subString, ",")) != NULL)
{
char usefullBuffer[2];
char spdBuffer[10];
char cogBuffer[10];
switch(i)
{
case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break; //获取UTC时间
case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break; //获取UTC时间
case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break; //获取纬度信息
case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break; //获取N/S
case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break; //获取经度信息
case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break; //获取E/W
case 7:memcpy(spdBuffer, subString, subStringNext - subString);break; //获取E/W
case 8:memcpy(cogBuffer, subString, subStringNext - subString);break; //获取E/W
case 9:memcpy(Save_Data.UTCData, subString, subStringNext - subString);break; //获取E/W
default:break;
}
subString = subStringNext;
Save_Data.isParseData = true;
if((usefullBuffer[0] == 'A')&(Save_Data.UTCData[0]!=0))
{
Save_Data.isUsefull = true;
}
else if(usefullBuffer[0] == 'V')
Save_Data.isUsefull = false;
}
else
{
//解析错误
}
Lat_f=(Save_Data.latitude[0]-'0')*10000000.0+(Save_Data.latitude[1]-'0')*1000000.0+(Save_Data.latitude[2]-'0')*100000.0+(Save_Data.latitude[3]-'0')*10000.0+(Save_Data.latitude[5]-'0')*1000.0
+(Save_Data.latitude[6]-'0')*100.0+(Save_Data.latitude[7]-'0')*10.0+(Save_Data.latitude[8]-'0')*1.0;
Lon_f=(Save_Data.longitude[0]-'0')*100000000.0+(Save_Data.longitude[1]-'0')*10000000.0+(Save_Data.longitude[2]-'0')*1000000.0+(Save_Data.longitude[3]-'0')*100000.0+(Save_Data.longitude[4]-'0')*10000.0
+(Save_Data.longitude[6]-'0')*1000.0+(Save_Data.longitude[7]-'0')*100.0+(Save_Data.longitude[8]-'0')*10.0+(Save_Data.longitude[9]-'0')*1.0;
Lat_f=Lat_f/1000000.0;
Lon_f=Lon_f/1000000.0;
}
}
}
//转换日期
memset(TempBuffer,0,10);
TempBuffer[0] = Save_Data.UTCData[4];
TempBuffer[1] = Save_Data.UTCData[5];
TempBuffer[2] = '-';
TempBuffer[3] = Save_Data.UTCData[2];
TempBuffer[4] = Save_Data.UTCData[3];
TempBuffer[5] = '-';
TempBuffer[6] = Save_Data.UTCData[0];
TempBuffer[7] = Save_Data.UTCData[1];
memcpy(Save_Data.UTCData,TempBuffer,strlen(TempBuffer));
memset(TempBuffer,0,10);
//转换时间
temp_time=(Save_Data.UTCTime[0]-'0')*10+(Save_Data.UTCTime[1]-'0')+8;
Save_Data.UTCTime[0]=(char)((temp_time/10)+'0');
Save_Data.UTCTime[1]=(char)((temp_time%10)+'0');
TempBuffer[0] = Save_Data.UTCTime[0];
TempBuffer[1] = Save_Data.UTCTime[1];
TempBuffer[2] = ':';
TempBuffer[3] = Save_Data.UTCTime[2];
TempBuffer[4] = Save_Data.UTCTime[3];
TempBuffer[5] = ':';
TempBuffer[6] = Save_Data.UTCTime[4];
TempBuffer[7] = Save_Data.UTCTime[5];
memset(Save_Data.UTCTime,0,UTCTime_Length);
memcpy(Save_Data.UTCTime,TempBuffer,strlen(TempBuffer));
memset(TempBuffer,0,10);
}
void printGpsBuffer(void)
{
int i=0;
//输出UTC时间
if (Save_Data.isParseData)
{
i=0;
Save_Data.isParseData = false;
printf("Save_Data.UTCTime = ");
while(Save_Data.UTCTime[i] != 0)
{
printf("%c",Save_Data.UTCTime[i]);
i++;
}
printf("\r\n");
//如果定位可用,输出定位信息
if(Save_Data.isUsefull)
{
Save_Data.isUsefull = false;
i=0;
printf("Save_Data.latitude = ");
while(Save_Data.latitude[i] != 0)
{
printf("%c",Save_Data.latitude[i]);
i++;
}
printf("\r\n");
i=0;
printf("Save_Data.N_S = ");
printf("%c",Save_Data.N_S[0]);
printf("%c",Save_Data.N_S[1]);
printf("\r\n");
i=0;
printf("Save_Data.longitude = ");
while(Save_Data.longitude[i]!=0)
{
printf("%c",Save_Data.longitude[i]);
i++;
}
printf("\r\n");
printf("Save_Data.E_W = ");
printf("%c",Save_Data.E_W[0]);
printf("%c",Save_Data.E_W[1]);
printf("\r\n");
}
else
{
printf("GPS DATA is not usefull!\r\n");
}
}
}
void L76C_Process(void)
{
u8 times=0;
Coordinates GPS;
Save_Data.Flag_finish_gnss=0;
while(times<35)
{
//等待GPS信号
delay_ms(1000);
if(Save_Data.isGetData)
parseGpsBuffer();
times++;
if(Save_Data.isUsefull)
{
GPS=L76X_GPS84_Coordinates();
times=61;
}
else
{
GPS.Lat=0.0;
GPS.Lon=0.0;
}
// Set_GNSSTIME_Rtc();//RTC校准
}
//GPS=L76X_GPS84_Coordinates();
sprintf(data_common1.GPS_DATA,"%.7f%c%s%c%.7f%c%s%c",GPS.Lat,',',Save_Data.N_S,',', GPS.Lon,',',Save_Data.E_W,',');//经纬度
L76X_Sturct_Clear();
USART_DeInit(USART1);
Save_Data.Flag_finish_gnss=1;
}