/******************************************************************************* * @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; }