/*******************************************************************************
|
* File Name : App.c
|
* Description :
|
* Created on : 2021Äê5ÔÂ07ÈÕ
|
* Author : www.hido-studio.com
|
*******************************************************************************/
|
|
/*******************************************************************************
|
* Include Files *
|
*******************************************************************************/
|
#include <string.h>
|
#include <math.h>
|
#include <stdio.h>
|
#include "App.h"
|
#include "stm32l0xx_hal.h"
|
#include "HIDO_Timer.h"
|
#include "Module.h"
|
#include "GPS.h"
|
#include "main.h"
|
#include "DBG.h"
|
#include "global_param.h"
|
#include "AIR780EDriver.h"
|
#include "Uart.h"
|
#include "Internet.h"
|
#include "HIDO_ATLite.h"
|
#include "UDPClient.h"
|
#include "global_param.h"
|
#include "SPIFlash.h"
|
#include "App.h"
|
#include "dw_driver.h"
|
#include "deca_device_api.h"
|
#include "dw_app.h"
|
#include "Lora.h"
|
#include "radio.h"
|
#include "DBG.h"
|
#include "WS2812.h"
|
#include "dw_mbx_tag.h"
|
/*******************************************************************************
|
* Macro *
|
*******************************************************************************/
|
|
/*******************************************************************************
|
* Type Definition *
|
*******************************************************************************/
|
|
/*******************************************************************************
|
* Local Variable *
|
*******************************************************************************/
|
static HIDO_BOOL l_bDismantle = HIDO_FALSE;
|
static HIDO_BOOL l_bCancelAlarm = HIDO_FALSE;
|
static HIDO_UINT32 l_u32DismantleAlarmTick = 0;
|
|
static HIDO_BOOL l_bCharge = HIDO_FALSE;
|
static HIDO_BOOL l_u32CancelChargeReport = HIDO_FALSE;
|
static HIDO_UINT32 l_u32ChargeTick = 0;
|
|
static HIDO_UINT32 l_u32LocationTick = 0;
|
extern ST_GPS l_stGPS;
|
extern uint32_t uwbled,gpsled,loraled,powerled;
|
uint8_t uwb_send[200]={0x55,0xaa};
|
void Uwb_Zubao_Poll();
|
extern IWDG_HandleTypeDef hiwdg;
|
/*******************************************************************************
|
* Local Function Declaration *
|
*******************************************************************************/
|
|
/*******************************************************************************
|
* Local Function *
|
*******************************************************************************/
|
char senddata[100];
|
void HexToAsciiSendUDP(uint8_t* data,u8 len)
|
{
|
|
u8 i,temp;
|
|
for(i=0;i<len;i++)
|
{
|
temp = *data++;
|
sprintf(&senddata[2*i],"%x",temp>>4);
|
sprintf(&senddata[2*i+1],"%x",temp&0xf);
|
}
|
senddata[2*len] = 0x0d;
|
senddata[2*len+1] = 0x0a;
|
// if(DBG_GetMode() == DBG_MODE_CFG)
|
// Uart_Send(0, (HIDO_UINT8 *) senddata, 2*len+2);
|
UDPClient_Uploadhex((uint8_t*)senddata,2*len+2);
|
}
|
extern uint8_t bat_percent;
|
uint8_t LBS_data[100]="$GNGGA,LBS,";
|
extern uint8_t fangchai_flag;
|
static HIDO_VOID LBSLocationCallback(ST_LBSLocation *_pstLBSLocation, HIDO_VOID *_pArg)
|
{ char LBS_dLon[16],LBS_dLat[16];
|
// Éϱ¨LBSλÖÃ
|
snprintf(LBS_dLon,sizeof(LBS_dLon),"%.8lf",_pstLBSLocation->m_dLon);
|
snprintf(LBS_dLat,sizeof(LBS_dLat),"%.8lf",_pstLBSLocation->m_dLat);
|
memcpy(&LBS_data[11],&LBS_dLon,12);
|
LBS_data[23]=0x2C;
|
memcpy(&LBS_data[24],&LBS_dLat,12);
|
|
HIDO_UINT32 u32Len = HIDO_UtilSnprintf((HIDO_CHAR *)LBS_data, sizeof(LBS_data), "%s,,,,,0,00,00.0,,,,,,*00,%X,%02x,%x,%d,%d,%d%\r\n",
|
LBS_data,g_com_map[DEV_ID], bat_percent,0,0,0,fangchai_flag);
|
Socket_Send(0, (HIDO_UINT8 *)LBS_data, u32Len);
|
// HexToAsciiSendUDP(LBS_data,u32Len);
|
// UDPClient_UploadGPS((char*)LBS_data);
|
}
|
extern UART_HandleTypeDef huart2;
|
uint8_t chongdian_only_one_flag;
|
void Stop_chongdian_Mode_Poll()
|
{
|
if(chongdian_only_one_flag==0)
|
{
|
chongdian_only_one_flag=1;
|
GPS_PowerOff();
|
HAL_UART_DeInit(&huart2);
|
GPIO_InitTypeDef GPIO_InitStruct = {0};//
|
GPIO_InitStruct.Pin = GPIO_PIN_4;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
|
// Radio.Sleep();
|
dwt_configuresleep(DWT_PRESRV_SLEEP | DWT_CONFIG, DWT_WAKE_CS | DWT_WAKE_WK| DWT_SLP_EN);
|
dwt_entersleep();
|
}
|
}
|
uint8_t only_one_flag;
|
void Stop_Mode_Poll()
|
{
|
if(only_one_flag==0)
|
{
|
only_one_flag=1;
|
GPS_PowerOff();
|
HAL_UART_DeInit(&huart2);
|
GPIO_InitTypeDef GPIO_InitStruct = {0};//
|
GPIO_InitStruct.Pin = GPIO_PIN_4;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
|
// Radio.Sleep();
|
dwt_configuresleep(DWT_PRESRV_SLEEP | DWT_CONFIG, DWT_WAKE_CS | DWT_WAKE_WK| DWT_SLP_EN);
|
dwt_entersleep();
|
}
|
}
|
extern uint16_t nomove_count;
|
extern uint8_t bat_percent;
|
extern uint8_t chargedbg_flag;
|
u8 power_state = 0,chargeon = 0;
|
uint8_t chongman_flag;
|
extern uint8_t bat_percent;
|
extern uint16_t heart_time;
|
extern uint8_t nomove_flag;
|
uint16_t qidong_time;
|
#define QIDONG_TIME 60 //1·ÖÖÓ
|
#define DENGDAI_TIME 30//90s
|
//#define STOP_TIME 600-DENGDAI_TIME-QIDONG_TIME//600s 10·ÖÖÓ
|
#define YUNDONG_UWB_TIME 1
|
#define YUNDONG_GPS4G_TIME 100
|
uint8_t GPS_data[200];
|
uint8_t GPS_successful_flag;
|
uint8_t fangchai_flag;
|
uint8_t fangchai_state;
|
extern uint16_t fangchai_time;
|
extern uint8_t taglist_num;
|
uint16_t tagseq;
|
extern uint16_t tagid_list[ANC_MAX_NUM],tagdist_list[ANC_MAX_NUM];
|
extern uint8_t tagbat_list[ANC_MAX_NUM];
|
extern TIM_HandleTypeDef htim3;
|
extern uint8_t beep_state;
|
//extern uint8_t air780_state;
|
extern uint16_t sleep_time;
|
uint8_t zuihoufasong_falg;
|
extern uint8_t receive1_gotosleep_flag;
|
extern uint8_t receive2_gotosleep_flag;
|
extern uint8_t receive3_gotosleep_flag;
|
extern uint8_t chongdian_time;
|
extern uint8_t input5vtime;
|
extern uint16_t work_time;
|
void PowerLedTask(void)
|
{
|
static u8 powerled_state=0;
|
if(HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin))
|
{
|
if(!power_state&&!chargedbg_flag)
|
{
|
DBG_SetMode(DBG_MODE_CHARGE);
|
power_state = 1;
|
}
|
while(HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin)&&DBG_GetMode() == DBG_MODE_CHARGE)
|
{
|
nomove_count = 0;
|
HAL_IWDG_Refresh(&hiwdg);
|
DBG_Poll();
|
IdleTask();
|
if(bat_percent>=100)
|
{
|
powerled = RED;
|
chongman_flag=1;
|
}
|
else
|
{
|
powerled = RED;
|
}
|
if(receive1_gotosleep_flag||receive2_gotosleep_flag)
|
{
|
if(receive1_gotosleep_flag)
|
{
|
uwbled=LEDOFF;
|
Stop_chongdian_Mode_Poll();
|
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
|
if(chongman_flag) //³äÂúµçÖØÆô£¬ÖØÆôÍâÉè¡£
|
{HAL_NVIC_SystemReset();}
|
}
|
if(receive2_gotosleep_flag)
|
{
|
uwbled=LEDOFF;
|
Stop_chongdian_Mode_Poll();
|
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
|
}
|
}
|
else
|
{
|
Internet_Poll();
|
HIDO_TimerPoll();
|
HIDO_ATLitePoll();
|
UDPClient_Poll();
|
GPS_Poll();
|
if(taglist_num>0)
|
{
|
if(work_time>=YUNDONG_UWB_TIME)
|
{
|
work_time=0;
|
Uwb_Zubao_Poll();
|
UDPClient_UploadGPS((char*)GPS_data);
|
HexToAsciiSendUDP(uwb_send,19+5*taglist_num);
|
taglist_num=0;
|
}
|
}
|
else
|
{
|
if(work_time>=g_com_map[GPS_HZ])
|
{
|
work_time=0;
|
if(GPS_successful_flag)
|
{
|
UDPClient_UploadGPS((char*)GPS_data);
|
}
|
else
|
{
|
Module_GetLBSLocationAsync(LBSLocationCallback, HIDO_NULL);
|
}
|
}
|
|
}
|
}
|
}
|
|
}
|
chongman_flag=0;
|
chargeon = 0;
|
if(power_state)
|
{
|
DBG_SetMode(DBG_MODE_SHELL);
|
power_state = 0;
|
}
|
if(!HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin))
|
{
|
chargedbg_flag = 0;
|
|
}
|
}
|
uint8_t imu_enable;
|
extern uint32_t dev_id;
|
void Program_Init(void)
|
{
|
float temp;
|
uint16_t temp2;
|
uint16_t i;
|
|
parameter_init();
|
// hardware_version = STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP);
|
// hardware_pici = STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP + 2);
|
// hardware_type = STMFLASH_ReadHalfWord(FLASH_HARDWARE_VERSION_MAP + 4);
|
//deca_sleep(1000);
|
|
g_com_map[GROUP_ID]=3;
|
g_com_map[VERSION] = (3<<8)|7;
|
|
if (g_com_map[COM_INTERVAL] <50)
|
{
|
g_com_map[COM_INTERVAL] = 100;
|
}
|
if (g_com_map[COM_INTERVAL] >1000)
|
{
|
g_com_map[COM_INTERVAL] = 1000;
|
}
|
if (g_com_map[IMU_THRES] > 10)
|
{
|
g_com_map[IMU_THRES] = 2;
|
}
|
if (g_com_map[POWERx] > MAX_RFPOWER)
|
{
|
g_com_map[POWERx] = MAX_RFPOWER;
|
}
|
if (g_com_map[POWERx] < 0)
|
{
|
g_com_map[POWERx] = 0;
|
}
|
if(g_com_map[STATIONARY_TIME] == 0xffff)
|
{
|
g_com_map[STATIONARY_TIME] = 10;
|
}
|
if(g_com_map[NEARBASE_ID2]>10000)
|
{
|
g_com_map[NEARBASE_ID2] = 0;
|
}
|
if(g_com_map[GPS_HZ]<180||g_com_map[GPS_HZ]>3600)
|
{
|
if(g_com_map[GPS_HZ]==1)
|
{g_com_map[GPS_HZ]=1;}
|
else
|
{g_com_map[GPS_HZ]=600;}
|
}
|
g_com_map[GPS_HZ]=1;
|
if(g_com_map[CHAICHUGPS_HZ]<180||g_com_map[CHAICHUGPS_HZ]>3600)
|
{
|
{g_com_map[CHAICHUGPS_HZ]=600;}
|
}
|
g_com_map[CHAICHUGPS_HZ]=1800;
|
if(g_com_map[NOMOVESLEEP_TIME]>120)
|
{
|
g_com_map[NOMOVESLEEP_TIME]=120;
|
}
|
// g_com_map[GPS_HZ]=120;
|
imu_enable=g_com_map[IMU_ENABLE];
|
// module_power = g_com_map[POWERx];
|
// imu_enable = g_com_map[IMU_ENABLE];
|
// motor_enable = g_com_map[MOTOR_ENABLE];
|
//g_com_map[COM_INTERVAL] = 100;
|
group_id = g_com_map[GROUP_ID];
|
dev_id = g_com_map[DEV_ID];
|
|
printf("É豸ID: %x .\r\n",dev_id);
|
printf("¹Ì¼þ°æ±¾: ÌúЬ¶¨Î» V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff);
|
printf("·þÎñÆ÷µØÖ·: %d.%d.%d.%d:%d.\r\n",g_com_map[IP_0],g_com_map[IP_1],g_com_map[IP_2],g_com_map[IP_3],g_com_map[PORT]);
|
printf("µ±Ç°Ô˶¯Ê±GPS¹¤×÷¼ä¸ô: %d .\r\n",g_com_map[GPS_HZ]);
|
printf("µ±Ç°±»²ðʱGPS¹¤×÷¼ä¸ô: %d .\r\n",g_com_map[CHAICHUGPS_HZ]);
|
// if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_TCP)
|
// { printf("TCP_RTCMģʽ,·þÎñÆ÷µØÖ·: %d.%d.%d.%d:%d.\r\n",g_com_map[TCP_IP_0],g_com_map[TCP_IP_1],g_com_map[TCP_IP_2],g_com_map[TCP_IP_3],g_com_map[TCP_PORT]);
|
// }else if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_NTRIP)
|
// {
|
//// sprintf((char *)&g_com_map[NTRIP_HOST_INDEX],"140.143.212.42");
|
//// g_com_map[NTRIP_PORT_INDEX] = 8005;
|
//// sprintf((char *)&g_com_map[NTRIP_USERNANME_INDEX],"test006");
|
//// sprintf((char *)&g_com_map[NTRIP_PASSWORD_INDEX],"hxzk20151102");
|
//// sprintf((char *)&g_com_map[NTRIP_SOURCENAME_INDEX],"RTCM32_GNSS2");
|
// printf("NtripHost:%s.\r\n",(char *)&g_com_map[NTRIP_HOST_INDEX]);
|
// printf("NtripPort:%d.\r\n",g_com_map[NTRIP_PORT_INDEX]);
|
// printf("NtripUsername:%s.\r\n",(char *)&g_com_map[NTRIP_USERNANME_INDEX]);
|
// printf("NtripPassword:%s.\r\n",(char *)&g_com_map[NTRIP_PASSWORD_INDEX]);
|
// printf("NtripSourcename:%s.\r\n",(char *)&g_com_map[NTRIP_SOURCENAME_INDEX]);
|
// }else if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_NONE)
|
// {
|
// printf("µ¥µã¶¨Î»Ä£Ê½Ä£Ê½. \r\n");
|
// }
|
}
|
|
void IdleTask(void)
|
{
|
// APLPollTask();
|
if(g_com_map[CNT_RESTART]==1)
|
{
|
g_com_map[CNT_RESTART]=0;
|
// printf("%s URTRestart",__debug_info__);
|
// URTRestart();
|
HAL_NVIC_SystemReset();
|
}
|
if(g_com_map[MAP_SIGN_INDEX]!=0x55AA||g_com_map[COM_INTERVAL]==0)
|
{
|
// printf("%s URTRestart",__debug_info__);
|
// URTRestart();
|
// // SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader
|
HAL_NVIC_SystemReset();
|
}
|
|
}
|
extern uint8_t jingzhiflag;
|
extern uint16_t testlorarecve;
|
void Uwb_Zubao_Poll()
|
{
|
|
for(u16 i=0;i<taglist_num-1;i++)
|
{
|
for(u16 j=0;j<taglist_num-1-i;j++)
|
{
|
if(tagdist_list[j]>tagdist_list[j+1])
|
{
|
u16 id,dist;
|
u8 bat;
|
id = tagid_list[j];
|
dist = tagdist_list[j];
|
bat = tagbat_list[j];
|
tagid_list[j] = tagid_list[j+1];
|
tagdist_list[j] = tagdist_list[j+1];
|
tagbat_list[j] = tagbat_list[j+1];
|
tagid_list[j+1] = id;
|
tagdist_list[j+1] = dist;
|
tagbat_list[j+1] = bat;
|
}
|
}
|
|
}
|
|
uint16_t state_flag;
|
u16 uwbchecksum;
|
state_flag=fangchai_flag<<4|jingzhiflag<<1;
|
if(taglist_num>8)
|
{taglist_num=8;}
|
uwb_send[2] = 0x12;//Õý³£Ä£Ê½
|
uwb_send[3] = 15+5*(taglist_num);//Êý¾Ý¶Î³¤¶È
|
memcpy(&uwb_send[4],&dev_id,2);
|
uwb_send[6] = tagseq;
|
uwb_send[7] = (tagseq++)>>8;
|
uwb_send[8] = bat_percent;
|
uwb_send[9] = state_flag;
|
memcpy(&uwb_send[10],&testlorarecve,2);
|
testlorarecve=0;
|
uwb_send[12] = 0;
|
uwb_send[13] = 0;
|
uwb_send[14] = 0;
|
uwb_send[15] = 0;
|
uwb_send[16] = taglist_num;
|
|
memcpy(&uwb_send[17],&tagid_list,2*taglist_num);
|
memcpy(&uwb_send[17+taglist_num*2],&tagdist_list,2*taglist_num);
|
memcpy(&uwb_send[17+taglist_num*4],&tagbat_list,taglist_num);
|
uwbchecksum = Checksum_u16(&uwb_send[2],15+5*taglist_num);
|
memcpy(&uwb_send[17+5*taglist_num],&uwbchecksum,2);
|
}
|
extern uint16_t testlorarecve;
|
void Main_Poll()
|
{
|
u16 uwbchecksum;
|
IdleTask();
|
HAL_IWDG_Refresh(&hiwdg);
|
if(bat_percent<=5)
|
{
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
|
}
|
if(HAL_GPIO_ReadPin(INPUT_5V_GPIO_Port,INPUT_5V_Pin))//5VÊäÈë¼ì²â
|
{
|
PowerLedTask();
|
DBG_Poll();
|
IdleTask();
|
}
|
else
|
{
|
if(chongdian_only_one_flag)//Èç¹û´Ó³äµçÐÝÃß״̬ͻȻ°Îµô³äµçÏߣ¬½øÈëÕý³£¹¤×÷ģʽ£¬ÒªÖØÆôÖØÐÂÆô¶¯4g gpsµÈÄ£¿é
|
{HAL_NVIC_SystemReset();}
|
// if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)) // É豸±»²ðж²ðжºóÿÃë·¢1´ÎXTB£¬Á¬Ðø·¢Îå´Î¡£ È»ºó10·ÖÖÓ·¢ËÍÒ»´Î¶¨Î»ÐÅÏ¢£¬ºÍXTB,ÆäËûʱºòÐÝÃß¡£
|
// {
|
// fangchai_flag=1;
|
// yundong_state=0;
|
// if(fangchai_state==0||fangchai_state==1)
|
// {
|
// GPS_Poll();
|
// Internet_Poll();
|
// HIDO_TimerPoll();
|
// HIDO_ATLitePoll();
|
// UDPClient_Poll();
|
// }
|
// if(fangchai_time>QIDONG_TIME&&fangchai_state==0)
|
// {
|
// fangchai_state=1;
|
// fangchai_time=0;
|
// if(GPS_successful_flag)
|
// {
|
// UDPClient_UploadGPS((char*)GPS_data);
|
// }
|
// else
|
// {
|
// Module_GetLBSLocationAsync(LBSLocationCallback, HIDO_NULL);
|
// }
|
// }
|
// if(fangchai_time>DENGDAI_TIME&&fangchai_state==1)
|
// {
|
// fangchai_time=0;
|
// fangchai_state=2;
|
// Stop_Mode_Poll();
|
// }
|
// if(fangchai_state==2)
|
// {
|
// HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
|
// }
|
// if(fangchai_time>g_com_map[CHAICHUGPS_HZ]-QIDONG_TIME-DENGDAI_TIME&&fangchai_state==2)
|
// {
|
// HAL_NVIC_SystemReset();
|
// }
|
// }
|
// else//É豸û±»²ðж
|
// {
|
if(receive3_gotosleep_flag)//ûÓд¦ÓÚ³äµç״̬&&ͬʱÔÚ¾²Ö¹ÐÝ״̬£¬ÊÕµ½ÉÏλ»úÒªÇóµÄÐÝÃß±ê־λ
|
{
|
Stop_Mode_Poll();
|
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
|
if(work_time>1200)
|
{HAL_NVIC_SystemReset();}///20·ÖÖÓºóÔÙ´ÎÆô¶¯¹¤×÷£¬Öظ´a²½Öè(±ÜÃâÌúЬ±»µÁÕÒ²»µ½)
|
}
|
else
|
{
|
GPS_Poll();
|
Internet_Poll();
|
HIDO_TimerPoll();
|
HIDO_ATLitePoll();
|
UDPClient_Poll();
|
// taglist_num=5;
|
if(taglist_num>0)
|
{
|
if(work_time>=YUNDONG_UWB_TIME)
|
{
|
work_time=0;
|
Uwb_Zubao_Poll();
|
UDPClient_UploadGPS((char*)GPS_data);
|
HexToAsciiSendUDP(uwb_send,19+5*taglist_num);
|
taglist_num=0;
|
}
|
}
|
else
|
{
|
if(work_time>=g_com_map[GPS_HZ])
|
{
|
work_time=0;
|
if(GPS_successful_flag)
|
{
|
UDPClient_UploadGPS((char*)GPS_data);
|
}
|
else
|
{
|
Module_GetLBSLocationAsync(LBSLocationCallback, HIDO_NULL);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
//*/
|
////ÒÔÉÏÊÇÔ´´úÂ룬±»²ð³ýʱ¼ä½ÓÐԹرÕ4G
|