📄 exec_func.c
字号:
GetOmoveAddr(CUSTOM_PARAMS,CUSTOM_PARAMS_COUNT,0x0004,&len,&moveAddr);
for(i=0;i<sizeof(cur_Sec);i++)
cur_Sec[i]=(MILEAGE_ACC_SEC+j)>>(8*(sizeof(cur_Sec)-i-1));
W25X32_WRITE(GetAddr(CUSTOM_PARAMS_SEC,moveAddr),len,cur_Sec);
}
}
*Addr=addr;
return TRUE;
}
*/
//=======================里程统计部分===========================
/********************************************************************************************************
** 函数名: CalcMil
** 功 能: 利用经纬度差来计算距离
** 输 入: x1,第一点的经度,y1,第一点纬度;x2,第二点的经度,y2,第二点纬度
** 返回值: 两点的距离
** 说 明: 经纬度是以度为单位的实数,为实际值×1000000
********************************************************************************************************/
float CalcMil(unsigned long X1,unsigned long Y1,unsigned long X2,unsigned long Y2)
{
#define PI 3.1415926
#define EARTH_RADIUS 6378137 //地球半径
float CurRadLong = 0; //两点经纬度的弧度
float CurRadLat = 0;
float PreRadLong = 0;
float PreRadLat = 0;
float a=0,b=0; //经纬度弧度差
float MilValue=0;
//将经纬度换算成弧度
CurRadLong = (float)(X1)/1000000.0;
CurRadLong = CurRadLong*PI/180.0;
PreRadLong = (float)(X2)/1000000.0 ;
PreRadLong = PreRadLong*PI/180.0;
CurRadLat = (float)(Y1)/1000000.0;
CurRadLat = CurRadLat*PI/180.0;
PreRadLat = (float)(Y2)/1000000.0 ;
PreRadLat = PreRadLat*PI/180.0;
//计算经纬度差值
if(CurRadLat>PreRadLat)
{
a = CurRadLat - PreRadLat ;
}
else
{
a = PreRadLat - CurRadLat;
}
if(CurRadLong>PreRadLong)
{
b = CurRadLong -PreRadLong ;
}
else
{
b = PreRadLong - CurRadLong;
}
MilValue = 2*(sqrt(sin(a/2.0)*sin(a/2.0)+cos(CurRadLat)*cos(PreRadLat)*sin(b/2.0)*sin(b/2.0)));
MilValue = (float)(EARTH_RADIUS*MilValue);
return(MilValue);
}
/*********************************************************************************************************
** 函数名称: PLL_CFG
** 函数功能: 重新连接PLL
** 入口参数: 无
** 出口参数: 无
*********************************************************************************************************/
void PLL_CFG(void)
{
if (PLLSTAT & (1 << 25))
{
PLLCON = 1; // PLL连接已经断开了,使能PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
}
PLLCON = 0; // PLL连接已经断开了,禁用PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
while (PLLSTAT & (3 << 24));
SCS = (SCS & 0x04) | 0x20; // 使能主振荡器,范围在1MHz~20MHz
while ((SCS & 0x40) == 0); // 等待主振荡器可用
CLKSRCSEL = 0x01; // 选择主振荡器为PLL的时钟源
PLLCFG = (((PLL_NValue) << 16) | (PLL_MValue));
PLLCON = 1;
PLLFEED = 0xAA; // 使能PLL,断开PLL连接
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 24)) == 0)); // 等待PLL稳定可用
CCLKCFG = CCLKDivValue;
while (((PLLSTAT & (1 << 26)) == 0)); // 查询PLL是否锁定
while (((PLLSTAT & 0x00007FFF) != PLL_MValue) && (((PLLSTAT & 0x00FF0000) >> 16) != PLL_NValue));
PLLCON = 3; // 连接PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 25)) != (1 << 25)));// 等待PLL锁定并连接
}
/*******************************************************************************
*功能:休眠省电模块
*******************************************************************************/
uint8 powerdown(uint16 *powerdown_cou,uint16 *acc_closetime)
{
uint16 dly=*powerdown_cou;
uint16 acc=*acc_closetime;
if(bl_powerdown==0)//判断是否处于休眠状态,不是则进入休眠
{
if(Get_ACCIN()==0)
{
acc++;
if(acc>=powerdown_settime)//ACC持续关时间是否满足中心设置时间
{
if(Comm_PowerDown()) //发送关闭模块指令(关闭GPRS通讯链路和GPS)将GPRS或CDMA的工作状态调整到短信状态
{
bl_powerdown=1; //置休眠标志
Connect_OK=FALSE;
ReConnect_OK=0;
acc=0;
}
}
}
else
{
acc=0;
bl_powerdown=0;
}
if((Connect_OK==TRUE)&&(ReConnect_OK==2))
{
if(dly<=90)
dly++;
if(dly==90) //延迟90秒(中心定位)
{
uint8 uiReviceBuf0[TRANSINFOLEN/2];
uint16 uiNum=0;
ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_UploadPlaceComm);
Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
uartWrite(UART2,uiReviceBuf0,uiNum,NULL);
OSTimeDly(10);
}
}
}
if(bl_powerdown==1) //已处于休眠状态时,判断是否需要重新激活
{
if(Get_ACCIN()>0||(bl_Warning==1)||(bl_DiaoDuMes==1))
{
bl_powerdown=0;
acc=0;
dly=0;
//GPRS开机
//P0_GPIOClr((1 << 24)); //输出低电平 开GPRS
//OSTimeDly(60); //300ms
P0_GPIOSet((1 << 24)); //输出高电平
OSTimeDly(60); //300ms
P0_GPIOClr((1 << 24)); //输出低电平 开GPRS
P0_GPIOSet((1 << 17)); //输出高电平//设置P0.17为低,开GPS模块
}
}
*powerdown_cou=dly;
*acc_closetime=acc;
return TRUE;
}
/*******************************************************************************
*功能:关GPS,发送休眠指令,关闭GPRS链接
*******************************************************************************/
uint8 Comm_PowerDown()
{
static char * GPRS_cmd[]={ "\r\nAT+AIPC=1\r\n\0", //关闭GPRS链路 //关闭链路1
"\r\nAT+CMGF=1\r\n\0", //短信状态
"\r\nAT+CNMI=1,1,0,0,1\r\n\0",
};
if((Connect_OK==TRUE)&&(ReConnect_OK==2))
{
uint8 uiReviceBuf0[TRANSINFOLEN/2];
uint16 uiNum=0;
//发送休眠数据包
ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_DormancyComm);
Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
uartWrite(UART2,uiReviceBuf0,uiNum,NULL);
OSTimeDlyHMSM(0,0,0,300);
uartWrite(UART2,(uint8 *)GPRS_cmd[2],strlen(GPRS_cmd[2]),NULL);
OSTimeDlyHMSM(0,0,0,300);
uartWrite(UART2,(uint8 *)GPRS_cmd[1],strlen(GPRS_cmd[1]),NULL);
OSTimeDlyHMSM(0,0,0,300);
uartWrite(UART2,(uint8 *)GPRS_cmd[0],strlen(GPRS_cmd[0]),NULL);
OSTimeDlyHMSM(0,0,0,300);
//GPRS关机
P0_GPIOSet((1 << 24)); //输出高电平 GPRS
OSTimeDly(200*3); //3S
P0_GPIOClr((1 << 24)); //输出低电平
P0_GPIOSet((1 << 17)); //输出高电平//设置P0.17为低,关GPS模块
return TRUE;
}
return FALSE;
}
/*******************************************************************************
*功能:关机省电模块
*******************************************************************************/
uint8 PowerOff(uint16 * poweroff_cou,uint16 *acc_closetime)
{
uint16 dly=*poweroff_cou;
uint16 acc=*acc_closetime;
if(bl_poweroff==0)//判断是否处于休眠状态,不是则进入休眠
{
if(Get_ACCIN()==0)
{
acc++;
if(acc>=poweroff_settime)//ACC持续关时间是否满足中心设置时间
{
bl_poweroff=1; //置休眠标志
acc=0;
}
}
else
{
acc=0;
bl_poweroff=0;
}
if((Connect_OK==TRUE)&&(ReConnect_OK==2))
{
if(dly<=90)
dly++;
if(dly==90) //延迟90秒(中心定位)
{
uint8 uiReviceBuf0[TRANSINFOLEN/2];
uint16 uiNum=0;
ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_UploadPlaceComm);
Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
uartWrite(UART2,uiReviceBuf0,uiNum,NULL);
OSTimeDly(10);
}
}
}
if(bl_poweroff==1)
{//需上传关机指令信息
if(bl_powerdown==1)
bl_powerdown=0;
if(Comm_PowerOff()) //发送关闭模块指令(关闭GPRS通讯链路和GPS)将GPRS或CDMA的工作状态调整到短信状态
{
Connect_OK=FALSE;
ReConnect_OK=0;
//RTC_InitDft2();
//PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // CPU进入掉电模式,此时CPU停止运行,只能通过外部中断或者RTC中断唤醒
/* 此时 CPU进入了掉电模式,等待RTC唤醒 */
/* CPU被RTC唤醒了之后,需要清除掉RTC增量中断标志,以便下次再次产生中断 */
//ILR = 0x02; // 清除RTC增量中断标志
//PCONP = 0x03BE;
PLL_CFG(); // 重新连接PLL,因为掉电后关闭了PLL
bl_poweroff=0; //激活后更新此关机标志。
acc=0;
dly=0;
//GPRS开机
//P0_GPIOClr((1 << 24)); //输出低电平 开GPRS
//OSTimeDly(60); //300ms
P0_GPIOSet((1 << 24)); //输出高电平
OSTimeDly(60); //300ms
P0_GPIOClr((1 << 24)); //输出低电平 开GPRS
P0_GPIOSet((1 << 17)); //输出高电平//设置P0.17为低,开GPS模块
}
}
*poweroff_cou=dly;
*acc_closetime=acc;
return TRUE;
}
uint8 Comm_PowerOff()
{
static char * GPRS_cmd[]={ "\r\nAT+AIPC=1\r\n\0", //关闭GPRS链路 //关闭链路1
"\r\nAT+CMGF=1\r\n\0", //短信状态
"\r\nAT+CNMI=1,1,0,0,1\r\n\0",
};
if((Connect_OK==TRUE)&&(ReConnect_OK==2))
{
uint8 uiReviceBuf0[TRANSINFOLEN/2];
uint16 uiNum=0;
//发送关机数据包
ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_ShutComm);
Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
uartWrite(UART2,uiReviceBuf0,uiNum,NULL);
OSTimeDlyHMSM(0,0,0,300);
uartWrite(UART2,(uint8 *)GPRS_cmd[0],strlen(GPRS_cmd[0]),NULL);
OSTimeDlyHMSM(0,0,0,300);
//GPRS关机
P0_GPIOSet((1 << 24)); //输出高电平 GPRS
OSTimeDly(200*3); //3S
P0_GPIOClr((1 << 24)); //输出低电平
P0_GPIOClr((1 << 17)); //输出低电平//设置P0.17为低,关GPS模块
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -