Newer
Older
BIRMM-GT200N / main.c
/*******************************************************************************
  * @file    main.c
  * @author  casic 203
  * @version V1.0
  * @date    2019-06-14
  * @brief
  * @attention
*********************************************************************************/

#include "string.h"
#include "gprs.h"
#include "rtc.h"
#include "AiderProtocol.h"
#include "API.h"
#include "sleep.h"
#include "math.h"
#include "NB-IOT.h"
#include "flash.h"

#include "gsdk_sdk.h"
#include <stdio.h>
#include <stdlib.h>
#include "gsdk_api.h"

struct    DeviceSet       DeviceConfig = {0x00}; //配置信息结构体
struct    Config_RegPara  ConfigData   = {0x00}; //定义的下发配置参数,HEX格式,方便在系统进入休眠模式之前写入BKP寄存器
struct    BusinessData    businessData;
struct 	  DataFrame       dataFrame;

uint8_t        DeviceID[] = DEVICE_ID; //初始化设备ID号
uint16_t       NodeAddr =0x0000;
uint8_t        RouteControl =0x03; //路由控制变量,默认使用数据集中器进行数据传输
uint8_t        send_buff[300]= {'\0'};      
uint8_t        history_send_buff[300]= {'\0'};      
double  	   GASData=200;
uint16_t	   ACR;

static gsdk_handle_t g_huart;
char  TestReceiveBuff[300];

gsdk_handle_t hgpio;

double Gas_DataGet(void);
extern uint8_t SIMCard_Type;

uint8_t        PD2_Flag = 0;//跳帽标志,1:往203所平台传三码 

int __io_puts(char *data, int len)
{
	int ret = 0;
	if (g_huart)
	{
		ret = gsdk_uart_write(g_huart, (uint8_t *)data, len, 1000);
	}
	return ret;
}

int log_init(void)
{
	uart_config_t uart_config;
	gsdk_status_t status;

	uart_config.baudrate    = UART_BAUDRATE_115200;
	uart_config.parity      = UART_PARITY_NONE;
	uart_config.stop_bit    = UART_STOP_BIT_1;
	uart_config.word_length = UART_WORD_LENGTH_8;

	status = gsdk_uart_open(UART_0, &uart_config, &g_huart);
	if (status != GSDK_SUCCESS)
	{
		gsdk_syslog_printf("[GPIO_DEMO]: failed to open uart %d\n", status);
		return -1;
	}
	return 0;
}

/*******************************************************************************
* Function Name  : XX
* Description    : XX
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint8_t Gpio_Init(void)
{
	gsdk_status_t status;
	gpio_config_t gpio_config;
	gpio_pin_t    gpio_pin;

	gpio_pin = GPIO_PIN_9;

	gpio_config.direction     = GPIO_DIRECTION_OUTPUT;
	gpio_config.pull          = GPIO_PULL_NONE;
	gpio_config.int_mode      = GPIO_INT_DISABLE;
	gpio_config.debounce_time = 0;
	gpio_config.callback      = NULL;

	status = gsdk_gpio_open(gpio_pin, &gpio_config, &hgpio);
	if (status != GSDK_SUCCESS)
	{
		goto _fail;
	}

	return 0;

_fail:
	gsdk_gpio_close(hgpio);
	printf("[GPIO_DEMO] Gpio test failed!\n");
	return -1;
}

void gpio_callback(void *user_data)
{
	printf("[GPIO_DEMO] gpio eint handle callback!\n");
}

/*******************************************************************************
* Function Name  : void PeripheralInit(void)
* Description    : 初始化端口及外设
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint8_t PeripheralInit(void)
{
	uint8_t Boot_Mode_Flag = 0;
    uint8_t count = 0;
	uint8_t       RunCount = 0;

	Gpio_Init();
	log_init();
	gsdk_gpio_write(hgpio, GPIO_DATA_HIGH);//打开燃气探头电源
	Boot_Mode_Flag = Get_Boot_Mode();	
	bsp_Init_DS2782();
	gsdk_ril_init();
	
	Module_Flash_Read(RUN_COUNT_ADDR, &RunCount, 1);                       //从Flash中读取采集液位个数
	if (RunCount > 24)          //设备发生外部复位
	{
		RunCount = 0;
		Module_Flash_Write(RUN_COUNT_ADDR - FLASH_TEST_BASE, &RunCount, 1);
	}
	else if (RunCount == 24)
	{
		RunCount = 0;
		Module_Flash_Write(RUN_COUNT_ADDR - FLASH_TEST_BASE, &RunCount, 1);
		gsdk_ril_set_hardware_reboot();//重启模块		
	}	
	else
	{
		RunCount++;
		Module_Flash_Write(RUN_COUNT_ADDR - FLASH_TEST_BASE, &RunCount, 1);		
	}
	printf("\n\r RunCount:%d \r\n", RunCount);	
	
	gsdk_ril_set_ip_mode(IPV4);	
	gsdk_ril_set_cfun_mode(1);  // 设置模块的电话功能为1 - 全功能
	while (1)
	{
		if (count > 6)
		{
			break;
		}
		vTaskDelay(500 / portTICK_PERIOD_MS);
		count++;
	}
//	vTaskDelay(300);
	RTC_Init(); //获取系统当前时间

	printf("\n\r****************************************************************\r\n");
	printf("\n\r*-----欢迎使用BIRMM-GT200N 燃气智能监测管盯!---------------*\r\n");
	printf("\n\r*-----软件版本号:%s ------------------------*\r\n", SOFTWARE_VERSION);
	printf("\n\r*-----设备编号:%.2x-%.2x-%.2x%.2x-%.2x%.2x---------------------------*\r\n", DeviceID[0], DeviceID[1], DeviceID[2], DeviceID[3], DeviceID[4], DeviceID[5]);
	printf("\n\r*-----版权所有:北京无线电计量测试研究所------------------*\r\n");
	printf("\n\r****************************************************************\r\n");

	return Boot_Mode_Flag;
}

/*******************************************************************************
* Function Name  : int main(void)
* Description    : 主函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
	uint16_t Boot_Mode_Flag, StartupResponse_Flag;

	Boot_Mode_Flag = PeripheralInit(); //初始化外设
	ConfigData_Init();             //从FLASH读取配置参数
	
//	DeviceConfig.CollectPeriod = 1;
	
/*	Module_DS2781_Set_Register();
	vTaskDelay(100);
	
		while(1)
	{
			printf("\n\r*-----设备编号:%.2x-%.2x-%.2x%.2x-%.2x%.2x---------------------------*\r\n", DeviceID[0], DeviceID[1], DeviceID[2], DeviceID[3], DeviceID[4], DeviceID[5]);

		printf("\r\n Get_DS2782_Temperature() is : %d \r\n", Get_DS2782_Temperature());
			printf("\r\n Get_DS2782_RARC() is : %d \r\n", Get_DS2782_RARC());
	printf("\r\n Get_DS2782_Current() is : %d \r\n", Get_DS2782_Current());
	printf("\r\n Get_DS2782_Voltage() is : %d \r\n", Get_DS2782_Voltage());	
	ACR = Get_DS2782_ACR(); //电池电量
	printf("\r\n Get_DS2782_ACR() is : %d \r\n", ACR);
		printf("\r\n Get_DS2782_RAAC() is : %d \r\n", Get_DS2782_RAAC());
		printf("\r\n Get_DS2782_RSAC() is : %d \r\n", Get_DS2782_RSAC());
		printf("\r\n Get_DS2782_RSRC() is : %d \r\n", Get_DS2782_RSRC());

		vTaskDelay(100);
	}*/

	//如果检测到掉电,上传三码
	if(Boot_Mode_Flag == 2)
	{
//		RTC_Timing(1);
		PD2_Flag = 1;
		Module_DS2781_Set_Register();
		businessData.HistoryDateCount = 0;
		Module_Flash_Write(HistoryDateCount_ADDR - FLASH_TEST_BASE, &(businessData.HistoryDateCount), 1);
		businessData.SendCount = 0;
		Module_Flash_Write(SendCount_ADDR - FLASH_TEST_BASE, &(businessData.SendCount), 1);		
		businessData.ParameterReply = 0;
		Module_Flash_Write(ParameterReply_ADDR - FLASH_TEST_BASE, &(businessData.ParameterReply), 1);		
		Code_Read_NB();
		StartupResponse_Flag = StartupRequest(send_buff,8);//数据组帧上传
		if(StartupResponse_Flag==0x099C) printf("\r\n IMEI ICCID 上报成功!!\r\n");
		else printf("\r\n IMEI ICCID 上报失败!!\r\n");
		gsdk_ril_set_hardware_reboot();//重启模块
	}
	else if(Boot_Mode_Flag == 3)
	{
		gotoSleep(DeviceConfig.CollectPeriod);//休眠一个采集周期
	}
	
	if(businessData.SendCount>0) //发送历史数据
	{
		Code_Read_NB();
		
		if(SIMCard_Type == 1)         //电信NB,发送到IOT平台
		{
			SendMessage_NB_T(history_send_buff, businessData.HistoryDateCount);
		}
		else if(SIMCard_Type == 0)                    //移动、联通NB,直接发送到后台服务器
		{
			SendMessage_NB_MU(history_send_buff, businessData.HistoryDateCount);
		}
		else
		{
			printf("\r\n ===========SIM卡异常,无法发数!===========!!\r\n");
		}
		businessData.DataCount = 0;
		Module_Flash_Write(CollectedDateCount_ADDR - FLASH_TEST_BASE, &(businessData.DataCount), 1);
		businessData.SendCount = 0;
		Module_Flash_Write(SendCount_ADDR - FLASH_TEST_BASE, &(businessData.SendCount), 1);
		gsdk_ril_set_hardware_reboot();//重启模块
	}
	
	if(businessData.ParameterReply>0) //发送历史数据
	{
		Code_Read_NB();		
		StartupRequest(send_buff,12);//参数配置回复上传
		businessData.ParameterReply = 0;
		Module_Flash_Write(ParameterReply_ADDR - FLASH_TEST_BASE, &(businessData.ParameterReply), 1);
		gsdk_ril_set_hardware_reboot();//重启模块
	}	
	
	printf("\r\n Get_DS2782_Temperature() is : %d \r\n", Get_DS2782_Temperature());
	printf("\r\n Get_DS2782_RARC() is : %d \r\n", Get_DS2782_RARC());
	printf("\r\n Get_DS2782_Current() is : %d \r\n", Get_DS2782_Current());
	printf("\r\n Get_DS2782_Voltage() is : %d \r\n", Get_DS2782_Voltage());
	ACR = Get_DS2782_ACR(); //电池电量
	printf("\r\n Get_DS2782_ACR() is : %d \r\n", ACR);
	
	
		
	/*如果已采集数据大于采集次数*/
	if((businessData.DataCount >= DeviceConfig.CollectNum))
	{
		Code_Read_NB();
		StartupResponse_Flag = TrapRequest(send_buff,4);//数据组帧上传
		gsdk_ril_set_hardware_reboot();//重启模块
	}
	else
	{
		BusinessData_Collection();
		if(GASData <=100)
		{
			BusinessData_Storage();					
		}
		else{
			Code_Read_NB();
			TrapRequest(send_buff,4);//数据组帧上传
		}
		gsdk_ril_set_hardware_reboot();//重启模块
	}

	gotoSleep(DeviceConfig.CollectPeriod);//休眠一个采集周期
}

