Newer
Older
BIRMM-GT200N / API.c
#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中读取采集液位数据
	}
}