#include "API.h" #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "gsdk_api.h" #include "gsdk_sdk.h" #include "rtc.h" #include "gprs.h" #include "NB-IOT.h" #include "bsp_ds2782.h" #include "TEA.h" #include "gsdk_ril.h" #include "gsdk_ril_cmds.h" #include "flash.h" extern struct DeviceSet DeviceConfig; extern struct BusinessData businessData; extern uint8_t history_send_buff[300]; /******************************************************************************* * Function Name : XX * Description : 初始化一些配置参数 * Input : None * Output : None * Return : None *******************************************************************************/ void ConfigData_Init(void) { uint16_t Temp = 0; uint8_t length = 0; uint8_t i; uint8_t DotCounter = 0; //分隔符计数器 struct Config_RegPara ConfigData = {0x00}; //定义的下发配置参数,HEX格式 printf("\r\nConfigData_Init start...\r\n"); //测试使用 Module_Flash_Read(CollectedDateCount_ADDR, &(businessData.DataCount), 1); //从Flash中读取采集液位个数 if (businessData.DataCount > 15) //设备发生外部复位 { businessData.DataCount = 0; Module_Flash_Write(CollectedDateCount_ADDR - FLASH_TEST_BASE, &(businessData.DataCount), 1); } printf("\n\r businessData.DataCount:%d \r\n", businessData.DataCount); Module_Flash_Read(CollectedDate_ADDR, (uint8_t *)&(businessData.CollectData), businessData.DataCount * 4); //从Flash中读取采集液位数据 Module_Flash_Read(HistoryDateCount_ADDR, &(businessData.HistoryDateCount), 1); //从Flash中读取历史数据长度 Module_Flash_Read(SendCount_ADDR, &(businessData.SendCount), 1); //从Flash中读取未发送的次数 Module_Flash_Read(ParameterReply_ADDR, &(businessData.ParameterReply), 1); //从Flash中读取参数配置回复 printf("\r\n-SendCount:-%d---.\r\n", businessData.SendCount); //测试使用 printf("\r\n-ParameterReply:-%d---.\r\n", businessData.ParameterReply); //测试使用 printf("\r\n-HistoryDateCount:-%d---.\r\n", businessData.HistoryDateCount); //测试使用 if(businessData.HistoryDateCount > 250) { businessData.HistoryDateCount = 0; Module_Flash_Write(HistoryDateCount_ADDR - FLASH_TEST_BASE, &(businessData.HistoryDateCount), 1); } else if(businessData.HistoryDateCount>0) { Module_Flash_Read(HistoryDate_ADDR, history_send_buff, businessData.HistoryDateCount); //从Flash中读取历史数据 } for(i = 0; i < businessData.DataCount; i++) { printf("%.2x ", businessData.CollectData[i][0]); printf("%.2x ", businessData.CollectData[i][1]); printf("%.2x ", businessData.CollectData[i][2]); printf("%.2x ", businessData.CollectData[i][3]); } Module_Flash_Read(StartTime_ADDR, businessData.StartTime, 5); //从Flash中读取采集时间 printf("**************第一次采集时间:%d-%d-%d %d:%d***********\r\n", businessData.StartTime[0] + 2000, businessData.StartTime[1], //测试使用 businessData.StartTime[2], businessData.StartTime[3], businessData.StartTime[4]); //测试使用 //////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(CollectPeriod_ADDR, ConfigData.CollectPeriod_Byte, 2); //从Flash中读取采集间隔 Temp = ConfigData.CollectPeriod_Byte[1] * 256 + ConfigData.CollectPeriod_Byte[0]; //低地址对应低字节 if((Temp > 0) && (Temp <= 96)) { DeviceConfig.CollectPeriod = Temp; } else { DeviceConfig.CollectPeriod = 60; //默认配置,每隔60分钟采集一次数据。 } printf("\r\n-CollectPeriod:-%2d---.\r\n", DeviceConfig.CollectPeriod ); //测试使用 ////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(CollectNum_ADDR, ConfigData.CollectNum_Byte, 2); //从Flash中读取采集次数 Temp = ConfigData.CollectNum_Byte[1] * 256 + ConfigData.CollectNum_Byte[0]; //低地址对应低字节 // Temp = 1; if((Temp > 0) && (Temp <= 24)) //每次数据上报最多采集15组数据 { DeviceConfig.CollectNum = Temp; } else { DeviceConfig.CollectNum = 12; //默认配置,每次数据上报采集12组数据。 } printf("\r\n-CollectNum:-%2d---.\r\n", DeviceConfig.CollectNum ); //测试使用 //////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(UploadCycle_ADDR, ConfigData.UploadCycle_Byte, 2); //从Flash中读取上报周期 Temp = ConfigData.UploadCycle_Byte[1] * 256 + ConfigData.UploadCycle_Byte[0]; if((Temp > 0) && (Temp <= 1440)) { DeviceConfig.UploadCycle = Temp; } else { DeviceConfig.UploadCycle = 60; //默认配置,数据上报周期为24小时,即每天上传1次数据。 } printf("\r\n-UploadCycle:-%2d---.\r\n", DeviceConfig.UploadCycle ); //测试使用 //////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(CollectTime_ADDR, ConfigData.CollectTime_Byte, 2); //从Flash中读取采集时间 Temp = ConfigData.CollectTime_Byte[1] * 256 + ConfigData.CollectTime_Byte[0]; //低地址对应低字节 if((Temp > 0) && (Temp <= 1440)) //限制采集时间范围为0-1440分钟 { DeviceConfig.CollectTime = Temp; } else { DeviceConfig.CollectTime = 60; //默认配置,凌晨1点开始采数。 } printf("\r\n-CollectTime:-%2d---.\r\n", DeviceConfig.CollectTime ); //测试使用 //////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(MountHeight_ADDR, ConfigData.MountHeight.Data_Hex, 4); //从Flash中读取低浓度报警阈值 if((ConfigData.MountHeight.Data_Float >= 0) && (ConfigData.MountHeight.Data_Float <= 100)) //限制低浓度报警阈值为0-100 { DeviceConfig.MountHeight.Data_Float = ConfigData.MountHeight.Data_Float; } else { DeviceConfig.MountHeight.Data_Float = 0; //默认配置,0。 } printf("\r\n-MountHeight:-%f---.\r\n", DeviceConfig.MountHeight.Data_Float ); //测试使用 //////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(AlarmValue_ADDR, ConfigData.AlarmValue.Data_Hex, 4); //从Flash中读取高浓度报警阈值 if((ConfigData.AlarmValue.Data_Float >= 0) && (ConfigData.AlarmValue.Data_Float <= 100)) //限制高浓度报警阈值为0-100 { DeviceConfig.AlarmValue.Data_Float = ConfigData.AlarmValue.Data_Float; } else { DeviceConfig.AlarmValue.Data_Float = 0; //默认配置,0。 } printf("\r\n-AlarmValue:-%f---.\r\n", DeviceConfig.AlarmValue.Data_Float ); //测试使用 ///////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(RetryNum_ADDR, &ConfigData.RetryNumSet, 1); //从Flash中读取采集重传次数 Temp = ConfigData.RetryNumSet; if((Temp > 0) && (Temp <= 10)) //重传次数上限为10 { DeviceConfig.RetryNum = Temp; } else { DeviceConfig.RetryNum = 3; //默认配置,数据丢失或者出错时最多重试3次。 } printf("\r\n-RetryNum:-%d---.\r\n", DeviceConfig.RetryNum ); //测试使用 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(ServerIP_ADDR, (uint8_t *)ConfigData.SMS_Set_ServerIP, 15); //从Flash中读取IP地址 for(Temp = 0; Temp < 15;) { if(((ConfigData.SMS_Set_ServerIP[Temp] >= '0') && (ConfigData.SMS_Set_ServerIP[Temp] <= '9')) || (ConfigData.SMS_Set_ServerIP[Temp] == '.')) { Temp++; if(ConfigData.SMS_Set_ServerIP[Temp] == '.')DotCounter++; } else { break; } } length = Temp; if((length >= 7) && (DotCounter == 3)) //对IP地址合法性做初步筛选,后续有待完善 { memcpy(DeviceConfig.ServerIP, ConfigData.SMS_Set_ServerIP, length); } else { memcpy(DeviceConfig.ServerIP, IPNET_MAIN, strlen(IPNET_MAIN)); //读取数据无效时,初始化服务器IP Module_Flash_Write(ServerIP_ADDR - FLASH_TEST_BASE, (uint8_t*)IPNET_MAIN, strlen(IPNET_MAIN)); } printf("\n\r<**********Data Upload Server IP: %s ********>\r\n", DeviceConfig.ServerIP); //测试使用 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Module_Flash_Read(ServerPort_ADDR, ConfigData.SMS_Set_ServerPort, 2); //从Flash中读取服务器端口号 Temp = ConfigData.SMS_Set_ServerPort[1] * 256 + ConfigData.SMS_Set_ServerPort[0]; //低地址对应低字节 if((Temp > 0) && (Temp < 65535)) //限制采集时间范围为0-65535分钟 { DeviceConfig.ServerPort = Temp; } else { DeviceConfig.ServerPort = PORTNUM_MAIN; //读取数据无效时,初始化服务器端口号 Module_Flash_Write(ServerPort_ADDR - FLASH_TEST_BASE, (uint8_t*) & (DeviceConfig.ServerPort), 2); } printf("\n\r<**********Data Upload Server Port: %d **************>\r\n", DeviceConfig.ServerPort); //测试使用 if(DeviceConfig.CollectNum > 24) { DeviceConfig.CollectNum = 12; //由于数据发送以及数据存储空间的限制,数据采集次数必须限制在5以内 } DeviceConfig.BatteryCapacity = 0x64; //电池电量,暂定为100% } /******************************************************************************* * Function Name : XX * Description : XX * Input : None * Output : None * Return : None *******************************************************************************/ void Level_DataCollect(void) { uint8_t i = 0; //测试使用 union Hfloat levelData; i = businessData.DataCount; levelData.Data_Float = Gas_DataGet(); if(levelData.Data_Float <= 100) { businessData.Level_Float = levelData.Data_Float; for(uint16_t j = 0; j < 4; j++) { businessData.Level_Date[i].Data_Hex[j] = levelData.Data_Hex[j]; businessData.CollectData[i][j] = levelData.Data_Hex[j]; } if(i == 0) { businessData.CollectTime[i] = (DeviceConfig.Time_Hour) * 60 + (DeviceConfig.Time_Min); //第一组数据采集时间 businessData.StartTime[0] = DeviceConfig.Time_Year; businessData.StartTime[1] = DeviceConfig.Time_Mon; businessData.StartTime[2] = DeviceConfig.Time_Mday; businessData.StartTime[3] = DeviceConfig.Time_Hour; businessData.StartTime[4] = DeviceConfig.Time_Min; Module_Flash_Write(StartTime_ADDR - FLASH_TEST_BASE, (uint8_t*) & (businessData.StartTime), 5); } else { businessData.CollectTime[i] = (businessData.CollectTime[i - 1]) + DeviceConfig.CollectPeriod; //后续每组数据采集时间为在前一组数据基础上增加采集间隔 } businessData.DataCount = (businessData.DataCount) + 1; } } /******************************************************************************* * Function Name : BusinessData_Collection * Description : 业务数据采集 * Input : none * Output : none * Return : none *******************************************************************************/ void BusinessData_Collection(void) { if(businessData.DataCount < DeviceConfig.CollectNum) { Level_DataCollect(); } } /******************************************************************************* * Function Name : BusinessData_Storage * Description : 业务数据存储 * Input : none * Output : none * Return : none *******************************************************************************/ void BusinessData_Storage(void) { if(businessData.DataCount <= DeviceConfig.CollectNum) { Module_Flash_Write(CollectedDateCount_ADDR - FLASH_TEST_BASE, &(businessData.DataCount), 1); Module_Flash_Write(CollectedDate_ADDR - FLASH_TEST_BASE, (uint8_t *)&(businessData.CollectData), businessData.DataCount * 4); //从Flash中读取采集液位数据 } }