double Gas_DataGet(void)
{
	uint16_t TestReceiveLength = 0;
	char   *pRecevBuff = NULL;
	char   *pGasRecevBuff = NULL;
	char   RecevFromGas[4] = {0x20,0x30,0x30,0x20};
	char   RecevFromRadar[2] = {0x0d,0x0a};
	uint8_t   j = 0;
	uint8_t     pp,i,m;
	char h1;
	char s1[2];
	GASData=250;
    uint8_t count = 0;
	
	printf("\r\n 预热8秒... \r\n");
	while (1)
	{
		if (count > 32)
		{
			count = 0;
			break;
		}
		vTaskDelay(500 / portTICK_PERIOD_MS);
		count++;
	}
//	vTaskDelay(800);//预热8秒

	printf("\r\n 预热结束... \r\n");
	for(j = 0; j < 30; j++)
	{
		printf("\r\n 开始读数... \r\n");
		TestReceiveLength = gsdk_uart_read(g_huart, (uint8_t *)TestReceiveBuff, 300, 1000);
		printf("\r\n TestReceiveLength is : %d \r\n", TestReceiveLength);
		if(TestReceiveLength > 0)
		{
			pGasRecevBuff = Find_SpecialString(TestReceiveBuff+180, RecevFromGas, strlen(TestReceiveBuff), 4);
			if(pGasRecevBuff != NULL)  //防止指针越界
			{
				printf("\r\n pGasRecevBuff is : %s \r\n", pGasRecevBuff);
				pRecevBuff = Find_SpecialString(pGasRecevBuff, RecevFromRadar, strlen(pGasRecevBuff), 2);
				for(m = 0; m < 29; m++)
				{
					printf("\r\npRecevBuff---------- %.2x\r\n", pRecevBuff[m]);
				}
				if(pRecevBuff != NULL)  //防止指针越界
				{
					if((pRecevBuff[9]==0x20)&&(pRecevBuff[15]==0x20)&&(pRecevBuff[23]==0x20)&&(pRecevBuff[26]==0x20))
					{
						//printf("\r\nUART4接收数据解析!!\r\n");
						pp=	pRecevBuff[2];
						for(i=1; i<25; i++)
						{
							pp^= pRecevBuff[i+2];
						}
						s1[0]= pRecevBuff[27];
						s1[1]= pRecevBuff[28];
						string_to_hex(&h1,s1);

						printf("\r\nUART4 校验 %.2x  %.2x!!\r\n",pp,h1);
						if(pp== h1)  //按位异或校验
						{
							if(pRecevBuff[24]==0x30)  //正常信号
							{
								printf("\r\npRecevBuff[25]---------------------------- %.2x!!\r\n",pRecevBuff[25]);
								if(pRecevBuff[25]==0x30)  //正常信号
								{
									printf("\r\n 工作状态正常 \r\n");
									if( pRecevBuff[6]==0x2e )   //小数点
									{
										GASData =(pRecevBuff[3]-0x30)*100 + (pRecevBuff[4]-0x30)*10 +  (pRecevBuff[5]-0x30)*1.0 + (pRecevBuff[7]-0x30)*0.1 + (pRecevBuff[8]-0x30)*0.01 ;
										if(pRecevBuff[2]==0x2b )   // 正负号
										{

										}
										else if(pRecevBuff[2]==0x2d)  // 正负号
										{
											GASData=-GASData;
										}
										else
										{
											GASData =250;//燃气传感器通信异常
										}
									}
								}
								else if(pRecevBuff[25]==0x31)
								{
									printf("\r\n 光路异常,无法正常使用 \r\n");
									GASData =240;
								}
								else if(pRecevBuff[25]==0x32) //
								{
									printf("\r\n 温度压力异常 \r\n");
									GASData =240;
								}
							}
							else
							{
								printf("\r\n 燃气探头异常 \r\n");
							}
						}
					}
				}
			}
		}
		if(GASData <=100) 	break;
		while (1)
		{
			if (count > 2)
			{
				count = 0;
				break;
			}
			vTaskDelay(500 / portTICK_PERIOD_MS);
			count++;
		}
//		vTaskDelay(100);
		memset(TestReceiveBuff, 0x00, 300);
	}
	printf("\r\n GASData is : %d \r\n", (uint8_t)GASData);

	gsdk_gpio_write(hgpio, GPIO_DATA_LOW);//关闭燃气探头电源
	return   GASData;
}