修改readme20231114
This commit is contained in:
commit
f0297dd651
|
@ -0,0 +1,13 @@
|
|||
#Git管理忽略文件
|
||||
#忽略objects文件夹下的所有文件
|
||||
/objects/*
|
||||
#在上面基础上将hex文件纳入管理
|
||||
!/objects/*.hex
|
||||
#在上面基础上将bin文件纳入管理
|
||||
!/objects/*.bin
|
||||
#在上面基础上将sct文件纳入管理
|
||||
!/objects/*.sct
|
||||
#忽略keil的用户uvguix文件
|
||||
*.uvguix.*
|
||||
#忽略单独一个JLinkLog.txt文件
|
||||
JLinkLog.txt
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
|
||||
|
||||
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
|
||||
<events>
|
||||
</events>
|
||||
|
||||
</component_viewer>
|
|
@ -0,0 +1,39 @@
|
|||
[BREAKPOINTS]
|
||||
ForceImpTypeAny = 0
|
||||
ShowInfoWin = 1
|
||||
EnableFlashBP = 2
|
||||
BPDuringExecution = 0
|
||||
[CFI]
|
||||
CFISize = 0x00
|
||||
CFIAddr = 0x00
|
||||
[CPU]
|
||||
MonModeVTableAddr = 0xFFFFFFFF
|
||||
MonModeDebug = 0
|
||||
MaxNumAPs = 0
|
||||
LowPowerHandlingMode = 0
|
||||
OverrideMemMap = 0
|
||||
AllowSimulation = 1
|
||||
ScriptFile=""
|
||||
[FLASH]
|
||||
CacheExcludeSize = 0x00
|
||||
CacheExcludeAddr = 0x00
|
||||
MinNumBytesFlashDL = 0
|
||||
SkipProgOnCRCMatch = 1
|
||||
VerifyDownload = 1
|
||||
AllowCaching = 1
|
||||
EnableFlashDL = 2
|
||||
Override = 1
|
||||
Device="Cortex-M0+"
|
||||
[GENERAL]
|
||||
WorkRAMSize = 0x00
|
||||
WorkRAMAddr = 0x00
|
||||
RAMUsageLimit = 0x00
|
||||
[SWO]
|
||||
SWOLogFile=""
|
||||
[MEM]
|
||||
RdOverrideOrMask = 0x00
|
||||
RdOverrideAndMask = 0xFFFFFFFF
|
||||
RdOverrideAddr = 0xFFFFFFFF
|
||||
WrOverrideOrMask = 0x00
|
||||
WrOverrideAndMask = 0xFFFFFFFF
|
||||
WrOverrideAddr = 0xFFFFFFFF
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,21 @@
|
|||
|
||||
/*
|
||||
* Auto generated Run-Time-Environment Configuration File
|
||||
* *** Do not modify ! ***
|
||||
*
|
||||
* Project: 'nbiot_meter'
|
||||
* Target: 'nbiot_meter'
|
||||
*/
|
||||
|
||||
#ifndef RTE_COMPONENTS_H
|
||||
#define RTE_COMPONENTS_H
|
||||
|
||||
|
||||
/*
|
||||
* Define the Device Header File:
|
||||
*/
|
||||
#define CMSIS_device_header "HC32L196MCTA.h"
|
||||
|
||||
|
||||
|
||||
#endif /* RTE_COMPONENTS_H */
|
|
@ -0,0 +1,158 @@
|
|||
#include "type.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_DebugPrint.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "SOE.h"
|
||||
|
||||
|
||||
void SaveNewSoe(u16 soe_type,u8 soe_data);
|
||||
|
||||
SOE soe_event;
|
||||
//SOE_TIME SOE_START_TIME = {0x00,0x01,0x01,0x00,0x00,0x00}; //2000-01-01 00:00:00
|
||||
//SOE_TIME SOE_END_TIME = {0x38,0x01,0x19,0x03,0x14,0x07}; //2038-01-19 03:14:07
|
||||
//SOE_TIME SOE_END_TIME = {0x99,0x12,0x31,0x23,0x59,0x59}; //2038-01-19 03:14:07
|
||||
u8 save_soe_state;
|
||||
DateTime rtcc_time_soe;
|
||||
u8 soe_tmp_buf[20];
|
||||
u8 soe_ee_msg;
|
||||
|
||||
/*************************************************************************************
|
||||
* @fun_name: SaveNewSoe -- 记录一条新的SOE
|
||||
* @param[in] : soe_type--类型 soe_data--数据(默认为0)
|
||||
*************************************************************************************/
|
||||
void SaveNewSoe(u16 soe_type,u8 soe_data)
|
||||
{
|
||||
if(soe_event.soe_cnt > SOE_NUM)
|
||||
{
|
||||
soe_event.soe_cnt = 0;
|
||||
}
|
||||
soe_event.soe_cnt++;
|
||||
soe_event.soe_cnt %= SOE_NUM;
|
||||
RtccGetDateTime(&rtcc_time_soe);
|
||||
soe_event.soe_type[soe_event.soe_cnt] = soe_type;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.year = rtcc_time_soe.s.year;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.month = rtcc_time_soe.s.month;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.day = rtcc_time_soe.s.day;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.hour = rtcc_time_soe.s.hour;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.minute = rtcc_time_soe.s.minute;
|
||||
soe_event.soe_time[soe_event.soe_cnt].s.second = rtcc_time_soe.s.second;
|
||||
soe_event.soe_data[soe_event.soe_cnt] = soe_data;
|
||||
}
|
||||
//
|
||||
u8 SaveSoeToEEIfIdle(void)
|
||||
{
|
||||
if(SAVE_SOE_S0 == save_soe_state)
|
||||
{
|
||||
return TASK_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TASK_BUSY;
|
||||
}
|
||||
}
|
||||
//存SOE内容到EE
|
||||
void SaveSoeToEE(void)
|
||||
{
|
||||
switch(save_soe_state)
|
||||
{
|
||||
case SAVE_SOE_S0:
|
||||
{
|
||||
if(soe_event.soe_cnt != soe_event.soe_record_cnt)
|
||||
{
|
||||
soe_event.soe_record_cnt++;
|
||||
soe_event.soe_record_cnt %= SOE_NUM;
|
||||
save_soe_state = SAVE_SOE_S1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SAVE_SOE_S1:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
soe_tmp_buf[0] = soe_event.soe_type[soe_event.soe_record_cnt];
|
||||
soe_tmp_buf[1] = soe_event.soe_type[soe_event.soe_record_cnt]>>8;
|
||||
soe_tmp_buf[2] = soe_event.soe_time[soe_event.soe_record_cnt].s.year;
|
||||
soe_tmp_buf[3] = soe_event.soe_time[soe_event.soe_record_cnt].s.month;
|
||||
soe_tmp_buf[4] = soe_event.soe_time[soe_event.soe_record_cnt].s.day;
|
||||
soe_tmp_buf[5] = soe_event.soe_time[soe_event.soe_record_cnt].s.hour;
|
||||
soe_tmp_buf[6] = soe_event.soe_time[soe_event.soe_record_cnt].s.minute;
|
||||
soe_tmp_buf[7] = soe_event.soe_time[soe_event.soe_record_cnt].s.second;
|
||||
soe_tmp_buf[8] = soe_event.soe_data[soe_event.soe_record_cnt];
|
||||
|
||||
if(Sys_data_object.P4.Point_SOE_write >= TOTAL_NUM_SOE)
|
||||
{
|
||||
Sys_data_object.P4.Point_SOE_write = 0;
|
||||
}
|
||||
EepWrite(soe_tmp_buf, EEP_ADDR_SOE_BASE + (u16)Sys_data_object.P4.Point_SOE_write*LENGTH_ONE_SOE, LENGTH_ONE_SOE, &soe_ee_msg);
|
||||
save_soe_state = SAVE_SOE_S2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SAVE_SOE_S2:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
Sys_data_object.P4.Point_SOE_write++;
|
||||
Sys_data_object.P4.Point_SOE_write %= TOTAL_NUM_SOE;
|
||||
EepWrite((u8*)(&Sys_data_object.P4.Point_SOE_write), EEP_ADDR_SOE_WR_POINT,sizeof(Sys_data_object.P4.Point_SOE_write),&soe_ee_msg);
|
||||
save_soe_state = SAVE_SOE_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
save_soe_state = SAVE_SOE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
void SoeInit(void)
|
||||
{
|
||||
soe_event.soe_cnt = 0;
|
||||
soe_event.soe_record_cnt = 0;
|
||||
}
|
||||
void SoeDealApp(void)
|
||||
{
|
||||
SaveSoeToEE();
|
||||
}
|
||||
/*************************************************************************************
|
||||
* @fun_name: Search_Soe -- 按照筛选条件 检索SOE
|
||||
* @brief :
|
||||
* @param[in] : soe_type--SOE类型 (0xFFFF表示不限定类型)
|
||||
start_time--起始时间(BCD前些 00年01月01日 00:00:00 表示读取最新SOE)
|
||||
end_time--结束时间(BCD填写当前时间,表示读取最新SOE)
|
||||
num--要检索几条 (0XFF-不限定条数)
|
||||
soe_read--检索到后存放指针
|
||||
检索顺序为最新发生的事件在前
|
||||
* @param[out] : u8 检索到有效的SOE条数
|
||||
* @retval : None
|
||||
* @other : None
|
||||
*************************************************************************************/
|
||||
u8 Check_One_Soe (u16 soe_type,DateTime_noweek *start_time,DateTime_noweek *end_time,ONE_SOE *soe_read)
|
||||
{
|
||||
time_t start_time_Greene,end_time_Greene,soe_time_Greene;//格林威治时间:从1970年1月1日开始到现在的秒数
|
||||
start_time_Greene = get_mktime_noweek(start_time);
|
||||
end_time_Greene = get_mktime_noweek(end_time);
|
||||
if(((soe_read->soe_type > SOE_START_ID0)&&(soe_read->soe_type < SOE_END_ID0))\
|
||||
||((soe_read->soe_type > SOE_START_ID1)&&(soe_read->soe_type < SOE_END_ID1)))
|
||||
{ //确保是有效的SOE事件
|
||||
if((soe_read->soe_type == soe_type) || (soe_type == SOE_ALL_TYPE))//是需要读取的类型
|
||||
{
|
||||
soe_time_Greene = get_mktime_noweek(&soe_read->soe_time);
|
||||
|
||||
if((soe_time_Greene >= start_time_Greene) && (soe_time_Greene <= end_time_Greene)) //是发生在读取时间段内
|
||||
{ //又检索到一条有效的SOE
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
#ifndef _SOE_H_
|
||||
#define _SOE_H_
|
||||
|
||||
#include "type.h"
|
||||
#include <time.h>
|
||||
#include "UWater_rtcc_driver.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
#define LENGTH_ONE_SOE 9
|
||||
#define TOTAL_NUM_SOE 100 //事件最大记录数
|
||||
#define SOE_ALL_TYPE 0xFFFF
|
||||
#define SOE_REMARK_NOR 0 //SOE备注,普通
|
||||
//#define SOE_REMARK_A_PIPE_BAD 1 //SOE备注,
|
||||
//#define SOE_REMARK_B_PIPE_BAD 2 //SOE备注,
|
||||
//#define SOE_VALVE_CLOSE 1 //SOE备注,普关
|
||||
//#define SOE_VALVE_CLOSE_LOCK 2 //SOE备注,权关
|
||||
//#define SOE_VALVE_CLOSE_LOCK 2 //SOE备注,权关
|
||||
#define SOE_NUM 10 //SOE事件同时可以发生10个
|
||||
|
||||
#define EEP_ADDR_SOE_BASE EEP_SOE_ADDR //0x1000
|
||||
#define EEP_ADDR_SOE_WR_POINT (EEP_ADDR_SOE_BASE + TOTAL_NUM_SOE*9)
|
||||
#define EEP_DATA_LEN_SOE (LENGTH_ONE_SOE*TOTAL_NUM_SOE+1)
|
||||
|
||||
#define MAX_NUM_READ_SOE 25 //单次读取SOE事件的最大条数
|
||||
|
||||
enum SOE_TYPE{
|
||||
SOE_START_ID0 = 0x0000, //开始地址--无SOE
|
||||
SOE_VALVE_OPEN, //普通开阀
|
||||
SOE_VALVE_OPEN_EMERGENCY, //应急开阀
|
||||
SOE_VALVE_CLOSE, //普通关阀
|
||||
SOE_VALVE_CLOSE_EMERGENCY, //应急关阀
|
||||
SOE_VALVE_CLOSE_LOCK, //权限关阀
|
||||
SOE_DEVICE_RESTART, //终端重启
|
||||
SOE_BAT_LOW_LEVEL, //欠压
|
||||
SOE_MAGNETIC_ATTACK, //磁干扰
|
||||
SOE_OVER_FLOW, //过流
|
||||
SOE_BACK_FLOW, //倒转
|
||||
SOE_MODEL_ERROE, //计量模块故障
|
||||
SOE_TAKE_OFF_METER, //拆表
|
||||
SOE_INSERT_SOMETHING, //异物插入
|
||||
SOE_SWITCH_INTER_OSCI, //切换内部晶振
|
||||
SOE_MANUAL_UPLOAD, //手动发起上报
|
||||
SOE_SET_INIT_VALUE, //设置底数
|
||||
SOE_17_BLE_ADV_ERR,
|
||||
SOE_18_BLE_ERR,
|
||||
SOE_19_BLE_TRIM,
|
||||
SOE_20_BLE_INIT, //蓝牙初始化
|
||||
/*****沈阳规约报警事件类型**********/
|
||||
//报警
|
||||
SOE_SY_OVER_FLOW = 1001,//流量超限--
|
||||
SOE_SY_NO_WATER, //空管报警--
|
||||
SOE_SY_REVERSE_FLOW, //反流报警--
|
||||
SOE_SY_LEAK_FLOW,//漏水报警--
|
||||
SOE_SY_LOW_POWER,//低电压报警---
|
||||
SOE_SY_TEMP_OVER,//温度超范围--
|
||||
SOE_SY_SHELL_OPEN,//上盖被打开
|
||||
SOE_SY_VALVE_ERR,//阀门操作失败--
|
||||
SOE_SY_CIRCLE_WRONG,//电路故障--
|
||||
SOE_SY_TEMP_SHORT,//测温短路--
|
||||
SOE_SY_TEMP_OPEN,//测温开路--
|
||||
//事件
|
||||
SOE_SY_VALVE_OPEN=1021,//开阀--
|
||||
SOE_SY_VALVE_CLOSE,//关阀--
|
||||
SOE_SY_SYS_RESET,//系统重启--1023
|
||||
SOE_SY_FROZEN_CLEAR,//冻结数据清空----
|
||||
SOE_SY_CURRENT_CLEAR,//水表读数清0----
|
||||
//自定义报警事件
|
||||
SOE_SY_LOW_AMP = 1101,//低振幅--
|
||||
SOE_SY_GP30_COMERR,//GP30通信故障--
|
||||
SOE_SY_TOF_OVER,//TOF跳变--
|
||||
|
||||
SOE_END_ID0 = 0xFFF0,
|
||||
//自定义事件
|
||||
SOE_START_ID1 = 0xFFF8,
|
||||
SOE_END_ID1,
|
||||
};
|
||||
|
||||
enum{
|
||||
SAVE_SOE_S0 = 0,
|
||||
SAVE_SOE_S1,
|
||||
SAVE_SOE_S2,
|
||||
SAVE_SOE_S3
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 soe_type[SOE_NUM];
|
||||
DateTime_noweek soe_time[SOE_NUM];
|
||||
u8 soe_data[SOE_NUM];
|
||||
u8 soe_cnt;
|
||||
u8 soe_record_cnt;
|
||||
} SOE;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 soe_type;
|
||||
DateTime_noweek soe_time;
|
||||
u8 soe_data;
|
||||
} ONE_SOE;
|
||||
|
||||
void SaveNewSoe(u16 soe_type,u8 soe_data);
|
||||
u8 Check_One_Soe (u16 soe_type,DateTime_noweek *start_time,DateTime_noweek *end_time,ONE_SOE *soe_read);
|
||||
void SoeInit(void);
|
||||
void SoeDealApp(void);
|
||||
u8 SaveSoeToEEIfIdle(void);
|
||||
//#pragma pack()
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,270 @@
|
|||
/* --COPYRIGHT--,BSD
|
||||
* Copyright (c) 2011, Texas Instruments Incorporated
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* --/COPYRIGHT--*/
|
||||
/*
|
||||
* TI_aes_128.c
|
||||
*
|
||||
* Created on: Nov 3, 2011
|
||||
* Author: Eric Peeters
|
||||
*
|
||||
* Description: Implementation of the AES-128 as defined by the FIPS PUB 197:
|
||||
* the official AES standard
|
||||
*/
|
||||
|
||||
#include "Uwater_Aes_128.h"
|
||||
|
||||
// foreward sbox
|
||||
const unsigned char sbox[256] = {
|
||||
//0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, //0
|
||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, //1
|
||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, //2
|
||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, //3
|
||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, //4
|
||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, //5
|
||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, //6
|
||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, //7
|
||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, //8
|
||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, //9
|
||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, //A
|
||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, //B
|
||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, //C
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, //D
|
||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, //E
|
||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; //F
|
||||
|
||||
// inverse sbox
|
||||
const unsigned char rsbox[256] =
|
||||
{ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
|
||||
, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
|
||||
, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
|
||||
, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
|
||||
, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
|
||||
, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
|
||||
, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
|
||||
, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
|
||||
, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
|
||||
, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
|
||||
, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
|
||||
, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
|
||||
, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
|
||||
, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
|
||||
, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
|
||||
, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
|
||||
|
||||
// round constant
|
||||
const unsigned char Rcon[10] = {
|
||||
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
|
||||
|
||||
|
||||
// multiply by 2 in the galois field
|
||||
unsigned char galois_mul2(unsigned char value)
|
||||
{
|
||||
signed char temp;
|
||||
// cast to signed value
|
||||
temp = (signed char) value;
|
||||
// if MSB is 1, then this will signed extend and fill the temp variable with 1's
|
||||
temp = temp >> 7;
|
||||
// AND with the reduction variable
|
||||
temp = temp & 0x1b;
|
||||
// finally shift and reduce the value
|
||||
return ((value << 1)^temp);
|
||||
}
|
||||
|
||||
// AES encryption and decryption function
|
||||
// The code was optimized for memory (flash and ram)
|
||||
// Combining both encryption and decryption resulted in a slower implementation
|
||||
// but much smaller than the 2 functions separated
|
||||
// This function only implements AES-128 encryption and decryption (AES-192 and
|
||||
// AES-256 are not supported by this code)
|
||||
void aes_enc_dec(unsigned char *state, unsigned char *key, unsigned char dir)
|
||||
{
|
||||
|
||||
// ClrWdt();//Çå¿´ÃŹ·È·ÈÏÊÇ·ñÐèÒª
|
||||
|
||||
unsigned char buf1, buf2, buf3, buf4, round, i;
|
||||
|
||||
// In case of decryption
|
||||
if (dir)
|
||||
{
|
||||
// compute the last key of encryption before starting the decryption
|
||||
for (round = 0 ; round < 10; round++)
|
||||
{
|
||||
//key schedule
|
||||
key[0] = sbox[key[13]]^key[0]^Rcon[round];
|
||||
key[1] = sbox[key[14]]^key[1];
|
||||
key[2] = sbox[key[15]]^key[2];
|
||||
key[3] = sbox[key[12]]^key[3];
|
||||
for (i=4; i<16; i++)
|
||||
{
|
||||
|
||||
key[i] = key[i] ^ key[i-4];
|
||||
}
|
||||
}
|
||||
|
||||
//first Addroundkey
|
||||
for (i = 0; i <16; i++)
|
||||
{
|
||||
state[i]=state[i] ^ key[i];
|
||||
// ClrWdt();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// main loop
|
||||
for (round = 0; round < 10; round++)
|
||||
{
|
||||
// ClrWdt();
|
||||
|
||||
if (dir)
|
||||
{
|
||||
//Inverse key schedule
|
||||
for (i=15; i>3; --i)
|
||||
{
|
||||
key[i] = key[i] ^ key[i-4];
|
||||
}
|
||||
key[0] = sbox[key[13]]^key[0]^Rcon[9-round];
|
||||
key[1] = sbox[key[14]]^key[1];
|
||||
key[2] = sbox[key[15]]^key[2];
|
||||
key[3] = sbox[key[12]]^key[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i <16; i++)
|
||||
{
|
||||
// with shiftrow i+5 mod 16
|
||||
state[i]=sbox[state[i] ^ key[i]];
|
||||
}
|
||||
//shift rows
|
||||
buf1 = state[1];
|
||||
state[1] = state[5];
|
||||
state[5] = state[9];
|
||||
state[9] = state[13];
|
||||
state[13] = buf1;
|
||||
|
||||
buf1 = state[2];
|
||||
buf2 = state[6];
|
||||
state[2] = state[10];
|
||||
state[6] = state[14];
|
||||
state[10] = buf1;
|
||||
state[14] = buf2;
|
||||
|
||||
buf1 = state[15];
|
||||
state[15] = state[11];
|
||||
state[11] = state[7];
|
||||
state[7] = state[3];
|
||||
state[3] = buf1;
|
||||
}
|
||||
//mixcol - inv mix
|
||||
if ((round > 0 && dir) || (round < 9 && !dir))
|
||||
{
|
||||
for (i=0; i <4; i++)
|
||||
{
|
||||
// ClrWdt();
|
||||
|
||||
buf4 = (i << 2);
|
||||
if (dir)
|
||||
{
|
||||
// precompute for decryption
|
||||
buf1 = galois_mul2(galois_mul2(state[buf4]^state[buf4+2]));
|
||||
buf2 = galois_mul2(galois_mul2(state[buf4+1]^state[buf4+3]));
|
||||
state[buf4] ^= buf1; state[buf4+1] ^= buf2; state[buf4+2] ^= buf1; state[buf4+3] ^= buf2;
|
||||
}
|
||||
// in all cases
|
||||
buf1 = state[buf4] ^ state[buf4+1] ^ state[buf4+2] ^ state[buf4+3];
|
||||
buf2 = state[buf4];
|
||||
buf3 = state[buf4]^state[buf4+1]; buf3=galois_mul2(buf3); state[buf4] = state[buf4] ^ buf3 ^ buf1;
|
||||
buf3 = state[buf4+1]^state[buf4+2]; buf3=galois_mul2(buf3); state[buf4+1] = state[buf4+1] ^ buf3 ^ buf1;
|
||||
buf3 = state[buf4+2]^state[buf4+3]; buf3=galois_mul2(buf3); state[buf4+2] = state[buf4+2] ^ buf3 ^ buf1;
|
||||
buf3 = state[buf4+3]^buf2; buf3=galois_mul2(buf3); state[buf4+3] = state[buf4+3] ^ buf3 ^ buf1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dir)
|
||||
{
|
||||
//Inv shift rows
|
||||
// Row 1
|
||||
buf1 = state[13];
|
||||
state[13] = state[9];
|
||||
state[9] = state[5];
|
||||
state[5] = state[1];
|
||||
state[1] = buf1;
|
||||
//Row 2
|
||||
buf1 = state[10];
|
||||
buf2 = state[14];
|
||||
state[10] = state[2];
|
||||
state[14] = state[6];
|
||||
state[2] = buf1;
|
||||
state[6] = buf2;
|
||||
//Row 3
|
||||
buf1 = state[3];
|
||||
state[3] = state[7];
|
||||
state[7] = state[11];
|
||||
state[11] = state[15];
|
||||
state[15] = buf1;
|
||||
|
||||
for (i = 0; i <16; i++)
|
||||
{
|
||||
// with shiftrow i+5 mod 16
|
||||
// ClrWdt();
|
||||
|
||||
state[i]=rsbox[state[i]] ^ key[i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//key schedule
|
||||
key[0] = sbox[key[13]]^key[0]^Rcon[round];
|
||||
key[1] = sbox[key[14]]^key[1];
|
||||
key[2] = sbox[key[15]]^key[2];
|
||||
key[3] = sbox[key[12]]^key[3];
|
||||
for (i=4; i<16; i++)
|
||||
{
|
||||
// ClrWdt();
|
||||
|
||||
key[i] = key[i] ^ key[i-4];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dir)
|
||||
{
|
||||
// ClrWdt();
|
||||
|
||||
//last Addroundkey
|
||||
for (i = 0; i <16; i++)
|
||||
{
|
||||
|
||||
// ClrWdt();
|
||||
// with shiftrow i+5 mod 16
|
||||
state[i]=state[i] ^ key[i];
|
||||
} // enf for
|
||||
} // end if (!dir)
|
||||
} // end function
|
|
@ -0,0 +1,44 @@
|
|||
/* --COPYRIGHT--,BSD
|
||||
* Copyright (c) 2011, Texas Instruments Incorporated
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of Texas Instruments Incorporated nor the names of
|
||||
* its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* --/COPYRIGHT--*/
|
||||
/*
|
||||
* TI_aes_128.h
|
||||
*
|
||||
* Created on: Nov 3, 2011
|
||||
* Author: Eric Peeters
|
||||
*/
|
||||
|
||||
#ifndef NBIOT_AES_H
|
||||
#define NBIOT_AES_H
|
||||
|
||||
|
||||
void aes_enc_dec(unsigned char *state, unsigned char *key, unsigned char dir);
|
||||
#endif /* NBIOT_AES_H */
|
|
@ -0,0 +1,318 @@
|
|||
#include "Uwater_Aes_128.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "type.h"
|
||||
|
||||
|
||||
u16 HexToBcd16(u16 value)
|
||||
{
|
||||
u16 rtval, temp;
|
||||
u8 i;
|
||||
rtval = 0;
|
||||
i = 0;
|
||||
while (value)
|
||||
{
|
||||
temp = value % 10;
|
||||
rtval |= (temp << i);
|
||||
i += 4;
|
||||
value /= 10;
|
||||
}
|
||||
return rtval;
|
||||
}
|
||||
|
||||
u8 BCD2HEX(u8 bcd_data) //BCD转为HEX子程序
|
||||
{
|
||||
unsigned char temp;
|
||||
temp = ((bcd_data>>4) * 10 + (bcd_data & 0x0F));//2020-10-31
|
||||
return temp;
|
||||
}
|
||||
|
||||
u8 HEX2BCD(u8 hex_data) //HEX转为BCD子程序
|
||||
{
|
||||
unsigned char temp;
|
||||
temp = (hex_data / 10 * 16 + (hex_data % 10));//2020-10-31
|
||||
return temp;
|
||||
}
|
||||
|
||||
u32 HexToBcd32(u32 value)
|
||||
{
|
||||
u32 rtval, temp;
|
||||
u8 i;
|
||||
rtval = 0;
|
||||
i = 0;
|
||||
while (value)
|
||||
{
|
||||
temp = value % 10;
|
||||
rtval |= (temp << i);
|
||||
i += 4;
|
||||
value /= 10;
|
||||
}
|
||||
return rtval;
|
||||
}
|
||||
|
||||
u32 Gp30DataToBcd(u32 data, u32 times)
|
||||
{
|
||||
float tempf;
|
||||
u32 temp32;
|
||||
tempf = ((float) data / 65536);
|
||||
temp32 = (u32) (tempf * times);
|
||||
return (HexToBcd32(temp32));
|
||||
}
|
||||
|
||||
u16 FramHexToBcd16(u16 value)
|
||||
{
|
||||
u16 rtval, temp;
|
||||
u8 i;
|
||||
rtval = 0;
|
||||
i = 0;
|
||||
while (value)
|
||||
{
|
||||
temp = value % 10;
|
||||
rtval |= (temp << i);
|
||||
i += 4;
|
||||
value /= 10;
|
||||
}
|
||||
return rtval;
|
||||
}
|
||||
|
||||
void fram_tools_writeU32ByBuf(u8 *pU32Buf, u8 *pSrc, u8 dir)
|
||||
{
|
||||
int temp_i=0;
|
||||
if(dir == 0)//data0-1-2-3
|
||||
{
|
||||
for(temp_i=0;temp_i<4;temp_i++)
|
||||
{
|
||||
pU32Buf[temp_i] = *pSrc++;
|
||||
}
|
||||
}
|
||||
else//data3-2-1-0
|
||||
{
|
||||
for(temp_i=0;temp_i<4;temp_i++)
|
||||
{
|
||||
pU32Buf[3-temp_i] = *pSrc++;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: check_apply_addr
|
||||
* @brief : 通讯地址判断
|
||||
* @param[in] : None
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
u8 check_apply_addr(u8 *p_buf,u8 *des_buf)
|
||||
{
|
||||
u8 tmp_i = 0;
|
||||
for (tmp_i = 0; tmp_i < 7; tmp_i++)
|
||||
{
|
||||
if (*(p_buf + tmp_i) != *(des_buf + tmp_i))//s_met_info.met_addr[tmp_i])
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: check_cs
|
||||
* @brief : cs校验计算
|
||||
* @param[in] : *p;len
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
u8 check_cs(u8* start_sddr, u8 datas_len)
|
||||
{
|
||||
u8 tmp_i = 0;
|
||||
u8 tmp_cs = 0;
|
||||
for (tmp_i = 0; tmp_i < datas_len; tmp_i++)
|
||||
{
|
||||
tmp_cs += *(start_sddr + tmp_i);
|
||||
}
|
||||
return tmp_cs;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: AES_decrypt
|
||||
* @brief :
|
||||
* @param[in] :
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
void AES_decrypt(u8 *buf, u8 len, u8 *key)
|
||||
{
|
||||
u8 p;
|
||||
u8 key1[16];
|
||||
u8 k,l;
|
||||
u8 start_data_length; //填补之前原数据域字节长度
|
||||
u8 recdata_length; //填补之后需要发送的字节长度
|
||||
start_data_length=len;
|
||||
//recdata_length=(start_data_length/16+1)*16;
|
||||
|
||||
recdata_length=start_data_length/16;
|
||||
for(k=0;k<recdata_length;k++)
|
||||
{
|
||||
u8 state[16];
|
||||
for(l=0;l<16;l++)
|
||||
state[l]=buf[k*16 + l];
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
key1[p] = key[p];
|
||||
}
|
||||
aes_enc_dec(state,key1,1); //添加解密
|
||||
for(l=0;l<16;l++)
|
||||
{
|
||||
buf[k*16 + l] =state[l];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SYNB_AES_decrypt(u8 *buf, u16 len, u8 *key)
|
||||
{
|
||||
u8 p;
|
||||
u8 key1[16];
|
||||
u16 k,l;
|
||||
u16 start_data_length; //填补之前原数据域字节长度
|
||||
u16 recdata_length; //填补之后需要发送的字节长度
|
||||
start_data_length=len;//s_frame_rcv_arr[s_frame_struct.head_site +11];
|
||||
recdata_length=(start_data_length/16+1)*16;
|
||||
for(k=0;k<(recdata_length/16);k++)
|
||||
{
|
||||
u8 state[16];
|
||||
for(l=0;l<16;l++)
|
||||
state[l]=buf[k*16 + l];//s_frame_rcv_arr[k*16+s_frame_struct.head_site +12 + l];
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
key1[p] = key[p];
|
||||
}
|
||||
aes_enc_dec(state,key1,1); //添加解密
|
||||
for(l=0;l<16;l++)
|
||||
{
|
||||
buf[k*16 + l] =state[l];//s_frame_rcv_arr[k*16+s_frame_struct.head_site +12 + l] =state[l];
|
||||
}
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: AES_encrypt
|
||||
* @brief :
|
||||
* @param[in] : 加密
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
void AES_encrypt(u8 num,u8 *buf, u16 len, u8 *key)
|
||||
{
|
||||
u8 key2[16];
|
||||
u16 start_data_length; //填补之前原数据域字节长度
|
||||
u8 adddata_length; //填补的字节长度
|
||||
u16 sentdata_length; //填补之后需要发送的字节长度
|
||||
u8 add_data; //填补的数据,取16的余数
|
||||
switch(num)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
start_data_length=len;
|
||||
sentdata_length=(start_data_length/16+1)*16;
|
||||
adddata_length=sentdata_length-start_data_length;
|
||||
add_data=adddata_length;
|
||||
u8 j;
|
||||
for(j=start_data_length;j<sentdata_length;j++) //填充发送区
|
||||
{
|
||||
buf[j]=add_data; //s_frame_send_buf[j+14]=add_data;
|
||||
}
|
||||
|
||||
u8 k,p;
|
||||
|
||||
for(k=0;k<(sentdata_length/16);k++)
|
||||
{
|
||||
u8 state[16];
|
||||
for(p=0;p<16;p++)
|
||||
state[p]=buf[k*16+p];
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
key2[p] = key[p];
|
||||
}
|
||||
aes_enc_dec(state,key2,0);
|
||||
for(p=0;p<16;p++)
|
||||
buf[k*16+p]=state[p];//s_frame_send_buf[k*16+14+p]=state[p];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
start_data_length=len;
|
||||
sentdata_length=(start_data_length/16+1)*16;
|
||||
adddata_length=sentdata_length-start_data_length;
|
||||
|
||||
add_data=adddata_length;
|
||||
u16 j;
|
||||
for(j=start_data_length;j<sentdata_length;j++) //填充发送区
|
||||
{
|
||||
buf[j]=add_data;//s_frame_send_buf[j+15]=add_data;
|
||||
}
|
||||
u8 k,p;
|
||||
for(k=0;k<(sentdata_length/16);k++)
|
||||
{
|
||||
u8 state[16];
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
state[p]=buf[k*16+p];//s_frame_send_buf[k*16+15+p];
|
||||
}
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
key2[p] = key[p];
|
||||
}
|
||||
aes_enc_dec(state,key2,0);
|
||||
for(p=0;p<16;p++)
|
||||
{
|
||||
buf[k*16+p]=state[p];//s_frame_send_buf[k*16+15+p]=state[p];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//CRC16计算方法1:使用2个256长度的校验表
|
||||
static u16 wCRCTalbeAbs[] = {0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000,
|
||||
0x9C01, 0x8801, 0x4400};
|
||||
|
||||
u16 CRC16(u8* pchMsg, u16 wDataLen)
|
||||
{
|
||||
u16 wCRC = 0xFFFF;
|
||||
u16 i;
|
||||
u8 chChar;
|
||||
for(i = 0; i < wDataLen; i++)
|
||||
{
|
||||
chChar = *pchMsg++;
|
||||
wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & 15] ^ (wCRC >> 4);
|
||||
wCRC = wCRCTalbeAbs[((chChar >> 4) ^ wCRC) & 15] ^ (wCRC >> 4);
|
||||
}
|
||||
return wCRC;
|
||||
}
|
||||
//ASCIL转HEX
|
||||
//ASCII码转HEX:
|
||||
//ASCII码:0-9 --> HEX:0x0-0x9 --> Dec:0-9
|
||||
//ASCII码:a/A-f/F --> HEX:0xA-0xF --> Dec:10-15
|
||||
uint8_t AsciiToHex(uint8_t Ascii_Byte)
|
||||
{
|
||||
if(Ascii_Byte & 0x80)
|
||||
{
|
||||
return Ascii_Byte;
|
||||
}
|
||||
if((Ascii_Byte >= '0')&&(Ascii_Byte <= '9'))
|
||||
{
|
||||
return Ascii_Byte - '0'; //0-9
|
||||
}
|
||||
else if( (Ascii_Byte >= 'a')&&(Ascii_Byte <= 'f') )
|
||||
{
|
||||
return Ascii_Byte - 'a' + 10; //10-15
|
||||
}
|
||||
else if( (Ascii_Byte >= 'A')&&(Ascii_Byte <= 'F') )
|
||||
{
|
||||
return Ascii_Byte - 'A' + 10; //10-15
|
||||
}
|
||||
return Ascii_Byte;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef UWATER_DATATOOLS_APP_H
|
||||
#define UWATER_DATATOOLS_APP_H
|
||||
|
||||
#include "type.h"
|
||||
|
||||
u16 HexToBcd16(u16 value);
|
||||
u8 BCD2HEX(u8 bcd_data); //BCD转为HEX子程序
|
||||
u8 HEX2BCD(u8 hex_data); //HEX转为BCD子程序
|
||||
u32 HexToBcd32(u32 value);
|
||||
u32 Gp30DataToBcd(u32 data, u32 times);
|
||||
u16 FramHexToBcd16(u16 value);
|
||||
void fram_tools_writeU32ByBuf(u8 *pU32Buf, u8 *pSrc, u8 dir);
|
||||
u8 check_apply_addr(u8 *p_buf,u8 *des_buf);
|
||||
u8 check_cs(u8* start_sddr, u8 datas_len);
|
||||
void AES_decrypt(u8 *buf, u8 len, u8 *key);
|
||||
void SYNB_AES_decrypt(u8 *buf, u16 len, u8 *key); //沈阳规约数据长度是两个字节
|
||||
void AES_encrypt(u8 num,u8 *buf, u16 len, u8 *key);
|
||||
u16 CRC16(u8* pchMsg, u16 wDataLen);
|
||||
uint8_t AsciiToHex(uint8_t Ascii_Byte);
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
#include "type.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_DebugPrint.h"
|
||||
#include "UWater_frame_app.h"
|
||||
|
||||
static u8 wait_for_print_buf[PRINT_BUF_SIZE]; //待打印缓冲区
|
||||
static u8 print_nb_data_flag = FALSE;
|
||||
static u8 print_program_data_flag = FALSE;
|
||||
static PRINT_STRUCT printf_struct;
|
||||
static u8 print_data_state=PRINT_DATA_S0;
|
||||
static u8 print_temp_data;
|
||||
static u16 print_temp_save_len;
|
||||
//启动NB数据打印
|
||||
void OpenPrintNbDataSwitch(void)
|
||||
{
|
||||
FrameSetMsgApp(MsgOpenIr);
|
||||
print_nb_data_flag = TRUE;
|
||||
}
|
||||
|
||||
//关闭NB数据打印
|
||||
void ClosePrintNbDataSwitch(void)
|
||||
{
|
||||
print_nb_data_flag = FALSE;
|
||||
}
|
||||
u8 GetPrintNbDataSwitch(void)
|
||||
{
|
||||
return print_nb_data_flag;
|
||||
}
|
||||
//启动程序数据打印
|
||||
void OpenPrintProgramDataSwitch(void)
|
||||
{
|
||||
print_program_data_flag = TRUE;
|
||||
}
|
||||
|
||||
//关闭程序数据打印
|
||||
void ClosePrintProgramDataSwitch(void)
|
||||
{
|
||||
print_program_data_flag = FALSE;
|
||||
}
|
||||
|
||||
/***********************启动打印数据********************************
|
||||
Function: void PrintNbData (u8 *data_src, u16 len)
|
||||
Description: 打印数据
|
||||
Input: data_src 数据来源指针 ,len 数据长度
|
||||
****************************************************************/
|
||||
void PrintNbData(u8 *data_src, u16 len)
|
||||
{
|
||||
if(print_nb_data_flag)
|
||||
{
|
||||
while(len--)
|
||||
{
|
||||
print_temp_save_len = printf_struct.saved_data_len;//把写指针保存起来
|
||||
print_temp_save_len++;
|
||||
if (print_temp_save_len >= PRINT_BUF_SIZE)
|
||||
print_temp_save_len = 0;
|
||||
if (print_temp_save_len != printf_struct.printf_data_len)
|
||||
{
|
||||
wait_for_print_buf[printf_struct.saved_data_len] = *data_src++;//将数据写入内存缓冲区
|
||||
printf_struct.saved_data_len = print_temp_save_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int Print_Get_Rx_Num(void)
|
||||
{
|
||||
if (printf_struct.saved_data_len >= printf_struct.printf_data_len)
|
||||
return (printf_struct.saved_data_len - printf_struct.printf_data_len);
|
||||
else
|
||||
return (printf_struct.saved_data_len + PRINT_BUF_SIZE - printf_struct.printf_data_len);
|
||||
}
|
||||
unsigned char Print_Get_Rx_Data(void)
|
||||
{
|
||||
unsigned char data;
|
||||
|
||||
data = wait_for_print_buf[printf_struct.printf_data_len];
|
||||
printf_struct.printf_data_len++;
|
||||
if (printf_struct.printf_data_len >= PRINT_BUF_SIZE)
|
||||
printf_struct.printf_data_len = 0;
|
||||
return data;
|
||||
}
|
||||
/***********************启动打印数据********************************
|
||||
Function: void PrintProgramData (u8 *data_src, u16 len)
|
||||
Description: 打印数据
|
||||
Input: data_src 数据来源指针 ,len 数据长度
|
||||
****************************************************************/
|
||||
void PrintProgramData(u8 *data_src, u16 len)
|
||||
{
|
||||
if(print_program_data_flag)
|
||||
{
|
||||
u16 i;
|
||||
if(len < PRINT_BUF_SIZE)
|
||||
{
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
wait_for_print_buf[printf_struct.saved_data_len++] = *(data_src + i);
|
||||
printf_struct.saved_data_len = printf_struct.saved_data_len % PRINT_BUF_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//打印状态机是否空闲
|
||||
u8 PrintDataMachineIfIdle(void)
|
||||
{
|
||||
if(PRINT_DATA_S0 == print_data_state)
|
||||
{
|
||||
return TASK_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TASK_BUSY;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************打印数据状态机******************************
|
||||
Function: void PrintDataMachine(void)
|
||||
Description: 打印数据状态机
|
||||
***************************************************************************/
|
||||
void PrintDataMachine(void)
|
||||
{
|
||||
switch(print_data_state)
|
||||
{
|
||||
case(PRINT_DATA_S0):
|
||||
{
|
||||
if(print_nb_data_flag)
|
||||
{
|
||||
if(Print_Get_Rx_Num()>0)
|
||||
{
|
||||
print_temp_data = Print_Get_Rx_Data();
|
||||
print_data_state = PRINT_DATA_S1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case(PRINT_DATA_S1):
|
||||
{
|
||||
if(TASK_IDLE == UartIfIdle(IR_UART_COM))
|
||||
{
|
||||
UartSend(IR_UART_COM,1,&print_temp_data,&printf_struct.send_msg);
|
||||
print_data_state = PRINT_DATA_S2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case(PRINT_DATA_S2):
|
||||
{
|
||||
if(Print_Get_Rx_Num()>0)
|
||||
{
|
||||
print_temp_data = Print_Get_Rx_Data();
|
||||
print_data_state = PRINT_DATA_S1;
|
||||
}
|
||||
else
|
||||
{
|
||||
print_data_state = PRINT_DATA_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case(PRINT_DATA_DEFAULT):
|
||||
{
|
||||
print_data_state = PRINT_DATA_S0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
print_data_state = PRINT_DATA_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
#ifndef __UWater_DEBUG_PRINT_H
|
||||
#define __UWater_DEBUG_PRINT_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "type.h"
|
||||
|
||||
#define PRINT_BUF_SIZE 1024
|
||||
|
||||
typedef struct {
|
||||
u16 saved_data_len; //存入数据的长度
|
||||
u16 printf_data_len; //已打印的数据长度
|
||||
u16 print_one_time_len;//单次打印长度
|
||||
u8 send_msg;
|
||||
u8 buf_overflow; //缓冲区溢出
|
||||
} PRINT_STRUCT;
|
||||
|
||||
typedef enum {
|
||||
PRINT_DATA_S0 = 0,
|
||||
PRINT_DATA_S1,
|
||||
PRINT_DATA_S2,
|
||||
PRINT_DATA_S3,
|
||||
PRINT_DATA_S4,
|
||||
PRINT_DATA_S5,
|
||||
PRINT_DATA_DEFAULT
|
||||
} PRINT_DATA;
|
||||
|
||||
//启动NB数据打印
|
||||
void OpenPrintNbDataSwitch(void);
|
||||
//关闭NB数据打印
|
||||
void ClosePrintNbDataSwitch(void);
|
||||
u8 GetPrintNbDataSwitch(void);
|
||||
//启动程序数据打印
|
||||
void OpenPrintProgramDataSwitch(void);
|
||||
//关闭程序数据打印
|
||||
void ClosePrintProgramDataSwitch(void);
|
||||
/***********************启动打印数据********************************
|
||||
Function: void PrintNbData (u8 *data_src, u16 len)
|
||||
Description: 打印数据
|
||||
Input: data_src 数据来源指针 ,len 数据长度
|
||||
****************************************************************/
|
||||
void PrintNbData(u8 *data_src, u16 len);
|
||||
/***********************启动打印数据********************************
|
||||
Function: void PrintProgramData (u8 *data_src, u16 len)
|
||||
Description: 打印数据
|
||||
Input: data_src 数据来源指针 ,len 数据长度
|
||||
****************************************************************/
|
||||
void PrintProgramData(u8 *data_src, u16 len);
|
||||
//打印状态机是否空闲
|
||||
u8 PrintDataMachineIfIdle(void);
|
||||
/*******************************打印数据状态机******************************
|
||||
Function: void PrintDataMachine(void)
|
||||
Description: 打印数据状态机
|
||||
***************************************************************************/
|
||||
void PrintDataMachine(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,750 @@
|
|||
#ifndef UWATER_FRAME_APP_H
|
||||
#define UWATER_FRAME_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "type.h"
|
||||
#include "UWater_gp22_driver.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
#pragma pack(1) //1字节对齐
|
||||
|
||||
/**
|
||||
硬件版本号命名规则:最高位表示是否带温度板
|
||||
|
||||
软件版本号命名规则:高4位表示地区
|
||||
bit31 bit30 bit29 bit28
|
||||
[地区:深水3-江水4----]
|
||||
**/
|
||||
#define BOOTLOADER_VERSION 0x3030314E //远程升级版本号(N1.00<EFBFBD>ASCALL
|
||||
#define FM_HEAD_MARK 0x68 //帧头
|
||||
#define MET_TYPE 0x10 //表计类型 0x10:水表
|
||||
#define MET_TYPE_TCP 0x20 //表计类型
|
||||
#define MET_TYPE_SY 0x02 //表计类型 沈阳规约定义为规约版本为02H 20211025
|
||||
#define FM_END_MARK 0x16 //帧尾
|
||||
#define MAX_NB 500 //NB接收数据缓冲区最大值
|
||||
#define FM_MAX_BUF_NUM 500 //发送缓冲区最大值
|
||||
|
||||
/*流量系数部分2020-07-08*/
|
||||
//流量系数部分宏定义
|
||||
#define FLOW_COEFFICIENT_BUF_NUM 18 //流量系数的个数
|
||||
#define LOW_TYPE 0x77
|
||||
#define MIDDLE_TYPE 0x88
|
||||
#define LARGE_TYPE 0x99
|
||||
#define ALL_TYPE 0xAA
|
||||
#define FLOW_COEFFICIENT_MAX 72089
|
||||
#define FLOW_COEFFICIENT_MIN 58982
|
||||
//第一次上电标志
|
||||
#define FIRST_POWER_ON_FLAG 0X55
|
||||
|
||||
|
||||
|
||||
|
||||
#define EEP_FRAME_BASE_ADDR 0x00
|
||||
#define EEP_FRAME_FIRST_POWER_ADDR (EEP_FRAME_BASE_ADDR + 0) //1byte //第一次上电标志地址
|
||||
#define EEP_FRAME_STARTUSING_ADDR (EEP_FRAME_FIRST_POWER_ADDR + 1) //1byte //出厂启用标志1字节
|
||||
#define FRAME_NBIot_FREQVAL (EEP_FRAME_STARTUSING_ADDR + 1) //设置上报频率5字节 add by wm 2017.07.19
|
||||
#define FRAME_NBIot_IP (FRAME_NBIot_FREQVAL+5) //设置ip 4字节
|
||||
#define FRAME_NBIot_PORT (FRAME_NBIot_IP+4) //设置端口 2字节
|
||||
#define FRAME_NBIot_REPORTSTART (FRAME_NBIot_PORT+2) //设置周期上报起始时间 6字节
|
||||
#define FRAME_NBIot_REPORTEND (FRAME_NBIot_REPORTSTART+6) //设置周期上报结束时间 6字节
|
||||
#define FRAME_NBIot_LENGTH (FRAME_NBIot_REPORTEND+6) //设置周期上报最小估值长度2字节
|
||||
#define EEP_RETRY_TIMES_ADDR (FRAME_NBIot_LENGTH + 2) //重试次数1字节
|
||||
#define FRAME_NBIot_STARTTIME (EEP_RETRY_TIMES_ADDR+1) //设置密集上报时间 9字节
|
||||
#define FRAME_NBIot_HIGHFLOW (FRAME_NBIot_STARTTIME+9) //设置最大流量报警阈值 4字节
|
||||
#define FRAME_VALVE_PRA (FRAME_NBIot_HIGHFLOW+4) //阀控相关参数 4字节
|
||||
#define FRAME_VALVE_EMERGENCY_FLOW (FRAME_VALVE_PRA +4) //应急开阀用水量设置 2字节
|
||||
#define FRAME_NBIot_fre (FRAME_VALVE_EMERGENCY_FLOW+2) //频点2个字节
|
||||
#define FRAME_NBIot_APN (FRAME_NBIot_fre+2) //APN 20字节
|
||||
#define FRAME_NBIot_KEY (FRAME_NBIot_APN+20) //普通密钥, 16字节
|
||||
#define EEP_FRAME_MAC_ADDR (FRAME_NBIot_KEY + 16) //7bytes //物理地址首地址
|
||||
#define EEP_FRAME_SER_NUM_ADDR (EEP_FRAME_MAC_ADDR + 7) //7bytes //序列号首地址
|
||||
#define EEP_FRAME_MET_ADDR (EEP_FRAME_SER_NUM_ADDR + 7) //7bytes //通讯地址首地址
|
||||
#define EEP_FRAME_SOLIDIFY_MAC_ADDR (EEP_FRAME_MET_ADDR + 7) //1byte //固化物理地址标志地址
|
||||
#define EEP_FRAME_BOOTLOADER_INFO_ADDR (EEP_FRAME_SOLIDIFY_MAC_ADDR + 1) //5bytes //远程升级信息首地址
|
||||
#define EEP_FRAME_ENABLE_BAK_KEY_ADDR (EEP_FRAME_BOOTLOADER_INFO_ADDR + 5) //1bytes //启用备份密钥标志地址
|
||||
#define EEP_FRAME_LAST_KEY_NUM (EEP_FRAME_ENABLE_BAK_KEY_ADDR + 1) //1byte //最新num,即下次通讯密钥num
|
||||
#define EEP_FRAME_TEMPERATURE_COEFFICIENT_ADDR (EEP_FRAME_LAST_KEY_NUM + 1) //8bytes //温度系数首地址
|
||||
#define EEP_FRAME_FLOW_COEFFICIENT_ADDR (EEP_FRAME_TEMPERATURE_COEFFICIENT_ADDR + 8) //24bytes //流量系数首地址
|
||||
#define EEP_FRAME_VERIFICATION_FUNCTION_ADDR (EEP_FRAME_FLOW_COEFFICIENT_ADDR + 24) //1byte //启用检定功能地址
|
||||
#define EEP_FRAME_INFRARED_FUNCTION_ADDR (EEP_FRAME_VERIFICATION_FUNCTION_ADDR + 1) //1byte //启用红外功能地址
|
||||
#define EEP_FRAME_FUNCCFGBYTES_ADDR (EEP_FRAME_INFRARED_FUNCTION_ADDR + 1) //32bytes //配置字节
|
||||
#define EEP_FRAME_START_FLOW_ADDR (EEP_FRAME_FUNCCFGBYTES_ADDR + 32) //2byte //使动流量2字节---20191111改善项目
|
||||
#define EEP_FRAME_COUNTER_CURRENT_FLOW_ADDR (EEP_FRAME_START_FLOW_ADDR + 2) //2byte //逆流开关2字节---20191111改善项目
|
||||
#define EEP_FRAME_SAMPLING_FREQUENCY_ADDR (EEP_FRAME_COUNTER_CURRENT_FLOW_ADDR + 2) //1byte //采样频率1字节---20191113改善项目
|
||||
#define EEP_FRAME_SAMPLING_BUF_LEN_ADDR (EEP_FRAME_SAMPLING_FREQUENCY_ADDR + 1) //1byte //采样缓冲区大小1字节---20191113改善项目
|
||||
#define EEP_FRAME_STORAGE_FREQUENCY (EEP_FRAME_SAMPLING_BUF_LEN_ADDR + 1) //1byte //密集存储间隔(0:30s,1:1min,2:2min,3:3min...)
|
||||
#define EEP_FRAME_JX_SAMPLING_FREQUENCY_ADDR (EEP_FRAME_STORAGE_FREQUENCY + 1) //2byte //江西规约采样频率(byte1,最低采样频率;byte2,最高采样频率)
|
||||
#define EEP_FRAME_JX_PSM_PWDOWN_ADDR (EEP_FRAME_JX_SAMPLING_FREQUENCY_ADDR +2) //1byte //江西规约NB模组PSM或断电模式选择(0,psm;1,power down)
|
||||
#define EEP_FRAME_NB_PARA_ADDR (EEP_FRAME_JX_PSM_PWDOWN_ADDR + 1) //4byte //设置NB重试间隔时间和符网等待时间
|
||||
#define FRAME_NBIot_BUBAO_FLAG (EEP_FRAME_NB_PARA_ADDR+4) //6byte //记录需要补包的数据“条数”,一个位对应一个数据包;以及读写历史数据指针 6字节
|
||||
#define FRMAE_REMAIN_EMERGENCY_FLOW (FRAME_NBIot_BUBAO_FLAG+6) //4byte 剩余应急用水量
|
||||
#define EEP_BLE_PARA_VOLTAGE (FRMAE_REMAIN_EMERGENCY_FLOW+4) //4byte 欠压阈值4字节
|
||||
#define EEP_FRMAE_BATTERY_ENERGY (EEP_BLE_PARA_VOLTAGE+4) //18byte 电池电量参数
|
||||
|
||||
|
||||
////以上要和 FRAME_MET_INFO 对应起来
|
||||
|
||||
#define EEP_GP30_BASE_ADDR 0X100
|
||||
/*#define DIFTOF_CALIBRATION_FLAG_ADDR 0X150 //2021,04,增加换能器零流量校准标志,如果是0xA1B2C3D4E5F6A7B8表示校准过
|
||||
#define DIFTOF_CALIBRATION_VALUE_ADDR DIFTOF_CALIBRATION_FLAG_ADDR +8 //2021,04,增加换能器零流量校准值4字节*/
|
||||
#define EEP_RTCC_APP_USE_ADDR 0X180
|
||||
|
||||
#define FRAME_FLOW_COEFFICIENT_ADDR 0x200 //多项式建模系数五条曲线共5*11*4字节
|
||||
|
||||
#define EEP_BOOTLOAD_START 0X300
|
||||
#define EEP_MCU_TYPE EEP_BOOTLOAD_START //mcu平台类型
|
||||
#define EEP_MCU_MODEL (EEP_MCU_TYPE+1) //mcu型号,1 字节
|
||||
#define EEP_PRODUCT_MODEL (EEP_MCU_MODEL+1) //产品型号,1字节
|
||||
#define EEP_HARDWARE_VERSION (EEP_PRODUCT_MODEL+1) //硬件版本,1字节
|
||||
#define EEP_SOFT_VERSION (EEP_HARDWARE_VERSION+1) //软件版本,4字节
|
||||
#define EEP_UPDATE_NUM (EEP_SOFT_VERSION+4) //升级总字节数,4字节
|
||||
#define EEP_UPDATE_CHECK (EEP_UPDATE_NUM+4) //升级校验码,2字节
|
||||
#define EEP_UPDATE_VER (EEP_UPDATE_CHECK+2) //升级版本,2字节
|
||||
#define EEP_UPDATE_FLAG (EEP_UPDATE_VER+2) //是否升级标志,1字节
|
||||
#define EEP_UPDATE_SOURSE (EEP_UPDATE_FLAG+1) //升级来源,1字节
|
||||
#define EEP_UPDATE_PKNUM (EEP_UPDATE_SOURSE+1) //包号,2字节
|
||||
#define EEP_UPDATE_RSSI (EEP_UPDATE_PKNUM+2) //信号强度,1字节
|
||||
#define EEP_UPDATE_UDP_IP (EEP_UPDATE_RSSI+1) //4bytes,UDP升级IP地址
|
||||
#define EEP_UPDATE_UDP_PORT (EEP_UPDATE_UDP_IP+4) //2bytes,UDP升级端口号
|
||||
|
||||
#define EEP_BASE_VALVE (EEP_BOOTLOAD_START+40) //阀门控制,2字节 20180903
|
||||
|
||||
#define FRAME_FLOW_LOW_COEFFICIENT_ADDR 0x340 //72字节,流量系数基地址 2020-07-08
|
||||
#define FRAME_FLOW_MIDDLE_COEFFICIENT_ADDR (FRAME_FLOW_LOW_COEFFICIENT_ADDR + 24)//流量系数LOW地址向后偏移24个字节用于存储20~35℃数值
|
||||
#define FRAME_FLOW_HIGH_COEFFICIENT_ADDR (FRAME_FLOW_MIDDLE_COEFFICIENT_ADDR + 24)//流量系数MIDDLE地址向后偏移24个字节用于存储35℃及以上数值
|
||||
|
||||
#define EEP_RTCC_APP_HISTORY_ADDR 0x440 //0x440~0x823
|
||||
#define EEP_SOE_ADDR 0x1000 //SOE存储基地址
|
||||
|
||||
#define FRAME_NBIot_HISTORY_READ_ADD 0x2000 //存储历史数据基地址
|
||||
#define FRAME_QUANZHOU_STORE_ADD 0x4000 //泉州项目数据存储地址
|
||||
#define FRAME_SHENYANG_STORE_ADD 0x7300 //沈阳项目数据存储地址
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//多项式建模部分宏定义
|
||||
#define MULT_COEFFICIENT_BUF_NUM 55 //多项式建模系数的个数
|
||||
#define COEFFICIENT_MAX (float)1000 //多项式建模系数的合法最大值
|
||||
#define COEFFICIENT_MIN (float)-1000 //多项式建模系数的合法最小值
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
UNION_4U8TOU32 float_storage_format;
|
||||
float float_datas;
|
||||
} UNION_FLOAT_STORAGE;
|
||||
|
||||
|
||||
typedef union
|
||||
{
|
||||
uint8_t value[4];
|
||||
uint32_t value_u32;
|
||||
float flt;
|
||||
} TYP_FLOW_COEFFICIENT;
|
||||
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
u8 type; //天数/月份区分位,无符号整数(HEX)。0:表示按天来发送1:表示按月来发送
|
||||
u8 period; //无符号整数(HEX)。周期值,如果配置为按天传,则该字段表示几天。如果配置为按月传,则该字段表示每月的几号
|
||||
bcd hour; //上传时间,BCD码,表示时。
|
||||
bcd minute; //上传时间,BCD码,表示分。
|
||||
bcd second;
|
||||
}s;
|
||||
u8 buf[5];
|
||||
} Time_upload;//定时上传参数
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 valve_state; //阀门状态
|
||||
u8 valve_err; //阀门异常
|
||||
u8 valve_total_time; //最大控阀时间
|
||||
u8 valve_AD; //堵转AD值
|
||||
};
|
||||
u8 byte[4];
|
||||
} IES_VALVE_PARAS; //阀控参数
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 valve_up_times_pre; //规约设定的频率-关阀上报
|
||||
u8 valve_up_times_total; //规约设定的次数-关阀上报
|
||||
u8 valve_up_times_realtime; //实时上报的次数-关阀上报
|
||||
u8 valve_auto_check; //每月阀门自检功能是否开启,AA表示开启
|
||||
u8 reserv;//预留字节
|
||||
};
|
||||
u8 byte[5];
|
||||
} IES_VALVE_UP_TIMES; //关阀后,上报参数
|
||||
|
||||
extern TYP_FLOW_COEFFICIENT cal_coefficient[MULT_COEFFICIENT_BUF_NUM];
|
||||
extern const float default_coefficient[MULT_COEFFICIENT_BUF_NUM];
|
||||
extern UNION_4U8TOU32 cal_flow_coefficient[FLOW_COEFFICIENT_BUF_NUM];//多项式流量系数
|
||||
extern const u32 default_flow_coefficient[FLOW_COEFFICIENT_BUF_NUM];//
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 ble_tx_power;
|
||||
u8 ble_adv_fre;
|
||||
u8 ble_con_para;
|
||||
u8 ble_scan_times;
|
||||
u8 password_enable;
|
||||
} BLE_FUNC_SW;
|
||||
typedef struct
|
||||
{
|
||||
mtype32_ total_use_sum_times_sec;
|
||||
mtype32_ bat_surplus;
|
||||
mtype32_ use_sum_times_sec;
|
||||
mtype32_ nb_use_sum_times_sec;
|
||||
u16 nb_upload_happen_num;
|
||||
u16 valve_use_sum_times_sec;
|
||||
float ee_remain_para_energy_life;
|
||||
}STR_RUN_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 first_power_flg; //第一次上电标志---------------------1
|
||||
u8 start_using_flg; //出厂启用标志-----------------------1
|
||||
Time_upload Time_upload_2006; //定时上传参数//上报频率5--------------------------5第无字节秒不用
|
||||
u8 server_ip[4]; //ip地址4----------------------------4
|
||||
UNION_2U8TOU16 server_port; //端口号2----------------------------2
|
||||
u8 report_period_start[6]; //周期上报起始时间,月日时?6----------6
|
||||
u8 report_period_end[6]; //周期上报结束时间,月日时?6----------6
|
||||
UNION_2U8TOU16 report_step_len; //UNION_2U8TOU16 report_step_len;//周期上报最小估长值2-----------------2// 错峰间隔时间 单位秒,范围15~43.定时上传错峰方案:定时上传时间 + 表号后3位 ×错峰时间间隔 + 60秒。
|
||||
u8 report_retry_times; //u8 report_retry_times; //重试次数 1 --------------------1
|
||||
u8 report_start_time[9]; //密集上报开始时间,月日时?9-----------9
|
||||
UNION_4U8TOU32 high_flow_alarm; //大流量报警门限值4-------------------4
|
||||
IES_VALVE_PARAS ies_valve_paras;//阀控参数 u8 ss_bak[6];//预留6个字节------------------------4
|
||||
UNION_2U8TOU16 ies_pulse_emergency; //应急用水量----------------------2
|
||||
UNION_2U8TOU16 report_fre; //频点2-------------------------------2
|
||||
u8 apn[20]; //APN, 20 ------------------------20
|
||||
u8 key[16]; //普通密钥---------------------------16
|
||||
u8 mac_addr[7]; //物理地址----------------------------7
|
||||
u8 ser_num[7]; //序列号------------------------------7
|
||||
u8 met_addr[7]; //通讯地址----------------------------7
|
||||
u8 solidify_mac_addr_flg; //固化物理地址标识---------------------1
|
||||
IES_VALVE_UP_TIMES ies_valve_up_times;//关阀后,上报参数-----------------5
|
||||
u8 enable_bak_key; //启用备份密钥--------------------------1
|
||||
u8 last_key_num; //下次通讯的密钥num---------------------1
|
||||
UNION_4U8TOU32 temperature_coefficient0; //温度系数0---------------------4
|
||||
UNION_4U8TOU32 temperature_coefficient1; //温度系数1---------------------4
|
||||
UNION_4U8TOU32 flow_coefficient_small; //小流量系数----------------------4//0x00010000
|
||||
UNION_4U8TOU32 flow_coefficient_middle0; //中流量系数0-------------------4//0x00010000
|
||||
UNION_4U8TOU32 flow_coefficient_middle1; //中流量系数1-------------------4//0x00010000
|
||||
UNION_4U8TOU32 flow_coefficient_middle2; //中流量系数2-------------------4//0x00010000
|
||||
UNION_4U8TOU32 flow_coefficient_middle3; //中流量系数3-------------------4//0x00010000 //20161021
|
||||
UNION_4U8TOU32 flow_coefficient_large; //大流量系数----------------------4//0x00010000
|
||||
u8 enable_verification_function; //启用检定功能--------------------------1//0x5A
|
||||
u8 enable_infrared_function; //启用红外功能------------------------------1//0x5A
|
||||
u8 func_cfg_bytes[32]; //功能配置字节------------------------------32
|
||||
//改善项目-20191108-增加始动流量和逆向流量开关,共4字节,
|
||||
UNION_2U8TOU16 start_flow;//使动流量2字节--------------------------------2
|
||||
UNION_2U8TOU16 counter_current_flow; //逆向流量开关----------------------2
|
||||
u8 sampling_frequency; //采样频率----------------------------------------1
|
||||
u8 buf_length; // BUFF--------------------------------------------------1
|
||||
u8 storage_frequency;//密集存储间隔--------------------------------------1
|
||||
u8 jx_sampling_frequency[2];//江西规约采样频率---------------------------2
|
||||
u8 jx_psm_pwdown;//江西规约NB模组PSM或断电模式选择------------------------1
|
||||
UNION_2U8TOU16 Upload_again_interval_time;//UNION_2U8TOU16 nb_para_retry_delay; //重试时间
|
||||
UNION_2U8TOU16 nb_para_login_ask_times; //增加附网时长(查询cereg次数)
|
||||
UNION_4U8TOU32 Supplemental_send_flag; //补包标志记录,每天的周期上报不成功则记录一个bit最多补包30天记录。
|
||||
u8 histroy_r;//历史数据的读指针 历史数据存储指针
|
||||
u8 histroy_w;//历史数据的写指针 补包用数据指针
|
||||
UNION_4U8TOU32 ies_pulse_remain; //应急用水量应达到的值,4
|
||||
u8 voltage_low[4];//欠压阈值
|
||||
STR_RUN_INFO run_information_object;
|
||||
}FRAME_MET_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 transducer_aging : 1; //换能器老化
|
||||
u8 flow_err : 1; //当前流量>Q4或者<Q1
|
||||
u8 rtcc_time_err : 1; //RTCC时间异常
|
||||
u8 nbsend_err : 1; //GPxx异常
|
||||
u8 nbrec_err :1;
|
||||
u8 water_overheating : 1; //水温超出温度等级范围
|
||||
u8 gp22_commun_fail:1;//GP22通信失败
|
||||
u8 nouse1 : 1;
|
||||
} stat0bits;
|
||||
u8 stat0;
|
||||
};
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 reverse : 1; //倒转
|
||||
u8 low_flow_rate : 1; //超低流量报警
|
||||
u8 none_water : 1; //管道无水
|
||||
u8 diftof_calibration_switch : 1; //零流量校准开关标志
|
||||
u8 transducer_check_abnormal : 1; //换能器可能存在异常的标志
|
||||
u8 low_battery_voltage : 1; //电池欠压
|
||||
u8 valve_state : 2; //阀门状态
|
||||
} stat1bits;
|
||||
u8 stat1;
|
||||
};
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 met_type: 1;//表计类型(1超声波、0普通)
|
||||
u8 nouse : 7;
|
||||
} stat2bits;
|
||||
u8 stat2;
|
||||
};
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 met_type : 1;
|
||||
u8 nbrec_err :1;
|
||||
u8 gp22_commun_fail:1;//GP22通信失败
|
||||
u8 rtcc_time_err : 1; //RTCC时间异常
|
||||
u8 nbsend_err : 1; //GPxx异常
|
||||
u8 water_overheating : 1; //水温超出温度等级范围
|
||||
u8 flow_err : 1; //当前流量>Q4或者<Q1
|
||||
u8 transducer_aging : 1;//换能器老化
|
||||
} stat3bits;
|
||||
u8 stat3;
|
||||
};
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 nouse : 8;
|
||||
} stat4bits;
|
||||
u8 stat4;
|
||||
};
|
||||
} MET_STATE; //状态字
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 reverse : 1; //倒转
|
||||
u8 low_flow_rate : 1; //超低流量报警
|
||||
u8 valve_state : 2; //阀门状态
|
||||
u8 remain_warning:1;//余量报警
|
||||
u8 release : 2; //空闲
|
||||
u8 ntc_state:1; //NTC异常标志
|
||||
} statTcp1bits;
|
||||
u8 statTCP1;
|
||||
};
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 remain_state : 1; //余量为负数
|
||||
u8 low_power : 1; //电池欠压报警
|
||||
u8 release : 2; //空闲
|
||||
u8 amplitude : 4;//换能器幅值档位
|
||||
} statTcp2bits;
|
||||
u8 statTCP2;
|
||||
};
|
||||
} TCP_STATE; //状态字
|
||||
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
} Fram_To_Float;
|
||||
typedef struct
|
||||
{
|
||||
u8 data_sourse; //信息源(0:uart ; 1:rf)
|
||||
u8 enc_reply_flg; //加密应答标志,置1有效
|
||||
u8 enc_tmp_addr[7]; //请求帧加密地址暂存,用于应答。
|
||||
u8 rev_key_num; //上位机给的num值
|
||||
} STRUCT_FLAG; //内部标志位
|
||||
/************************************************规约消息管理相关**********************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 set_verification_msg; //进检定0
|
||||
u8 clear_realtime_data_msg; //清实时数据1
|
||||
u8 clear_work_time_msg; //清累计工作时间2
|
||||
u8 bootloader_msg; //远程升级3
|
||||
u8 measure_hydrostatic_jet_lag_msg; //测净水时差4----------没用
|
||||
u8 clear_history_data_msg; //清历史数据5
|
||||
u8 channel_change_msg; //信道切换6-------------------------没用
|
||||
u8 start_188fm_route_msg;//188规约发起递传7----------------没用
|
||||
u8 change_link_addr_msg; //更新链路地址8----------------没用
|
||||
u8 change_route_mettype_msg; //表类型变9----------------没用
|
||||
u8 check_active_time_msg; //需要立即查活跃期msg(上电或者递传时间、抄表时段变)10
|
||||
u8 calibrate_time_rfapp_msg; //校时msg(用于rtapp复位状态、标志)11
|
||||
u8 calibrate_rtc_msg; //RTC校准msg 12
|
||||
u8 valve_ctrl_msg; //阀控msg 13------------------没用
|
||||
u8 static_measure_init_msg; //静水测量初始化msg 14----------没用
|
||||
u8 low_power_msg; //表计低功耗msg 15
|
||||
u8 out_verification_msg; //出检定msg 16
|
||||
u8 lcd_display_all_msg; //全显 17
|
||||
u8 initial_data_msg; //下初值标志 18
|
||||
u8 model_change_msg;//切换逆流计量使用 19
|
||||
u8 valve_open_msg;//开阀20
|
||||
u8 valve_close_msg;//关阀21
|
||||
u8 valve_half_msg;//半开阀22
|
||||
//NB上报相关的
|
||||
u8 msg_nb_UploadFreqChange;//上报频率改变
|
||||
u8 msg_nb_IpPort_change;//IP Port改变
|
||||
u8 msg_nb_StartEnd_change;//周期上报起始和结束时间改变
|
||||
u8 msg_nb_StepLength_change;//估长值改变
|
||||
u8 msg_nb_RetryTimes_change;//重试次数改变
|
||||
u8 msg_nb_IntensiveTime;//密集上报
|
||||
u8 msg_nb_FlowAlarm;//报警阈值
|
||||
u8 msg_nb_UartSend;//串口发起上传
|
||||
u8 msg_nb_SoftUpdate;//软件升级消息
|
||||
u8 msg_nb_Apn_change;//APN更改
|
||||
u8 msg_updatesoft_version_ok;//判断升级版本号正确
|
||||
u8 msg_rtcc_adjust_time;//RTC校时消息
|
||||
u8 msg_nb_upload_ack_ok;//NB上传应答成功
|
||||
u8 msg_nb_uoload_faild;//NB上传失败
|
||||
u8 msg_caliberate;//表计单程时间校准标志
|
||||
} STRUCT_MSG; //对外msg
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SetVerificationMsg = 0, //进检定0
|
||||
ClearRealtimeDataMsg = 1, //清实时数据1
|
||||
ClearWorkTimeMsg = 2, //清累计工作时间2
|
||||
BootloaderMsg = 3, //远程升级3
|
||||
MeasureHydrostaticJetLagMsg = 4, //测净水时差4
|
||||
ClearHistoryDataMsg = 5,//清历史数据5
|
||||
ChannelChangeMsg = 6,//信道切换6
|
||||
Start188FmRouteMsg = 7,//188规约发起递传7
|
||||
ChangeLinkAddrMsg = 8,//更新链路地址8
|
||||
ChangeRouteMettypeMsg = 9,//表类型变9
|
||||
CalibrateRtcMsg = 12,//RTC校准msg 12
|
||||
ValveCtrlMsg = 13,//阀控msg 13
|
||||
StaticMeasureInitMsg = 14,//静水测量初始化msg 14
|
||||
LowPowerMsg = 15,//表计低功耗msg 15
|
||||
OutVerificationMsg = 16,//出检定msg 16
|
||||
LcdDisplayAllMsg = 17,//全显 17
|
||||
InitialDataMsg = 18,//下初值标志 18
|
||||
ModelChangeMsg = 19,//切换逆流计量使用 19
|
||||
ValveOpenMsg = 20,//开阀20
|
||||
ValveCloseMsg= 21,//关阀21
|
||||
ValveHalfMsg = 22,//半开阀22
|
||||
//NB上报相关的
|
||||
MsgNbUploadFreqChange=23,//上传数据
|
||||
MsgNbIpPortChange=24,//IP Port改变
|
||||
MsgNbStartEndChange=25,//周期上报起始和结束时间改变
|
||||
MsgNbStepLengthChange=26,//估长值改变
|
||||
MsgNbRetryTimesChange=27,//重试次数改变
|
||||
MsgNbIntensiveTime=28,//密集上报
|
||||
MsgNbFlowAlarm=29,//报警阈值
|
||||
MsgNbUartSend=30,//串口发起上传
|
||||
MsgNbSoftUpdate=31,//软件升级消息
|
||||
MsgNbApnChange=32,//APN更改
|
||||
MsgUpdateSoftVersionCheckOk=33,//判断升级版本号正确
|
||||
MsgRtccAdjustTime=34,//RTC校时消息
|
||||
MsgNbUplaod_AckOk=35,//NB上传应答成功
|
||||
MsgNbUploadFailed=36,//NB上传失败
|
||||
MsgNbUploadRetryMsg=37,//NB上传开始
|
||||
MsgSaveHisIndex=38,//保存读写指针
|
||||
MsgSaveBubaoFlag=39,//保存补报标志
|
||||
MsgClearNbDebugFlag=40,//关闭红外打印
|
||||
MsgOpenIr=41,//打开红外通信
|
||||
MsgRtccEvenHour=42,//偶数整点时间到
|
||||
MsgValve_EmergencyFlowStore=43,//应急用水量保存消息
|
||||
MsgTouchKeyReset = 44,
|
||||
MsgNbUplaod_AckLoginOk=45,//NB上传应答成功
|
||||
MsgCaliberate = 46,//表计单程时间校准标志
|
||||
///////////////////泉州
|
||||
MsgQuanzhou_DailySave=47,//日冻结数据存储消息
|
||||
MsgQuanzhou_MonthSave=48,//月冻结数据存储消息
|
||||
///////////////////长沙
|
||||
MsgChangcha_ValveUploadCnts=49,//关阀上报次数增加消息
|
||||
MsgTchKey_ClearKeyLimit=50,//清除触摸按键次数消息
|
||||
//////////////////阀门状态切换时发起上报
|
||||
MsgNbUploadByValveStateChange = 51,
|
||||
MsgNb_SaveHis=52,//记录补报消息
|
||||
MsgNbUpload_OffLine = 53,//立即下线
|
||||
MsgValveCloseSaveFlow = 54,//关阀到位保持当前流量
|
||||
MsgValveCloseSuccess = 55,//关阀到位
|
||||
MsgValveOpenSuccess =56,//开阀到位
|
||||
//////////////////沈阳
|
||||
MsgShenYang_DailySave=57,//日冻结数据存储
|
||||
MsgShenYang_MonthSave=58,//月冻结数据存储
|
||||
MsgShenYang_YearSave=59,//年冻结数据存储
|
||||
MsgShenYang_CircleSave=60,//周期数据存储
|
||||
MsgShenYang_FrozenClear=61,//冻结数据清除
|
||||
MsgShenYang_CircleClear=62,//周期数据清除
|
||||
MsgShenYang_WarningClear=63,//报警数据清除
|
||||
MsgShenYang_FactorySettingAndReset=64,//恢复出厂设置并重启
|
||||
MsgShenYang_SysReset=65,
|
||||
MsgShenYang_WarningCheck=66,//检查报警状态
|
||||
MsgShenYang_WarningStoreReset=67,
|
||||
MsgShenYang_NbUploadWarning = 68,//报警触发上报
|
||||
MsgShenYang_NbUploadWarningWithCircle = 69,//报警随周期数据上报
|
||||
MsgShenYang_NbUplaod_AckOk=70,//NB上传应答成功
|
||||
MsgShenYang_UdpIpPortChange=71,//UDP IP Port改变
|
||||
/////////////////////////
|
||||
MsgNb_FlagRcvNbFrame=72,//收到指令
|
||||
MsgSS_JianGeStore=73,//间隔流量存储
|
||||
Msg_FrozenStore=74,//间隔流量存储
|
||||
Msg_ClearHisOther=75,//清表数据给其他规约消息
|
||||
Msg_ValveOpenEmergency=76,//按键应急开阀
|
||||
Msg_WdtReset=77,//看门狗复位消息
|
||||
Msg_Por5VReset=78,//欠压或硬复位
|
||||
MsgSS_HisIndexStore=79,//冻结数据指针存储
|
||||
MsgBLE_AdvChange=80,//广播数据修改
|
||||
MsgBLE_ReadData=81,//抄读表数据消息
|
||||
MsgBLE_RevData=82,//收到指令消息
|
||||
MsgAddr_Change=83,//表地址变化
|
||||
MsgBLE_ConfigChange=84,//蓝牙上电初始化
|
||||
MsgBLE_Clktrim=85,//时钟校准
|
||||
MsgBLE_OtaEnter=86,//进入OTA升级
|
||||
MsgBLE_OtaExit=87,//退出OTA升级
|
||||
Msg_PsmPowerCheck=88,//PSM电源检查
|
||||
Msg_FactoryUpload=89,//厂区上报消息
|
||||
Msg_FactoryBleActive=90,//厂区唤醒蓝牙
|
||||
|
||||
Msg_AllCount=91
|
||||
} Frame_MsgTypeDef;
|
||||
|
||||
#define FRAME_MSG_TYPE_CNT Msg_AllCount
|
||||
|
||||
typedef union
|
||||
{
|
||||
STRUCT_MSG MsgStruct;
|
||||
u8 MsgBuf[FRAME_MSG_TYPE_CNT];
|
||||
} UNION_MSG;
|
||||
|
||||
void FrameSetMsgApp(Frame_MsgTypeDef msgType);
|
||||
u8 FrameCheckMsgApp(Frame_MsgTypeDef msgType);
|
||||
u8 FrameClearMsgApp(Frame_MsgTypeDef msgType);
|
||||
/***************************************************************************************************/
|
||||
/************************************************规约参数管理相关**********************************/
|
||||
typedef enum
|
||||
{
|
||||
FramePara_DNx = 0, //管段口径
|
||||
FramePara_Tc0 = 1, //温度系数0
|
||||
FramePara_Tc1 = 2, //温度系数1
|
||||
FramePara_FcSmall = 3, //流量系数small
|
||||
FramePara_FcMiddle0 = 4, //流量系数Middle0
|
||||
FramePara_FcMiddle1 = 5, //流量系数Middle1
|
||||
FramePara_FcMiddle2 = 6, //流量系数Middle2
|
||||
FramePara_FcLarge = 7, //流量系数Large
|
||||
FramePara_ReportStartDMY = 8, //密集上报开始时间日月年bcd
|
||||
FramePara_ReportStartSMH = 9, //密集上报开始时间秒分时bcd
|
||||
FramePara_ProgVersion = 10, //软件版本号
|
||||
FramePara_MetAddr0_3 = 11, //通信地址低4字节
|
||||
FramePara_MetAddr4 = 12, //通信地址高1字节
|
||||
FramePara_FuncCfg0_3 = 13,//功能控制字
|
||||
FramePara_FuncCfg4_7 = 14,//功能控制字
|
||||
FramePara_FuncCfg8_11 = 15,//功能控制字
|
||||
FramePara_FuncCfg12_15 = 16,//功能控制字
|
||||
FramePara_ReportEndSMH = 17,//密集上报结束时间日月年bcd
|
||||
FramePara_FcMiddle3 = 18, //流量系数Middle3
|
||||
FramePara_Sta1_2 = 21,//状态字
|
||||
FramePara_CCFlow = 22,//逆流开关
|
||||
FramePara_StartFlow = 23,//始动流量
|
||||
FramePara_GP30Freq = 24,//采样频率
|
||||
FramePara_GP30BufLen = 25,//采样缓存字节数
|
||||
FramePara_ReportFreq = 30,//上报频率
|
||||
FramePara_EnableTestFunc = 31,//检定功能开关
|
||||
FramePara_EnableInfrareFunc = 32,//红外功能开关
|
||||
FramePara_StartUsingFunc = 33,//出厂启用
|
||||
FramePara_StoreFrequency = 34,//密集存储间隔时间
|
||||
FramePara_SamplingFrequency = 35,//江西规约采样频率
|
||||
FramePara_PsmOrPwDown = 36, //江西规约NB模组PSM或断电模式选择
|
||||
FramePara_NbParaRetryDelay = 37, //NB模组上报重试时间和符网等待时间参数配置
|
||||
FramePara_NbParaLoginAckTimes=38,
|
||||
FramePara_BootVersion = 39,//boot版本号
|
||||
//
|
||||
FramePara_End = 40
|
||||
} Frame_CheckParaTypeDef;
|
||||
#define FRAME_PARA_BUF_LEN (FramePara_End+1)
|
||||
u32 FrameCheckParaApp(Frame_CheckParaTypeDef parameter);
|
||||
void Frame_Para_Init(void);
|
||||
/***************************************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 en_code;//是否加密,1为加密
|
||||
u8 add_num;//加密补位的数字
|
||||
u16 data_len;//收到的数据区的长度
|
||||
}ENCODE_VERIFY;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 mcu; //平台类型
|
||||
u8 mcu_model; //MCU型号
|
||||
u8 product_model; //产品型号
|
||||
u8 hardware_version; //硬件版本号
|
||||
u8 soft_version[4]; //软件版本号
|
||||
UNION_4U8TOU32 update_num; //升级总字节数
|
||||
UNION_2U8TOU16 update_check; //升级校验码
|
||||
UNION_2U8TOU16 bootloader_ver;//升级版本
|
||||
u8 bootloader_update_flg;//是否升级标志
|
||||
u8 bootloader_datas_sourse;//升级来源//0x01--串口 0x02--GPRS 0x03--小无线
|
||||
UNION_2U8TOU16 bootloader_paknum;//包号
|
||||
//以下不通过上位机发送
|
||||
//注意,boot判断到端口号在8081~8090之间,会自动启用UDP升级方式;规约设置IP地址时,判断到该范围,会保存到UDP IP的EE地址
|
||||
u8 bootloader_RSSI; //信号强度
|
||||
u8 server_ip[4]; //udp升级,ip地址4
|
||||
UNION_2U8TOU16 server_port; //udp升级,端口号2
|
||||
//表计地址和以上信息在EE中不连续
|
||||
u8 bootloader_addr[7];//表计地址
|
||||
}U_UPGRADE_INFO; //34字节
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 FirstPowerOnFlag;
|
||||
u8 ProductUpoadFailFlag;
|
||||
u8 ProductUploadFlag;
|
||||
BLE_FUNC_SW function_switch;//蓝牙功能开关
|
||||
u8 NBSleepMode;
|
||||
u8 LCD_NoTestFlag;
|
||||
}U_TEMP_INFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 Point_SOE_write; //SOE记录指针
|
||||
}U_SIGAL_DATA;
|
||||
|
||||
typedef union {
|
||||
|
||||
struct {
|
||||
u8 first_flag; //第一次上电标志位
|
||||
u32 work_hour; //累计工作时间
|
||||
DateTime start_time_up; //出厂时间
|
||||
u16 day_history_addr; //历史日数据存储指针
|
||||
u32 day_data; //结算日累积流量
|
||||
}data;
|
||||
u8 byte[18];
|
||||
} RTCC_EE_DATA; //RTCC永久性数据
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FRAME_MET_INFO P1;//系统参数缓存
|
||||
U_UPGRADE_INFO P2;//升级和UDP地址相关
|
||||
U_TEMP_INFO P3;//不存EE的全局参数
|
||||
U_SIGAL_DATA P4;
|
||||
RTCC_EE_DATA ee_data;
|
||||
//GP30_DIFTOF_CAL_DATA P5;
|
||||
} Data_object;//定义数据对象
|
||||
|
||||
//#define FLOW_ 0x2B1A
|
||||
|
||||
extern Data_object Sys_data_object;
|
||||
//20211204
|
||||
#if PF_TYPE_METER || EN_TYPE_METER || MID_TYPE_METER
|
||||
extern float default_error_cruve[15][16];
|
||||
#else
|
||||
extern float default_error_cruve[12][16];
|
||||
#endif
|
||||
extern float default_error_DXS[MULT_COEFFICIENT_BUF_NUM];
|
||||
|
||||
void FrameInitApp(void);
|
||||
void FrameMachineApp(void);
|
||||
//江西水务规约使用
|
||||
void FrameSetSupplementalPack_Flag(u8 tempData);
|
||||
|
||||
|
||||
u16 FrameCheckByte(void);
|
||||
u8 FrameIfSleepApp(void);
|
||||
MET_STATE FrameGetByte(void);
|
||||
u8 Save_histroy_ss_flag(u8 flag);
|
||||
u8 Clear_histroy_ss_flag(u8 ss_NO);
|
||||
///////////////////////////////////
|
||||
u32 HexToBcd32(u32 value);
|
||||
u32 Gp30DataToBcd(u32 data, u32 times);
|
||||
/*************NB*************************/
|
||||
TYP_FLOW_COEFFICIENT* ReadCofficientApp(void);
|
||||
UNION_4U8TOU32* Read_Flow_CofficientApp(void);//2020-07-08 用来传递流量系数的首地址
|
||||
u32 Read_Flow_CofficientApp_For_LCD(u8 index);//2020-08-13 //用来传输常温流量系数给A2屏幕
|
||||
void fram_tools_writeU32ByBuf(u8 *pU32Buf, u8 *pSrc, u8 dir);
|
||||
u8 frame_get_datasource(void);
|
||||
void frame_set_key(void);
|
||||
|
||||
float Get_Temperature_Caliberate(void);//获取活塞台子校准温度
|
||||
void SetCaliberateTemperature(u16 temp_value);//更新标准温度
|
||||
u8 GetNbiotRevHandleOverFlag(void);
|
||||
void UWMetPtlPackApp(void);
|
||||
|
||||
#define UP_DEAL_S0 0
|
||||
#define UP_DEAL_S1 1
|
||||
#define UP_DEAL_S2 2
|
||||
#define UP_DEAL_S3 3
|
||||
#define UP_DEAL_S4 4
|
||||
#define UP_DEAL_S5 5
|
||||
#define UP_DEAL_S6 6
|
||||
#define UP_DEAL_S7 7
|
||||
#define UP_DEAL_S8 8
|
||||
#define UP_DEAL_S9 9
|
||||
#define UP_DEAL_S10 10
|
||||
#define UP_DEAL_S11 11
|
||||
#define UP_DEAL_S12 12
|
||||
#define UP_DEAL_S13 13
|
||||
#define UP_DEAL_S14 14
|
||||
#define UP_DEAL_S15 15
|
||||
#define UP_DEAL_S16 16
|
||||
#define UP_DEAL_S17 17
|
||||
#define UP_DEAL_S18 18
|
||||
#define UP_DEAL_S19 19
|
||||
#define UP_DEAL_S20 20
|
||||
#define UP_DEAL_S21 21
|
||||
#define UP_DEAL_S30 30
|
||||
#define UP_DEAL_S31 31
|
||||
#define UP_DEAL_S32 32
|
||||
#define UP_DEAL_S33 33
|
||||
|
||||
#define UP_DEAL_S_OVER 99
|
||||
|
||||
//解规约状态机
|
||||
typedef enum{
|
||||
UW_MET_PTL_IDLE=0, //空闲
|
||||
UW_MET_PTL_EXP, //解规约,区分规约类型
|
||||
UW_MET_IES_PTL_PACK_S1, //MBUS规约组应答帧
|
||||
UW_MET_MBUS_PTL_PACK_S1, //积成NB规约组应答帧
|
||||
UW_MET_SHTCP_PTL_PACK_S1, //商河TCP规约组应答帧
|
||||
UW_MET_SYNB_PTL_PACK_S1, //沈阳NB规约组应答帧
|
||||
UW_MET_OTHER_PTL_PACK_S1,
|
||||
UW_MET_PTL_PACK_S2, //根据通道发送数据
|
||||
UW_MET_PTL_PACK_S3, //根据通道判断数据发送完成
|
||||
}TYP_STATE_MET_PTL_PACK;
|
||||
|
||||
/*********************************************************缓存队列*********************/
|
||||
#define QUEUE_BUF_SIZE 10 //缓存队列深度
|
||||
typedef struct
|
||||
{
|
||||
u8 type;
|
||||
u16 length;
|
||||
u8 buffer[128];
|
||||
} ONE_PACK_DATA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 handled_count;
|
||||
u8 total_count;
|
||||
ONE_PACK_DATA queue[QUEUE_BUF_SIZE];
|
||||
} NBIOT_REV_QUEUE;
|
||||
|
||||
//规约数据通道类型
|
||||
#define UP_SOURCE_IR 0
|
||||
#define UP_SOURCE_NB 1
|
||||
#define UP_SOURCE_MBUS 2
|
||||
#define UP_SOURCE_BLE 3
|
||||
//规约类型
|
||||
#define IES_PTL 1
|
||||
#define MBUS_PTL 2
|
||||
//#define SHTCP_PTL 3
|
||||
//#define SYNB_PTL 4
|
||||
#define OTHER_PTL 5
|
||||
//规约组帧状态
|
||||
#define PTL_PACK_BUSY 0
|
||||
#define PTL_PACK_SUCCESS 1
|
||||
#define PTL_PACK_FAIL 2
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GP30W_FRAME_APP_NEW_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,143 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_BLE_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_BLE_H
|
||||
#include "sys_config.h"
|
||||
#include "type.h"
|
||||
#if PRODUCT_BLE_SS
|
||||
//----------------------------------------------蓝牙规约协议----------------------------------------/
|
||||
/**
|
||||
数据标识0不从0开始;
|
||||
增加读取功能配置字
|
||||
*/
|
||||
//抄读表数
|
||||
#define BLE_READ_DATA_DI0 0x00
|
||||
#define BLE_READ_DATA_DI1 0x50
|
||||
//阀控
|
||||
#define BLE_VALVE_CTRL_DI0 0x01
|
||||
#define BLE_VALVE_CTRL_DI1 0x50
|
||||
//读取表地址
|
||||
#define BLE_READ_MET_DI0 0x02
|
||||
#define BLE_READ_MET_DI1 0x50
|
||||
//设置表地址
|
||||
#define BLE_SET_MET_DI0 0x03
|
||||
#define BLE_SET_MET_DI1 0x50
|
||||
//设置表底数
|
||||
#define BLE_SET_DATA_DI0 0x04
|
||||
#define BLE_SET_DATA_DI1 0x50
|
||||
//升级
|
||||
#define BLE_SET_BOOT_DI0 0x05
|
||||
#define BLE_SET_BOOT_DI1 0x50
|
||||
//读软件版本
|
||||
#define BLE_READ_VERSION_DI0 0x06
|
||||
#define BLE_READ_VERSION_DI1 0x50
|
||||
//读表时间
|
||||
#define BLE_READ_TIME_DI0 0x07
|
||||
#define BLE_READ_TIME_DI1 0x50
|
||||
//设置表时间
|
||||
#define BLE_SET_TIME_DI0 0x08
|
||||
#define BLE_SET_TIME_DI1 0x50
|
||||
//启动自检
|
||||
#define BLE_TEST_START_DI0 0x09
|
||||
#define BLE_TEST_START_DI1 0x50
|
||||
//查询自检
|
||||
#define BLE_TEST_READ_DI0 0x0A
|
||||
#define BLE_TEST_READ_DI1 0x50
|
||||
//启动校准
|
||||
#define BLE_ADJUST_START_DI0 0x0B
|
||||
#define BLE_ADJUST_START_DI1 0x50
|
||||
//查询校准
|
||||
#define BLE_ADJUST_READ_DI0 0x0C
|
||||
#define BLE_ADJUST_READ_DI1 0x50
|
||||
//读SOE
|
||||
#define BLE_READ_SOE_DI0 0x0D
|
||||
#define BLE_READ_SOE_DI1 0x50
|
||||
//读欠压阈值
|
||||
#define BLE_READ_PWLOW_DI0 0x0E
|
||||
#define BLE_READ_PWLOW_DI1 0x50
|
||||
//设置欠压阈值
|
||||
#define BLE_SET_PWLOW_DI0 0x0F
|
||||
#define BLE_SET_PWLOW_DI1 0x50
|
||||
//读EE数据
|
||||
#define BLE_READ_EEPROM_DI0 0x10
|
||||
#define BLE_READ_EEPROM_DI1 0x50
|
||||
//擦除EEPROM
|
||||
#define BLE_ERASE_EEPROM_DI0 0x11
|
||||
#define BLE_ERASE_EEPROM_DI1 0x50
|
||||
//读RAM区数据
|
||||
#define BLE_READ_RAM_DI0 0x12
|
||||
#define BLE_READ_RAM_DI1 0x50
|
||||
//读取过流告警值与持续时间
|
||||
#define BLE_READ_OVERFLOW_DI0 0x13
|
||||
#define BLE_READ_OVERFLOW_DI1 0x50
|
||||
//设置过流告警值与持续时间
|
||||
#define BLE_SET_OVERFLOW_DI0 0x14
|
||||
#define BLE_SET_OVERFLOW_DI1 0x50
|
||||
//读取过流告警值与持续时间
|
||||
#define BLE_READ_ROVERFLOW_DI0 0x15
|
||||
#define BLE_READ_ROVERFLOW_DI1 0x50
|
||||
//设置过流告警值与持续时间
|
||||
#define BLE_SET_ROVERFLOW_DI0 0x16
|
||||
#define BLE_SET_ROVERFLOW_DI1 0x50
|
||||
//读日结数据
|
||||
#define BLE_READ_DAILY_DI0 0x17
|
||||
#define BLE_READ_DAILY_DI1 0x50
|
||||
//读月结数据
|
||||
#define BLE_READ_MONTH_DI0 0x18
|
||||
#define BLE_READ_MONTH_DI1 0x50
|
||||
//MCU重启
|
||||
#define BLE_RESET_MCU_DI0 0x19
|
||||
#define BLE_RESET_MCU_DI1 0x50
|
||||
//设置功能配置字
|
||||
#define BLE_SET_CONFIG_DI0 0x1A
|
||||
#define BLE_SET_CONFIG_DI1 0x50
|
||||
//读瞬时流量和温度
|
||||
#define BLE_READ_FLOWTEMP_DI0 0x1B
|
||||
#define BLE_READ_FLOWTEMP_DI1 0x50
|
||||
//进入检定
|
||||
#define BLE_ENTER_TEST_DI0 0x1C
|
||||
#define BLE_ENTER_TEST_DI1 0x50
|
||||
//读检定数据
|
||||
#define BLE_READ_TEST_DI0 0x1D
|
||||
#define BLE_READ_TEST_DI1 0x50
|
||||
//退出检定
|
||||
#define BLE_EXIT_TEST_DI0 0x1E
|
||||
#define BLE_EXIT_TEST_DI1 0x50
|
||||
//读某日历史数据
|
||||
#define BLE_READ_HIS_DI0 0x1F
|
||||
#define BLE_READ_HIS_DI1 0x50
|
||||
|
||||
//设置OTA升级标志
|
||||
#define BLE_OTA_NOTIC_DI0 0x80
|
||||
#define BLE_OTA_NOTIC_DI1 0x50
|
||||
|
||||
typedef enum{
|
||||
BLE_STATE_S0 = 0,
|
||||
BLE_STATE_S1,
|
||||
BLE_STATE_S2,
|
||||
BLE_STATE_S3,
|
||||
BLE_STATE_S4
|
||||
}TYP_STATE_BLE;
|
||||
|
||||
#define PACK_NUM_GPRS 155
|
||||
//获取状态字
|
||||
UNION_4U8TOU32 getBleWetState(void);
|
||||
//规约数据存储部分初始化
|
||||
void DataStoreInit(void);
|
||||
//规约数据存储状态机
|
||||
void DataStoreMachine(void);
|
||||
//规约数据存储休眠判断
|
||||
u8 DataStoreIfIdle(void);
|
||||
|
||||
u8 crack_frame_BLE(u16 frame_lenth,u8 *frame_buffer);
|
||||
//深水规约处理
|
||||
u8 up_deal_code_ble(void);
|
||||
void Frame_ResetDealState_BLE(void);
|
||||
//应答数据组帧
|
||||
void Frame_ack_BLE(u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
u32 sys_get_net_state(void);
|
||||
void setBleReadAccessFlag(u8 data);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,198 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_GUANGSHUI_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_GUANGSHUI_H
|
||||
|
||||
#include "sys_config.h"
|
||||
#ifdef PRODUCT_GS
|
||||
|
||||
|
||||
#define FRAME_HEAD_JM 0x69 //帧头
|
||||
#define FRAME_END_JM 0x17 //帧尾本号
|
||||
#define FRAME_MARK_JM 0xb1 //帧标识
|
||||
#define FRAME_TYPE_JM 0x14 //版本
|
||||
|
||||
#define FRAME_LEN_MAX UP_BUF_SIZE
|
||||
#define FRAME_LEN_MIN 10
|
||||
|
||||
#define GS_HIS_STORE_MAX 540 //历史数据存储条数,默认540/5=108天
|
||||
|
||||
#define EEP_ADDR_CIRCLE_DATA FRAME_NBIot_HISTORY_READ_ADD //周期上报历史数据存储地址
|
||||
#define EEP_ADDR_HIS_DATA EEP_RTCC_APP_HISTORY_ADDR //数据查询历史数据存储地址
|
||||
#define EEP_ADDR_HIS_INDEX (EEP_ADDR_HIS_DATA+GS_HIS_STORE_MAX*5) //数据查询历史数据指针存储地址 0x440+0xA8C=0xECC~ED2(6字节)
|
||||
#define EEP_ADDR_TEMP_STORE_UPLOAD (EEP_ADDR_HIS_INDEX+6) //临时存储和上报参数地址(8字节)
|
||||
//周期实时数据组帧
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
u8 buf[4];
|
||||
}U32_To_Float;
|
||||
|
||||
typedef struct //存放表计收到的比较重要的数据
|
||||
{
|
||||
u8 locn;
|
||||
mtype16_ len;
|
||||
mtype16_ serial_num;
|
||||
u8 frame_ctrl;
|
||||
u8 STA;
|
||||
mtype16_ data_len;
|
||||
u8 crc;
|
||||
} STRUCT_FRAME_GS;
|
||||
|
||||
//数据存储指针
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UNION_4U8TOU32 Index_w;
|
||||
UNION_2U8TOU16 Period;
|
||||
}Data;
|
||||
u8 data_buf[6];
|
||||
}UNION_GS_STORE_INDEX;
|
||||
|
||||
#define STRU_DATA_LEN_GS 157 //广水历史数据区上报长度
|
||||
#define STRU_DATA_LEN_GS_CURRENT 16 //广水当前数据区上报长度
|
||||
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
u8 Datetime[6];
|
||||
u8 StepCnt;
|
||||
u8 Step[2];
|
||||
u8 DataCode;
|
||||
u8 StepFlow1[6];
|
||||
u8 StepFlowN[47][3];
|
||||
}data;
|
||||
u8 buf[STRU_DATA_LEN_GS];
|
||||
} STRU_UP_FRAME_GS;
|
||||
|
||||
//设置主动上报参数
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 start_time_h;
|
||||
u8 start_time_m;
|
||||
UNION_2U8TOU16 up_interval;//上发间隔分钟
|
||||
UNION_2U8TOU16 data_interval;//数据间隔分钟
|
||||
UNION_2U8TOU16 effective_time;
|
||||
}Data;
|
||||
u8 data_buf[8];
|
||||
}UNION_GS_UPLOAD_PARA;
|
||||
//////////////////////////////////////////规约控制字/////////////////////////////////////////////////////////
|
||||
/*NB新增通信规约*/
|
||||
//深水读取历史数据
|
||||
#define SS_READ_HIS_CTRL 0x27
|
||||
#define SS_ACK_READ_HIS_CTRL 0xa7
|
||||
#define SS_READ_HIS_CTRL_ID0 0x35
|
||||
#define SS_READ_HIS_CTRL_ID1 0xA0
|
||||
|
||||
#define QZ_READ_HIS_MONTH_CTRL_ID1 0x30 //月冻结数据
|
||||
#define QZ_READ_HIS_DAILY_CTRL_ID1 0x31 //日冻结信息
|
||||
|
||||
//深水上传数据报文
|
||||
#define SS_UPLOAD_CTRL 0x67
|
||||
#define SS_ACK_UPLOAD_CTRL 0xD6
|
||||
#define SS_UPLOAD_CTRL_ID0 0x43
|
||||
#define SS_UPLOAD_CTRL_ID1 0xA1
|
||||
#define SS_UPLOAD_CTRL_UDP_ID0 0x31 //UDP上报数据数据标识
|
||||
//短帧上报数据
|
||||
#define SHORT_UPLOAD_CTRL 0x9A
|
||||
#define SHORT_ACK_UPLOAD_CTRL 0xEF
|
||||
#define SHORT_UPLOAD_CTRL_ID0 0x02
|
||||
#define SHORT_UPLOAD_CTRL_ID1 0x10
|
||||
|
||||
//新补报规约上报数据
|
||||
#define SUPP_UPLOAD_CTRL 0x9B
|
||||
#define SUPP_ACK_UPLOAD_CTRL 0xF1
|
||||
#define SUPP_UPLOAD_CTRL_ID0 0x01
|
||||
#define SUPP_UPLOAD_CTRL_ID1 0x10
|
||||
|
||||
//深水登录帧
|
||||
#define SS_SIGN_IN_CTRL 0x8f
|
||||
#define SS_ACK_SIGN_IN_CTRL 0xe8
|
||||
#define SS_SIGN_IN_CTRL_ID0 0x55
|
||||
#define SS_SIGN_IN_CTRL_ID1 0xa1
|
||||
|
||||
//清除失败次数
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL 0x94
|
||||
#define SS_ACK_CLEAR_FAIL_TIMES_CTRL 0xEC
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI0 0x59
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI1 0xA1
|
||||
|
||||
//广水控制码
|
||||
#define READ_MET_CTRL_00 0x00 //
|
||||
#define READ_MET_CTRL_01 0x01 //
|
||||
#define READ_MET_CTRL_02 0x02 //
|
||||
#define READ_MET_CTRL_03 0x03 //
|
||||
#define READ_MET_CTRL_04 0x04 //
|
||||
#define READ_MET_CTRL_05 0x05 //
|
||||
#define READ_MET_CTRL_06 0x06 //
|
||||
#define READ_MET_CTRL_07 0x07 //
|
||||
#define READ_MET_CTRL_08 0x08 //
|
||||
#define READ_MET_CTRL_09 0x09 //
|
||||
#define READ_MET_CTRL_010 0x0a //
|
||||
#define READ_MET_CTRL_011 0x0b //
|
||||
#define READ_MET_CTRL_012 0x0c //
|
||||
#define READ_MET_CTRL_013 0x0d //
|
||||
|
||||
enum{
|
||||
SUPPLEMENT_DATA_FRAME_S0 = 0,
|
||||
SUPPLEMENT_DATA_FRAME_S1,
|
||||
SUPPLEMENT_DATA_FRAME_S2,
|
||||
SUPPLEMENT_DATA_FRAME_S3,
|
||||
SUPPLEMENT_DATA_FRAME_S4,
|
||||
SUPPLEMENT_DATA_FRAME_S5,
|
||||
SUPPLEMENT_DATA_FRAME_S6,
|
||||
SUPPLEMENT_DATA_FRAME_S7
|
||||
};
|
||||
#define SUPPLEMENT_DATA_MAX_NUM 19 //一帧补报数据里最多19条日冻结
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SS_StoreMsg0 = 0u,
|
||||
SS_StoreMsg1 = 1u,
|
||||
SS_StoreMsg2 = 2u,
|
||||
SS_StoreMsg3 = 3u,
|
||||
SS_StoreMsg4 = 4u,
|
||||
SS_StoreMsg5 = 5u,
|
||||
SS_StoreMsg6 = 6u,
|
||||
SS_StoreMsg7 = 7u
|
||||
}SS_StoreMsgType;
|
||||
|
||||
/***************************************长帧上报数据格式*********************/
|
||||
#define PACK_NUM_GPRS 155 //周期上报部分数据长度
|
||||
#define PACK_NUM_GPRS_INTEN 199 //24小时的30min间隔流量数据长度,48*4+7
|
||||
#define PACK_NUM_GPRS_TOTAL (PACK_NUM_GPRS+PACK_NUM_GPRS_INTEN) //周期上报的数据总长度
|
||||
#define CURRENT_DATA_INFO_LEN 36
|
||||
#define STEP_FLOW_START_ADDR (0+CURRENT_DATA_INFO_LEN)
|
||||
/**************************规约应答相关函数**********************************/
|
||||
u8 up_deal_code_GuangShui(void);
|
||||
u8 crack_frame_GuangShui(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_GuangShui(void);
|
||||
void Frame_ack_GuangShui(u8* p_send_buf, u16* p_send_len);
|
||||
/**************************上报相关函数***************************************/
|
||||
#define PERIOD_DATA_NUM 32 //周期数据记录总报数
|
||||
|
||||
void GetUploadDataResetState_GS(void);
|
||||
u8 GetUploadDataCheckIdle_GS(void);
|
||||
u8 GetUploadDataCheckTask_GS(void);
|
||||
void GetUploadDataMachine_GS(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
/**************************存储相关函数***************************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/*****************************************************************************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_COAP
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_COAP
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP1
|
||||
//主上报10秒,副上报5秒
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 100 //10秒
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,514 @@
|
|||
#include "sys_config.h"
|
||||
|
||||
#if PRODUCT_JS
|
||||
#include "sys_processor.h"
|
||||
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_JX_Store_App.h"
|
||||
#include "UWater_frame_func_ReplyNB.h"
|
||||
#include "UWater_frame_func_ReplyJiangShui.h"
|
||||
|
||||
static u8 s_eep_complete_JiangShui=0;
|
||||
static u8 task_complete_JiangShui = PTL_PACK_BUSY;
|
||||
static u8 g_frame_temp_buf_JiangShui[UP_BUF_SIZE]; //数据部分缓冲区
|
||||
static u16 g_frame_temp_len_JiangShui=0;
|
||||
|
||||
static STRUCT_FRAME_IES frame_struct_JiangShui; //规约信息
|
||||
static u8 *new_message_data_rev_JiangShui;
|
||||
static u8 up_deal_stat_JiangShui = UP_DEAL_S0;//规约处理状态机
|
||||
/*******主动上传数据相关变量*****************************************/
|
||||
static u16 upload_serial_num_JiangShui=0;
|
||||
static STRUCT_FRAME_IES upload_struct_JiangShui; //规约信息
|
||||
static u8 upload_frame_stat_JiangShui=0; //主动上报组帧状态
|
||||
static u8 upload_task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
static u8 temp_format_error;//上报格式异常标志
|
||||
static u8 jx_upload_fail_times=0;
|
||||
|
||||
//江西规约上报缓存
|
||||
static u8 upload_temp_buf_JiangShui[PACK_NUM_GPRS_TOTAL];
|
||||
static u16 upload_temp_len_JiangShui=0;//主动上报数据长度
|
||||
static u16 jx_upload_record_cnts = 0;//需要上报的记录条数
|
||||
static u8 jx_upload_total_packs=0;//本次需要上报的总包数
|
||||
static u8 jx_upload_cur_pack=0;//本次需要上报的当前包号
|
||||
static u16 s_upload_connect_time=0;//联网时间
|
||||
//上传应答处理
|
||||
static void frame_func_reply_NB_AckUpload(void)
|
||||
{
|
||||
g_frame_temp_len_JiangShui =0;
|
||||
u8 sernum0 = upload_serial_num_JiangShui&0xFF;
|
||||
u8 sernum1 = (upload_serial_num_JiangShui>>8)&0xFF;
|
||||
if(*(new_message_data_rev_JiangShui + 6) == 1)//上报数据格式异常
|
||||
{
|
||||
if(frame_struct_JiangShui.serial_num0 == sernum0)
|
||||
{
|
||||
if(frame_struct_JiangShui.serial_num1 == sernum1)
|
||||
{
|
||||
FrameSetMsgApp(MsgNbUplaod_AckOk);//江西水务产线生产测试返回格式异常,应判断过
|
||||
NB_SS_Control_SetPara(NB_SS_FormatError, 1);//置起上报格式异常标志
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(frame_struct_JiangShui.serial_num0 == sernum0)
|
||||
{
|
||||
if(frame_struct_JiangShui.serial_num1 == sernum1)
|
||||
{
|
||||
FrameSetMsgApp(MsgNbUplaod_AckOk);
|
||||
}
|
||||
}
|
||||
NB_SS_Control_SetPara(NB_SS_FormatError, 0);//清除上报格式异常标志
|
||||
}
|
||||
task_complete_JiangShui = PTL_PACK_FAIL;//这是上报应答帧,返回错误,表计不应答
|
||||
}
|
||||
|
||||
//登录帧------------------------判断的应答控制字,返回PTL_PACK_FAIL
|
||||
static void frame_func_reply_NB_AckLogin(void)
|
||||
{
|
||||
FrameSetMsgApp(MsgNbUplaod_AckLoginOk);
|
||||
}
|
||||
//清除失败次数
|
||||
static void frame_func_s3_NB_ClearFailTimes(void)
|
||||
{
|
||||
static u8 temp_clear_buf[4];
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
g_frame_temp_len_JiangShui = 0;
|
||||
NB_SS_Control_SetPara(NB_SS_FormatError, 0);
|
||||
NB_SS_Control_SetPara(NB_UploadFailTimes, 0);
|
||||
temp_clear_buf[0]=0;
|
||||
temp_clear_buf[1]=0;
|
||||
temp_clear_buf[2]=0;
|
||||
temp_clear_buf[3]=0;
|
||||
EepWrite(temp_clear_buf, FRAME_NBIot_BUBAO_FLAG, 4, &s_eep_complete_JiangShui);
|
||||
task_complete_JiangShui = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
//江西水务:设置密集存储间隔
|
||||
static void frame_func_s3_NB_SetStorageFrequency(void)
|
||||
{
|
||||
switch(up_deal_stat_JiangShui)
|
||||
{
|
||||
case UP_DEAL_S0:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//存储数据到EEPROM
|
||||
{
|
||||
g_frame_temp_len_JiangShui = 0;
|
||||
if(*new_message_data_rev_JiangShui> 0x5A) //最大采样间隔90min
|
||||
{
|
||||
task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
Sys_data_object.P1.storage_frequency = *(new_message_data_rev_JiangShui);
|
||||
EepWrite(&Sys_data_object.P1.storage_frequency, EEP_FRAME_STORAGE_FREQUENCY, 1, &s_eep_complete_JiangShui);
|
||||
Frame_Para_Init();
|
||||
task_complete_JiangShui = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
up_deal_stat_JiangShui = UP_DEAL_S0;
|
||||
task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//江西水务:设置采样频率
|
||||
static void frame_func_s3_NB_SetSamplingFrequecy(void)
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//存储数据到EEPROM
|
||||
{
|
||||
g_frame_temp_len_JiangShui = 0;
|
||||
Sys_data_object.P1.jx_sampling_frequency[0] = *(new_message_data_rev_JiangShui + 0);
|
||||
Sys_data_object.P1.jx_sampling_frequency[1] = *(new_message_data_rev_JiangShui + 1);
|
||||
EepWrite(&Sys_data_object.P1.jx_sampling_frequency[0], EEP_FRAME_JX_SAMPLING_FREQUENCY_ADDR, 2, &s_eep_complete_JiangShui);
|
||||
Frame_Para_Init();
|
||||
task_complete_JiangShui = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
//江西水务:设置NB模组为PSM或断电模式
|
||||
static void frame_func_s3_NB_SetPsmOrPwDown(void)
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
g_frame_temp_len_JiangShui = 0;
|
||||
Sys_data_object.P1.jx_psm_pwdown = *new_message_data_rev_JiangShui;
|
||||
EepWrite(&Sys_data_object.P1.jx_psm_pwdown, EEP_FRAME_JX_PSM_PWDOWN_ADDR, 1, &s_eep_complete_JiangShui);
|
||||
Frame_Para_Init();
|
||||
task_complete_JiangShui = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************************************************/
|
||||
//解规约
|
||||
u8 crack_frame_JiangShui(u16 frame_lenth,u8 *frame_buffer)
|
||||
{
|
||||
u8 temp_res = crack_frame_IES_Base(frame_lenth, frame_buffer, &frame_struct_JiangShui);
|
||||
if(temp_res == SUCCESS_IES)
|
||||
{
|
||||
frame_struct_JiangShui.sta &= 0xFD; //表示非主动上传(bit1为1时表示主动上传,0表示应答)
|
||||
frame_struct_JiangShui.DI0 = *(frame_buffer + frame_struct_JiangShui.head_site + 12);
|
||||
frame_struct_JiangShui.DI1 = *(frame_buffer + frame_struct_JiangShui.head_site + 13);
|
||||
frame_struct_JiangShui.serial_num0 = *(frame_buffer + frame_struct_JiangShui.head_site + 14);
|
||||
frame_struct_JiangShui.serial_num1 = *(frame_buffer + frame_struct_JiangShui.head_site + 15);
|
||||
new_message_data_rev_JiangShui = frame_buffer + frame_struct_JiangShui.head_site + 16;
|
||||
frame_lenth = 0;
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
return ERROR_IES;
|
||||
}
|
||||
|
||||
//江水规约处理:扩展积成规约
|
||||
u8 up_deal_code_JiangShui(void)
|
||||
{
|
||||
task_complete_JiangShui = PTL_PACK_BUSY;
|
||||
switch(frame_struct_JiangShui.ctrl)
|
||||
{
|
||||
case SS_ACK_UPLOAD_CTRL:
|
||||
{
|
||||
frame_func_reply_NB_AckUpload();
|
||||
}
|
||||
break;
|
||||
|
||||
case SS_ACK_SIGN_IN_CTRL:
|
||||
{
|
||||
frame_func_reply_NB_AckLogin();
|
||||
}
|
||||
break;
|
||||
|
||||
case SS_CLEAR_FAIL_TIMES_CTRL:
|
||||
{
|
||||
frame_func_s3_NB_ClearFailTimes();;
|
||||
frame_struct_JiangShui.ack_ctrl = SS_ACK_CLEAR_FAIL_TIMES_CTRL;
|
||||
}
|
||||
break;
|
||||
|
||||
case FM_SET_MJJI_SPACE_TIME_CTRL:
|
||||
{
|
||||
frame_func_s3_NB_SetStorageFrequency();;
|
||||
frame_struct_JiangShui.ack_ctrl = FM_SET_MJJI_SPACE_TIME_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case FM_SET_SAMPLING_FREQUENCY_CTRL:
|
||||
{
|
||||
frame_func_s3_NB_SetSamplingFrequecy();;
|
||||
frame_struct_JiangShui.ack_ctrl = FM_SET_SAMPLING_FREQUENCY_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case FM_SET_PSM_PWDOWN_CTRL:
|
||||
{
|
||||
frame_func_s3_NB_SetPsmOrPwDown();;
|
||||
frame_struct_JiangShui.ack_ctrl = FM_SET_PSM_PWDOWN_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
up_deal_stat_JiangShui = UP_DEAL_S0;
|
||||
task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return task_complete_JiangShui;
|
||||
}
|
||||
|
||||
void Frame_ResetDealState_JiangShui(void)
|
||||
{
|
||||
up_deal_stat_JiangShui = UP_DEAL_S0;//基线扩展规约处理状态复位
|
||||
}
|
||||
//应答数据组帧
|
||||
void Frame_ack_JiangShui(u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
STRUCT_FRAME_IES temp_struct;
|
||||
|
||||
temp_struct.ack_ctrl = frame_struct_JiangShui.ack_ctrl;
|
||||
temp_struct.DI0 = frame_struct_JiangShui.DI0;
|
||||
temp_struct.DI1 = frame_struct_JiangShui.DI1;
|
||||
temp_struct.sta = frame_struct_JiangShui.sta;
|
||||
temp_struct.serial_num0 = frame_struct_JiangShui.serial_num0;
|
||||
temp_struct.serial_num1 = frame_struct_JiangShui.serial_num1;
|
||||
|
||||
Frame_ack_IesBase(temp_struct,g_frame_temp_buf_JiangShui, g_frame_temp_len_JiangShui, p_send_buf, p_send_len);
|
||||
}
|
||||
/****************************************************************以下主动上报数据的处理*********************************************/
|
||||
static u8 upload_frame_retry_times=0;
|
||||
//static u8 temp_upload_step=0;
|
||||
|
||||
void GetUploadDataResetState_JX(void)
|
||||
{
|
||||
upload_frame_stat_JiangShui =UP_DEAL_S0;
|
||||
upload_task_complete_JiangShui = PTL_PACK_BUSY;
|
||||
}
|
||||
u8 GetUploadDataCheckIdle_JX(void)
|
||||
{
|
||||
if(UP_DEAL_S0 == upload_frame_stat_JiangShui)
|
||||
{
|
||||
return TASK_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TASK_BUSY;
|
||||
}
|
||||
}
|
||||
u8 GetUploadDataCheckTask_JX(void)
|
||||
{
|
||||
return upload_task_complete_JiangShui;
|
||||
}
|
||||
|
||||
/***********************************************
|
||||
获取联网时间
|
||||
***********************************************/
|
||||
u16 GetUploadConnectTime_JX(u8 type)
|
||||
{
|
||||
if(type == 0)
|
||||
{
|
||||
return s_upload_connect_time;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (Get100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS)/1000000);
|
||||
}
|
||||
}
|
||||
|
||||
void GetUploadDataMachine_JX(u8 data_step, u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
switch(upload_frame_stat_JiangShui)
|
||||
{
|
||||
case UP_DEAL_S0:
|
||||
{
|
||||
if(data_step == UPLOAD_FRAME_REQUEST_NEW)//请求新数据包
|
||||
{
|
||||
s_upload_connect_time = Get100msTimer(TIMER_100MS_WAIT_SLEEP_GPRS)/1000000;
|
||||
upload_frame_retry_times = 0;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S1;
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_UPLOAD_OK)//发送成功
|
||||
{
|
||||
jx_upload_fail_times = 0;
|
||||
upload_frame_retry_times = 0;
|
||||
SystemClearUploadAgain();//重传清0
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S10;//获取下一包数据
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_UPLOAD_RETRY)//请求重新发送
|
||||
{
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S21;
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_ONLINE_FAIL) //联网失败
|
||||
{
|
||||
if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType()||
|
||||
(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType()))//定时上传
|
||||
{
|
||||
SystemAddUploadAgain();//重传增加
|
||||
}
|
||||
if((Sys_data_object.P1.func_cfg_bytes[0]>0)&&NbiotIfOnline())//厂区上报时间,如果有信号值,则不报故障
|
||||
{
|
||||
NB_SS_Control_SetPara(NB_UploadFailTimes, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
jx_upload_fail_times++;//失败次数增加
|
||||
}
|
||||
upload_task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
else
|
||||
{
|
||||
upload_task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S1://计算总上报包数,获取第一包数据
|
||||
{
|
||||
if(Copy_R_W_Count() == SUCCESS)//获取冻结的存储读、写指针
|
||||
{
|
||||
jx_upload_record_cnts = get_com_rx_num_copy(); //获取需要上传的记录条数
|
||||
if(jx_upload_record_cnts >0)
|
||||
{
|
||||
jx_upload_total_packs = (jx_upload_record_cnts/JX_ONE_PACKET_COUNTS);//计算需要上传的总包数,45条记录一包
|
||||
if(jx_upload_record_cnts % JX_ONE_PACKET_COUNTS)
|
||||
{
|
||||
jx_upload_total_packs += 1;
|
||||
}
|
||||
if(jx_upload_total_packs > MAX_PACKS_TOUPLOAD)//最大65包
|
||||
{
|
||||
jx_upload_total_packs = MAX_PACKS_TOUPLOAD;
|
||||
}
|
||||
}
|
||||
else//如果无数据存储,则获取当前流量数据上传
|
||||
{
|
||||
jx_upload_total_packs = 1;//总包数
|
||||
}
|
||||
jx_upload_cur_pack = 1;//当前包号从1开始
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S10://更新已上报指针,获取下一包数据
|
||||
{
|
||||
if(Renew_Rcount() == SUCCESS)//保存读指针
|
||||
{
|
||||
jx_upload_cur_pack += 1;//上传数据包加1
|
||||
if(jx_upload_cur_pack > jx_upload_total_packs)//上传完毕
|
||||
{
|
||||
upload_task_complete_JiangShui = PTL_PACK_FAIL;//失败
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
else
|
||||
{
|
||||
jx_upload_record_cnts = get_com_rx_num_copy();//获取需要上传的记录条数
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S2;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S2://获取上报数据并组帧
|
||||
{
|
||||
if(get_com_rx_data() == SUCCESS)//获取数据
|
||||
{
|
||||
NB_JX_Frame_Upload_Data(upload_temp_buf_JiangShui, &upload_temp_len_JiangShui, jx_upload_total_packs, jx_upload_cur_pack);//组数据部分
|
||||
|
||||
upload_struct_JiangShui.ack_ctrl = SS_UPLOAD_CTRL;
|
||||
upload_struct_JiangShui.DI0 = SS_UPLOAD_CTRL_ID0;
|
||||
upload_struct_JiangShui.DI1 = SS_UPLOAD_CTRL_ID1;
|
||||
upload_struct_JiangShui.sta = 0x03;//加密主动上传
|
||||
upload_serial_num_JiangShui++;
|
||||
upload_struct_JiangShui.serial_num0 = upload_serial_num_JiangShui&0xFF;
|
||||
upload_struct_JiangShui.serial_num1 = (upload_serial_num_JiangShui>>8)&0xFF;
|
||||
|
||||
Frame_ack_IesBase(upload_struct_JiangShui, upload_temp_buf_JiangShui, upload_temp_len_JiangShui, p_send_buf, p_send_len);
|
||||
|
||||
upload_task_complete_JiangShui = PTL_PACK_SUCCESS;// 成功
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case UP_DEAL_S21://重试
|
||||
{
|
||||
if(upload_frame_retry_times < 1) //改为重发1次
|
||||
{
|
||||
upload_frame_retry_times++;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S2;
|
||||
}
|
||||
else//重新发送失败3次的处理
|
||||
{
|
||||
if((UPLOAD_TYPE_FIX_TIME == GetEventUploadType())|| //定时上传
|
||||
(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType())) //重传
|
||||
{
|
||||
SystemAddUploadAgain();//重传增加
|
||||
}
|
||||
if((Sys_data_object.P1.func_cfg_bytes[0]>0)&&NbiotIfOnline())//厂区上报时间,如果有信号值,则不报故障
|
||||
{
|
||||
NB_SS_Control_SetPara(NB_UploadFailTimes, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
jx_upload_fail_times++;//失败次数增加
|
||||
}
|
||||
upload_task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
upload_task_complete_JiangShui = PTL_PACK_FAIL;
|
||||
upload_frame_stat_JiangShui = UP_DEAL_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name:NB_SS_Control_GetPara
|
||||
* @brief :
|
||||
* @param[in] :读取上报控制相关参数
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
u8 NB_SS_Control_GetPara(NB_SS_ControlParaTypeDef paraType)
|
||||
{
|
||||
switch(paraType)
|
||||
{
|
||||
// case NB_UploadFailTimes://需要上报包数
|
||||
// {
|
||||
// u8 temp_fail_times=JiangXiStore_UploadPacks();
|
||||
// return temp_fail_times;
|
||||
// }
|
||||
case NB_UploadFailTimes://失败次数
|
||||
{
|
||||
u8 temp_fail_times=0;
|
||||
if(Sys_data_object.P3.ProductUpoadFailFlag)//串口上报失败
|
||||
{
|
||||
temp_fail_times = Sys_data_object.P3.ProductUpoadFailFlag;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_fail_times = jx_upload_fail_times;
|
||||
}
|
||||
return temp_fail_times;
|
||||
}
|
||||
case NB_SS_FormatError://上报数据格式错误
|
||||
{
|
||||
return temp_format_error;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name:NB_SS_Control_SetPara
|
||||
* @brief :
|
||||
* @param[in] :设置上报控制相关参数
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
void NB_SS_Control_SetPara(NB_SS_ControlParaTypeDef paraType, u8 data)
|
||||
{
|
||||
switch(paraType)
|
||||
{
|
||||
case NB_SS_FormatError://上报数据格式错误
|
||||
{
|
||||
temp_format_error = data;
|
||||
break;
|
||||
}
|
||||
case NB_UploadFailTimes://失败次数
|
||||
{
|
||||
SystemClearUploadAgain();
|
||||
Sys_data_object.P3.ProductUpoadFailFlag = 0;
|
||||
jx_upload_fail_times = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//规约数据存储部分初始化
|
||||
void DataStoreInit(void)
|
||||
{
|
||||
JiangXiStore_InitApp();
|
||||
}
|
||||
//规约数据存储状态机
|
||||
void DataStoreMachine(void)
|
||||
{
|
||||
JiangXiStore_Machine();
|
||||
}
|
||||
//规约数据存储休眠判断
|
||||
u8 DataStoreIfIdle(void)
|
||||
{
|
||||
return JiangXiStore_IfSleep();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_JIANGSHUI_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_JIANGSHUI_H
|
||||
|
||||
#include "sys_config.h"
|
||||
#ifdef PRODUCT_JS
|
||||
//////////////////////////////////////////积成规约控制字/////////////////////////////////////////////////////////
|
||||
|
||||
//深水上传数据报文
|
||||
#define SS_UPLOAD_CTRL 0x67
|
||||
#define SS_ACK_UPLOAD_CTRL 0xD6
|
||||
#define SS_UPLOAD_CTRL_ID0 0x43
|
||||
#define SS_UPLOAD_CTRL_ID1 0xA1
|
||||
#define SS_UPLOAD_CTRL_UDP_ID0 0x31 //UDP上报数据数据标识
|
||||
|
||||
//深水登录帧
|
||||
#define SS_SIGN_IN_CTRL 0x8f
|
||||
#define SS_ACK_SIGN_IN_CTRL 0xe8
|
||||
#define SS_SIGN_IN_CTRL_ID0 0x55
|
||||
#define SS_SIGN_IN_CTRL_ID1 0xa1
|
||||
|
||||
//清除失败次数
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL 0x94
|
||||
#define SS_ACK_CLEAR_FAIL_TIMES_CTRL 0xEC
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI0 0x59
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI1 0xA1
|
||||
|
||||
//******************************************江西水务定制规约-NB***********************************/
|
||||
//设置密集存储间隔
|
||||
#define FM_SET_MJJI_SPACE_TIME_CTRL 0x5A
|
||||
#define FM_SET_MJJI_SPACE_TIME_REPLY_CTRL 0xCA
|
||||
#define FM_SET_MJJI_SPACE_TIME_DI0 0x48
|
||||
#define FM_SET_MJJI_SPACE_TIME_DI1 0xA0
|
||||
|
||||
//读取密集存储间隔
|
||||
#define FM_RED_MJJI_SPACE_TIME_CTRL 0x5B
|
||||
#define FM_RED_MJJI_SPACE_TIME_REPLY_CTRL 0xCB
|
||||
#define FM_RED_MJJI_SPACE_TIME_DI0 0x49
|
||||
#define FM_RED_MJJI_SPACE_TIME_DI1 0xA0
|
||||
|
||||
//设置采样频率
|
||||
#define FM_SET_SAMPLING_FREQUENCY_CTRL 0x5D
|
||||
#define FM_SET_SAMPLING_FREQUENCY_REPLY_CTRL 0xCD
|
||||
#define FM_SET_SAMPLING_FREQUENCY_DI0 0x50
|
||||
#define FM_SET_SAMPLING_FREQUENCY_DI1 0xA0
|
||||
|
||||
//读取采样频率
|
||||
#define FM_READ_SAMPLING_FREQUENCY_CTRL 0x5E
|
||||
#define FM_READ_SAMPLING_FREQUENCY_REPLY_CTRL 0xCE
|
||||
#define FM_READ_SAMPLING_FREQUENCY_DI0 0x51
|
||||
#define FM_READ_SAMPLING_FREQUENCY_DI1 0xA0
|
||||
|
||||
//设置NB模组为PSM或断电模式
|
||||
#define FM_SET_PSM_PWDOWN_CTRL 0x85
|
||||
#define FM_SET_PSM_PWDOWN_REPLY_CTRL 0x05
|
||||
#define FM_SET_PSM_PWDOWN_DI0 0x04
|
||||
#define FM_SET_PSM_PWDOWN_DI1 0xA0
|
||||
|
||||
|
||||
/////////////////////////////////////////////////积成规约数据结构///////////////////////////////////////////////
|
||||
/**************************规约应答相关函数**********************************/
|
||||
u8 up_deal_code_JiangShui(void);
|
||||
u8 crack_frame_JiangShui(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_JiangShui(void);
|
||||
void Frame_ack_JiangShui(u8* p_send_buf, u16* p_send_len);
|
||||
/**************************上报相关函数***************************************/
|
||||
#define JX_ONE_PACKET_COUNTS 45 //每包数据的间隔量条数
|
||||
#define PACK_NUM_GPRS_TOTAL 378//江西水务规约上报数据字节数
|
||||
|
||||
void GetUploadDataResetState_JX(void);
|
||||
u8 GetUploadDataCheckIdle_JX(void);
|
||||
u8 GetUploadDataCheckTask_JX(void);
|
||||
void GetUploadDataMachine_JX(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
u16 GetUploadConnectTime_JX(u8 type);
|
||||
/**************************存储相关函数***************************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/*****************************************************************************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_COAP
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_COAP
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP1
|
||||
//主上报10秒,副上报5秒
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 100
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,670 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_NB_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_NB_H
|
||||
|
||||
#include "type.h"
|
||||
|
||||
//////////////////////////////////////////积成规约控制字/////////////////////////////////////////////////////////
|
||||
//写温度系数//CRC
|
||||
#define FM_SET_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL 0x45
|
||||
#define FM_SET_TEMPERATURECOEFFICIENT_REPLY_CTRL 0xB5
|
||||
#define FM_SET_TEMPERATURECOEFFICIENT_DI0 0x35
|
||||
#define FM_SET_TEMPERATURECOEFFICIENT_DI1 0xA0
|
||||
|
||||
//写流量系数
|
||||
#define FM_SET_FLOWCOEFFICIENT_ARGUMENT_CTRL 0x46
|
||||
#define FM_SET_FLOWCOEFFICIENT_REPLY_CTRL 0xB6
|
||||
#define FM_SET_FLOWCOEFFICIENT_DI0 0x36
|
||||
#define FM_SET_FLOWCOEFFICIENT_DI1 0xA0
|
||||
|
||||
//启用关闭检定或红外功能//CRC
|
||||
#define FM_SWITCH_VERIFICATION_OR_INFRARED_ARGUMENT_CTRL 0xBA
|
||||
#define FM_SWITCH_VERIFICATION_OR_INFRARED_REPLY_CTRL 0xBB
|
||||
#define FM_SWITCH_VERIFICATION_OR_INFRARED_DI0 0x3B
|
||||
#define FM_SWITCH_VERIFICATION_OR_INFRARED_DI1 0xA0
|
||||
|
||||
//加密读表数据//CRC和无磁兼容
|
||||
#define FM_ENC_READ_DATA_ARGUMENT_CTRL 0x01
|
||||
#define FM_ENC_READ_DATA_REPLY_CTRL 0x81
|
||||
#define FM_ENC_READ_DATA_DI0 0x1F
|
||||
#define FM_ENC_READ_DATA_DI1 0x90
|
||||
|
||||
//读表地址
|
||||
#define FM_READ_ADDR_ARGUMENT_CTRL 0x03
|
||||
#define FM_READ_ADDR_REPLY_CTRL 0x83
|
||||
#define FM_READ_ADDR_DI0 0x0A
|
||||
#define FM_READ_ADDR_DI1 0x81
|
||||
|
||||
//阀门控制
|
||||
#define VALVE_CONTROL_CTRL 0x04
|
||||
#define ACK_VALVE_CONTROL_CTRL 0x84
|
||||
#define VALVE_CONTROL_DATA_ID0 0x17
|
||||
#define VALVE_CONTROL_DATA_ID1 0xA0
|
||||
|
||||
//读取软件版本号//CS和无磁兼容
|
||||
#define FM_READ_SWVERSION_ARGUMENT_CTRL 0x05
|
||||
#define FM_READ_SWVERSION_REPLY_CTRL 0x85
|
||||
#define FM_READ_SWVERSION_DI0 0x20
|
||||
#define FM_READ_SWVERSION_DI1 0xA0
|
||||
|
||||
//读取物理地址//CRC
|
||||
#define FM_READ_MAC_ARGUMENT_CTRL 0x11
|
||||
#define FM_READ_MAC_REPLY_CTRL 0x91
|
||||
#define FM_READ_MAC_DI0 0x1D
|
||||
#define FM_READ_MAC_DI1 0xA0
|
||||
|
||||
//请求写表地址控制码
|
||||
#define FM_ENC_SET_ADDR_ARGUMENT_CTRL 0x15
|
||||
#define FM_ENC_SET_ADDR_REPLY_CTRL 0x95
|
||||
#define FM_ENC_SET_ADDR_DI0 0x18
|
||||
#define FM_ENC_SET_ADDR_DI1 0xA0
|
||||
|
||||
//请求写初值控制码
|
||||
#define FM_ENC_WRITE_INITVALUE_ARGUMENT_CTRL 0x16
|
||||
#define FM_ENC_WRITE_INITVALUE_REPLY_CTRL 0x96
|
||||
#define FM_ENC_WRITE_INITVALUE_DI0 0x16
|
||||
#define FM_ENC_WRITE_INITVALUE_DI1 0xA0
|
||||
//配置功能
|
||||
#define FM_CFG_FUNCTIONCFG_ARGUMENT_CTRL 0x53
|
||||
#define FM_CFG_FUNCTIONCFG_REPLY_CTRL 0xC3
|
||||
#define FM_CFG_FUNCTIONCFG_DI0 0x41
|
||||
#define FM_CFG_FUNCTIONCFG_DI1 0xA0
|
||||
//校时
|
||||
#define FM_CALIBRATE_TIME_ARGUMENT_CTRL 0x22
|
||||
#define FM_CALIBRATE_TIME_REPLY_CTRL 0xA2
|
||||
#define FM_CALIBRATE_TIME_DI0 0x32
|
||||
#define FM_CALIBRATE_TIME_DI1 0xA0
|
||||
|
||||
//读出厂序列号//CS和无磁兼容
|
||||
#define FM_READ_SERIALNUM_ARGUMENT_CTRL 0x31
|
||||
#define FM_READ_SERIALNUM_REPLY_CTRL 0xE1
|
||||
#define FM_READ_SERIALNUM_DI0 0x01
|
||||
#define FM_READ_SERIALNUM_DI1 0x89
|
||||
|
||||
//读温度系数//CS
|
||||
#define FM_READ_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL 0x3A
|
||||
#define FM_READ_TEMPERATURECOEFFICIENT_REPLY_CTRL 0xBA
|
||||
#define FM_READ_TEMPERATURECOEFFICIENT_DI0 0x3A
|
||||
#define FM_READ_TEMPERATURECOEFFICIENT_DI1 0xA0
|
||||
|
||||
//清表数据//CRC
|
||||
#define FM_CLEAR_METERDATA_ARGUMENT_CTRL 0x47
|
||||
#define FM_CLEAR_METERDATA_REPLY_CTRL 0xB7
|
||||
#define FM_CLEAR_METERDATA_DI0 0x37
|
||||
#define FM_CLEAR_METERDATA_DI1 0xA0
|
||||
|
||||
//读流量系数//CS
|
||||
#define FM_READ_FLOWCOEFFICIENT_ARGUMENT_CTRL 0x48
|
||||
#define FM_READ_FLOWCOEFFICIENT_REPLY_CTRL 0xB8
|
||||
#define FM_READ_FLOWCOEFFICIENT_DI0 0x38
|
||||
#define FM_READ_FLOWCOEFFICIENT_DI1 0xA0
|
||||
|
||||
//设置为检定状态//CRC
|
||||
#define FM_SET_VERIFICATIONSTATE_ARGUMENT_CTRL 0x49
|
||||
#define FM_SET_VERIFICATIONSTATE_REPLY_CTRL 0xB9
|
||||
#define FM_SET_VERIFICATIONSTATE_DI0 0x39
|
||||
#define FM_SET_VERIFICATIONSTATE_DI1 0xA0
|
||||
#define FM_SET_VERIFICATIONSTATE_TOOL_DI1 0xA1 //脉冲检表工装进检定
|
||||
|
||||
//读检定数据//CS
|
||||
#define FM_READ_VERIFICATIONDATA_ARGUMENT_CTRL 0x4C
|
||||
#define FM_READ_VERIFICATIONDATA_REPLY_CTRL 0xBC
|
||||
#define FM_READ_VERIFICATIONDATA_DI0 0x3C
|
||||
#define FM_READ_VERIFICATIONDATA_DI1 0xA0
|
||||
#define FM_READ_VERIFICATIONDATA_TOOL_DI1 0xA1
|
||||
|
||||
//读瞬时流量和温度//CS
|
||||
#define FM_READ_INSTANTANEOUSFLOW_AND_TEMPERATURE_ARGUMENT_CTRL 0x4F
|
||||
#define FM_READ_INSTANTANEOUSFLOW_AND_TEMPERATURE_REPLY_CTRL 0xBF
|
||||
#define FM_READ_INSTANTANEOUSFLOW_AND_TEMPERATURE_DI0 0x3F
|
||||
#define FM_READ_INSTANTANEOUSFLOW_AND_TEMPERATURE_DI1 0xA0
|
||||
|
||||
//启动停止测试(只适用于检定状态)
|
||||
#define FM_START_OR_STOP_TEST_ARGUMENT_CTRL 0x51
|
||||
#define FM_START_OR_STOP_TEST_REPLY_CTRL 0xC1
|
||||
#define FM_START_OR_STOP_TEST_DI0 0x3F
|
||||
#define FM_START_OR_STOP_TEST_DI1 0xA0
|
||||
|
||||
//(清)出厂启用
|
||||
#define FM_START_OR_CLEAR_USING_ARGUMENT_CTRL 0x54
|
||||
#define FM_START_OR_CLEAR_USING_REPLY_CTRL 0xC4
|
||||
#define FM_START_OR_CLEAR_USING_DI0 0x42
|
||||
#define FM_START_OR_CLEAR_USING_DI1 0xA0
|
||||
|
||||
//读配置功能
|
||||
#define FM_RD_FUNCTIONCFG_ARGUMENT_CTRL 0x58
|
||||
#define FM_RD_FUNCTIONCFG_REPLY_CTRL 0xB3
|
||||
#define FM_RD_FUNCTIONCFG_DI0 0x41
|
||||
#define FM_RD_FUNCTIONCFG_DI1 0xA0
|
||||
|
||||
//RTCC校准
|
||||
#define FM_RTC_CALIBTATION_ARGUMENT_CTRL 0x55
|
||||
#define FM_RTC_CALIBTATION_REPLY_CTRL 0xC5
|
||||
#define FM_RTC_CALIBTATION_DI0 0x43
|
||||
#define FM_RTC_CALIBTATION_DI1 0xA0
|
||||
|
||||
//进入低功耗(测试规约)
|
||||
#define FM_ENTER_LOWPOWER_ARGUMENT_CTRL 0x56
|
||||
#define FM_ENTER_LOWPOWER_REPLY_CTRL 0xC6
|
||||
#define FM_ENTER_LOWPOWER_DI0 0x44
|
||||
#define FM_ENTER_LOWPOWER_DI1 0xA0
|
||||
|
||||
//退出检定状态//CRC
|
||||
#define FM_OUT_VERIFICATIONSTATE_ARGUMENT_CTRL 0x57
|
||||
#define FM_OUT_VERIFICATIONSTATE_REPLY_CTRL 0xC7
|
||||
#define FM_OUT_VERIFICATIONSTATE_DI0 0x45
|
||||
#define FM_OUT_VERIFICATIONSTATE_DI1 0xA0
|
||||
|
||||
//设置使动流量
|
||||
#define FM_SET_START_FLOW_CTRL 0x62
|
||||
#define FM_SET_START_FLOW_REPLY_CTRL 0xD6
|
||||
#define FM_SET_START_FLOW_DI0 0x56
|
||||
#define FM_SET_START_FLOW_DI1 0x31
|
||||
//读取使动流量
|
||||
#define FM_READ_START_FLOW_CTRL 0x63
|
||||
#define FM_READ_START_FLOW_REPLY_CTRL 0xD7
|
||||
#define FM_READ_START_FLOW_DI0 0x57
|
||||
#define FM_READ_START_FLOW_DI1 0x32
|
||||
|
||||
//设置逆流计量开关
|
||||
#define FM_SET_COUNTER_CURRENT_CTRL 0x66
|
||||
#define FM_SET_COUNTER_CURRENT_REPLY_CTRL 0xCB
|
||||
#define FM_SET_COUNTER_CURRENT_CTRL_ID0 0x42
|
||||
#define FM_SET_COUNTER_CURRENT_CTRL_ID1 0x33
|
||||
|
||||
//读取逆流计量开关
|
||||
#define FM_READ_COUNTER_CURRENT_CTRL 0x67
|
||||
#define FM_READ_COUNTER_CURRENT_REPLY_CTRL 0xCC
|
||||
#define FM_READ_COUNTER_CURRENT_CTRL_ID0 0x42
|
||||
#define FM_READ_COUNTER_CURRENT_CTRL_ID1 0x34
|
||||
|
||||
//设置零流量校准开关
|
||||
#define FM_SET_DIFTOF_CALIBRATION_CTRL 0x68
|
||||
#define FM_SET_DIFTOF_CALIBRATION_REPLY_CTRL 0xD0
|
||||
#define FM_SET_DIFTOF_CALIBRATION_CTRL_ID0 0x4A
|
||||
#define FM_SET_DIFTOF_CALIBRATION_CTRL_ID1 0x36
|
||||
|
||||
//硬件自检测
|
||||
#define FM_TEST_SLEF_ARGUMENT_CTRL 0xCF
|
||||
#define FM_TEST_SLEF_REPLY_CTRL 0xDF
|
||||
#define FM_TEST_SLEF_DI0 0x01
|
||||
#define FM_TEST_SLEF_DI1 0x30
|
||||
|
||||
/*NB新增通信规约*/
|
||||
//深水读取历史数据
|
||||
#define SS_READ_HIS_CTRL 0x27
|
||||
#define SS_ACK_READ_HIS_CTRL 0xa7
|
||||
#define SS_READ_HIS_CTRL_ID0 0x35
|
||||
#define SS_READ_HIS_CTRL_ID1 0xA0
|
||||
|
||||
#define QZ_READ_HIS_MONTH_CTRL_ID1 0x30 //月冻结数据
|
||||
#define QZ_READ_HIS_DAILY_CTRL_ID1 0x31 //日冻结信息
|
||||
|
||||
//查询校准结果
|
||||
#define CHECK_CALIBRATION_RESULT_CTRL 0x32
|
||||
#define ACK_CHECK_CALIBRATION_RESULT_CTRL 0xA2
|
||||
#define CHECK_CALIBRATION_RESULT_ID0 0x3A
|
||||
#define CHECK_CALIBRATION_RESULT_ID1 0xA0
|
||||
|
||||
//远程升级_旧规约
|
||||
#define FM_BOOTLOADER_ARGUMENT_CTRL 0x44
|
||||
#define FM_BOOTLOADER_REPLY_CTRL 0xB4
|
||||
#define FM_BOOTLOADER_DI0 0x04
|
||||
#define FM_BOOTLOADER_DI1 0xA1
|
||||
|
||||
//远程升级_新规约
|
||||
#define FM_BOOTLOADER_NEW_ARGUMENT_CTRL 0x6E
|
||||
#define FM_BOOTLOADER_NEW_REPLY_CTRL 0xDE
|
||||
#define FM_BOOTLOADER_NEW_DI0 0x2D
|
||||
#define FM_BOOTLOADER_NEW_DI1 0x20
|
||||
|
||||
//读写阀控参数 控制字和升级规约相同
|
||||
#define ACK_SET_RD_VALVE_PARA2_CTRL 0xF6
|
||||
#define SET_RD_VALVE_PARA2_CTRL_DI0 0x08
|
||||
#define SET_RD_VALVE_PARA2_CTRL_DI1 0x10
|
||||
|
||||
//读取IP和端口号
|
||||
#define READ_IP_PORT_CTRL 0x4A
|
||||
#define ACK_READ_IP_PORT_CTRL 0xBA
|
||||
#define READ_IP_PORT_DATA_ID0 0x0A
|
||||
#define READ_IP_PORT_DATA_ID1 0xA1
|
||||
|
||||
//写IP和端口号控制码
|
||||
#define WRITE_IP_PORT_CTRL 0x4B
|
||||
#define ACK_WRTIE_IP_PORT_CTRL 0xBB
|
||||
#define WRITE_IP_PORT_DATA_ID0 0x0B
|
||||
#define WRITE_IP_PORT_DATA_ID1 0xA1
|
||||
|
||||
//设置为全显状态
|
||||
#define SS_SET_LCD_DISPLAY_CTRL 0x61
|
||||
#define SS_ACK_SET_LCD_DISPLAY_CTRL 0xC8
|
||||
#define SS_SET_LCD_DISPLAY_CTRL_ID0 0x46
|
||||
#define SS_SET_LCD_DISPLAY_CTRL_ID1 0xA0
|
||||
|
||||
//深水上传数据报文
|
||||
#define SS_UPLOAD_CTRL 0x67
|
||||
#define SS_ACK_UPLOAD_CTRL 0xD6
|
||||
#define SS_UPLOAD_CTRL_ID0 0x43
|
||||
#define SS_UPLOAD_CTRL_ID1 0xA1
|
||||
#define SS_UPLOAD_CTRL_UDP_ID0 0x31 //UDP上报数据数据标识
|
||||
//短帧上报数据
|
||||
#define SHORT_UPLOAD_CTRL 0x9A
|
||||
#define SHORT_ACK_UPLOAD_CTRL 0xEF
|
||||
#define SHORT_UPLOAD_CTRL_ID0 0x02
|
||||
#define SHORT_UPLOAD_CTRL_ID1 0x10
|
||||
|
||||
//设置APN
|
||||
#define SS_SET_APN_CTRL 0x69
|
||||
#define SS_ACK_SET_APN_CTRL 0xD8
|
||||
#define SS_SET_APN_CTRL_ID0 0x45
|
||||
#define SS_SET_APN_CTRL_ID1 0xA1
|
||||
|
||||
//读取APN
|
||||
#define SS_RD_APN_CTRL 0x70
|
||||
#define SS_ACK_RDT_APN_CTRL 0xD9
|
||||
#define SS_RD_APN_CTRL_ID0 0x46
|
||||
#define SS_RD_APN_CTRL_ID1 0xA1
|
||||
|
||||
//深水统一设置参数
|
||||
#define SS_UNIFIED_SETTINGS_CTRL 0x71
|
||||
#define SS_ACK_UNIFIED_SETTINGS_CTRL 0xE9
|
||||
#define SS_UNIFIED_SETTINGS_CTRL_ID0 0x56
|
||||
#define SS_UNIFIED_SETTINGS_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置大流量报警门限
|
||||
#define SS_SET_THRESHOLD_CTRL 0x72
|
||||
#define SS_ACK_SET_THRESHOLD_CTRL 0xda
|
||||
#define SS_SET_THRESHOLD_CTRL_ID0 0x47
|
||||
#define SS_SET_THRESHOLD_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取大流量报警门限
|
||||
#define SS_READ_THRESHOLD_CTRL 0x73
|
||||
#define SS_ACK_READ_THRESHOLD_CTRL 0xdb
|
||||
#define SS_READ_THRESHOLD_CTRL_ID0 0x48
|
||||
#define SS_READ_THRESHOLD_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置上报起始时间、结束时间
|
||||
#define SS_SET_START_END_CTRL 0x74
|
||||
#define SS_ACK_SET_START_END_CTRL 0xdc
|
||||
#define SS_SET_START_END_CTRL_ID0 0x49
|
||||
#define SS_SET_START_END_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取上报起始时间、结束时间
|
||||
#define SS_READ_START_END_CTRL 0x75
|
||||
#define SS_ACK_READ_START_END_CTRL 0xdd
|
||||
#define SS_READ_START_END_CTRL_ID0 0x4a
|
||||
#define SS_READ_START_END_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置最小估长
|
||||
#define SS_SET_STEPLENGTH_CTRL 0x76
|
||||
#define SS_ACK_SET_STEPLENGTH_CTRL 0xde
|
||||
#define SS_SET_STEPLENGTH_CTRL_ID0 0x4b
|
||||
#define SS_SET_STEPLENGTH_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取最小估长
|
||||
#define SS_READ_STEPLENGTH_CTRL 0x77
|
||||
#define SS_ACK_READ_STEPLENGTH_CTRL 0xdf
|
||||
#define SS_READ_STEPLENGTH_CTRL_ID0 0x4c
|
||||
#define SS_READ_STEPLENGTH_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取水表时间、频点
|
||||
#define SS_READ_TIME_FREQUENCY_CTRL 0x78
|
||||
#define SS_ACK_READ_TIME_FREQUENCY_CTRL 0xe0
|
||||
#define SS_READ_TIME_FREQUENCY_CTRL_ID0 0x4d
|
||||
#define SS_READ_TIME_FREQUENCY_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置重试次数
|
||||
#define SS_SET_RETRY_COUNT_CTRL 0x79
|
||||
#define SS_ACK_SET_RETRY_COUNT_CTRL 0xe1
|
||||
#define SS_SET_RETRY_COUNT_CTRL_ID0 0x4e
|
||||
#define SS_SET_RETRY_COUNT_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取重试次数
|
||||
#define SS_READ_RETRY_COUNT_CTRL 0x7a
|
||||
#define SS_ACK_READ_RETRY_COUNT_CTRL 0xe2
|
||||
#define SS_READ_RETRY_COUNT_CTRL_ID0 0x4f
|
||||
#define SS_READ_RETRY_COUNT_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置上报数据频率
|
||||
#define SS_SET_REPORTING_FREQUENCY_CTRL 0x7b
|
||||
#define SS_ACK_SET_REPORTING_FREQUENCY_CTRL 0xe3
|
||||
#define SS_SET_REPORTING_FREQUENCY_CTRL_ID0 0x50
|
||||
#define SS_SET_REPORTING_FREQUENCY_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取上报数据频率
|
||||
#define SS_READ_REPORTING_FREQUENCY_CTRL 0x7c
|
||||
#define SS_ACK_READ_REPORTING_FREQUENCY_CTRL 0xe4
|
||||
#define SS_READ_REPORTING_FREQUENCY_CTRL_ID0 0x51
|
||||
#define SS_READ_REPORTING_FREQUENCY_CTRL_ID1 0xa1
|
||||
|
||||
//深水统一读取参数
|
||||
#define SS_UNIFIED_READ_CTRL 0x7d
|
||||
#define SS_ACK_UNIFIED_READ_CTRL 0xe5
|
||||
#define SS_UNIFIED_READ_CTRL_ID0 0x52
|
||||
#define SS_UNIFIED_READ_CTRL_ID1 0xa1
|
||||
|
||||
//深水设置密集上报开始时间
|
||||
#define SS_SET_REPORTSTARTTIME_CTRL 0x7e
|
||||
#define SS_ACK_SET_REPORTSTARTTIME_CTRL 0xe6
|
||||
#define SS_SET_REPORTSTARTTIME_CTRL_ID0 0x53
|
||||
#define SS_SET_REPORTSTARTTIME_CTRL_ID1 0xa1
|
||||
|
||||
//深水读取密集上报开始时间
|
||||
#define SS_READ_REPORTSTARTTIME_CTRL 0x7f
|
||||
#define SS_ACK_READ_REPORTSTARTTIME_CTRL 0xe7
|
||||
#define SS_READ_REPORTSTARTTIME_CTRL_ID0 0x54
|
||||
#define SS_READ_REPORTSTARTTIME_CTRL_ID1 0xa1
|
||||
|
||||
//深水登录帧
|
||||
#define SS_SIGN_IN_CTRL 0x8f
|
||||
#define SS_ACK_SIGN_IN_CTRL 0xe8
|
||||
#define SS_SIGN_IN_CTRL_ID0 0x55
|
||||
#define SS_SIGN_IN_CTRL_ID1 0xa1
|
||||
|
||||
//读取IMEI控制码
|
||||
#define SS_READ_IMEI_CTRL 0x91
|
||||
#define SS_ACK_READ_IMEI_CTRL 0xe9
|
||||
#define SS_READ_IMEI_CTRL_ID0 0x56
|
||||
#define SS_READ_IMEI_CTRL_ID1 0xa1
|
||||
|
||||
//终端重启
|
||||
#define SS_TERNAL_RESTART_CTRL 0x92
|
||||
#define SS_ACK_TERNAL_RESTART_CTRL 0xEA
|
||||
#define SS_TERNAL_RESTART_CTRL_ID0 0x57
|
||||
#define SS_TERNAL_RESTART_CTRL_ID1 0xA1
|
||||
|
||||
//读信号强度控制码
|
||||
#define READ_SIGNAL_INTENSITY_CTRL 0x93
|
||||
#define ACK_READ_SIGNAL_INTENSITY_CTRL 0xEB
|
||||
#define READ_SIGNAL_INTENSITY_DATA_ID0 0x58
|
||||
#define READ_SIGNAL_INTENSITY_DATA_ID1 0xA1
|
||||
|
||||
//清除失败次数
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL 0x94
|
||||
#define SS_ACK_CLEAR_FAIL_TIMES_CTRL 0xEC
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI0 0x59
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI1 0xA1
|
||||
|
||||
//设置普通密钥
|
||||
#define SS_SET_COMMON_KEY_CTRL 0x95
|
||||
#define ACK_SS_SET_COMMON_KEY_CTRL 0xED
|
||||
#define SS_SET_COMMON_KEY_CTRL_DI0 0x5A
|
||||
#define SS_SET_COMMON_KEY_CTRL_DI1 0xA1
|
||||
|
||||
//读取普通密钥
|
||||
#define SS_RD_COMMON_KEY_CTRL 0x96
|
||||
#define ACK_SS_RD_COMMON_KEY_CTRL 0xEE
|
||||
#define SS_RD_COMMON_KEY_CTRL_DI0 0x5B
|
||||
#define SS_RD_COMMON_KEY_CTRL_DI1 0xA1
|
||||
|
||||
//读取RAM区数据
|
||||
#define RD_RAM_CTRL 0x98
|
||||
#define ACK_RD_RAM_CTRL 0xF0
|
||||
#define RD_RAM_CTRL_DI0 0x5D
|
||||
#define RD_RAM_CTRL_DI1 0xA1
|
||||
|
||||
//发起短信上传,板卡测试阶段使用
|
||||
#define SMS_UPLOAD_CTRL 0xCB
|
||||
#define ACK_SMS_UPLOAD_CTRL 0xDB
|
||||
#define SMS_UPLOAD_CTRL_ID0 0x15
|
||||
#define SMS_UPLOAD_CTRL_ID1 0xCC
|
||||
|
||||
|
||||
|
||||
//******************************************江西水务定制规约-NB***********************************/
|
||||
//设置密集存储间隔
|
||||
#define FM_SET_MJJI_SPACE_TIME_CTRL 0x5A
|
||||
#define FM_SET_MJJI_SPACE_TIME_REPLY_CTRL 0xCA
|
||||
#define FM_SET_MJJI_SPACE_TIME_DI0 0x48
|
||||
#define FM_SET_MJJI_SPACE_TIME_DI1 0xA0
|
||||
|
||||
//读取密集存储间隔
|
||||
#define FM_RED_MJJI_SPACE_TIME_CTRL 0x5B
|
||||
#define FM_RED_MJJI_SPACE_TIME_REPLY_CTRL 0xCB
|
||||
#define FM_RED_MJJI_SPACE_TIME_DI0 0x49
|
||||
#define FM_RED_MJJI_SPACE_TIME_DI1 0xA0
|
||||
|
||||
//设置采样频率
|
||||
#define FM_SET_SAMPLING_FREQUENCY_CTRL 0x5D
|
||||
#define FM_SET_SAMPLING_FREQUENCY_REPLY_CTRL 0xCD
|
||||
#define FM_SET_SAMPLING_FREQUENCY_DI0 0x50
|
||||
#define FM_SET_SAMPLING_FREQUENCY_DI1 0xA0
|
||||
|
||||
//读取采样频率
|
||||
#define FM_READ_SAMPLING_FREQUENCY_CTRL 0x5E
|
||||
#define FM_READ_SAMPLING_FREQUENCY_REPLY_CTRL 0xCE
|
||||
#define FM_READ_SAMPLING_FREQUENCY_DI0 0x51
|
||||
#define FM_READ_SAMPLING_FREQUENCY_DI1 0xA0
|
||||
|
||||
//设置NB模组为PSM或断电模式
|
||||
#define FM_SET_PSM_PWDOWN_CTRL 0x85
|
||||
#define FM_SET_PSM_PWDOWN_REPLY_CTRL 0x05
|
||||
#define FM_SET_PSM_PWDOWN_DI0 0x04
|
||||
#define FM_SET_PSM_PWDOWN_DI1 0xA0
|
||||
|
||||
//设置上报相关参数
|
||||
#define FM_SET_RETRY_TIME_CTRL 0x08
|
||||
#define FM_SET_RETRY_TIME_REPLY_CTRL 0xB8
|
||||
#define FM_SET_RETRY_TIME_DI0 0x32
|
||||
#define FM_SET_RETRY_TIME_DI1 0xAA
|
||||
|
||||
//读取上报相关参数
|
||||
#define FM_READ_RETRY_TIME_CTRL 0x02
|
||||
#define FM_READ_RETRY_TIME_REPLY_CTRL 0xB2
|
||||
#define FM_READ_RETRY_TIME_DI0 0x33
|
||||
#define FM_READ_RETRY_TIME_DI1 0xAB
|
||||
|
||||
#define ACK_UPLOAD_WITH_VAVLE_CTRL 0xC6 //携带控阀信息的周期应答帧
|
||||
#define ACK_UPLOAD_WITH_VAVLE_CTRL_ID0 0x02
|
||||
#define ACK_UPLOAD_WITH_VAVLE_CTRL_ID1 0x10
|
||||
|
||||
//新增规约
|
||||
//以下为新增规约
|
||||
#define IES_NEW_ADD_FRAME_CTRL 0x6F //新增规约
|
||||
#define ACK_IES_NEW_ADD_FRAME_CTRL 0xF7 //新增规约应答
|
||||
#define COM_WATER_ID1_0x10 0x10
|
||||
|
||||
#define READ_EEPROM_DATA_ID0 0x00 //读取任意位置EE数据
|
||||
#define WRITE_EEPROM_DATA_ID0 0x01 //写任意位置EE数据
|
||||
//#define SET_IR_USATR_AT_ID0 0x02 //进入红外透传
|
||||
#define SET_UDP_IP_PORT_ID0 0x03 //设置udp的ip
|
||||
#define READ_UDP_IP_PORT_ID0 0x04 //读取udp的ip
|
||||
//#define SET_UPDATE_IP_PORT_ID0 0x05 //设置udp的ip
|
||||
//#define READ_UPDATE_IP_PORT_ID0 0x06 //读取udp的ip
|
||||
//#define READ_SUC_FAIL_RESET_TIMES_ID0 0x07 //读取发送成功、失败次数,复位次数
|
||||
//#define SEND_UDP_CYCLE_DATA_ID0 0x08 //UDP发送的数据
|
||||
//#define START_AUTO_CHECK_ID0 0x09 //启动自检
|
||||
//#define READ_AUTO_CHECK_ID0 0x0A //查询自检结果
|
||||
////#define UPDATE_MCU_ID0 0x0B //新远程升级
|
||||
//#define JIANGE_TIME_SET_READ_ID0 0x0C //重传间隔时间参数设置/读取
|
||||
#define SET_EMERGENCY_NUM_ID0 0x0D //设置紧急用水量
|
||||
#define READ_EMERGENCY_NUM_ID0 0x0E //读取紧急用水量
|
||||
#define READ_TIMES_SOE_ID0 0x0F //读取时间段SOE事件
|
||||
#define READ_LAST_SOE_ID0 0x10 //读取最新SOE事件
|
||||
#define READ_BATERY_PARA 0x11 //读取电量相关参数
|
||||
#define CLEAR_BATERY_PARA 0x12 //清除电量相关参数
|
||||
#define FACTORY_TEST_UPLOAD_ID0 0x1E //厂区测试上传,只进行到附网完成
|
||||
/////////////////////////////////////////////////积成规约数据结构///////////////////////////////////////////////
|
||||
typedef struct
|
||||
{
|
||||
u8 head_site; //帧头位置
|
||||
u8 ctrl;
|
||||
u8 ack_ctrl;
|
||||
u8 len;
|
||||
u8 DI0;
|
||||
u8 DI1;
|
||||
u8 serial_num0;
|
||||
u8 serial_num1;
|
||||
u8 key_num;
|
||||
u8 end_site; //帧尾位置
|
||||
u8 check_len; //参与校验计算的数据长度
|
||||
u8 sta; //GPRS加密状态0x80加密 0x40 主动发送(BIT2 = 0应答帧)
|
||||
u8 met_type;
|
||||
} STRUCT_FRAME_IES;//存储数据帧重要内容
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 data0;
|
||||
u8 data1;
|
||||
u8 data2;
|
||||
u8 data3;
|
||||
} datas_map;
|
||||
u8 data_buf[4];
|
||||
u32 datas;
|
||||
} SS_UNION_4U8TOU32;
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 data0;
|
||||
u8 data1;
|
||||
} datas_map;
|
||||
u8 data_buf[2];
|
||||
u16 datas;
|
||||
} SS_UNION_2U8TOU16;
|
||||
|
||||
typedef struct{
|
||||
SS_UNION_2U8TOU16 snr;
|
||||
u16 ecl;
|
||||
u16 rsrp;
|
||||
u8 csq;
|
||||
u8 faile_times;//上报失败次数
|
||||
u8 format_error;//上报数据格式错误
|
||||
u32 cell_id;
|
||||
SS_UNION_2U8TOU16 report_fre;
|
||||
}SIGNAL_INFO;
|
||||
|
||||
typedef union
|
||||
{
|
||||
SIGNAL_INFO SignalStruct;
|
||||
u8 SignalBuf[15];
|
||||
} UNION_SIGNAL;
|
||||
/******************************************************长帧上报数据格式*********************/
|
||||
#define STRU_DATA_LEN_IES 354
|
||||
typedef union{
|
||||
struct{
|
||||
u8 data1;
|
||||
u8 data2;
|
||||
}datas_map;
|
||||
u16 u16_data;
|
||||
}S_M_DATA_16,*p_S_M_DATA_16;
|
||||
typedef union{
|
||||
struct{
|
||||
u16 RSRP_val;//信号强度
|
||||
S_M_DATA_16 bat_val;//电池电压
|
||||
u16 snr_val;//信噪比
|
||||
u16 ecl_val;//无线信号覆盖等级
|
||||
u8 single_val;//csq 信号质量
|
||||
u8 bat_threshold_val;//电池欠压阈值
|
||||
}metinfo;
|
||||
u8 byte[10];
|
||||
}MEASURE_UPLOAD_INFO;
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
SS_UNION_4U8TOU32 CurrentFlow;//u8 CurrentFlow[4];
|
||||
SS_UNION_4U8TOU32 CurrentFlowReverse;//u8 CurrentFlowReverse[4];
|
||||
SS_UNION_4U8TOU32 CurrentFlowForward;//u8 CurrentFlowForward[4];
|
||||
u8 DailyHighestFlowAndTime[14];
|
||||
MEASURE_UPLOAD_INFO UploadInfo;
|
||||
u8 StepFlow[96]; //间隔流量
|
||||
u8 UploadTime[7];//上报时间
|
||||
u8 StepFlowStartTime[7];//间隔流量起始时间
|
||||
u8 StateBytes[5];//状态字
|
||||
SS_UNION_4U8TOU32 DailyActiveTime;//155字节
|
||||
//密集采集
|
||||
u8 MiJiCaiJiFlow[192];
|
||||
u8 MiJiCaiJiStartTime[7];
|
||||
}data;
|
||||
u8 buf[STRU_DATA_LEN_IES];//354
|
||||
} STRU_UPLOAD_FRAME;
|
||||
|
||||
#define CURRENT_DATA_INFO_LEN 36
|
||||
#define STEP_FLOW_START_ADDR (0+CURRENT_DATA_INFO_LEN)
|
||||
#define UPLOAD_TIME_ADDR (STEP_FLOW_START_ADDR + 96)
|
||||
#define STEP_FLOW_TIME_ADDR (UPLOAD_TIME_ADDR + 7)
|
||||
|
||||
/******************************************************短帧上报数据格式*********************/
|
||||
#define STRU_DATA_LEN_IES_SHORT 27 //短帧上报数据总长度
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
SS_UNION_4U8TOU32 CurrentFlow_short;//u8 CurrentFlow[4];
|
||||
SS_UNION_4U8TOU32 null_buf;
|
||||
u8 RSRP_val; //信号强度1字节
|
||||
u16 bat_voltage; //电池电压2字节
|
||||
u16 mode_snr; //SNR2字节
|
||||
u8 mode_ecl; //ECL1字节
|
||||
u8 UploadTime[5]; //上报时间 4字节
|
||||
u8 StateBytes[4]; //状态字5字节
|
||||
SS_UNION_2U8TOU16 soft_ver; //软件版本2字节
|
||||
SS_UNION_2U8TOU16 temp_value; //温度2字节
|
||||
}data;
|
||||
u8 buf[STRU_DATA_LEN_IES_SHORT];//27
|
||||
} STRU_SHORT_UPLOAD_FRAME;
|
||||
|
||||
/******************************************************UDP上报数据格式*********************/
|
||||
#define STRU_DATA_LEN_IES_UDP 62
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
SS_UNION_2U8TOU16 GP30_PeakUp;
|
||||
SS_UNION_2U8TOU16 GP30_PeakDown;
|
||||
SS_UNION_2U8TOU16 TempX100;
|
||||
SS_UNION_2U8TOU16 GP30_TempX100;
|
||||
SS_UNION_4U8TOU32 GP30_Diff;
|
||||
SS_UNION_4U8TOU32 GP30_DiffBig[4];
|
||||
u8 ResetCount;
|
||||
u16 ResetReason;
|
||||
u16 BateryPower;
|
||||
u16 Rsrp;
|
||||
u8 Snr;
|
||||
u8 UploadLastFailCode;
|
||||
SS_UNION_4U8TOU32 CellId;
|
||||
u8 Frequency;
|
||||
u8 Reverse[8];
|
||||
u8 Sta0;
|
||||
u8 Sta1;
|
||||
u8 Sta2;
|
||||
u8 Sta3;
|
||||
SS_UNION_4U8TOU32 CurrentFlow_short;
|
||||
SS_UNION_4U8TOU32 null_buf;
|
||||
}ProcMsgData;
|
||||
u8 buf[STRU_DATA_LEN_IES_UDP];//62
|
||||
} STRU_PROC_MSG;
|
||||
|
||||
/**************************规约应答相关函数**********************************/
|
||||
u8 up_deal_code_ies(void);
|
||||
u8 check_met_addr_IES(u8 *p_buf,u8 *des_buf);
|
||||
u8 crack_frame_IES_Base(u16 frame_lenth,u8 *frame_buffer, STRUCT_FRAME_IES* pFrameIES);
|
||||
u8 crack_frame_IES(u16 frame_lenth,u8 *frame_buffer);
|
||||
MEASURE_UPLOAD_INFO UploadGetInfo_Base(void);
|
||||
void Frame_ack_IesBase(STRUCT_FRAME_IES temp_struct, u8* p_temp_buf, u16 p_temp_len, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
void Frame_ResetDealState_Ies(void);
|
||||
void Frame_ack_IES(u8* p_send_buf, u16* p_send_len);
|
||||
void Frame_nb_ss_upload(u8* p_send_buf, u16* p_send_len);
|
||||
void Frame_nb_jx_upload(u8* p_send_buf, u16* p_send_len);
|
||||
/**************************上报相关函数***************************************/
|
||||
#define PERIOD_DATA_NUM 32 //周期数据记录总报数
|
||||
#define JX_ONE_PACKET_COUNTS 45 //每包数据的间隔量条数
|
||||
|
||||
|
||||
void GetUploadDataResetState_Product(void);
|
||||
u8 GetUploadDataCheckIdle_Product(void);
|
||||
u8 GetUploadDataCheckTask_Product(void);
|
||||
void GetUploadDataMachine_Product(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
void GetUploadDataResetState_IesUDP(void);
|
||||
u8 GetUploadDataCheckIdle_IesUDP(void);
|
||||
u8 GetUploadDataCheckTask_IesUDP(void);
|
||||
void GetUploadDataMachine_IesUDP(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
void SS_Store_InitApp(void);
|
||||
u8 SS_Store_IfSleep(void);
|
||||
/*****************************************************************************/
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,109 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_SY_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_SY_H
|
||||
|
||||
#include "sys_config.h"
|
||||
#if PRODUCT_SY
|
||||
#include "UWater_Frame_app.h"
|
||||
/**************************************20211025沈阳订单新增规约********************************************/
|
||||
//上报冻结数据
|
||||
//水表向平台端主动发送数据规约
|
||||
//上传冻结数据(101,应答1) 上报未冻结数据、水表状态、报警等信息
|
||||
#define FM_UPLOAD_FROZEN_DATA_CTRL 0x65 //101
|
||||
#define FM_UPLOAD_FROZEN_DATA_REPLY_CTRL 0x01 //1
|
||||
|
||||
//上报周期数据(102,应答2) 上报周期采集的数据
|
||||
#define FM_UPLOAD_CYCLE_DATA_CTRL 0x66 //102
|
||||
#define FM_UPLOAD_CYCLE_DATA_REPLY_CTRL 0x02 //2
|
||||
|
||||
//突发报警上传(103,应答3) 在发生报警等级为1的报警事件时随时上传
|
||||
#define FM_SUDDEN_ALARM_UPLOAD_CTRL 0x67 //103
|
||||
#define FM_SUDDEN_ALARM_UPLOAD_REPLY_CTRL 0x03 //3
|
||||
|
||||
//水表应答平台请求规约
|
||||
//参数设置(6,应答106) 设置上传时间、开关阀门、报警参数等
|
||||
#define FM_PARAMENTER_SETTING_CTRL 0x06 //6
|
||||
#define FM_PARAMENTER_SETTING_REPLY_CTRL 0x6A //106
|
||||
|
||||
//参数查询(7,应答107) 在发生报警等级为1的报警事件时随时上传
|
||||
#define FM_PARAMENTER_QUERY_CTRL 0x07 //7
|
||||
#define FM_PARAMENTER_QUERY_REPLY_CTRL 0x6B //107
|
||||
|
||||
//冻结数据查询(8,应答108) 查询日冻结数据、年冻结数据、月冻结数据
|
||||
#define FM_FROZEN_DATA_QUERY_CTRL 0x08 //8
|
||||
#define FM_FROZEN_DATA_QUERY_REPLY_CTRL 0x6C //108
|
||||
|
||||
//周期数据查询(9,应答109) 查询最近7天的周期数据
|
||||
#define FM_CYCLE_DATA_QUERY_CTRL 0x09 //9
|
||||
#define FM_CYCLE_DATA_QUERY_REPLY_CTRL 0x6D //109
|
||||
|
||||
//报警历史数据查询(10,应答110) 查询历史报警数据
|
||||
#define FM_ALARM_HISTORY_DATA_QUERY_CTRL 0x0A //10
|
||||
#define FM_ALARM_HISTORY_DATA_QUERY_REPLY_CTRL 0x6E //110
|
||||
|
||||
//清空数据(51,应答151) 清空冻结数据、历史数据、报警数据
|
||||
#define FM_CLEAR_ALL_DATA_CTRL 0x33 //51
|
||||
#define FM_CLEAR_ALL_DATA_REPLY_CTRL 0x97 //151
|
||||
|
||||
//重启、恢复出厂设置(52,应答152)
|
||||
#define FM_RESTORE_FACTORY_SETTING_CTRL 0x34 //52
|
||||
#define FM_RESTORE_FACTORY_SETTING_REPLY_CTRL 0x98 //152
|
||||
|
||||
//调试指令(71,应答171) 由厂家自行定义的报文,数据域由厂家自行设置
|
||||
#define FM_DEBUG_INSTRUCTION_CTRL 0x47 //71
|
||||
#define FM_DEBUG_INSTRUCTION_REPLY_CTRL 0xAB //171
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 data0;
|
||||
u8 data1;
|
||||
} datas_map;
|
||||
u8 data_buf[2];
|
||||
u16 datas;
|
||||
} SY_UNION_2U8TOU16;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 head_site; //帧头位置
|
||||
u8 ctrl;
|
||||
u8 ack_ctrl;
|
||||
SY_UNION_2U8TOU16 len; //沈阳规约数据长度固定2字节16进制,低字节在前,高字节在后
|
||||
u8 end_site; //帧尾位置
|
||||
u8 check_len; //参与校验计算的数据长度
|
||||
u8 sta; //GPRS加密状态0x80加密 0x40 主动发送(BIT2 = 0应答帧)
|
||||
u8 met_type; //沈阳规约将表计类型定义为规约类型,定为0X02
|
||||
u8 serial_num0; //序列号
|
||||
} STRUCT_FRAME_SY;//存储数据帧重要内容
|
||||
|
||||
|
||||
u8 up_deal_code_sy(void);
|
||||
u8 crack_frame_SY(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_Shenyang(void);
|
||||
void Sy_Frame_nb_read_ack(u8* p_send_buf, u16* p_send_len);
|
||||
/************************************************上报相关**********************/
|
||||
void GetUploadDataResetState_ShenYangUDP(void);
|
||||
u8 GetUploadDataCheckIdle_ShenYangUDP(void);
|
||||
u8 GetUploadDataCheckTask_ShenYangUDP(void);
|
||||
void GetUploadDataMachine_ShenYangUDP(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
/**************************存储相关函数***************************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/*****************************************************************************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_UDP1
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP2
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP2
|
||||
//主上报10秒,副上报5秒
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 100
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,597 @@
|
|||
#include "sys_config.h"
|
||||
|
||||
#if PRODUCT_SHTCP
|
||||
#include "sys_processor.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_timer1us_driver.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_power_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_valve_app.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_QZ_Store_App.h"
|
||||
#include "UWater_frame_func_ReplyNB.h"
|
||||
#include "UWater_frame_func_ReplyShangHe.h"
|
||||
|
||||
|
||||
static u8 task_complete_sh = PTL_PACK_FAIL;
|
||||
static STRUCT_FRAME_SH s_frame_struct_SH; //规约信息
|
||||
static u8 up_deal_stat_sh = UP_DEAL_S0;
|
||||
|
||||
static u16 g_frame_temp_len_sh=0;
|
||||
static u8 g_frame_temp_send_buf_sh[UP_DATA_BUF_SIZE_SH]; //数据部分缓冲区
|
||||
/*******主动上传数据相关变量*****************************************/
|
||||
static STRU_TCP_UPLOAD_FRAME tcp_upload_frame;
|
||||
static u8 upload_frame_stat_sh=0; //主动上报组帧状态
|
||||
static u8 upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
static u8* new_message_data_rev_sh;
|
||||
static u8 temp_upload_step=0;
|
||||
static u8 upload_frame_retry_times=0;
|
||||
//控阀
|
||||
static void frame_func_reply_TCP_ValveControl(void)
|
||||
{
|
||||
g_frame_temp_len_sh = 0;
|
||||
if(*(new_message_data_rev_sh) == 0x55)//开阀
|
||||
{
|
||||
FrameSetMsgApp(ValveOpenMsg);
|
||||
}
|
||||
else if(*(new_message_data_rev_sh) == 0x99)//关阀
|
||||
{
|
||||
FrameSetMsgApp(ValveCloseMsg);
|
||||
}
|
||||
up_deal_stat_sh = up_deal_stat_sh;
|
||||
task_complete_sh = PTL_PACK_SUCCESS;
|
||||
}
|
||||
static void frame_func_reply_TCP_AckUpload(void)
|
||||
{
|
||||
g_frame_temp_len_sh = 0;
|
||||
if(*(new_message_data_rev_sh) == 0x01)//立即下线
|
||||
{
|
||||
FrameSetMsgApp(MsgNbUpload_OffLine);//立即下线
|
||||
}
|
||||
FrameSetMsgApp(MsgNbUplaod_AckOk);
|
||||
task_complete_sh = PTL_PACK_FAIL;
|
||||
}
|
||||
|
||||
//解商河水务规约
|
||||
u8 crack_frame_SHTCP(u16 frame_lenth,u8 *frame_buffer)
|
||||
{
|
||||
u16 tmp_i = 0;
|
||||
u16 tmp_j = 0;
|
||||
u8 tmp_check = 0;
|
||||
for (tmp_i = 0; tmp_i < frame_lenth; tmp_i++)
|
||||
{
|
||||
if (FM_HEAD_MARK == *(frame_buffer + tmp_i))
|
||||
{
|
||||
if ((MET_TYPE_TCP == *(frame_buffer + tmp_i + 1))&&(UP_SOURCE_NB == frame_get_datasource()))
|
||||
{
|
||||
s_frame_struct_SH.met_type = MET_TYPE_TCP;
|
||||
s_frame_struct_SH.head_site = tmp_i; //记录帧头
|
||||
s_frame_struct_SH.len = *(frame_buffer + tmp_i + 10);//数据长度
|
||||
s_frame_struct_SH.end_site = s_frame_struct_SH.head_site + 10 + s_frame_struct_SH.len + 2;
|
||||
s_frame_struct_SH.check_len = s_frame_struct_SH.end_site - s_frame_struct_SH.head_site - 1;
|
||||
if(FM_END_MARK == *(frame_buffer + s_frame_struct_SH.end_site))
|
||||
{
|
||||
//计算校验和
|
||||
tmp_check = 0;
|
||||
for (tmp_j = s_frame_struct_SH.head_site; tmp_j < (s_frame_struct_SH.end_site - 1); tmp_j++)
|
||||
{
|
||||
tmp_check += *(frame_buffer + tmp_j);
|
||||
}
|
||||
if (tmp_check == *(frame_buffer + s_frame_struct_SH.end_site - 1))
|
||||
{
|
||||
u8 check_addr[7];
|
||||
for (tmp_j = 0; tmp_j < 7; tmp_j++)
|
||||
{
|
||||
check_addr[tmp_j] = Sys_data_object.P1.met_addr[tmp_j];
|
||||
}
|
||||
s_frame_struct_SH.ctrl = *(frame_buffer + s_frame_struct_SH.head_site + 9);
|
||||
s_frame_struct_SH.DI0 = *(frame_buffer + s_frame_struct_SH.head_site + 11);
|
||||
s_frame_struct_SH.DI1 = *(frame_buffer + s_frame_struct_SH.head_site + 12);
|
||||
s_frame_struct_SH.serial_num0 = *(frame_buffer + s_frame_struct_SH.head_site + 13);
|
||||
new_message_data_rev_sh = (frame_buffer + s_frame_struct_SH.head_site + 14);
|
||||
switch(s_frame_struct_SH.ctrl)
|
||||
{
|
||||
case VALVE_CONTROL_TCP_CTRL:
|
||||
{
|
||||
check_addr[0] = check_addr[0]-1;//地址为设备地址码减一,最后一位为 0~8
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(SUCCESS == check_apply_addr(frame_buffer + s_frame_struct_SH.head_site + 2, check_addr))
|
||||
{
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ERROR_IES;
|
||||
}
|
||||
|
||||
//规约处理
|
||||
u8 up_deal_code_sh(void)
|
||||
{
|
||||
task_complete_sh = PTL_PACK_BUSY;
|
||||
switch(s_frame_struct_SH.ctrl)
|
||||
{
|
||||
case VALVE_CONTROL_TCP_CTRL:
|
||||
{
|
||||
frame_func_reply_TCP_ValveControl();
|
||||
s_frame_struct_SH.ack_ctrl = ACK_VALVE_CONTROL_TCP_CTRL;
|
||||
}
|
||||
break;
|
||||
case FM_TCP_UPLOAD_REPLAY_CTRL:
|
||||
{
|
||||
frame_func_reply_TCP_AckUpload();
|
||||
s_frame_struct_SH.ack_ctrl = FM_TCP_UPLOAD_CTRL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
up_deal_stat_sh = UP_DEAL_S0;
|
||||
task_complete_sh = PTL_PACK_FAIL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return task_complete_sh;
|
||||
}
|
||||
|
||||
void Frame_ResetDealState_SH(void)
|
||||
{
|
||||
up_deal_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
|
||||
|
||||
void Frame_CreatCs_AckSH(u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
int i=0;
|
||||
//组应答帧头
|
||||
p_send_buf[0] = 0xFE;
|
||||
p_send_buf[1] = 0xFE;
|
||||
p_send_buf[2] = FM_HEAD_MARK;
|
||||
p_send_buf[3] = MET_TYPE;
|
||||
for (i = 0; i < 7; i++)
|
||||
{
|
||||
p_send_buf[4 + i] = Sys_data_object.P1.mac_addr[i];
|
||||
}
|
||||
p_send_buf[11] = s_frame_struct_SH.ack_ctrl;
|
||||
p_send_buf[12] = (3+g_frame_temp_len_sh);
|
||||
p_send_buf[13] = s_frame_struct_SH.DI0;
|
||||
p_send_buf[14] = s_frame_struct_SH.DI1;
|
||||
p_send_buf[15] = s_frame_struct_SH.serial_num0;
|
||||
for(i=0;i<g_frame_temp_len_sh;i++)
|
||||
{
|
||||
p_send_buf[16+i] = g_frame_temp_send_buf_sh[i];
|
||||
}
|
||||
p_send_buf[16+g_frame_temp_len_sh] = check_cs(&p_send_buf[2], (p_send_buf[12] + 11));
|
||||
p_send_buf[17+g_frame_temp_len_sh] = FM_END_MARK;
|
||||
*p_send_len = (18+g_frame_temp_len_sh);
|
||||
}
|
||||
|
||||
/****************************************************************以下主动上报数据的处理*********************************************/
|
||||
static void Register_TcpFrameData(u8 *p_send_buf, u16 *p_send_len)
|
||||
{
|
||||
u8 i=0;
|
||||
char imei_buf[16];
|
||||
|
||||
NbiotGetIMEI(imei_buf);
|
||||
|
||||
for(i=0;i<15;i++)
|
||||
{
|
||||
*p_send_buf++ = imei_buf[i];
|
||||
}
|
||||
*p_send_len = 15;
|
||||
}
|
||||
static void Ping_TcpFrameData(u8 *p_send_buf, u16 *p_send_len)
|
||||
{
|
||||
u8 i=0;
|
||||
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
*p_send_buf++ = '0';
|
||||
}
|
||||
*p_send_len = 3;
|
||||
}
|
||||
//TCP上报数据帧
|
||||
static void Upload_TcpFrameData(u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
u8 i=0;
|
||||
UNION_4U8TOU32 tmp_datas_buf;
|
||||
u8 temp_data=0;
|
||||
TCP_STATE tcp_stat;
|
||||
MET_STATE temp_state;
|
||||
Fram_To_Float tmp_float;
|
||||
DateTime tempRtccTime;
|
||||
UNION_2U8TOU16 temp_bat_val;
|
||||
|
||||
tcp_upload_frame.data.HeadBuf[0] = 0xFE;
|
||||
tcp_upload_frame.data.HeadBuf[1] = 0xFE;
|
||||
tcp_upload_frame.data.HeadBuf[2] = 0x68;
|
||||
tcp_upload_frame.data.HeadBuf[3] = 0x20;
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
tcp_upload_frame.data.Addr[i] = Sys_data_object.P1.met_addr[i];
|
||||
}
|
||||
tcp_upload_frame.data.Ctrl = 0x81;
|
||||
tcp_upload_frame.data.Num = 0;//59;
|
||||
tcp_upload_frame.data.DataFlag[0] = 0x90;
|
||||
tcp_upload_frame.data.DataFlag[1] = 0x1F;
|
||||
tcp_upload_frame.data.Ser = 0x00;
|
||||
tcp_upload_frame.data.Data1Buf[0] = 1;
|
||||
tcp_upload_frame.data.Data1Buf[1] = 1;
|
||||
tcp_upload_frame.data.Data1Buf[2] = 1;
|
||||
tcp_upload_frame.data.Data1Buf[3] = 1;
|
||||
//单户户号
|
||||
tcp_upload_frame.data.Data2Buf[0] = Sys_data_object.P1.met_addr[0];
|
||||
tcp_upload_frame.data.Data2Buf[1] = Sys_data_object.P1.met_addr[1];
|
||||
tcp_upload_frame.data.Data2Buf[2] = Sys_data_object.P1.met_addr[2];
|
||||
tcp_upload_frame.data.Data2Buf[3] = Sys_data_object.P1.met_addr[3];
|
||||
//剩余流量
|
||||
tcp_upload_frame.data.Data2Buf[4] = 0x00;//小数位
|
||||
tcp_upload_frame.data.Data2Buf[5] = 0x01;
|
||||
tcp_upload_frame.data.Data2Buf[6] = 0x00;
|
||||
tcp_upload_frame.data.Data2Buf[7] = 0x00;
|
||||
//累计流量
|
||||
tmp_float.gp22_u32 = Gp30CheckDataApp(2);
|
||||
tmp_datas_buf.datas = HexToBcd32((u32)(tmp_float.gp22_float));
|
||||
tcp_upload_frame.data.Data2Buf[8] = tmp_datas_buf.data_buf[0];//小数位
|
||||
tcp_upload_frame.data.Data2Buf[9] = tmp_datas_buf.data_buf[1];
|
||||
tcp_upload_frame.data.Data2Buf[10] = tmp_datas_buf.data_buf[2];
|
||||
tcp_upload_frame.data.Data2Buf[11] = tmp_datas_buf.data_buf[3];//小数位
|
||||
//瞬时流量
|
||||
tmp_datas_buf.datas = Gp30CheckDataApp(GP30_APP_INS_FLOW); //瞬时流量(四位小数,放大100000倍)//BCD
|
||||
tmp_datas_buf.datas = Gp30DataToBcd(tmp_datas_buf.datas, 10);
|
||||
tcp_upload_frame.data.Data2Buf[12] = tmp_datas_buf.data_buf[0];
|
||||
tcp_upload_frame.data.Data2Buf[13] = tmp_datas_buf.data_buf[1];
|
||||
tcp_upload_frame.data.Data2Buf[14] = tmp_datas_buf.data_buf[2];//小数位
|
||||
tcp_upload_frame.data.Data2Buf[15] = tmp_datas_buf.data_buf[3];
|
||||
//温度
|
||||
float tmep = TempCheckValueApp(); //
|
||||
if(tmep <0)
|
||||
{
|
||||
tmp_datas_buf.datas = (u32)(tmep*(-100));
|
||||
tmp_datas_buf.datas &= 0x0FFFF;
|
||||
tmp_datas_buf.datas |= 0x80000;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_datas_buf.datas = (u32)(tmep*(100));
|
||||
tmp_datas_buf.datas &= 0x7FFFF;
|
||||
}
|
||||
tcp_upload_frame.data.Data2Buf[16] = tmp_datas_buf.datas_map.data0;
|
||||
tcp_upload_frame.data.Data2Buf[17] = tmp_datas_buf.datas_map.data1;
|
||||
tcp_upload_frame.data.Data2Buf[18] = tmp_datas_buf.datas_map.data2;//小数位
|
||||
//累计工作时间
|
||||
tmp_datas_buf.datas = RtccGetWorkHourApp();
|
||||
tmp_datas_buf.datas = HexToBcd32(tmp_datas_buf.datas);
|
||||
tcp_upload_frame.data.Data2Buf[19] = tmp_datas_buf.datas_map.data0;
|
||||
tcp_upload_frame.data.Data2Buf[20] = tmp_datas_buf.datas_map.data1;
|
||||
tcp_upload_frame.data.Data2Buf[21] = tmp_datas_buf.datas_map.data2;
|
||||
//状态字转换
|
||||
temp_state = FrameGetByte();
|
||||
tcp_stat.statTCP1 = 0;
|
||||
tcp_stat.statTCP2 = 0;
|
||||
tcp_stat.statTcp1bits.reverse = temp_state.stat1bits.reverse;
|
||||
tcp_stat.statTcp1bits.low_flow_rate = temp_state.stat1bits.low_flow_rate;
|
||||
tcp_stat.statTcp1bits.valve_state = temp_state.stat1bits.valve_state;
|
||||
if(temp_state.stat0bits.transducer_aging)
|
||||
{
|
||||
tcp_stat.statTcp2bits.amplitude = 0;//低振幅
|
||||
}
|
||||
else
|
||||
{
|
||||
tcp_stat.statTcp2bits.amplitude = 3;//高振福
|
||||
}
|
||||
tcp_stat.statTcp2bits.low_power = temp_state.stat1bits.low_battery_voltage;
|
||||
|
||||
tcp_upload_frame.data.Data2Buf[22] = tcp_stat.statTCP1;
|
||||
tcp_upload_frame.data.Data2Buf[23] = tcp_stat.statTCP2;
|
||||
#if defined(VALVE)
|
||||
temp_data = ValveGetStateApp();
|
||||
if(temp_data == 0x01)//阀门关
|
||||
{
|
||||
tcp_upload_frame.data.Data2Buf[22] |= 0x40;
|
||||
}
|
||||
else//阀门异常
|
||||
{
|
||||
tcp_upload_frame.data.Data2Buf[22] |= 0xC0;
|
||||
}
|
||||
#endif
|
||||
//信号强度
|
||||
NbiotGetCSQ(&temp_data);
|
||||
tcp_upload_frame.data.Data3Buf[0] = 0;
|
||||
tcp_upload_frame.data.Data3Buf[1] = temp_data;
|
||||
|
||||
//维度//37.30907
|
||||
tcp_upload_frame.data.Data3Buf[2] = 0x03;
|
||||
tcp_upload_frame.data.Data3Buf[3] = 0x7F;
|
||||
tcp_upload_frame.data.Data3Buf[4] = 0x30;
|
||||
tcp_upload_frame.data.Data3Buf[5] = 0x90;
|
||||
tcp_upload_frame.data.Data3Buf[6] = 0x70;
|
||||
//经度//117.1571
|
||||
tcp_upload_frame.data.Data3Buf[7] = 0x11;
|
||||
tcp_upload_frame.data.Data3Buf[8] = 0x7F;
|
||||
tcp_upload_frame.data.Data3Buf[9] = 0x15;
|
||||
tcp_upload_frame.data.Data3Buf[10] = 0x71;
|
||||
tcp_upload_frame.data.Data3Buf[11]= 0x00;
|
||||
//太阳能电压
|
||||
tcp_upload_frame.data.Data3Buf[12]= 0x00;
|
||||
tcp_upload_frame.data.Data3Buf[13]= 0x00;//小数位
|
||||
//电池电压
|
||||
//获取电压值
|
||||
temp_bat_val.datas =HexToBcd16(PowerCheckValueSys());
|
||||
tcp_upload_frame.data.Data3Buf[14]= temp_bat_val.datas&0xFF;//小数位
|
||||
tcp_upload_frame.data.Data3Buf[15]= (temp_bat_val.datas>>8)&0xFF;
|
||||
//压力
|
||||
tcp_upload_frame.data.Data3Buf[16]= 0x00;
|
||||
tcp_upload_frame.data.Data3Buf[17]= 0x00;
|
||||
//版本号
|
||||
tcp_upload_frame.data.Data3Buf[18]= (FrameCheckParaApp(FramePara_ProgVersion)>>16)&0xFF;
|
||||
tcp_upload_frame.data.Data3Buf[19]= (FrameCheckParaApp(FramePara_ProgVersion)>>24)&0xFF;
|
||||
//日期时间
|
||||
RtccGetDateTime(&tempRtccTime);//上报时间
|
||||
tcp_upload_frame.data.Data3Buf[20] = tempRtccTime.s.second;
|
||||
tcp_upload_frame.data.Data3Buf[21] = tempRtccTime.s.minute;
|
||||
tcp_upload_frame.data.Data3Buf[22] = tempRtccTime.s.hour;
|
||||
tcp_upload_frame.data.Data3Buf[23] = tempRtccTime.s.day;
|
||||
tcp_upload_frame.data.Data3Buf[24] = tempRtccTime.s.month;
|
||||
tcp_upload_frame.data.Data3Buf[25] = tempRtccTime.s.year;
|
||||
tcp_upload_frame.data.Data3Buf[26] = 0x20;
|
||||
//状态
|
||||
tcp_upload_frame.data.Data3Buf[27] = 0x00;
|
||||
//校验和
|
||||
tcp_upload_frame.data.Cs = 0;
|
||||
for(i=2;i<72;i++)
|
||||
{
|
||||
tcp_upload_frame.data.Cs += tcp_upload_frame.buf[i];
|
||||
}
|
||||
tcp_upload_frame.data.End = 0x16;
|
||||
|
||||
for(i=0;i<74;i++)
|
||||
{
|
||||
*p_send_buf++ = tcp_upload_frame.buf[i];
|
||||
}
|
||||
*p_send_len = 74;
|
||||
}
|
||||
|
||||
void GetUploadDataResetState_SH(void)
|
||||
{
|
||||
upload_frame_stat_sh =UP_DEAL_S0;
|
||||
upload_task_complete_sh = PTL_PACK_BUSY;
|
||||
}
|
||||
u8 GetUploadDataCheckIdle_SH(void)
|
||||
{
|
||||
if(UP_DEAL_S0 == upload_frame_stat_sh)
|
||||
{
|
||||
return TASK_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TASK_BUSY;
|
||||
}
|
||||
}
|
||||
u8 GetUploadDataCheckTask_SH(void)
|
||||
{
|
||||
return upload_task_complete_sh;
|
||||
}
|
||||
|
||||
void GetUploadDataMachine_SH(u8 data_step, u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
switch(upload_frame_stat_sh)
|
||||
{
|
||||
case UP_DEAL_S0:
|
||||
{
|
||||
if(data_step == UPLOAD_FRAME_REQUEST_NEW)
|
||||
{
|
||||
temp_upload_step = 0;
|
||||
upload_frame_retry_times = 0;
|
||||
upload_frame_stat_sh = UP_DEAL_S1;//发送注册包
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_UPLOAD_OK)//发送数据成功,开始立即发送心跳包
|
||||
{
|
||||
SystemClearUploadAgain();//重传清0
|
||||
upload_frame_stat_sh = UP_DEAL_S3;//发第一个心跳包
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_UPLOAD_RETRY)//重发数据,或者是发送了注册包
|
||||
{
|
||||
if(temp_upload_step == UP_DEAL_S1)//注册包
|
||||
{
|
||||
upload_frame_stat_sh = UP_DEAL_S20;//发送数据包
|
||||
}
|
||||
else if(temp_upload_step == UP_DEAL_S20)//数据包
|
||||
{
|
||||
upload_frame_stat_sh = UP_DEAL_S21;//重试
|
||||
}
|
||||
else if(temp_upload_step == UP_DEAL_S3)//发第一个心跳包
|
||||
{
|
||||
upload_frame_stat_sh = UP_DEAL_S4;//再次延时发送心跳包
|
||||
}
|
||||
else//第二个心跳包或其他情况
|
||||
{
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
else if(data_step == UPLOAD_FRAME_ONLINE_FAIL) //联网失败
|
||||
{
|
||||
if(UPLOAD_TYPE_FIX_TIME == GetEventUploadType()||
|
||||
(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType()))//定时上传
|
||||
{
|
||||
SystemAddUploadAgain();//重传增加
|
||||
}
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
else
|
||||
{
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S1://组注册帧
|
||||
{
|
||||
if(EepIfIdle())
|
||||
{
|
||||
temp_upload_step = UP_DEAL_S1;
|
||||
Register_TcpFrameData(p_send_buf, p_send_len);
|
||||
upload_task_complete_sh = PTL_PACK_SUCCESS;//成功
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S20://组上报帧
|
||||
{
|
||||
temp_upload_step = UP_DEAL_S20;
|
||||
Upload_TcpFrameData(p_send_buf, p_send_len);
|
||||
upload_task_complete_sh = PTL_PACK_SUCCESS;//成功
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S21://重试
|
||||
{
|
||||
if(upload_frame_retry_times < 3)
|
||||
{
|
||||
upload_frame_retry_times++;
|
||||
upload_frame_stat_sh = UP_DEAL_S20;
|
||||
}
|
||||
else//重新发送失败3次的处理
|
||||
{
|
||||
if((UPLOAD_TYPE_FIX_TIME == GetEventUploadType())|| //重传
|
||||
(UPLOAD_TYPE_RETRY_AGAIN == GetEventUploadType()))//定时上传
|
||||
{
|
||||
SystemAddUploadAgain();//重传增加
|
||||
}
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case UP_DEAL_S3://立即发送心跳包获取下行指令
|
||||
{
|
||||
temp_upload_step = UP_DEAL_S3;
|
||||
Ping_TcpFrameData(p_send_buf, p_send_len);
|
||||
upload_task_complete_sh = PTL_PACK_SUCCESS;//成功
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S4://间隔1分钟再发送心跳包
|
||||
{
|
||||
temp_upload_step = UP_DEAL_S4;
|
||||
Ping_TcpFrameData(p_send_buf, p_send_len);
|
||||
Set100msTimer(TIMER_100MS_UPLOAD_MONITOR, 600);//定时60秒
|
||||
upload_frame_stat_sh = UP_DEAL_S5;
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S5://等待延时时间到
|
||||
{
|
||||
if(0 == Check100msTimer(TIMER_100MS_UPLOAD_MONITOR))
|
||||
{
|
||||
upload_task_complete_sh = PTL_PACK_SUCCESS;//成功
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
if(FrameCheckMsgApp(MsgNbUpload_OffLine)) //立即下线消息
|
||||
{
|
||||
FrameClearMsgApp(MsgNbUpload_OffLine);
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;//结束
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
upload_task_complete_sh = PTL_PACK_FAIL;
|
||||
upload_frame_stat_sh = UP_DEAL_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name:NB_SS_Control_GetPara
|
||||
* @brief :
|
||||
* @param[in] :读取上报控制相关参数
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
u8 NB_SS_Control_GetPara(NB_SS_ControlParaTypeDef paraType)
|
||||
{
|
||||
switch(paraType)
|
||||
{
|
||||
case NB_HistroyReadIndex://历史数据的读指针
|
||||
{
|
||||
return Sys_data_object.P1.histroy_w;
|
||||
}
|
||||
case NB_UploadFailTimes://失败次数
|
||||
{
|
||||
u8 temp_fail_times=0;
|
||||
for(int i = 0; i < 32; i++)
|
||||
{
|
||||
if(((Sys_data_object.P1.Supplemental_send_flag.datas >> i) & 0x00000001) == 0x00000001)
|
||||
{
|
||||
temp_fail_times += 1;
|
||||
}
|
||||
}
|
||||
return temp_fail_times;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name:NB_SS_Control_SetPara
|
||||
* @brief :
|
||||
* @param[in] :设置上报控制相关参数
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
void NB_SS_Control_SetPara(NB_SS_ControlParaTypeDef paraType, u8 data)
|
||||
{
|
||||
switch(paraType)
|
||||
{
|
||||
case NB_HistroyReadIndex://历史数据的读指针
|
||||
{
|
||||
Sys_data_object.P1.histroy_w = data;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//规约数据存储部分初始化
|
||||
void DataStoreInit(void)
|
||||
{
|
||||
Quanzhou_Store_InitApp();
|
||||
}
|
||||
//规约数据存储状态机
|
||||
void DataStoreMachine(void)
|
||||
{
|
||||
Quanzhou_Store_Machine();//冻结数据存储
|
||||
}
|
||||
//规约数据存储休眠判断
|
||||
u8 DataStoreIfIdle(void)
|
||||
{
|
||||
if(QuanzhouStore_IfSleep()==TRUE)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAYSHANGHE_H
|
||||
#define UWATER_FRAME_FUNC_REPLAYSHANGHE_H
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
#if PRODUCT_SHTCP
|
||||
|
||||
#define UP_DATA_BUF_SIZE_SH 128
|
||||
//阀门控制-----商河水务,数据标识高低位调换-------------------------------------------------
|
||||
#define VALVE_CONTROL_TCP_CTRL 0x04
|
||||
#define ACK_VALVE_CONTROL_TCP_CTRL 0x84
|
||||
#define VALVE_CONTROL_TCP_DATA_ID0 0xA0
|
||||
#define VALVE_CONTROL_TCP_DATA_ID1 0x17
|
||||
|
||||
|
||||
//数据上报
|
||||
#define FM_TCP_UPLOAD_CTRL 0x81
|
||||
#define FM_TCP_UPLOAD_REPLAY_CTRL 0x22
|
||||
#define FM_TCP_UPLOAD_DI0 0x47
|
||||
#define FM_TCP_UPLOAD_DI1 0x02
|
||||
/************************************************************************************************/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 head_site; //帧头位置
|
||||
u8 ctrl;
|
||||
u8 ack_ctrl;
|
||||
u8 len;
|
||||
u8 DI0;
|
||||
u8 DI1;
|
||||
u8 serial_num0;
|
||||
u8 serial_num1;
|
||||
u8 key_num;
|
||||
u8 end_site; //帧尾位置
|
||||
u8 check_len; //参与校验计算的数据长度
|
||||
u8 sta; //GPRS加密状态0x80加密 0x40 主动发送(BIT2 = 0应答帧)
|
||||
u8 met_type;
|
||||
} STRUCT_FRAME_SH;//存储数据帧重要内容
|
||||
|
||||
typedef union {
|
||||
struct
|
||||
{
|
||||
u8 HeadBuf[4];// FE FE 68 20
|
||||
u8 Addr[7];//表地址
|
||||
u8 Ctrl;//控制字
|
||||
u8 Num;//数据长度
|
||||
u8 DataFlag[2];//数据标识
|
||||
u8 Ser;//序列号
|
||||
u8 Data1Buf[4];//数据1
|
||||
u8 Data2Buf[24];
|
||||
u8 Data3Buf[28];
|
||||
u8 Cs;//68到data3
|
||||
u8 End;//结束符
|
||||
}data;
|
||||
u8 buf[80];
|
||||
} STRU_TCP_UPLOAD_FRAME;
|
||||
|
||||
u8 crack_frame_SHTCP(u16 frame_lenth,u8 *frame_buffer);
|
||||
u8 up_deal_code_sh(void);
|
||||
void Frame_ResetDealState_SH(void);
|
||||
void Frame_CreatCs_AckSH(u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
void GetUploadDataResetState_SH(void);
|
||||
u8 GetUploadDataCheckIdle_SH(void);
|
||||
u8 GetUploadDataCheckTask_SH(void);
|
||||
void GetUploadDataMachine_SH(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
/**************************存储相关函数***************************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/*****************************************************************************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_COAP
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_COAP
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP1
|
||||
//主上报15秒,副上报5秒
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 150
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,107 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_SHENSHUI_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_SHENSHUI_H
|
||||
|
||||
#include "sys_config.h"
|
||||
#ifdef PRODUCT_SS
|
||||
//////////////////////////////////////////规约控制字/////////////////////////////////////////////////////////
|
||||
/*NB新增通信规约*/
|
||||
//深水读取历史数据
|
||||
#define SS_READ_HIS_CTRL 0x27
|
||||
#define SS_ACK_READ_HIS_CTRL 0xa7
|
||||
#define SS_READ_HIS_CTRL_ID0 0x35
|
||||
#define SS_READ_HIS_CTRL_ID1 0xA0
|
||||
|
||||
#define QZ_READ_HIS_MONTH_CTRL_ID1 0x30 //月冻结数据
|
||||
#define QZ_READ_HIS_DAILY_CTRL_ID1 0x31 //日冻结信息
|
||||
|
||||
//深水上传数据报文
|
||||
#define SS_UPLOAD_CTRL 0x67
|
||||
#define SS_ACK_UPLOAD_CTRL 0xD6
|
||||
#define SS_UPLOAD_CTRL_ID0 0x43
|
||||
#define SS_UPLOAD_CTRL_ID1 0xA1
|
||||
#define SS_UPLOAD_CTRL_UDP_ID0 0x31 //UDP上报数据数据标识
|
||||
//短帧上报数据
|
||||
#define SHORT_UPLOAD_CTRL 0x9A
|
||||
#define SHORT_ACK_UPLOAD_CTRL 0xEF
|
||||
#define SHORT_UPLOAD_CTRL_ID0 0x02
|
||||
#define SHORT_UPLOAD_CTRL_ID1 0x10
|
||||
|
||||
//新补报规约上报数据
|
||||
#define SUPP_UPLOAD_CTRL 0x9B
|
||||
#define SUPP_ACK_UPLOAD_CTRL 0xF1
|
||||
#define SUPP_UPLOAD_CTRL_ID0 0x01
|
||||
#define SUPP_UPLOAD_CTRL_ID1 0x10
|
||||
|
||||
//深水登录帧
|
||||
#define SS_SIGN_IN_CTRL 0x8f
|
||||
#define SS_ACK_SIGN_IN_CTRL 0xe8
|
||||
#define SS_SIGN_IN_CTRL_ID0 0x55
|
||||
#define SS_SIGN_IN_CTRL_ID1 0xa1
|
||||
|
||||
//清除失败次数
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL 0x94
|
||||
#define SS_ACK_CLEAR_FAIL_TIMES_CTRL 0xEC
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI0 0x59
|
||||
#define SS_CLEAR_FAIL_TIMES_CTRL_DI1 0xA1
|
||||
|
||||
enum{
|
||||
SUPPLEMENT_DATA_FRAME_S0 = 0,
|
||||
SUPPLEMENT_DATA_FRAME_S1,
|
||||
SUPPLEMENT_DATA_FRAME_S2,
|
||||
SUPPLEMENT_DATA_FRAME_S3,
|
||||
SUPPLEMENT_DATA_FRAME_S4,
|
||||
SUPPLEMENT_DATA_FRAME_S5,
|
||||
SUPPLEMENT_DATA_FRAME_S6,
|
||||
SUPPLEMENT_DATA_FRAME_S7
|
||||
};
|
||||
#define SUPPLEMENT_DATA_MAX_NUM 19 //一帧补报数据里最多19条日冻结
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SS_StoreMsg0 = 0u,
|
||||
SS_StoreMsg1 = 1u,
|
||||
SS_StoreMsg2 = 2u,
|
||||
SS_StoreMsg3 = 3u,
|
||||
SS_StoreMsg4 = 4u,
|
||||
SS_StoreMsg5 = 5u,
|
||||
SS_StoreMsg6 = 6u,
|
||||
SS_StoreMsg7 = 7u
|
||||
}SS_StoreMsgType;
|
||||
|
||||
/***************************************长帧上报数据格式*********************/
|
||||
#define PACK_NUM_GPRS 155 //周期上报部分数据长度
|
||||
#define PACK_NUM_GPRS_INTEN 199 //24小时的30min间隔流量数据长度,48*4+7
|
||||
#define PACK_NUM_GPRS_TOTAL (PACK_NUM_GPRS+PACK_NUM_GPRS_INTEN) //周期上报的数据总长度
|
||||
#define CURRENT_DATA_INFO_LEN 36
|
||||
#define STEP_FLOW_START_ADDR (0+CURRENT_DATA_INFO_LEN)
|
||||
/**************************规约应答相关函数**********************************/
|
||||
u8 up_deal_code_ShenShui(void);
|
||||
u8 crack_frame_ShenShui(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_ShenShui(void);
|
||||
void Frame_ack_ShenShui(u8* p_send_buf, u16* p_send_len);
|
||||
/**************************上报相关函数***************************************/
|
||||
#define PERIOD_DATA_NUM 32 //周期数据记录总报数
|
||||
|
||||
void GetUploadDataResetState_SS(void);
|
||||
u8 GetUploadDataCheckIdle_SS(void);
|
||||
u8 GetUploadDataCheckTask_SS(void);
|
||||
void GetUploadDataMachine_SS(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
/**************************存储相关函数***************************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/*****************************************************************************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_COAP
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_COAP
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP1
|
||||
//主上报10秒,副上报5秒
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 100 //10秒
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#include "UWater_frame_app.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_frame_func_ReplyWT.h"
|
||||
#include "UWater_encryption_driver.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_frame_func_ReplyShenYang.h"
|
||||
|
||||
#if PRODUCT_SY
|
||||
|
||||
//解商河水务规约
|
||||
u8 crack_frame_SHTCP(u16 frame_lenth,u8 *frame_buffer)//
|
||||
{
|
||||
u16 tmp_i = 0;
|
||||
u16 tmp_j = 0;
|
||||
u8 tmp_check = 0;
|
||||
for (tmp_i = 0; tmp_i < frame_lenth; tmp_i++)
|
||||
{
|
||||
if (FM_HEAD_MARK == *(frame_buffer + tmp_i))
|
||||
{
|
||||
if ((MET_TYPE_TCP == *(s_frame_rcv_buf + tmp_i + 1))&&(1 == s_frame_flag.data_sourse))
|
||||
{
|
||||
s_frame_struct.met_type = MET_TYPE_TCP;
|
||||
s_frame_struct.head_site = tmp_i; //记录帧头
|
||||
s_frame_struct.len = *(s_frame_rcv_buf + tmp_i + 10);//数据长度
|
||||
s_frame_struct.end_site = s_frame_struct.head_site + 10 + s_frame_struct.len + 2;
|
||||
s_frame_struct.check_len = s_frame_struct.end_site - s_frame_struct.head_site - 1;
|
||||
if(FM_END_MARK == *(s_frame_rcv_buf + s_frame_struct.end_site))
|
||||
{
|
||||
//计算校验和
|
||||
tmp_check = 0;
|
||||
for (tmp_j = s_frame_struct.head_site; tmp_j < (s_frame_struct.end_site - 1); tmp_j++)
|
||||
{
|
||||
tmp_check += *(s_frame_rcv_buf + tmp_j);
|
||||
}
|
||||
if (tmp_check == *(s_frame_rcv_buf + s_frame_struct.end_site - 1))
|
||||
{
|
||||
s_frame_struct.ctrl = *(s_frame_rcv_buf + s_frame_struct.head_site + 9);
|
||||
s_frame_struct.DI0 = *(s_frame_rcv_buf + s_frame_struct.head_site + 11);
|
||||
s_frame_struct.DI1 = *(s_frame_rcv_buf + s_frame_struct.head_site + 12);
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ERROR_IES;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_WT_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_WT_H
|
||||
|
||||
#include "type.h"
|
||||
|
||||
u8 up_deal_code_mbus(void);
|
||||
u8 crack_frame_MBUS(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_Mbus(void);
|
||||
void Frame_CreatCrcCs_Ack(u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,849 @@
|
|||
#include "UWater_frame_app.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_frame_func_ReplyWT.h"
|
||||
#include "UWater_encryption_driver.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
|
||||
|
||||
static u8 broad_addr[7] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
|
||||
static u8 task_complete_mbus = PTL_PACK_BUSY;
|
||||
static STRUCT_FLAG s_frame_flag_MBUS; //规约标志
|
||||
static STRUCT_FRAME_MBUS frame_struct_MBUS; //规约信息
|
||||
static u8 *new_message_data_rev_mbus;
|
||||
static u16 g_frame_temp_len_mbus;
|
||||
static u8 g_frame_temp_send_buf_mbus[UP_BUF_SIZE]; //数据部分缓冲区
|
||||
static u8 s_eep_complete_mbus;
|
||||
static u8 up_deal_stat_mbus=UP_DEAL_S0;
|
||||
//static u8 frame_temp_data_buf[256];//发送数据帧组帧缓存
|
||||
//读通讯地址
|
||||
static void frame_func_reply_WT_ReadAddr(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
/*MBus规约 读温度系数*/
|
||||
static void frame_func_reply_WT_ReadTemperatureCoefficient(void)
|
||||
{
|
||||
UNION_4U8TOU32 temp_4U8toU32_data;
|
||||
g_frame_temp_len_mbus = 0;
|
||||
temp_4U8toU32_data.datas = FrameCheckParaApp(FramePara_Tc0);
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = temp_4U8toU32_data.data_buf[i];
|
||||
}
|
||||
temp_4U8toU32_data.datas = FrameCheckParaApp(FramePara_Tc1);
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = temp_4U8toU32_data.data_buf[i];
|
||||
}
|
||||
g_frame_temp_len_mbus = 8;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
/*读取物理地址*/
|
||||
static void frame_func_reply_WT_ReadMac(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
for(int i=0;i<7;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x00;//返回给水台子固定MAC地址0x00
|
||||
}
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
/*设为检定状态*/
|
||||
static void frame_func_reply_WT_SetVerificationState(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
if (0 == Sys_data_object.P1.enable_verification_function)
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
FrameSetMsgApp(SetVerificationMsg);
|
||||
FrameClearMsgApp(MsgCaliberate);//清零 单程时间校准校准标志
|
||||
//Gp30TestFlowInit(); //设置为检定状态,GP30应用数据初始化(改善模组驱动不需要)
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
//读出厂序列号
|
||||
static void frame_func_reply_WT_ReadSerialNum(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.last_key_num;
|
||||
for(int i=0;i<7;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x00;//返回给水台子固定序列号0x00
|
||||
}
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x5A;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
//退出检定状态
|
||||
static void frame_func_reply_WT_OutVerificationState(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
if(01 == LcdCheckStateApp())
|
||||
{
|
||||
FrameSetMsgApp(OutVerificationMsg);//s_struct_msg.MsgStruct.out_verification_msg = 1;
|
||||
}
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
//读流量系数
|
||||
static void frame_func_reply_WT_ReadFlowCoefficient(void)
|
||||
{
|
||||
int i;
|
||||
g_frame_temp_len_mbus = 0;
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_small.data_buf[i];
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_middle0.data_buf[i];
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_middle1.data_buf[i];
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_middle2.data_buf[i];
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_middle3.data_buf[i];
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = Sys_data_object.P1.flow_coefficient_large.data_buf[i];
|
||||
}
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
//读检定数据
|
||||
static void frame_func_reply_WT_ReadVerificationData(void)
|
||||
{
|
||||
int i;
|
||||
DateTime tmp_time_buf;
|
||||
UNION_4U8TOU32 tmp_datas_buf;
|
||||
UNION_FLOAT_STORAGE tmp_float_datas_buf;
|
||||
float tempTempratureFlag;
|
||||
MET_STATE temp_met_state;
|
||||
g_frame_temp_len_mbus = 0;
|
||||
|
||||
if(01 != LcdCheckStateApp()) //非检定状态
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
//温度
|
||||
if(TRUE==Check_Start_STOP_Filter_Flag())
|
||||
{
|
||||
Clear_Start_STOP_Filter_Flag();
|
||||
tempTempratureFlag = Check_Temperature_Parameter();//传递滤波的反算温度数据
|
||||
}
|
||||
else
|
||||
{
|
||||
tempTempratureFlag = TempCheckValueApp();
|
||||
}
|
||||
|
||||
if(tempTempratureFlag < 0)
|
||||
{
|
||||
tempTempratureFlag = -tempTempratureFlag;
|
||||
tmp_datas_buf.datas = HexToBcd32((u32)(tempTempratureFlag*100));
|
||||
tmp_datas_buf.datas|= 0x800000;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_datas_buf.datas = HexToBcd32((u32)(tempTempratureFlag*100));
|
||||
tmp_datas_buf.datas &= 0x7FFFFF;
|
||||
}
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
//累计流量
|
||||
tmp_float_datas_buf.float_storage_format.datas = Gp30CheckTestDataApp(GP30_APP_TOTAL_FLOW); //累计流量//BCD
|
||||
tmp_datas_buf.datas = (u32) (tmp_float_datas_buf.float_datas);
|
||||
tmp_datas_buf.datas = HexToBcd32(tmp_datas_buf.datas);
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x2C; //m?
|
||||
//瞬时流量
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_INS_FLOW); //瞬时流量(四位小数,放大100000倍)//BCD
|
||||
tmp_datas_buf.datas = Gp30DataToBcd(tmp_datas_buf.datas, 100);//与NB区别
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x35; //m?/h
|
||||
//up单程时间
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_TOF);//
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
//Magnify 100000 times(m3/h):Real-time instantaneous flow
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_INS_FLOW_LCD);
|
||||
tmp_datas_buf.datas = Gp30DataToBcd(tmp_datas_buf.datas, 100);
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
//tof
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_DIFF); //时间差
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
//累计工作时间//BCD
|
||||
tmp_datas_buf.datas = RtccGetWorkHourApp();
|
||||
tmp_datas_buf.datas = HexToBcd32(tmp_datas_buf.datas);
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
//实时时间
|
||||
RtccGetDateTime(&tmp_time_buf);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0x20;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.year;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.month;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.day;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.hour;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.minute;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_time_buf.s.second;
|
||||
//状态字
|
||||
temp_met_state = FrameGetByte();
|
||||
/**添加规约,用来配合水台子测流量**/
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = temp_met_state.stat1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = temp_met_state.stat3;
|
||||
//************************新增数据:15字节***********************/
|
||||
//温度T0-T2(T2):3字节
|
||||
#if WENDU_FANSUAN_OPEN
|
||||
tempTempratureFlag= TempCheckValueApp();//传递实时的反算温度数据
|
||||
|
||||
if(tempTempratureFlag < 0)
|
||||
{
|
||||
tempTempratureFlag = -tempTempratureFlag;
|
||||
tmp_datas_buf.datas = HexToBcd32((u32)(tempTempratureFlag*100));
|
||||
tmp_datas_buf.datas|= 0x800000;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_datas_buf.datas = HexToBcd32((u32)(tempTempratureFlag*100));
|
||||
tmp_datas_buf.datas &= 0x7FFFFF;
|
||||
}
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.data_buf[i];
|
||||
}
|
||||
tmp_datas_buf.datas = Gp30CheckDataApp(11); //TOF_UP补偿系数
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data2;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data3;
|
||||
|
||||
tmp_datas_buf.datas = Gp30CheckDataApp(12);//TOF_DOWN补偿系数
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data2;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data3;
|
||||
#else//常规程序反算温度默认写0
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
}
|
||||
//up amplitude(V1):4字节
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_PEAK_UP);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data2;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data3;
|
||||
//down amplitude(V2):4字节
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_PEAK_DOWN);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data2;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data3;
|
||||
#endif
|
||||
//down 的单程时间
|
||||
tmp_datas_buf.datas = Gp30CheckTestDataApp(GP30_APP_DOWN);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data1;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data2;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = tmp_datas_buf.datas_map.data3;
|
||||
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
//启动\停止测试
|
||||
static void frame_func_reply_WT_StartOrStopTest(void)
|
||||
{
|
||||
g_frame_temp_len_mbus = 0;
|
||||
if(01 != LcdCheckStateApp())
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
if(0x01 == *(new_message_data_rev_mbus)) //start
|
||||
{
|
||||
Gp30StartMeasureApp(1);
|
||||
}
|
||||
else if(0x00 == *(new_message_data_rev_mbus)) //stop
|
||||
{
|
||||
Gp30StartMeasureApp(0);
|
||||
}
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = *(new_message_data_rev_mbus);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
|
||||
//模组/水台子规约:读多项式系数
|
||||
static void frame_func_reply_WT_ReadPolyNomialcoefficient(void)
|
||||
{
|
||||
g_frame_temp_len_mbus=0;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = FM_METER_TYPE;
|
||||
memcpy(&g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus], &(cal_coefficient[0].value[0]),sizeof (cal_coefficient));
|
||||
g_frame_temp_len_mbus = (sizeof (cal_coefficient)+1);
|
||||
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
//写温度系数
|
||||
static void frame_func_s3_WT_SetTempratureConefficient(void)
|
||||
{
|
||||
switch(up_deal_stat_mbus)
|
||||
{
|
||||
case UP_DEAL_S0:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//存储温度系数到EEPROM完成
|
||||
{
|
||||
g_frame_temp_len_mbus=0;
|
||||
if (0x01 == Sys_data_object.P1.start_using_flg) //出厂启用
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
fram_tools_writeU32ByBuf(Sys_data_object.P1.temperature_coefficient0.data_buf, new_message_data_rev_mbus, 0);
|
||||
fram_tools_writeU32ByBuf(Sys_data_object.P1.temperature_coefficient1.data_buf, (new_message_data_rev_mbus + 4), 0);
|
||||
|
||||
#if WENDU_FANSUAN_OPEN
|
||||
UNION_2U8TOU16 temp_caliber_value;
|
||||
temp_caliber_value.datas_map.data0 =*(new_message_data_rev_mbus + 8);//获取温度数据低字节
|
||||
temp_caliber_value.datas_map.data1 =*(new_message_data_rev_mbus + 9);//获取温度数据高字节
|
||||
|
||||
SetCaliberateTemperature(temp_caliber_value.datas);//当前温度数据
|
||||
|
||||
if(Get_Temperature_Caliberate()!=0)/*1、表计在校准时下发清零温度系数,活塞台子会下发非零校准温度值 2、表计在校准时下发写温度系数,-活塞台子下发的校准温度值为0*/
|
||||
{
|
||||
FrameSetMsgApp(MsgCaliberate); //置1 单程时间校准校准MSG----只有在校准温度不是零的情况下才允许校准单程时间
|
||||
RtccSetTimer(RTCC_TOF_CALIBERATE_TIME, RTCC_TOF_CALIBERATE_TIME_OUT);//设置超时防护 超时防护----实际测试
|
||||
}
|
||||
#endif
|
||||
EepWrite(&Sys_data_object.P1.temperature_coefficient0.datas_map.data0, EEP_FRAME_TEMPERATURE_COEFFICIENT_ADDR, 8, &s_eep_complete_mbus);
|
||||
Frame_Para_Init();
|
||||
|
||||
if((0==Sys_data_object.P1.temperature_coefficient0.datas)&&(0==Sys_data_object.P1.temperature_coefficient1.datas))
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S1; //当水台子下发清温度系数时,将流量系数写为1
|
||||
}
|
||||
else
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S2;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S1:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//存储温度系数到EEPROM
|
||||
{
|
||||
memcpy(&(cal_flow_coefficient[0].datas_map.data0), default_flow_coefficient, sizeof (default_flow_coefficient));
|
||||
EepWrite(&(cal_flow_coefficient[0].datas_map.data0), FRAME_FLOW_LOW_COEFFICIENT_ADDR, 72, &s_eep_complete_mbus);
|
||||
up_deal_stat_mbus = UP_DEAL_S2;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UP_DEAL_S2:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//存储温度系数到EEPROM完成
|
||||
{
|
||||
Frame_Para_Init();
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
//写流量系数 **修改写流量系数限制(0.5-1.5)2019年7月5日
|
||||
static void frame_func_s3_WT_SetFowcoefficient(void)
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
g_frame_temp_len_mbus =0;
|
||||
if (0x01 == Sys_data_object.P1.start_using_flg) //出厂启用
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
UNION_4U8TOU32 flow_small;
|
||||
UNION_4U8TOU32 flow_medium0;
|
||||
UNION_4U8TOU32 flow_medium1;
|
||||
UNION_4U8TOU32 flow_medium2;
|
||||
UNION_4U8TOU32 flow_medium3;
|
||||
UNION_4U8TOU32 flow_large;
|
||||
fram_tools_writeU32ByBuf(flow_small.data_buf, (new_message_data_rev_mbus), 0);
|
||||
fram_tools_writeU32ByBuf(flow_medium0.data_buf, (new_message_data_rev_mbus + 4), 0);
|
||||
fram_tools_writeU32ByBuf(flow_medium1.data_buf, (new_message_data_rev_mbus + 8), 0);
|
||||
fram_tools_writeU32ByBuf(flow_medium2.data_buf, (new_message_data_rev_mbus + 12), 0);
|
||||
fram_tools_writeU32ByBuf(flow_medium3.data_buf, (new_message_data_rev_mbus + 16), 0);
|
||||
fram_tools_writeU32ByBuf(flow_large.data_buf, (new_message_data_rev_mbus + 20), 0);
|
||||
if(( (FLOW_COEFFICIENT_MIN < flow_small.datas) && (flow_small.datas < FLOW_COEFFICIENT_MAX) ) && ( (FLOW_COEFFICIENT_MIN < flow_medium0.datas) && (flow_medium0.datas < FLOW_COEFFICIENT_MAX) )
|
||||
&& ( (FLOW_COEFFICIENT_MIN < flow_medium1.datas) && (flow_medium1.datas < FLOW_COEFFICIENT_MAX) ) && ( (FLOW_COEFFICIENT_MIN < flow_medium2.datas) && (flow_medium2.datas < FLOW_COEFFICIENT_MAX) )
|
||||
&& ( (FLOW_COEFFICIENT_MIN < flow_medium3.datas) && (flow_medium3.datas < FLOW_COEFFICIENT_MAX) ) && ( (FLOW_COEFFICIENT_MIN < flow_large.datas) && (flow_large.datas < FLOW_COEFFICIENT_MAX) ))
|
||||
{
|
||||
if(LOW_TYPE==*(new_message_data_rev_mbus + 24))
|
||||
{
|
||||
memcpy(&(cal_flow_coefficient[0].datas_map.data0), new_message_data_rev_mbus, 24);
|
||||
EepWrite(&(cal_flow_coefficient[0].datas_map.data0), FRAME_FLOW_LOW_COEFFICIENT_ADDR, 24, &s_eep_complete_mbus);
|
||||
}
|
||||
else if(MIDDLE_TYPE==*(new_message_data_rev_mbus + 24))
|
||||
{
|
||||
memcpy(&(cal_flow_coefficient[6].datas_map.data0), new_message_data_rev_mbus, 24);
|
||||
EepWrite(&(cal_flow_coefficient[6].datas_map.data0), FRAME_FLOW_MIDDLE_COEFFICIENT_ADDR, 24, &s_eep_complete_mbus);
|
||||
}
|
||||
else if(LARGE_TYPE==*(new_message_data_rev_mbus + 24))
|
||||
{
|
||||
memcpy(&(cal_flow_coefficient[12].datas_map.data0), new_message_data_rev_mbus, 24);
|
||||
EepWrite(&(cal_flow_coefficient[12].datas_map.data0), FRAME_FLOW_HIGH_COEFFICIENT_ADDR, 24, &s_eep_complete_mbus);
|
||||
}
|
||||
else if(ALL_TYPE==*(new_message_data_rev_mbus + 24))
|
||||
{
|
||||
memcpy(&(cal_flow_coefficient[0].datas_map.data0), default_flow_coefficient, sizeof (default_flow_coefficient));
|
||||
EepWrite(&(cal_flow_coefficient[0].datas_map.data0), FRAME_FLOW_LOW_COEFFICIENT_ADDR, 72, &s_eep_complete_mbus);
|
||||
}
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//(清)出厂启用
|
||||
static void frame_func_s3_WT_StartOrClearUsing(void)
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
g_frame_temp_len_mbus =0;
|
||||
if (0x01 == *(new_message_data_rev_mbus))
|
||||
{
|
||||
Sys_data_object.P1.start_using_flg = 0x01;
|
||||
}
|
||||
else if (0x00 == *(new_message_data_rev_mbus))
|
||||
{
|
||||
Sys_data_object.P1.start_using_flg = 0x00;
|
||||
}
|
||||
else
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
EepWrite(&Sys_data_object.P1.start_using_flg, EEP_FRAME_STARTUSING_ADDR, 1, &s_eep_complete_mbus);
|
||||
Frame_Para_Init();
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = *new_message_data_rev_mbus;
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
//写多项式系数
|
||||
static void frame_func_s3_WT_SetPolyNomialcoefficient(void)
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
TYP_FLOW_COEFFICIENT coefficient_buffer[MULT_COEFFICIENT_BUF_NUM]= {0};//多项式建模参数变量缓存
|
||||
g_frame_temp_len_mbus = 0;
|
||||
if (0x01 == Sys_data_object.P1.start_using_flg) //出厂启用
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
if(FM_METER_TYPE != *(new_message_data_rev_mbus))
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
memcpy(&(coefficient_buffer[0].value[0]), (new_message_data_rev_mbus +1), sizeof (cal_coefficient));
|
||||
if((0 ==coefficient_buffer[1].flt) && (0 ==coefficient_buffer[2].flt) && (0 ==coefficient_buffer[12].flt)&& (0 ==coefficient_buffer[13].flt)
|
||||
&&(0 ==coefficient_buffer[23].flt)&& (0 ==coefficient_buffer[24].flt)&& (0 ==coefficient_buffer[34].flt)&& (0 ==coefficient_buffer[35].flt)
|
||||
&& (0 ==coefficient_buffer[45].flt)&& (0 ==coefficient_buffer[46].flt))
|
||||
{
|
||||
memcpy(&cal_coefficient[0].flt, default_coefficient,sizeof(default_coefficient));
|
||||
}
|
||||
else
|
||||
{
|
||||
for(u8 i=0;i<MULT_COEFFICIENT_BUF_NUM;i++)
|
||||
{
|
||||
if((COEFFICIENT_MAX< coefficient_buffer[i].flt)||(coefficient_buffer[i].flt <COEFFICIENT_MIN))//判断范围有待确认-20191112
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
memcpy(&(cal_coefficient[0].value[0]), (new_message_data_rev_mbus +1), sizeof (cal_coefficient));
|
||||
}
|
||||
EepWrite(&cal_coefficient[0].value[0], FRAME_FLOW_COEFFICIENT_ADDR, sizeof (cal_coefficient), &s_eep_complete_mbus);
|
||||
g_frame_temp_send_buf_mbus[g_frame_temp_len_mbus++] = 0;
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//解积成MBUS规约
|
||||
u8 crack_frame_MBUS(u16 frame_lenth,u8 *frame_buffer)//
|
||||
{
|
||||
u16 tmp_i = 0;
|
||||
u16 tmp_j = 0;
|
||||
u8 tmp_check = 0;
|
||||
u8 enc_tmp_addr[7];//缓存解密的地址
|
||||
for (tmp_i = 0; tmp_i < frame_lenth; tmp_i++)
|
||||
{
|
||||
if (FM_HEAD_MARK == *(frame_buffer + tmp_i))
|
||||
{
|
||||
if (MET_TYPE == *(frame_buffer + tmp_i + 1))
|
||||
{
|
||||
//判断是表计规约还是模组/水台子规约,第10个字节>2,说明是水台子/模组的规约数据长度,否则就是表计的sta
|
||||
frame_struct_MBUS.head_site = tmp_i; //记录帧头
|
||||
frame_struct_MBUS.len = *(frame_buffer + tmp_i + 10);//数据长度
|
||||
frame_struct_MBUS.end_site = frame_struct_MBUS.head_site + frame_struct_MBUS.len + 12;
|
||||
frame_struct_MBUS.check_len = frame_struct_MBUS.end_site - frame_struct_MBUS.head_site - 1;
|
||||
//检测数据帧是否有效
|
||||
if ((frame_struct_MBUS.end_site < frame_lenth))
|
||||
{
|
||||
if(FM_END_MARK == *(frame_buffer + frame_struct_MBUS.end_site))
|
||||
{
|
||||
s_frame_flag_MBUS.enc_reply_flg = 0;
|
||||
frame_struct_MBUS.ctrl = *(frame_buffer + frame_struct_MBUS.head_site + 9);
|
||||
frame_struct_MBUS.DI0 = *(frame_buffer + frame_struct_MBUS.head_site + 11);
|
||||
frame_struct_MBUS.DI1 = *(frame_buffer + frame_struct_MBUS.head_site + 12);
|
||||
frame_struct_MBUS.serial_num0 = *(frame_buffer + frame_struct_MBUS.head_site + 13);
|
||||
new_message_data_rev_mbus = (frame_buffer + frame_struct_MBUS.head_site + 15);
|
||||
switch(frame_struct_MBUS.ctrl)
|
||||
{
|
||||
//地址加密的规约
|
||||
case MFM_READ_MAC_ARGUMENT_CTRL://读物理地址
|
||||
case MFM_SET_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL://写温度系数
|
||||
case MFM_SET_FLOWCOEFFICIENT_ARGUMENT_CTRL://写流量系数
|
||||
case MFM_SET_VERIFICATIONSTATE_ARGUMENT_CTRL://设为检定
|
||||
case MFM_START_OR_STOP_TEST_ARGUMENT_CTRL://启动停止测试
|
||||
case MFM_START_OR_CLEAR_USING_ARGUMENT_CTRL://出厂启用
|
||||
case FM_SET_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL://写多项式系数
|
||||
{
|
||||
frame_struct_MBUS.key_num = *(frame_buffer + frame_struct_MBUS.head_site + 14);
|
||||
tmp_check = SA_crc((frame_buffer + frame_struct_MBUS.head_site), frame_struct_MBUS.check_len, frame_struct_MBUS.key_num);
|
||||
if (tmp_check == *(frame_buffer + frame_struct_MBUS.end_site - 1))
|
||||
{
|
||||
if (MFM_READ_MAC_ARGUMENT_CTRL == frame_struct_MBUS.ctrl)//读物理地址,保存加密字key_num
|
||||
{
|
||||
if (SUCCESS == check_apply_addr(frame_buffer + frame_struct_MBUS.head_site + 2, Sys_data_object.P1.met_addr))
|
||||
{
|
||||
s_frame_flag_MBUS.rev_key_num = *(frame_buffer + frame_struct_MBUS.head_site + 14);
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (tmp_j = 0; tmp_j < 7; tmp_j++)
|
||||
{
|
||||
enc_tmp_addr[tmp_j] = *(frame_buffer + frame_struct_MBUS.head_site + 2 + tmp_j);
|
||||
}
|
||||
Address_Encrypt((frame_buffer + frame_struct_MBUS.head_site + 2), frame_struct_MBUS.key_num); //解密地址
|
||||
if (Num_Check(frame_struct_MBUS.key_num, Sys_data_object.P1.last_key_num)) //num ok
|
||||
{
|
||||
for (tmp_j = 0; tmp_j < 7; tmp_j++)
|
||||
{
|
||||
s_frame_flag_MBUS.enc_tmp_addr[tmp_j] = enc_tmp_addr[tmp_j];
|
||||
}
|
||||
s_frame_flag_MBUS.enc_reply_flg = TRUE;
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
Sys_data_object.P1.last_key_num = Num_Change(frame_struct_MBUS.key_num, Sys_data_object.P1.enable_bak_key); //更新NUM
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
//使用广播地址的规约
|
||||
case MFM_READ_ADDR_ARGUMENT_CTRL:
|
||||
case MFM_SET_ADDR_ARGUMENT_CTRL:
|
||||
{
|
||||
for (tmp_j = frame_struct_MBUS.head_site; tmp_j < (frame_struct_MBUS.end_site - 1); tmp_j++)
|
||||
{
|
||||
tmp_check += *(frame_buffer + tmp_j);
|
||||
}
|
||||
if (tmp_check != *(frame_buffer + frame_struct_MBUS.end_site - 1))//CS校验错误
|
||||
{
|
||||
return ERROR_IES;
|
||||
}
|
||||
if (SUCCESS == check_apply_addr(frame_buffer + frame_struct_MBUS.head_site + 2, broad_addr))
|
||||
{
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
}
|
||||
break;
|
||||
//其他非加密规约
|
||||
default:
|
||||
{
|
||||
for (tmp_j = frame_struct_MBUS.head_site; tmp_j < (frame_struct_MBUS.end_site - 1); tmp_j++)
|
||||
{
|
||||
tmp_check += *(frame_buffer + tmp_j);
|
||||
}
|
||||
if (tmp_check != *(frame_buffer + frame_struct_MBUS.end_site - 1))//CS校验错误
|
||||
{
|
||||
return ERROR_IES;
|
||||
}
|
||||
if (SUCCESS == check_apply_addr(frame_buffer + frame_struct_MBUS.head_site + 2, Sys_data_object.P1.met_addr))
|
||||
{
|
||||
return SUCCESS_IES;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ERROR_IES;
|
||||
}
|
||||
//MBUS/水台子规约处理
|
||||
u8 up_deal_code_mbus(void)
|
||||
{
|
||||
task_complete_mbus = PTL_PACK_BUSY;
|
||||
switch(frame_struct_MBUS.ctrl)
|
||||
{
|
||||
case MFM_READ_ADDR_ARGUMENT_CTRL://读地址
|
||||
{
|
||||
frame_func_reply_WT_ReadAddr();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_ADDR_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_READ_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL://读温度系数
|
||||
{
|
||||
frame_func_reply_WT_ReadTemperatureCoefficient();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_TEMPERATURECOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_READ_MAC_ARGUMENT_CTRL://读物理地址
|
||||
{
|
||||
frame_func_reply_WT_ReadMac();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_MAC_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_SET_VERIFICATIONSTATE_ARGUMENT_CTRL://进检定
|
||||
{
|
||||
frame_func_reply_WT_SetVerificationState();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_SET_VERIFICATIONSTATE_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_READ_SERIALNUM_ARGUMENT_CTRL://读序列号
|
||||
{
|
||||
frame_func_reply_WT_ReadSerialNum();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_SERIALNUM_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_OUT_VERIFICATIONSTATE_ARGUMENT_CTRL://退检定
|
||||
{
|
||||
frame_func_reply_WT_OutVerificationState();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_OUT_VERIFICATIONSTATE_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_READ_FLOWCOEFFICIENT_ARGUMENT_CTRL://读流量系数
|
||||
{
|
||||
frame_func_reply_WT_ReadFlowCoefficient();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_FLOWCOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_READ_VERIFICATIONDATA_ARGUMENT_CTRL://读检定数据
|
||||
{
|
||||
frame_func_reply_WT_ReadVerificationData();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_READ_VERIFICATIONDATA_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_START_OR_STOP_TEST_ARGUMENT_CTRL://启动停止测试
|
||||
{
|
||||
frame_func_reply_WT_StartOrStopTest();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_START_OR_STOP_TEST_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case FM_READ_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL://读多项式系数
|
||||
{
|
||||
frame_func_reply_WT_ReadPolyNomialcoefficient();
|
||||
frame_struct_MBUS.ack_ctrl = FM_READ_POLYNOMIALCOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_SET_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL://写温度系数
|
||||
{
|
||||
frame_func_s3_WT_SetTempratureConefficient();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_SET_TEMPERATURECOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_SET_FLOWCOEFFICIENT_ARGUMENT_CTRL://写流量系数
|
||||
{
|
||||
frame_func_s3_WT_SetFowcoefficient();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_SET_FLOWCOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case MFM_START_OR_CLEAR_USING_ARGUMENT_CTRL://出厂启用
|
||||
{
|
||||
frame_func_s3_WT_StartOrClearUsing();
|
||||
frame_struct_MBUS.ack_ctrl = MFM_START_OR_CLEAR_USING_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
case FM_SET_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL://写多项式系数
|
||||
{
|
||||
frame_func_s3_WT_SetPolyNomialcoefficient();
|
||||
frame_struct_MBUS.ack_ctrl = FM_SET_POLYNOMIALCOEFFICIENT_REPLY_CTRL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
task_complete_mbus = PTL_PACK_FAIL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return task_complete_mbus;
|
||||
}
|
||||
|
||||
void Frame_ResetDealState_Mbus(void)
|
||||
{
|
||||
up_deal_stat_mbus = UP_DEAL_S0;
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: Frame_CreatCrcCs_Ack
|
||||
* @brief : 组cs或CRC校验帧
|
||||
* @param[in] : *p;len
|
||||
* @param[out]: None
|
||||
* @retval : None
|
||||
* @other :
|
||||
******************************************************************************/
|
||||
void Frame_CreatCrcCs_Ack(u8* p_send_buf, u16* p_send_len)
|
||||
{
|
||||
int tmp_i=0;
|
||||
//组应答帧头
|
||||
p_send_buf[0] = 0xFE;
|
||||
p_send_buf[1] = 0xFE;
|
||||
p_send_buf[2] = FM_HEAD_MARK;
|
||||
p_send_buf[3] = MET_TYPE;
|
||||
if (MFM_SOLIDIFY_MAC_ARGUMENT_CTRL == frame_struct_MBUS.ctrl)
|
||||
{
|
||||
for (tmp_i = 0; tmp_i < 7; tmp_i++)
|
||||
{
|
||||
p_send_buf[4 + tmp_i] = Sys_data_object.P1.mac_addr[tmp_i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (1 == s_frame_flag_MBUS.enc_reply_flg)
|
||||
{
|
||||
s_frame_flag_MBUS.enc_reply_flg = 0;
|
||||
for (tmp_i = 0; tmp_i < 7; tmp_i++)
|
||||
{
|
||||
p_send_buf[4 + tmp_i] = s_frame_flag_MBUS.enc_tmp_addr[tmp_i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (tmp_i = 0; tmp_i < 7; tmp_i++)
|
||||
{
|
||||
p_send_buf[4 + tmp_i] = Sys_data_object.P1.met_addr[tmp_i];
|
||||
}
|
||||
}
|
||||
|
||||
if (MFM_READ_MAC_ARGUMENT_CTRL == frame_struct_MBUS.ctrl)
|
||||
{
|
||||
Address_Encrypt(&p_send_buf[4], s_frame_flag_MBUS.rev_key_num);
|
||||
}
|
||||
}
|
||||
switch(frame_struct_MBUS.ctrl)
|
||||
{
|
||||
//CRC校验的规约
|
||||
case MFM_READ_MAC_ARGUMENT_CTRL:
|
||||
case MFM_SET_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL:
|
||||
case MFM_SET_FLOWCOEFFICIENT_ARGUMENT_CTRL:
|
||||
case MFM_SET_VERIFICATIONSTATE_ARGUMENT_CTRL:
|
||||
case MFM_START_OR_STOP_TEST_ARGUMENT_CTRL:
|
||||
case MFM_START_OR_CLEAR_USING_ARGUMENT_CTRL:
|
||||
case FM_SET_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL:
|
||||
{
|
||||
p_send_buf[11] = frame_struct_MBUS.ack_ctrl;
|
||||
p_send_buf[12] = (4+g_frame_temp_len_mbus);
|
||||
p_send_buf[13] = frame_struct_MBUS.DI0;
|
||||
p_send_buf[14] = frame_struct_MBUS.DI1;
|
||||
p_send_buf[15] = frame_struct_MBUS.serial_num0;
|
||||
p_send_buf[16] = frame_struct_MBUS.key_num;
|
||||
for(tmp_i =0;tmp_i<g_frame_temp_len_mbus;tmp_i++)
|
||||
{
|
||||
p_send_buf[17+tmp_i] = g_frame_temp_send_buf_mbus[tmp_i];
|
||||
}
|
||||
if(frame_struct_MBUS.ctrl == MFM_READ_MAC_REPLY_CTRL)
|
||||
{
|
||||
Address_Encrypt(&p_send_buf[17], frame_struct_MBUS.key_num);
|
||||
}
|
||||
p_send_buf[17+g_frame_temp_len_mbus] = SA_crc(&p_send_buf[2], (p_send_buf[12] + 11), frame_struct_MBUS.key_num);
|
||||
p_send_buf[18+g_frame_temp_len_mbus] = FM_END_MARK;
|
||||
*p_send_len = (19+g_frame_temp_len_mbus);
|
||||
}
|
||||
break;
|
||||
//CS校验的规约
|
||||
default:
|
||||
{
|
||||
p_send_buf[11] = frame_struct_MBUS.ack_ctrl;
|
||||
p_send_buf[12] = (3+g_frame_temp_len_mbus);
|
||||
p_send_buf[13] = frame_struct_MBUS.DI0;
|
||||
p_send_buf[14] = frame_struct_MBUS.DI1;
|
||||
p_send_buf[15] = frame_struct_MBUS.serial_num0;
|
||||
for(tmp_i=0; tmp_i<g_frame_temp_len_mbus; tmp_i++)
|
||||
{
|
||||
p_send_buf[16+tmp_i] = g_frame_temp_send_buf_mbus[tmp_i];
|
||||
}
|
||||
p_send_buf[16+g_frame_temp_len_mbus] = check_cs(&p_send_buf[2], (p_send_buf[12] + 11));
|
||||
p_send_buf[17+g_frame_temp_len_mbus] = FM_END_MARK;
|
||||
*p_send_len = (18+g_frame_temp_len_mbus);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
#ifndef UWATER_FRAME_FUNC_REPLAY_WT_H
|
||||
#define UWATER_FRAME_FUNC_REPLAY_WT_H
|
||||
|
||||
#include "type.h"
|
||||
|
||||
/************************************************水台子规约********************************************/
|
||||
//固化物理地址//CRC
|
||||
#define MFM_SOLIDIFY_MAC_ARGUMENT_CTRL 0x10
|
||||
#define MFM_SOLIDIFY_MAC_REPLY_CTRL 0x90
|
||||
#define MFM_SOLIDIFY_MAC_DI0 0x1C
|
||||
#define MFM_SOLIDIFY_MAC_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:读表计通信地址----------------------------------------------------------
|
||||
#define MFM_READ_ADDR_ARGUMENT_CTRL 0x03
|
||||
#define MFM_READ_ADDR_REPLY_CTRL 0x83
|
||||
#define MFM_READ_ADDR_DI0 0x0A
|
||||
#define MFM_READ_ADDR_DI1 0x81
|
||||
|
||||
//请求写表地址控制码
|
||||
#define MFM_SET_ADDR_ARGUMENT_CTRL 0x15
|
||||
#define MFM_SET_ADDR_REPLY_CTRL 0x95
|
||||
#define MFM_SET_ADDR_DI0 0x18
|
||||
#define MFM_SET_ADDR_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:读出厂序列号------------------------------------------------------------
|
||||
#define MFM_READ_SERIALNUM_ARGUMENT_CTRL 0x31
|
||||
#define MFM_READ_SERIALNUM_REPLY_CTRL 0xE1
|
||||
#define MFM_READ_SERIALNUM_DI0 0x01
|
||||
#define MFM_READ_SERIALNUM_DI1 0x89
|
||||
|
||||
//模组/水台子规约:读温度系数--------------------------------------------------------------
|
||||
#define MFM_READ_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL 0X4A
|
||||
#define MFM_READ_TEMPERATURECOEFFICIENT_REPLY_CTRL 0xBA
|
||||
#define MFM_READ_TEMPERATURECOEFFICIENT_DI0 0x3A
|
||||
#define MFM_READ_TEMPERATURECOEFFICIENT_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:读流量系数--------------------------------------------------------------
|
||||
#define MFM_READ_FLOWCOEFFICIENT_ARGUMENT_CTRL 0x48
|
||||
#define MFM_READ_FLOWCOEFFICIENT_REPLY_CTRL 0xB8
|
||||
#define MFM_READ_FLOWCOEFFICIENT_DI0 0x38
|
||||
#define MFM_READ_FLOWCOEFFICIENT_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:读检定数据--------------------------------------------------------------
|
||||
#define MFM_READ_VERIFICATIONDATA_ARGUMENT_CTRL 0x4C
|
||||
#define MFM_READ_VERIFICATIONDATA_REPLY_CTRL 0xBC
|
||||
#define MFM_READ_VERIFICATIONDATA_DI0 0x3C
|
||||
#define MFM_READ_VERIFICATIONDATA_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:退出检定状态-------------------------------------------------------------
|
||||
#define MFM_OUT_VERIFICATIONSTATE_ARGUMENT_CTRL 0x57
|
||||
#define MFM_OUT_VERIFICATIONSTATE_REPLY_CTRL 0xC7
|
||||
#define MFM_OUT_VERIFICATIONSTATE_DI0 0x45
|
||||
#define MFM_OUT_VERIFICATIONSTATE_DI1 0xA0
|
||||
//模组/水台子规约:读多项式建模系数--------------------------------------------------------
|
||||
#define FM_READ_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL 0x65
|
||||
#define FM_READ_POLYNOMIALCOEFFICIENT_REPLY_CTRL 0xF1
|
||||
#define FM_READ_POLYNOMIALCOEFFICIENT_DI0 0x61
|
||||
#define FM_READ_POLYNOMIALCOEFFICIENT_DI1 0xA0
|
||||
/************************************************水台子规约:动态解密的******************************/
|
||||
//模组/水台子规约:读取物理地址--------------------------------------------------------
|
||||
#define MFM_READ_MAC_ARGUMENT_CTRL 0x11
|
||||
#define MFM_READ_MAC_REPLY_CTRL 0x91
|
||||
#define MFM_READ_MAC_DI0 0x1D
|
||||
#define MFM_READ_MAC_DI1 0xA0
|
||||
//模组/水台子规约:写温度系数-----------------------------------------------------
|
||||
#define MFM_SET_TEMPERATURECOEFFICIENT_ARGUMENT_CTRL 0x45
|
||||
#define MFM_SET_TEMPERATURECOEFFICIENT_REPLY_CTRL 0xB5
|
||||
#define MFM_SET_TEMPERATURECOEFFICIENT_DI0 0x35
|
||||
#define MFM_SET_TEMPERATURECOEFFICIENT_DI1 0xA0
|
||||
|
||||
//模组/水台子规约:写流量系数------------------------------------------------------
|
||||
#define MFM_SET_FLOWCOEFFICIENT_ARGUMENT_CTRL 0x46
|
||||
#define MFM_SET_FLOWCOEFFICIENT_REPLY_CTRL 0xB6
|
||||
#define MFM_SET_FLOWCOEFFICIENT_DI0 0x36
|
||||
#define MFM_SET_FLOWCOEFFICIENT_DI1 0xA0
|
||||
//模组/水台子规约:设置为检定状态//CRC--------------------------------------------------
|
||||
//设置为检定状态//CRC
|
||||
#define MFM_SET_VERIFICATIONSTATE_ARGUMENT_CTRL 0x49
|
||||
#define MFM_SET_VERIFICATIONSTATE_REPLY_CTRL 0xB9
|
||||
#define MFM_SET_VERIFICATIONSTATE_DI0 0x39
|
||||
#define MFM_SET_VERIFICATIONSTATE_DI1 0xA0
|
||||
//模组/水台子规约:启动停止测试(只适用于检定状态)--------------------------------------------
|
||||
#define MFM_START_OR_STOP_TEST_ARGUMENT_CTRL 0x51
|
||||
#define MFM_START_OR_STOP_TEST_REPLY_CTRL 0xC1
|
||||
#define MFM_START_OR_STOP_TEST_DI0 0x3F
|
||||
#define MFM_START_OR_STOP_TEST_DI1 0xA0
|
||||
//模组/水台子规约:(清)出厂启用--------------------------------------------------------------
|
||||
#define MFM_START_OR_CLEAR_USING_ARGUMENT_CTRL 0x54
|
||||
#define MFM_START_OR_CLEAR_USING_REPLY_CTRL 0xC4
|
||||
#define MFM_START_OR_CLEAR_USING_DI0 0x42
|
||||
#define MFM_START_OR_CLEAR_USING_DI1 0xA0
|
||||
//模组/水台子规约: 写多项式建模系数--------------------------------------------------------
|
||||
#define FM_SET_POLYNOMIALCOEFFICIENT_ARGUMENT_CTRL 0x64
|
||||
#define FM_SET_POLYNOMIALCOEFFICIENT_REPLY_CTRL 0xF0
|
||||
#define FM_SET_POLYNOMIALCOEFFICIENT_DI0 0x60
|
||||
#define FM_SET_POLYNOMIALCOEFFICIENT_DI1 0xA0
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 head_site; //帧头位置
|
||||
u8 ctrl;
|
||||
u8 ack_ctrl;
|
||||
u8 len;
|
||||
u8 DI0;
|
||||
u8 DI1;
|
||||
u8 serial_num0;
|
||||
u8 serial_num1;
|
||||
u8 key_num;
|
||||
u8 end_site; //帧尾位置
|
||||
u8 check_len; //参与校验计算的数据长度
|
||||
u8 sta; //GPRS加密状态0x80加密 0x40 主动发送(BIT2 = 0应答帧)
|
||||
u8 met_type;
|
||||
} STRUCT_FRAME_MBUS;//存储数据帧重要内容
|
||||
|
||||
u8 up_deal_code_mbus(void);
|
||||
u8 crack_frame_MBUS(u16 frame_lenth,u8 *frame_buffer);
|
||||
void Frame_ResetDealState_Mbus(void);
|
||||
void Frame_CreatCrcCs_Ack(u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,199 @@
|
|||
#ifndef __WHYW_FRAME_H__
|
||||
#define __WHYW_FRAME_H__
|
||||
|
||||
/******************************************************************************
|
||||
* Include files
|
||||
******************************************************************************/
|
||||
#include "sys_config.h"
|
||||
#if PRODUCT_WHYW
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
/* C binding of definitions if building with C++ compiler */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/*******************************EEPROM存储地址划分****************************/
|
||||
#define STORE_DATA_SIZE_CIRCLE 4 //周期数据单条长度
|
||||
#define STORE_DATA_COUNT_CIRCLE 240
|
||||
#define EEP_DATA_LEN_CIRCLE (STORE_DATA_SIZE_CIRCLE*STORE_DATA_COUNT_CIRCLE)//1200//周期数据存储空间
|
||||
|
||||
#define EEP_ADDR_WHYW_STORE_CIRCLE FRAME_SHENYANG_STORE_ADD //0x7300~0x7C00 周期数据存储地址
|
||||
#define EEP_ADDR_WHYW_CIRCLE_INDEX_W (EEP_ADDR_WHYW_STORE_CIRCLE+EEP_DATA_LEN_CIRCLE)//周期数据存储指针
|
||||
#define EEP_ADDR_WHYW_CIRCLE_INDEX_R (EEP_ADDR_WHYW_CIRCLE_INDEX_W+2)//周期数据读取指针
|
||||
#define EEP_ADDR_WHYW_LAST_RTCC (EEP_ADDR_WHYW_CIRCLE_INDEX_R+2)//最后一条记录的时间7字节
|
||||
//配置参数相关的存储
|
||||
#define EEP_ADDR_WHYW_NB_ONLINE_KEEP (EEP_ADDR_WHYW_LAST_RTCC+7) //在线延时时间 1字节
|
||||
#define EEP_ADDR_WHYW_STORE_INTERVAL (EEP_ADDR_WHYW_NB_ONLINE_KEEP+1)//表数据采集记录间隔时间 1字节
|
||||
#define EEP_ADDR_WHYW_BATTERY_PRA (EEP_ADDR_WHYW_STORE_INTERVAL+1)//电池电压相关参数 4字节
|
||||
#define EEP_ADDR_WHYW_UPLOAD_SUCCESS (EEP_ADDR_WHYW_BATTERY_PRA+4)//上报总次数
|
||||
#define EEP_ADDR_WHYW_UPLOAD_FAIL (EEP_ADDR_WHYW_UPLOAD_SUCCESS+4)//上报成功总次数
|
||||
|
||||
#define UPLOAD_CIRCLE_MAX_COUNT 48 //单帧最多48条记录:48*4=192
|
||||
#define UPLOAD_CIRCLE_MAX_LEN (STORE_DATA_SIZE_CIRCLE*UPLOAD_CIRCLE_MAX_COUNT)//单帧最大字节数
|
||||
|
||||
#define EE_PRA_SIZE_WHYW 21//EE存储参数总字节数
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UNION_2U8TOU16 u_circle_store_index_w;//周期数据存储的位置
|
||||
UNION_2U8TOU16 u_circle_store_index_r;//周期数据读取的位置
|
||||
DateTime store_circle_rtcc_end;//最后一条记录的时间7字节
|
||||
u8 ee_nb_online_keep_time;//在线延时时间 1字节
|
||||
u8 ee_nb_acq_interval;//表数据采集记录间隔时间 1字节 采集间隔30分钟
|
||||
u8 ee_battery_pra[4];//电池电压相关参数
|
||||
UNION_2U8TOU16 ee_upload_count_success;//上报成功总次数
|
||||
UNION_2U8TOU16 ee_upload_count_fail;//上报失败总次数
|
||||
}Data;
|
||||
u8 data_buf[EE_PRA_SIZE_WHYW];
|
||||
}WHYW_UNION_EE_STORE;
|
||||
/******************************规约解析相关参数*********************************/
|
||||
#define FRAME_HEAD_MARK 0x68
|
||||
#define FRAME_END_MARK 0x16
|
||||
#define UP_BUF_SIZE 512
|
||||
|
||||
#define FRAME_LEN_MAX UP_BUF_SIZE
|
||||
#define FRAME_LEN_MIN 10
|
||||
|
||||
#define FRAME_GUIDE 0xFE //引导
|
||||
#define FRAME_HEAD 0x68 //帧头
|
||||
#define FRAME_TAIL 0x16 //帧尾本号
|
||||
|
||||
#define W_METTYPE 0x10 //水表类型
|
||||
#define LYBK_DATA_UP_NOW 0x55
|
||||
#define LYBK_OFFSET_DATA_UP 0xFF
|
||||
#define LYBK_DISCRETE_DATA_UP 0x99
|
||||
|
||||
|
||||
#define READ_CTRL_DOWN 0x01 //读控制码下行
|
||||
#define READ_CTRL_UP 0x81 //读控制码上行
|
||||
#define WRITE_CTRL_DOWN 0x04 //写控制码下行
|
||||
#define WRITE_CTRL_UP 0x84 //写控制码上行
|
||||
|
||||
//读、写水表在线延时等待时间
|
||||
#define RW_ONLINE_TIME_D0 0x81
|
||||
#define RW_ONLINE_TIME_D1 0x11
|
||||
|
||||
//读、写水表实时时间
|
||||
#define RW_METER_TIME_D0 0xA0
|
||||
#define RW_METER_TIME_D1 0x15
|
||||
|
||||
//读、写水表自动上传数据的时间参数
|
||||
#define RW_UPLOAD_TIME_ID0 0x81
|
||||
#define RW_UPLOAD_TIME_ID1 0x04
|
||||
|
||||
//读、写水表数据采集间隔时间
|
||||
#define RW_INTERVAL_TIME_ID0 0x81
|
||||
#define RW_INTERVAL_TIME_ID1 0x05
|
||||
|
||||
//读、写取电池电压相关参数
|
||||
#define RW_BATTERY_D0 0x81
|
||||
#define RW_BATTERY_D1 0x09
|
||||
|
||||
//读、写水表 NB 网络参数
|
||||
#define RW_NB_PARA_D0 0x81
|
||||
#define RW_NB_PARA_D1 0x10
|
||||
|
||||
|
||||
//当前计量信息数据标识D0
|
||||
#define UPLOAD_DATA_D0 0x90
|
||||
#define UPLOAD_DATA_D1 0x20
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
u8 buf[4];
|
||||
}U32_To_Float;
|
||||
|
||||
typedef struct //存放表计收到的比较重要的数据
|
||||
{
|
||||
u8 head_site;
|
||||
u8 frame_ctrl; //下行控制码
|
||||
u8 ack_ctrl; //上行控制码
|
||||
u8 mark_DI0; //数据标识DI0
|
||||
u8 mark_DI1; //数据标识DI1
|
||||
u8 serial_num; //序列号
|
||||
mtype16_ len; //长度
|
||||
u16 chkval; //校验和
|
||||
u8 frame_sta; //规约状态
|
||||
} STRUCT_FRAME_WHYW;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 send_len;
|
||||
u8 send_sum_cs; //校验和
|
||||
u8 send_buf[UP_BUF_SIZE];
|
||||
}OTHER_FRAME_UP_SEND_PARA_;
|
||||
|
||||
|
||||
typedef enum{
|
||||
WHYW_STATE_S0 = 0,
|
||||
WHYW_STATE_S1,
|
||||
WHYW_STATE_S2,
|
||||
WHYW_STATE_S3,
|
||||
WHYW_STATE_S4,
|
||||
WHYW_STATE_S5,
|
||||
WHYW_STATE_S6,
|
||||
WHYW_STATE_S7,
|
||||
WHYW_STATE_S8,
|
||||
WHYW_STATE_S9,
|
||||
WHYW_STATE_S10,
|
||||
WHYW_STATE_S11,
|
||||
WHYW_STATE_S12,
|
||||
WHYW_STATE_S13,
|
||||
WHYW_STATE_S20,
|
||||
WHYW_STATE_S21,
|
||||
WHYW_STATE_S22,
|
||||
WHYW_STATE_S30,
|
||||
WHYW_STATE_S31,
|
||||
WHYW_STATE_S32,
|
||||
}TYP_STATE_WHYW;
|
||||
|
||||
|
||||
u8 crack_frame_WHYW(u16 frame_lenth, u8 *frame_buffer);
|
||||
u8 up_deal_code_WHYW(void);
|
||||
void Frame_ack_WHYW(u8* p_send_buf, u16* p_send_len);
|
||||
void Frame_ResetDealState_WHYW(void);
|
||||
|
||||
void GetUploadDataResetState_WHYW(void);
|
||||
u8 GetUploadDataCheckIdle_WHYW(void);
|
||||
u8 GetUploadDataCheckTask_WHYW(void);
|
||||
void GetUploadDataMachine_WHYW(u8 data_step, u8* p_send_buf, u16* p_send_len);
|
||||
|
||||
/****************************规约数据存储部分*****************************/
|
||||
void DataStoreInit(void);
|
||||
void DataStoreMachine(void);
|
||||
u8 DataStoreIfIdle(void);
|
||||
/************************网络连接选择\延时等待时间设置********************/
|
||||
#define MAIN_CONNECT_TYPE NBIOT_CONNECT_UDP1
|
||||
#define MAIN_SEND_TYPE SEND_TYPE_UDP1
|
||||
#define SLAVE_CONNECT_TYPE NBIOT_CONNECT_UDP2
|
||||
#define SLAVE_SEND_TYPE SEND_TYPE_UDP2
|
||||
|
||||
#define COAP_UPLOAD_WAIT_ACK_TIME 150 //主上报15秒,副上报5秒
|
||||
#define UDP_UPLOAD_WAIT_ACK_TIME 50
|
||||
#define NB_ONLINE_KEEP_TIME 50
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __LYBK_FRAME_H__ */
|
||||
/******************************************************************************
|
||||
* EOF (not truncated)
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,713 @@
|
|||
#include "sys_config.h"
|
||||
#if PRODUCT_JS
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_power_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "sys_processor.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_JX_Store_App.h"
|
||||
#include "UWater_sys.h"
|
||||
/******************************************************************************************************
|
||||
com_rxbuf_wcount_copy,com_rxbuf_rcount_copy 用于记录上报时刻的com_rxbuf_wcount和 com_rxbuf_rcount;
|
||||
上报完成后,会将com_rxbuf_rcount_copy赋予com_rxbuf_rcount更新。
|
||||
*/
|
||||
#define __no_init __attribute__((zero_init))
|
||||
__no_init volatile u32 jx_com_rxbuf_wcount_copy __attribute__((section(".ARM.__at_0x20007F28")));
|
||||
__no_init volatile u32 jx_com_rxbuf_rcount_copy __attribute__((section(".ARM.__at_0x20007F2C")));
|
||||
__no_init volatile u16 jx_com_rxbuf_check_copy __attribute__((section(".ARM.__at_0x20007F30")));
|
||||
|
||||
UNION_4U8TOU32 com_rxbuf_wcount, com_rxbuf_rcount; //存储数据读写指针
|
||||
UNION_4U8TOU32 com_rxbuf_wcount_copy, com_rxbuf_rcount_copy; //存储数据读写指针上传时间冻结指针
|
||||
u32 temp_rxbuf_rcount=0;
|
||||
//上传时com_rxbuf_rcount_copy的变量,上传前com_rxbuf_rcount_copy=temp_rxbuf_rcount,上传后temp_rxbuf_rcount=com_rxbuf_rcount_copy
|
||||
/******************************************************************************************************/
|
||||
/*
|
||||
old_miji_interval_flow,new_miji_interval_flow用于计算间隔流量
|
||||
当new_miji_interval_flow和old_miji_interval_flow发生变化时,
|
||||
记录差值new_miji_interval_flow-old_miji_interval_flow做为
|
||||
*/
|
||||
U32_To_Float old_miji_interval_flow;
|
||||
U32_To_Float new_miji_interval_flow;
|
||||
U32_To_Float temp_base_flow;
|
||||
static u8 miji_interval_time;//密集采样间隔时间
|
||||
/******************************************************************************************************/
|
||||
static DateTime s_temp_store_Time;//用于取出当前时间
|
||||
UNION_JX_STORE_PackHead u_temp_store_data;//间隔存储数据格式
|
||||
|
||||
u8 upload_store_buf[JX_UPLOAD_LEN];//364 上报数据缓存:8字节间隔数据x最大45条+4字节流量基数据
|
||||
u8 upload_store_count=0; //记录上报的数据包实际的间隔数据条数,其余补0xFF
|
||||
|
||||
u8 s_temp_store_ee_msg; //EEPROM操作状态
|
||||
|
||||
static u8 jiangxi_store_first_power_flag=0;//第一次上电标志
|
||||
static TYP_STATE_JX jiangxi_store_init_step=JX_STATE_S0;//上电初始化状态
|
||||
static TYP_STATE_JX step_jx_store=JX_STATE_S0; //间隔流量数据存储状态
|
||||
/******************************************************************************************************
|
||||
JiangXiStore_InitApp
|
||||
江西规约存储、读取指针上电初始化
|
||||
******************************************************************************************************/
|
||||
void JiangXiStore_InitApp(void)
|
||||
{
|
||||
jiangxi_store_init_step = JX_STATE_S1;
|
||||
while(jiangxi_store_init_step)
|
||||
{
|
||||
switch(jiangxi_store_init_step)
|
||||
{
|
||||
case JX_STATE_S0:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S1:
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepRead(EEP_ADDR_JX_STORE_FIRST_POWER, &jiangxi_store_first_power_flag, 1, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S2:
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if (0x55 == jiangxi_store_first_power_flag)
|
||||
{
|
||||
jiangxi_store_init_step = JX_STATE_S20;
|
||||
}
|
||||
else //第一次上电
|
||||
{
|
||||
com_rxbuf_wcount.datas = 0;
|
||||
com_rxbuf_rcount.datas = 0;
|
||||
StoreRWIndex_2_Ram();
|
||||
jiangxi_store_init_step = JX_STATE_S10;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
//第一次上电
|
||||
case JX_STATE_S10://保存写指针
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepWrite(&com_rxbuf_wcount.data_buf[0], EEP_ADDR_JX_STORE_WRITE, 4, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S11;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S11://保存读指针
|
||||
{
|
||||
if ((SUCCESS == EepCheckMsg(s_temp_store_ee_msg)) && (TASK_IDLE == EepIfIdle()))
|
||||
{
|
||||
EepWrite(&com_rxbuf_rcount.data_buf[0], EEP_ADDR_JX_STORE_READ, 4, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S12;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S12://保存上电标志
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
jiangxi_store_first_power_flag = 0x55;
|
||||
EepWrite(&jiangxi_store_first_power_flag, EEP_ADDR_JX_STORE_FIRST_POWER, 1, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S30;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//非第一次上电
|
||||
case JX_STATE_S20://读取写指针
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepRead(EEP_ADDR_JX_STORE_WRITE, com_rxbuf_wcount.data_buf, 4, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S21;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S21://读取读指针
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepRead(EEP_ADDR_JX_STORE_READ, com_rxbuf_rcount.data_buf, 4, &s_temp_store_ee_msg);
|
||||
jiangxi_store_init_step = JX_STATE_S30;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//等待EE操作完成
|
||||
case JX_STATE_S30:
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if(jx_com_rxbuf_check_copy == getCRC_HisIndex(jx_com_rxbuf_wcount_copy, jx_com_rxbuf_rcount_copy))
|
||||
{
|
||||
com_rxbuf_wcount.datas = jx_com_rxbuf_wcount_copy;
|
||||
com_rxbuf_rcount.datas = jx_com_rxbuf_rcount_copy;
|
||||
}
|
||||
jiangxi_store_init_step = JX_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
jiangxi_store_init_step = JX_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EepMachineDriver();
|
||||
}
|
||||
}
|
||||
/*************************************************************************
|
||||
函数名:write_com_rx_data
|
||||
说 明:存储一条间隔数据流量;并存储对应的指针和按条件存储流量基数据
|
||||
输 入:UNION_JX_STORE_PackHead类型。该数据类型包括间隔数据和流量基数据。
|
||||
流量基数据按每45条间隔数据对应一条基数据。
|
||||
*************************************************************************/
|
||||
int write_com_rx_data(UNION_JX_STORE_PackHead *dat)
|
||||
{
|
||||
static TYP_STATE_JX step_store_write=JX_STATE_S0;
|
||||
switch(step_store_write)
|
||||
{
|
||||
case JX_STATE_S0://保存间隔数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if(com_rxbuf_wcount.datas == 0xFFFFFFFF)//判断指针有效性
|
||||
{
|
||||
com_rxbuf_wcount.datas = 0;//重新初始化指针
|
||||
com_rxbuf_rcount.datas = 0;
|
||||
StoreRWIndex_2_Ram();
|
||||
}
|
||||
EepWrite(dat->Stru.StepUnion.buf, (EEP_ADDR_JX_STORE_STEP_START + (com_rxbuf_wcount.datas%COM_RXBUF_MAX)*8), 8, &s_temp_store_ee_msg);
|
||||
step_store_write = JX_STATE_S1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S1://保存基数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if((com_rxbuf_wcount.datas % 45) == 0)
|
||||
{
|
||||
EepWrite(dat->Stru.BaseFlowData.data_buf, EEP_ADDR_JX_STORE_BASE_START + ((com_rxbuf_wcount.datas%COM_RXBUF_MAX)/45)*4, 4, &s_temp_store_ee_msg);
|
||||
}
|
||||
step_store_write = JX_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S2://保存写指针
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//ee写完成
|
||||
{
|
||||
com_rxbuf_wcount.datas ++;
|
||||
StoreRWIndex_2_Ram();
|
||||
step_store_write = JX_STATE_S0;
|
||||
return SUCCESS;//返回完成
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_store_write = JX_STATE_S0;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
/*************************************************************************
|
||||
函数名:Copy_R_W_Count
|
||||
说 明:上传时刻冻结当前存储的读、写指针
|
||||
返回值:操作完成返回1,操作未完成返回0xFF
|
||||
*************************************************************************/
|
||||
u8 Copy_R_W_Count(void)
|
||||
{
|
||||
static TYP_STATE_JX step_store_read_count_copy=JX_STATE_S0;
|
||||
switch(step_store_read_count_copy)
|
||||
{
|
||||
case JX_STATE_S0:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if((com_rxbuf_wcount.datas == 0xFFFFFFFF)||(com_rxbuf_rcount.datas == 0xFFFFFFFF))//判断指针有效性
|
||||
{
|
||||
com_rxbuf_wcount.datas = 0;
|
||||
com_rxbuf_rcount.datas = 0;
|
||||
StoreRWIndex_2_Ram();
|
||||
step_store_read_count_copy = JX_STATE_S1;
|
||||
}
|
||||
else
|
||||
{
|
||||
com_rxbuf_wcount_copy.datas = com_rxbuf_wcount.datas;//6cb7
|
||||
com_rxbuf_rcount_copy.datas = com_rxbuf_rcount.datas;//1f2f
|
||||
|
||||
if (com_rxbuf_wcount_copy.datas >= com_rxbuf_rcount_copy.datas )
|
||||
{
|
||||
if((com_rxbuf_wcount_copy.datas - com_rxbuf_rcount_copy.datas) > COM_RXBUF_MAX)
|
||||
{
|
||||
com_rxbuf_rcount_copy.datas = (com_rxbuf_wcount_copy.datas - COM_RXBUF_MAX);//6177
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
com_rxbuf_rcount_copy.datas = com_rxbuf_wcount_copy.datas;
|
||||
}
|
||||
if(com_rxbuf_wcount_copy.datas > (com_rxbuf_rcount_copy.datas + COM_RXBUF_MAX -45))//判断是否覆盖了首包数据的基数据
|
||||
{
|
||||
com_rxbuf_rcount_copy.datas = com_rxbuf_rcount_copy.datas + (45 - com_rxbuf_rcount_copy.datas%45);//舍去首包的残余条数
|
||||
}
|
||||
step_store_read_count_copy = JX_STATE_S0;//38941---38970
|
||||
return SUCCESS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
//数据无效,重新初始化读,写指针
|
||||
case JX_STATE_S1:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepWrite(com_rxbuf_wcount.data_buf, EEP_ADDR_JX_STORE_WRITE, 4, &s_temp_store_ee_msg);
|
||||
step_store_read_count_copy = JX_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S2:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepWrite(com_rxbuf_rcount.data_buf, EEP_ADDR_JX_STORE_READ, 4, &s_temp_store_ee_msg);
|
||||
step_store_read_count_copy = JX_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_store_read_count_copy = JX_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
函数名:Renew_Rcount
|
||||
说 明:将上报用完之后的com_rxbuf_rcount_copy更新到读指针com_rxbuf_rcount.
|
||||
目的是防止上报失败或个别包上报失败.
|
||||
成功收到上报应答时调用.
|
||||
temp_rxbuf_rcount的作用是暂时保存com_rxbuf_rcount_copy,
|
||||
如果上报成功则赋值给com_rxbuf_rcount_copy,上报不成功,则不影响com_rxbuf_rcount_copy
|
||||
返回值:操作完成返回1,操作未完成返回0xFF
|
||||
*************************************************************************/
|
||||
u8 Renew_Rcount(void)
|
||||
{
|
||||
static TYP_STATE_JX step_renew_Rcount=JX_STATE_S0;
|
||||
switch(step_renew_Rcount)
|
||||
{
|
||||
case JX_STATE_S0://保存读指针
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//ee写完成
|
||||
{
|
||||
com_rxbuf_rcount_copy.datas = temp_rxbuf_rcount;
|
||||
com_rxbuf_rcount.datas = com_rxbuf_rcount_copy.datas;
|
||||
EepWrite(com_rxbuf_rcount.data_buf, EEP_ADDR_JX_STORE_READ, 4, &s_temp_store_ee_msg);
|
||||
step_renew_Rcount = JX_STATE_S1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S1:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//ee写完成
|
||||
{
|
||||
step_renew_Rcount = JX_STATE_S0;
|
||||
return SUCCESS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_renew_Rcount = JX_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
函数名:get_com_rx_num_copy
|
||||
说 明:根据冻结指针计算需要上报的记录条数,
|
||||
如果超过COM_RXBUF_MAX,就取COM_RXBUF_MAX
|
||||
返回值:操作完成返回1,操作未完成返回0xFF
|
||||
*************************************************************************/
|
||||
u16 get_com_rx_num_copy(void)
|
||||
{
|
||||
if (com_rxbuf_wcount_copy.datas >= com_rxbuf_rcount_copy.datas )
|
||||
{
|
||||
if((com_rxbuf_wcount_copy.datas - com_rxbuf_rcount_copy.datas) > COM_RXBUF_MAX)
|
||||
{
|
||||
com_rxbuf_rcount_copy.datas = (com_rxbuf_wcount_copy.datas - COM_RXBUF_MAX);
|
||||
}
|
||||
return (com_rxbuf_wcount_copy.datas - com_rxbuf_rcount_copy.datas);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
函数名:get_com_rx_data
|
||||
说 明:获取上传数据
|
||||
*************************************************************************/
|
||||
int get_com_rx_data(void)
|
||||
{
|
||||
static TYP_STATE_JX step_store_read=JX_STATE_S0;
|
||||
switch(step_store_read)
|
||||
{
|
||||
case JX_STATE_S0://读取存储指针
|
||||
{
|
||||
int i=0;
|
||||
for(i=0;i<JX_UPLOAD_LEN;i++)
|
||||
{
|
||||
upload_store_buf[i] = 0xFF;//先清空发送缓存,后期就不用再补0xFF
|
||||
}
|
||||
if(get_com_rx_num_copy() > 0)
|
||||
{
|
||||
temp_rxbuf_rcount = com_rxbuf_rcount_copy.datas - com_rxbuf_rcount_copy.datas%45;
|
||||
upload_store_count = 0;
|
||||
step_store_read = JX_STATE_S1;//进入下一步读取数据
|
||||
}
|
||||
else if(get_com_rx_num_copy() == 0) //无用水记录时,回复一条当前流量,间隔流量设置一条0
|
||||
{
|
||||
RtccGetDateTime(&s_temp_store_Time);
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Day = s_temp_store_Time.s.day;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Hour = s_temp_store_Time.s.hour;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Minute = s_temp_store_Time.s.minute;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.StepTime = miji_interval_time;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.gp22_float = 0;
|
||||
RTCC_To_Float temp_flow;
|
||||
|
||||
temp_rxbuf_rcount = com_rxbuf_rcount_copy.datas;
|
||||
temp_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
upload_store_buf[0] = u_temp_store_data.Stru.StepUnion.StepData.Day;
|
||||
upload_store_buf[1] = u_temp_store_data.Stru.StepUnion.StepData.Hour;
|
||||
upload_store_buf[2] = u_temp_store_data.Stru.StepUnion.StepData.Minute;
|
||||
upload_store_buf[3] = u_temp_store_data.Stru.StepUnion.StepData.StepTime;
|
||||
|
||||
upload_store_buf[4] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[0];
|
||||
upload_store_buf[5] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[1];
|
||||
upload_store_buf[6] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[2];
|
||||
upload_store_buf[7] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[3];
|
||||
|
||||
upload_store_buf[360] = temp_flow.buf[0];
|
||||
upload_store_buf[361] = temp_flow.buf[1];
|
||||
upload_store_buf[362] = temp_flow.buf[2];
|
||||
upload_store_buf[363] = temp_flow.buf[3];
|
||||
return SUCCESS;// 在此就返回完成
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S1://读取基数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())//(temp_rxbuf_rcount%COM_RXBUF_MAX)/45=第2a=42条开始,导致第43、44条数据使用了新循环的‘1’‘2’‘3’...条的基数据
|
||||
{
|
||||
EepRead(EEP_ADDR_JX_STORE_BASE_START + ((temp_rxbuf_rcount%COM_RXBUF_MAX)/45)*4, &upload_store_buf[360], 4, &s_temp_store_ee_msg);
|
||||
step_store_read = JX_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S2://读间隔数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
//判断基数据的有效性
|
||||
temp_base_flow.buf[0] = upload_store_buf[360];
|
||||
temp_base_flow.buf[1] = upload_store_buf[361];
|
||||
temp_base_flow.buf[2] = upload_store_buf[362];
|
||||
temp_base_flow.buf[3] = upload_store_buf[363];
|
||||
if((temp_base_flow.gp22_float > 10000000)||(temp_base_flow.gp22_float < 0)||(temp_base_flow.gp22_u32 == 0Xffffffff))//数据无效
|
||||
{
|
||||
//数据无效,上报当前数据,且初始化读写指针
|
||||
com_rxbuf_wcount.datas = 0;
|
||||
com_rxbuf_rcount.datas = 0;
|
||||
com_rxbuf_wcount_copy.datas = 0;
|
||||
com_rxbuf_rcount_copy.datas = 0;
|
||||
StoreRWIndex_2_Ram();
|
||||
|
||||
temp_rxbuf_rcount = com_rxbuf_rcount_copy.datas;
|
||||
temp_base_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
upload_store_buf[0] = u_temp_store_data.Stru.StepUnion.StepData.Day;
|
||||
upload_store_buf[1] = u_temp_store_data.Stru.StepUnion.StepData.Hour;
|
||||
upload_store_buf[2] = u_temp_store_data.Stru.StepUnion.StepData.Minute;
|
||||
upload_store_buf[3] = u_temp_store_data.Stru.StepUnion.StepData.StepTime;
|
||||
|
||||
upload_store_buf[4] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[0];
|
||||
upload_store_buf[5] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[1];
|
||||
upload_store_buf[6] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[2];
|
||||
upload_store_buf[7] = u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.buf[3];
|
||||
|
||||
upload_store_buf[360] = temp_base_flow.buf[0];
|
||||
upload_store_buf[361] = temp_base_flow.buf[1];
|
||||
upload_store_buf[362] = temp_base_flow.buf[2];
|
||||
upload_store_buf[363] = temp_base_flow.buf[3];
|
||||
|
||||
step_store_read = JX_STATE_S5;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(temp_rxbuf_rcount < com_rxbuf_wcount_copy.datas)
|
||||
{
|
||||
EepRead(EEP_ADDR_JX_STORE_STEP_START + (temp_rxbuf_rcount%COM_RXBUF_MAX)*8, &upload_store_buf[8*upload_store_count], 8, &s_temp_store_ee_msg);
|
||||
step_store_read = JX_STATE_S3;
|
||||
}
|
||||
else
|
||||
{
|
||||
step_store_read = JX_STATE_S4;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S3:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
temp_rxbuf_rcount++;
|
||||
upload_store_count++;
|
||||
if(upload_store_count < 45)
|
||||
{
|
||||
step_store_read = JX_STATE_S2;
|
||||
}
|
||||
else
|
||||
{
|
||||
step_store_read = JX_STATE_S4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S4:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
step_store_read = JX_STATE_S0;
|
||||
return SUCCESS; //返回完成
|
||||
}
|
||||
break;
|
||||
}
|
||||
//数据无效,重新初始化读,写指针
|
||||
case JX_STATE_S5:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepWrite(com_rxbuf_wcount.data_buf, EEP_ADDR_JX_STORE_WRITE, 4, &s_temp_store_ee_msg);
|
||||
step_store_read = JX_STATE_S6;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S6:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepWrite(com_rxbuf_rcount.data_buf, EEP_ADDR_JX_STORE_READ, 4, &s_temp_store_ee_msg);
|
||||
step_store_read = JX_STATE_S4;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
函数名:JiangXiStore_Machine
|
||||
说 明:江西定制规约数据存储状态机;
|
||||
当流速大于0时,启动间隔存储.
|
||||
间隔存储时间间隔可设置,即,0-30s; 1-1分钟; 2-2分钟 ……
|
||||
***************************************************************************/
|
||||
void JiangXiStore_Machine(void)
|
||||
{
|
||||
switch(step_jx_store)
|
||||
{
|
||||
case JX_STATE_S0:
|
||||
{
|
||||
if(Gp30CheckDataApp(1) > 0)//判断流速
|
||||
{
|
||||
old_miji_interval_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
u_temp_store_data.Stru.BaseFlowData.datas = Gp30CheckDataApp(2);//基础流量暂存,要放在间隔流量变化之前
|
||||
miji_interval_time = FrameCheckParaApp(FramePara_StoreFrequency);
|
||||
if(miji_interval_time == 0x00)
|
||||
{
|
||||
RtccSetTimer(RTCC_MIJI_WAIT_TIME,30);//默认30s存储间隔
|
||||
}
|
||||
else
|
||||
{
|
||||
RtccSetTimer(RTCC_MIJI_WAIT_TIME,60*miji_interval_time);
|
||||
}
|
||||
step_jx_store = JX_STATE_S1;
|
||||
}//8900+5000+1000+2980+7000+6200+2000=11.4 3.2+2.2=5.4 5.8
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S1:
|
||||
{
|
||||
if(RtccCheckTimer(RTCC_MIJI_WAIT_TIME) == 0)
|
||||
{
|
||||
//间隔流量存储格式整理:时间格式
|
||||
RtccGetDateTime(&s_temp_store_Time);
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Day = s_temp_store_Time.s.day;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Hour = s_temp_store_Time.s.hour;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.Minute = s_temp_store_Time.s.minute;
|
||||
u_temp_store_data.Stru.StepUnion.StepData.StepTime = miji_interval_time;
|
||||
//间隔流量存储格式整理:流量格式
|
||||
new_miji_interval_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
u_temp_store_data.Stru.StepUnion.StepData.StepFlowData.gp22_float = (new_miji_interval_flow.gp22_float - old_miji_interval_flow.gp22_float)/100;
|
||||
step_jx_store = JX_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JX_STATE_S2:
|
||||
{
|
||||
if(write_com_rx_data(&u_temp_store_data) == SUCCESS)//流量数据存储
|
||||
{
|
||||
step_jx_store = JX_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_jx_store = JX_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
计算需要上报的包数
|
||||
*/
|
||||
u8 JiangXiStore_UploadPacks(void)
|
||||
{
|
||||
u16 temp_upload_record_cnts=0;
|
||||
u8 temp_upload_total_packs=0;
|
||||
if((com_rxbuf_wcount.datas == 0xFFFFFFFF)||(com_rxbuf_rcount.datas == 0xFFFFFFFF))//判断指针有效性
|
||||
{
|
||||
com_rxbuf_wcount.datas = 0;
|
||||
com_rxbuf_rcount.datas = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (com_rxbuf_wcount.datas >= com_rxbuf_rcount_copy.datas )
|
||||
{
|
||||
if((com_rxbuf_wcount.datas - com_rxbuf_rcount.datas) > COM_RXBUF_MAX)
|
||||
{
|
||||
com_rxbuf_rcount.datas = (com_rxbuf_wcount.datas - COM_RXBUF_MAX);//6177
|
||||
}
|
||||
}
|
||||
if(com_rxbuf_wcount.datas > (com_rxbuf_rcount.datas + COM_RXBUF_MAX -45))//判断是否覆盖了首包数据的基数据
|
||||
{
|
||||
com_rxbuf_rcount.datas = com_rxbuf_rcount.datas + (45 - com_rxbuf_rcount.datas%45);//舍去首包的残余条数
|
||||
}
|
||||
}
|
||||
temp_upload_record_cnts = com_rxbuf_wcount.datas - com_rxbuf_rcount.datas;
|
||||
temp_upload_total_packs = (temp_upload_record_cnts/45);//计算需要上传的总包数,45条记录一包
|
||||
if(temp_upload_record_cnts % 45)
|
||||
{
|
||||
temp_upload_total_packs += 1;
|
||||
}
|
||||
if(temp_upload_total_packs>64)//最大64包
|
||||
{
|
||||
temp_upload_total_packs = 64;
|
||||
}
|
||||
return temp_upload_total_packs;
|
||||
}
|
||||
/**
|
||||
计算读写指针的CRC校验,
|
||||
*/
|
||||
u16 getCRC_HisIndex(u32 data1, u32 data2)
|
||||
{
|
||||
u8 tempBuf[8];
|
||||
|
||||
tempBuf[0] = data1&0xFF;
|
||||
tempBuf[1] = (data1>>8)&0xFF;
|
||||
tempBuf[2] = (data1>>16)&0xFF;
|
||||
tempBuf[3] = (data1>>24)&0xFF;
|
||||
tempBuf[4] = data2&0xFF;
|
||||
tempBuf[5] = (data2>>8)&0xFF;
|
||||
tempBuf[6] = (data2>>16)&0xFF;
|
||||
tempBuf[7] = (data2>>24)&0xFF;
|
||||
return CRC16(tempBuf,8);
|
||||
}
|
||||
|
||||
void StoreRWIndex_2_Ram(void)
|
||||
{
|
||||
jx_com_rxbuf_wcount_copy = com_rxbuf_wcount.datas;
|
||||
jx_com_rxbuf_rcount_copy = com_rxbuf_rcount.datas;
|
||||
jx_com_rxbuf_check_copy = getCRC_HisIndex(jx_com_rxbuf_wcount_copy, jx_com_rxbuf_rcount_copy);
|
||||
}
|
||||
|
||||
/***********************************************
|
||||
江西规约发送数据组帧
|
||||
***********************************************/
|
||||
void NB_JX_Frame_Upload_Data(u8* psend_buf, u16* psend_len, u8 totalPack, u8 curPack)
|
||||
{
|
||||
u16 tmp_i =0;
|
||||
|
||||
s16 s_temp_data=0;
|
||||
MET_STATE temp_state; //状态字
|
||||
|
||||
//u16 s_g_data_len = PACK_NUM_GPRS_TOTAL;
|
||||
UNION_2U8TOU16 temp_data;
|
||||
|
||||
*psend_buf++ = totalPack;//需要上报总报数;
|
||||
*psend_buf++ = curPack;//当前上报的包号;
|
||||
for (tmp_i = 0; tmp_i < 360; tmp_i++) //8条历史数据
|
||||
{
|
||||
*psend_buf++ = upload_store_buf[tmp_i];
|
||||
}
|
||||
|
||||
//电压值
|
||||
temp_data.datas =FramHexToBcd16(PowerCheckValueSys());
|
||||
*psend_buf++ = temp_data.datas_map.data0;
|
||||
*psend_buf++ = temp_data.datas_map.data1;
|
||||
//流量
|
||||
*psend_buf++ = upload_store_buf[360];
|
||||
*psend_buf++ = upload_store_buf[361];
|
||||
*psend_buf++ = upload_store_buf[362];
|
||||
*psend_buf++ = upload_store_buf[363];
|
||||
//信号强度
|
||||
NbiotGetRSRP(&s_temp_data);
|
||||
temp_data.datas = -s_temp_data;
|
||||
*psend_buf++ =temp_data.data_buf[0];
|
||||
*psend_buf++ =temp_data.data_buf[1];
|
||||
////新增附网时间
|
||||
*psend_buf++=GetUploadConnectTime_JX(0)&0xFF;
|
||||
*psend_buf++=(GetUploadConnectTime_JX(0)>>8)&0xFF;
|
||||
*psend_buf++= GetUploadConnectTime_JX(1)&0xFF;
|
||||
*psend_buf++= (GetUploadConnectTime_JX(1)>>8)&0xFF;
|
||||
//状态字
|
||||
temp_state = FrameGetByte();
|
||||
*psend_buf++ = temp_state.stat0;
|
||||
*psend_buf++ = temp_state.stat1;
|
||||
*psend_buf++ = temp_state.stat2;
|
||||
*psend_buf++ = 0x02;
|
||||
*psend_len = PACK_NUM_GPRS_TOTAL;
|
||||
}
|
||||
|
||||
u8 JiangXiStore_IfSleep(void)
|
||||
{
|
||||
if((step_jx_store == JX_STATE_S0) ||(step_jx_store == JX_STATE_S1) )
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
|
||||
#ifndef __UWater_JX_STORE_APP_H
|
||||
#define __UWater_JX_STORE_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "sys_config.h"
|
||||
#if PRODUCT_JS
|
||||
#include "type.h"
|
||||
#include "UWater_frame_app.h"
|
||||
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
u8 buf[4];
|
||||
}U32_To_Float;
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 Day;
|
||||
u8 Hour;
|
||||
u8 Minute;
|
||||
u8 StepTime;
|
||||
U32_To_Float StepFlowData;
|
||||
}StepData;
|
||||
u8 buf[8];
|
||||
}UNION_JX_STORE_DATA;
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UNION_4U8TOU32 BaseFlowData;
|
||||
UNION_JX_STORE_DATA StepUnion;
|
||||
}Stru;
|
||||
u8 PackHeadBuf[12];
|
||||
}UNION_JX_STORE_PackHead;
|
||||
|
||||
typedef enum{
|
||||
JX_STATE_S0 = 0,
|
||||
JX_STATE_S1,
|
||||
JX_STATE_S2,
|
||||
JX_STATE_S3,
|
||||
JX_STATE_S4,
|
||||
JX_STATE_S5,
|
||||
JX_STATE_S6,
|
||||
JX_STATE_S7,
|
||||
JX_STATE_S8,
|
||||
JX_STATE_S9,
|
||||
JX_STATE_S10,
|
||||
JX_STATE_S11,
|
||||
JX_STATE_S12,
|
||||
JX_STATE_S20,
|
||||
JX_STATE_S21,
|
||||
JX_STATE_S22,
|
||||
JX_STATE_S30,
|
||||
JX_STATE_S31,
|
||||
JX_STATE_S32,
|
||||
JX_STATE_S40,
|
||||
JX_STATE_S41,
|
||||
JX_STATE_S42,
|
||||
JX_STATE_S50,
|
||||
JX_STATE_S51,
|
||||
JX_STATE_S52,
|
||||
JX_STATE_S60,
|
||||
JX_STATE_S61,
|
||||
JX_STATE_S62,
|
||||
JX_STATE_S70,
|
||||
JX_STATE_S71,
|
||||
JX_STATE_S72,
|
||||
JX_STATE_S80,
|
||||
JX_STATE_S81,
|
||||
JX_STATE_S82,
|
||||
JX_STATE_S90,
|
||||
JX_STATE_S91,
|
||||
JX_STATE_S92
|
||||
}TYP_STATE_JX;
|
||||
|
||||
|
||||
#define JX_UPLOAD_LEN 364
|
||||
#define MAX_PACKS_TOUPLOAD 65 //最大包数
|
||||
#define COM_RXBUF_MAX (45*MAX_PACKS_TOUPLOAD)//(45*65)//能存储的总条数:2880
|
||||
|
||||
#define EEP_ADDR_JX_STORE_STEP_START FRAME_NBIot_HISTORY_READ_ADD //0x2000 //
|
||||
#define EEP_ADDR_JX_STORE_BASE_START (EEP_ADDR_JX_STORE_STEP_START + (8*45*MAX_PACKS_TOUPLOAD))
|
||||
#define EEP_ADDR_JX_STORE_WRITE (EEP_ADDR_JX_STORE_BASE_START + (4*MAX_PACKS_TOUPLOAD)) //4bytes
|
||||
#define EEP_ADDR_JX_STORE_READ (EEP_ADDR_JX_STORE_WRITE + 4) //4bytes
|
||||
#define EEP_ADDR_JX_STORE_FIRST_POWER (EEP_ADDR_JX_STORE_READ + 4) //1bytes
|
||||
|
||||
u8 Copy_R_W_Count(void);
|
||||
u8 Renew_Rcount(void);
|
||||
u16 get_com_rx_num_copy(void);
|
||||
int get_com_rx_data(void);
|
||||
void JiangXiStore_InitApp(void);
|
||||
u8 JiangXiStore_UploadPacks(void);
|
||||
u8 JiangXiStore_IfSleep(void);
|
||||
void JiangXiStore_Machine(void);
|
||||
u16 getCRC_HisIndex(u32 data1, u32 data2);
|
||||
void StoreRWIndex_2_Ram(void);
|
||||
void NB_JX_Frame_Upload_Data(u8* psend_buf, u16* psend_len, u8 totalPack, u8 curPack);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __UWater_JIANGXISTORE_APP_H */
|
||||
|
||||
/***************************************************************END OF FILE****/
|
|
@ -0,0 +1,460 @@
|
|||
#include "UWater_frame_app.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_QZ_Store_App.h"
|
||||
#include "sys_processor.h"
|
||||
|
||||
/**********公用变量************************************************************/
|
||||
DateTime tempRtccTime_BCD;
|
||||
u8 tempMsg_EE=0;
|
||||
MET_STATE temp_MetState; //状态字
|
||||
UNION_QZ_STORE_INDEX uStoreIndex_QZ;
|
||||
TYP_STATE_QZ step_QuanzhouStoreInit = QZ_STATE_S0;
|
||||
TYP_STATE_QZ step_QuanzhouStoreMachine = QZ_STATE_S0;
|
||||
DateTime protl_rtcc_time;
|
||||
/**********日冻结信息存储相关变量***********************************************/
|
||||
UNION_QZ_STORE_DAY temp_daily_data;
|
||||
u8 *pBuf_DailyHalfHourFlow;
|
||||
u8 *pBuf_DailyHighestFlow;
|
||||
TYP_STATE_QZ step_DailyDataStore = QZ_STATE_S0;
|
||||
|
||||
/**********月冻结数据存储相关变量***********************************************/
|
||||
UNION_QZ_STORE_MONTH temp_month_data;
|
||||
TYP_STATE_QZ step_MonthDataStore = QZ_STATE_S0;
|
||||
|
||||
static float s_daily_temprature[3];
|
||||
static u16 s_daily_temprature_min_max[2];
|
||||
|
||||
//间隔流量缓存
|
||||
static u8 temp_IntervalDataBuf[96];
|
||||
static u8 temp_interval_flow_addr;//间隔流量缓存地址
|
||||
static RTCC_To_Float old_jiange_total_flow;
|
||||
static RTCC_To_Float new_jiange_total_flow;
|
||||
static RTCC_UNION_2U8TOU16 jiange_data;
|
||||
/********************************************************************************
|
||||
函数名:Quanzhou_Store_InitApp
|
||||
说 明:泉州数据存储初始化
|
||||
********************************************************************************/
|
||||
void Quanzhou_Store_InitApp(void)
|
||||
{
|
||||
TYP_STATE_QZ tmp_init_stat = QZ_STATE_S0;
|
||||
if(Sys_data_object.P3.FirstPowerOnFlag == FIRST_POWER_ON_FLAG)
|
||||
{
|
||||
tmp_init_stat = QZ_STATE_S10;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_init_stat = QZ_STATE_S20;
|
||||
}
|
||||
while (tmp_init_stat)
|
||||
{
|
||||
switch (tmp_init_stat)
|
||||
{
|
||||
case QZ_STATE_S0:
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
tmp_init_stat = QZ_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S10://第一次上电流程
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
uStoreIndex_QZ.Data.DailyStore = 0;
|
||||
uStoreIndex_QZ.Data.MonthStore = 0;
|
||||
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
|
||||
tmp_init_stat = QZ_STATE_S1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S20://非第一次上电
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
EepRead(EEP_ADDR_QZ_STORE_INDEX_WRITE, &uStoreIndex_QZ.data_buf[0], 2, &tempMsg_EE);
|
||||
tmp_init_stat = QZ_STATE_S1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S1:
|
||||
{
|
||||
if (TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
tmp_init_stat = QZ_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
tmp_init_stat =QZ_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
EepMachineDriver();
|
||||
}
|
||||
new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32;
|
||||
for(int i=0;i<96;i++)
|
||||
{
|
||||
temp_IntervalDataBuf[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//日最高最低水温
|
||||
static void SysCheckTempratureMinMax(DateTime alarm_time)
|
||||
{
|
||||
if((0 == alarm_time.s.hour) && (0 == alarm_time.s.minute))
|
||||
{
|
||||
//每天0点重新记录温度
|
||||
if(s_daily_temprature[0]<0)//高温小于0
|
||||
{
|
||||
s_daily_temprature_min_max[0] = -((u16)(s_daily_temprature[0]*10));
|
||||
s_daily_temprature_min_max[0] = 0x8000|s_daily_temprature_min_max[0];
|
||||
}
|
||||
else//高温大于0
|
||||
{
|
||||
s_daily_temprature_min_max[0] = (u16)(s_daily_temprature[0]*10);//强转优先级大于乘,要先乘
|
||||
}
|
||||
if(s_daily_temprature[1]<0)//低温小于0
|
||||
{
|
||||
s_daily_temprature_min_max[1] = -((u16)(s_daily_temprature[1]*10));
|
||||
s_daily_temprature_min_max[1] = 0x8000|s_daily_temprature_min_max[1];
|
||||
}
|
||||
else//低温大于0
|
||||
{
|
||||
s_daily_temprature_min_max[1] = (u16)(s_daily_temprature[1]*10);
|
||||
}
|
||||
s_daily_temprature[2] = TempCheckValueApp();
|
||||
s_daily_temprature[0] = s_daily_temprature[2];
|
||||
s_daily_temprature[1] = s_daily_temprature[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
//计算温度最大最小值
|
||||
s_daily_temprature[2] = TempCheckValueApp();
|
||||
if(s_daily_temprature[2]>s_daily_temprature[0])
|
||||
{
|
||||
s_daily_temprature[0] = s_daily_temprature[2];//高温
|
||||
}
|
||||
if(s_daily_temprature[2]<s_daily_temprature[1])
|
||||
{
|
||||
s_daily_temprature[1] = s_daily_temprature[2];//低温
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
函数名:QuanZhou_DailyDataStore_proc
|
||||
说 明:日冻结数据存储,
|
||||
0点存储日冻结数据\
|
||||
半小时的间隔流量\
|
||||
日最高流速\
|
||||
日最高水温\
|
||||
日最低水温\
|
||||
报警状态字\
|
||||
时间年月日
|
||||
********************************************************************************/
|
||||
static int QuanZhou_DailyDataStore_proc(void)
|
||||
{
|
||||
switch(step_DailyDataStore)
|
||||
{
|
||||
case QZ_STATE_S0:
|
||||
{
|
||||
u8 temp_index = 0;
|
||||
temp_daily_data.Data.Head = 0x5A;
|
||||
QZ_U32_To_Float temp_float_dadta;
|
||||
//获取当前流量
|
||||
temp_float_dadta.gp22_u32 = Gp30CheckDataApp(2);
|
||||
temp_daily_data.Data.DailyFlowData.gp22_u32 = (u32)temp_float_dadta.gp22_float;
|
||||
|
||||
|
||||
//获取间隔流量:2B(间隔流量)X2(次/h)X24h=96B
|
||||
for(temp_index = 0; temp_index <96 ;temp_index++)
|
||||
{
|
||||
temp_daily_data.Data.StepFlowDataBuf[temp_index] = temp_IntervalDataBuf[temp_index];
|
||||
}
|
||||
for(temp_index = 0; temp_index <96 ;temp_index++)
|
||||
{
|
||||
temp_IntervalDataBuf[temp_index] = 0;
|
||||
}
|
||||
|
||||
//获取日最高流速
|
||||
RtccCheck_Hight_Flow(&pBuf_DailyHighestFlow);
|
||||
for(temp_index = 0; temp_index <14 ;temp_index++)
|
||||
{
|
||||
temp_daily_data.Data.HighestFlowDataBuf[temp_index] = *(pBuf_DailyHighestFlow+temp_index);
|
||||
}
|
||||
|
||||
//获取日最高和最低水温
|
||||
temp_daily_data.Data.HighestTemp = s_daily_temprature_min_max[0];
|
||||
temp_daily_data.Data.LowestTemp = s_daily_temprature_min_max[1];
|
||||
//获取报警信息
|
||||
//状态字
|
||||
temp_MetState = FrameGetByte();
|
||||
temp_daily_data.Data.MetState[0] = temp_MetState.stat0;
|
||||
temp_daily_data.Data.MetState[1] = temp_MetState.stat1;
|
||||
temp_daily_data.Data.MetState[2] = temp_MetState.stat3;
|
||||
|
||||
//获取当前时间
|
||||
RtccGetDateTime(&tempRtccTime_BCD);
|
||||
temp_daily_data.Data.Year = tempRtccTime_BCD.s.year;
|
||||
temp_daily_data.Data.Month = tempRtccTime_BCD.s.month;
|
||||
temp_daily_data.Data.Day = tempRtccTime_BCD.s.day;
|
||||
//校验和
|
||||
temp_daily_data.Data.CheckSum=0;
|
||||
for(temp_index = 0; temp_index<(STORE_SIZE_DATA_DAILY-2); temp_index++)
|
||||
{
|
||||
temp_daily_data.Data.CheckSum += temp_daily_data.data_buf[temp_index];
|
||||
}
|
||||
//预留字节
|
||||
temp_daily_data.Data.End = 0xA5;
|
||||
|
||||
step_DailyDataStore = QZ_STATE_S1;
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S1://存储数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if(uStoreIndex_QZ.Data.DailyStore>=100)
|
||||
{
|
||||
uStoreIndex_QZ.Data.DailyStore = 0;
|
||||
}
|
||||
EepWrite(temp_daily_data.data_buf, EEP_ADDR_QZ_STORE_DAY + uStoreIndex_QZ.Data.DailyStore*128, 128, &tempMsg_EE);
|
||||
step_DailyDataStore = QZ_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S2: //存储指针
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
uStoreIndex_QZ.Data.DailyStore++;
|
||||
if(uStoreIndex_QZ.Data.DailyStore>=100)
|
||||
{
|
||||
uStoreIndex_QZ.Data.DailyStore = 0;
|
||||
}
|
||||
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
|
||||
step_DailyDataStore = QZ_STATE_S3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S3:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
step_DailyDataStore = QZ_STATE_S0;
|
||||
return SUCCESS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_DailyDataStore = QZ_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
函数名:month_store_proc
|
||||
说 明:月冻结数据存储,存储24个月的冻结数据。
|
||||
每月1号0点1分存储,时间记录为上一个月的月份
|
||||
********************************************************************************/
|
||||
static int QuanZhou_MonthDataStore_proc(void)
|
||||
{
|
||||
switch(step_MonthDataStore)
|
||||
{
|
||||
case QZ_STATE_S0://月冻结数据
|
||||
{
|
||||
QZ_U32_To_Float temp_float_dadta;
|
||||
//清消息
|
||||
RtccGetDateTime(&tempRtccTime_BCD);
|
||||
temp_float_dadta.gp22_u32 = Gp30CheckDataApp(2);
|
||||
temp_month_data.Data.FlowData.gp22_u32 = (u32)temp_float_dadta.gp22_float;
|
||||
temp_month_data.Data.Month = tempRtccTime_BCD.s.month;
|
||||
temp_month_data.Data.Year = tempRtccTime_BCD.s.year;
|
||||
if(tempRtccTime_BCD.s.month>1)
|
||||
{
|
||||
temp_month_data.Data.Month = BCD2HEX(tempRtccTime_BCD.s.month) -1;
|
||||
temp_month_data.Data.Month = HEX2BCD(temp_month_data.Data.Month);
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_month_data.Data.Year = BCD2HEX(tempRtccTime_BCD.s.year) -1;
|
||||
temp_month_data.Data.Year = HEX2BCD(temp_month_data.Data.Year);
|
||||
temp_month_data.Data.Month = 0x12;
|
||||
}
|
||||
step_MonthDataStore = QZ_STATE_S1;
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S1://存储数据
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
if(uStoreIndex_QZ.Data.MonthStore>=24)
|
||||
{
|
||||
uStoreIndex_QZ.Data.MonthStore = 0;
|
||||
}
|
||||
EepWrite(temp_month_data.data_buf, EEP_ADDR_QZ_STORE_MONTH + uStoreIndex_QZ.Data.MonthStore*6, 6, &tempMsg_EE);
|
||||
step_MonthDataStore = QZ_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S2: //存储指针
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
uStoreIndex_QZ.Data.MonthStore++;
|
||||
if(uStoreIndex_QZ.Data.MonthStore>=24)
|
||||
{
|
||||
uStoreIndex_QZ.Data.MonthStore = 0;
|
||||
}
|
||||
EepWrite(&uStoreIndex_QZ.data_buf[0], EEP_ADDR_QZ_STORE_INDEX_WRITE, 2, &tempMsg_EE);
|
||||
step_MonthDataStore = QZ_STATE_S3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S3:
|
||||
{
|
||||
if(TASK_IDLE == EepIfIdle())
|
||||
{
|
||||
step_MonthDataStore = QZ_STATE_S0;
|
||||
return SUCCESS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_MonthDataStore = QZ_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************************
|
||||
函数名:Quanzhou_Store_Machine
|
||||
说 明:泉州数据存储状态机
|
||||
********************************************************************************/
|
||||
void Quanzhou_Store_Machine(void)
|
||||
{
|
||||
switch(step_QuanzhouStoreMachine)
|
||||
{
|
||||
case QZ_STATE_S0://数据存储消息判断
|
||||
{
|
||||
if (FrameCheckMsgApp(Msg_FrozenStore))
|
||||
{
|
||||
FrameClearMsgApp(Msg_FrozenStore);
|
||||
RtccGetDateTime(&protl_rtcc_time);
|
||||
SysCheckTempratureMinMax(protl_rtcc_time);//计算日最高最低水温
|
||||
if((protl_rtcc_time.s.minute==0x00)||(protl_rtcc_time.s.minute==0x30))//半小时间隔流量存储
|
||||
{
|
||||
//计算间隔流量
|
||||
new_jiange_total_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
jiange_data.datas = (u16)((new_jiange_total_flow.gp22_float - old_jiange_total_flow.gp22_float)*10);
|
||||
old_jiange_total_flow.gp22_u32 = new_jiange_total_flow.gp22_u32;
|
||||
//计算本时刻间隔流量存储位置
|
||||
temp_interval_flow_addr = BCD2HEX(protl_rtcc_time.s.hour)*4 + (BCD2HEX(protl_rtcc_time.s.minute)/30)*2;
|
||||
temp_IntervalDataBuf[temp_interval_flow_addr] = jiange_data.datas_map.data0;
|
||||
temp_IntervalDataBuf[temp_interval_flow_addr+1] = jiange_data.datas_map.data1;
|
||||
}
|
||||
if((protl_rtcc_time.s.hour==0)&&(protl_rtcc_time.s.minute==0))//日冻结数据存储
|
||||
{
|
||||
FrameSetMsgApp(MsgQuanzhou_DailySave);
|
||||
if(protl_rtcc_time.s.day == 1)//每月1号0点0分存储月冻结数据
|
||||
{
|
||||
FrameSetMsgApp(MsgQuanzhou_MonthSave);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(FrameCheckMsgApp(MsgQuanzhou_DailySave))//日冻结消息
|
||||
{
|
||||
FrameClearMsgApp(MsgQuanzhou_DailySave); //清消息
|
||||
step_QuanzhouStoreMachine = QZ_STATE_S1;
|
||||
}
|
||||
else if(FrameCheckMsgApp(MsgQuanzhou_MonthSave))//月冻结消息
|
||||
{
|
||||
FrameClearMsgApp(MsgQuanzhou_MonthSave); //清消息
|
||||
step_QuanzhouStoreMachine = QZ_STATE_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S1://日冻结数据存储
|
||||
{
|
||||
if(QuanZhou_DailyDataStore_proc() == SUCCESS)
|
||||
{
|
||||
step_QuanzhouStoreMachine = QZ_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QZ_STATE_S2://月冻结数据存储
|
||||
{
|
||||
if(QuanZhou_MonthDataStore_proc() == SUCCESS)
|
||||
{
|
||||
step_QuanzhouStoreMachine = QZ_STATE_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
step_QuanzhouStoreMachine = QZ_STATE_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/********************************************************************************
|
||||
函数名:get_QZ_StorePara
|
||||
说 明:获取泉州数据存储当前指针
|
||||
********************************************************************************/
|
||||
u8 get_QZ_StorePara(QZ_ParaTypeDef paraType)
|
||||
{
|
||||
switch(paraType)
|
||||
{
|
||||
case QZ_StoreCurIndex_Daily://日冻结存储指针
|
||||
{
|
||||
if(uStoreIndex_QZ.Data.DailyStore>=100)
|
||||
{
|
||||
uStoreIndex_QZ.Data.DailyStore = 0;
|
||||
}
|
||||
return uStoreIndex_QZ.Data.DailyStore;
|
||||
}
|
||||
case QZ_StoreCurIndex_Month://月冻结存储指针
|
||||
{
|
||||
if(uStoreIndex_QZ.Data.MonthStore>=24)
|
||||
{
|
||||
uStoreIndex_QZ.Data.MonthStore = 0;
|
||||
}
|
||||
return uStoreIndex_QZ.Data.MonthStore;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/********************************************************************************
|
||||
函数名:QuanzhouStore_IfSleep
|
||||
说 明:泉州数据存储状态机空闲判断
|
||||
********************************************************************************/
|
||||
u8 QuanzhouStore_IfSleep(void)
|
||||
{
|
||||
if(step_QuanzhouStoreMachine == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
|
||||
#ifndef __UWater_QZ_STORE_APP_H
|
||||
#define __UWater_QZ_STORE_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "type.h"
|
||||
#include "UWater_frame_app.h"
|
||||
|
||||
#define STORE_SIZE_DATA_DAILY 128 //日冻结数据单条长度
|
||||
#define STORE_SIZE_DATA_MONTH 6 //月冻结数据单条长度
|
||||
|
||||
#define EEP_ADDR_QZ_STORE_DAY FRAME_QUANZHOU_STORE_ADD //0x4000日冻结信息(128*100天=12800)
|
||||
#define EEP_ADDR_QZ_STORE_MONTH (EEP_ADDR_QZ_STORE_DAY + STORE_SIZE_DATA_DAILY*100) //0x7200月冻结数据(6*24=144)
|
||||
#define EEP_ADDR_QZ_STORE_INDEX_WRITE (EEP_ADDR_QZ_STORE_MONTH + STORE_SIZE_DATA_MONTH*24) //0x7290 数据存储指针 2字节
|
||||
|
||||
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
u8 buf[4];
|
||||
}QZ_U32_To_Float;
|
||||
|
||||
//数据存储指针
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 DailyStore;
|
||||
u8 MonthStore;
|
||||
}Data;
|
||||
u8 data_buf[2];
|
||||
}UNION_QZ_STORE_INDEX;
|
||||
|
||||
//数据存储指针参数名称
|
||||
typedef enum
|
||||
{
|
||||
QZ_StoreCurIndex_Daily = 0, //日冻结存储指针
|
||||
QZ_StoreCurIndex_Month = 1,//月冻结存储指针
|
||||
} QZ_ParaTypeDef;
|
||||
|
||||
//日冻结数据结构体
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 Head;// 1
|
||||
QZ_U32_To_Float DailyFlowData;//日冻结数据 4
|
||||
u8 StepFlowDataBuf[96];//记录每天半小时间隔流量 96
|
||||
u8 HighestFlowDataBuf[14];//日最高流速及持续时间 14
|
||||
u16 HighestTemp;//日最高温度 2
|
||||
u16 LowestTemp;//日最低温度 2
|
||||
u8 MetState[4];//状态字 4
|
||||
u8 Year;// 3
|
||||
u8 Month;
|
||||
u8 Day;
|
||||
u8 CheckSum;// 1
|
||||
u8 End;// 1
|
||||
}Data;
|
||||
u8 data_buf[STORE_SIZE_DATA_DAILY];
|
||||
}UNION_QZ_STORE_DAY;
|
||||
|
||||
//月冻结数据结构体
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
QZ_U32_To_Float FlowData;
|
||||
u8 Year;
|
||||
u8 Month;
|
||||
}Data;
|
||||
u8 data_buf[STORE_SIZE_DATA_MONTH];
|
||||
}UNION_QZ_STORE_MONTH;
|
||||
|
||||
|
||||
typedef enum{
|
||||
QZ_STATE_S0 = 0,
|
||||
QZ_STATE_S1,
|
||||
QZ_STATE_S2,
|
||||
QZ_STATE_S3,
|
||||
QZ_STATE_S4,
|
||||
QZ_STATE_S5,
|
||||
QZ_STATE_S6,
|
||||
QZ_STATE_S7,
|
||||
QZ_STATE_S8,
|
||||
QZ_STATE_S9,
|
||||
QZ_STATE_S10,
|
||||
QZ_STATE_S11,
|
||||
QZ_STATE_S12,
|
||||
QZ_STATE_S20,
|
||||
QZ_STATE_S21,
|
||||
QZ_STATE_S22,
|
||||
QZ_STATE_S30,
|
||||
QZ_STATE_S31,
|
||||
QZ_STATE_S32,
|
||||
QZ_STATE_S40,
|
||||
QZ_STATE_S41,
|
||||
QZ_STATE_S42,
|
||||
QZ_STATE_S50,
|
||||
QZ_STATE_S51,
|
||||
QZ_STATE_S52,
|
||||
QZ_STATE_S60,
|
||||
QZ_STATE_S61,
|
||||
QZ_STATE_S62,
|
||||
QZ_STATE_S70,
|
||||
QZ_STATE_S71,
|
||||
QZ_STATE_S72,
|
||||
QZ_STATE_S80,
|
||||
QZ_STATE_S81,
|
||||
QZ_STATE_S82,
|
||||
QZ_STATE_S90,
|
||||
QZ_STATE_S91,
|
||||
QZ_STATE_S92
|
||||
}TYP_STATE_QZ;
|
||||
|
||||
void Quanzhou_Store_InitApp(void);
|
||||
void Quanzhou_Store_Machine(void);
|
||||
u8 get_QZ_StorePara(QZ_ParaTypeDef paraType);
|
||||
u8 QuanzhouStore_IfSleep(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __UWater_JIANGXISTORE_APP_H */
|
||||
|
||||
/***************************************************************END OF FILE****/
|
|
@ -0,0 +1,110 @@
|
|||
#include "UWater_frame_app.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_power_app.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_Nb_SS_DataManage.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
#include "UWater_key_app.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_DebugPrint.h"
|
||||
#include "UWater_ir_app.h"
|
||||
#include "UWater_Valve_app.h"
|
||||
#include <string.h>
|
||||
#include "nb_uart_driver_bc25.h"
|
||||
#include "nb_driver_bc25.h"
|
||||
#include "UWater_JX_Store_App.h"
|
||||
|
||||
STRU_UPLOAD_FRAME upload_frame; //coap上报数据帧
|
||||
//获取上报信号值,电池电压
|
||||
static void UploadGetInfo(void)
|
||||
{
|
||||
s16 s_temp_data=0;
|
||||
|
||||
NbiotGetSNR(&s_temp_data);
|
||||
if(s_temp_data<0)
|
||||
{
|
||||
upload_frame.data.UploadInfo.metinfo.snr_val =(-s_temp_data);
|
||||
upload_frame.data.UploadInfo.metinfo.snr_val |= 0x8000;
|
||||
}
|
||||
else
|
||||
{
|
||||
upload_frame.data.UploadInfo.metinfo.snr_val = s_temp_data;
|
||||
}
|
||||
//
|
||||
NbiotGetECL(&s_temp_data);
|
||||
if(s_temp_data<0)
|
||||
{
|
||||
upload_frame.data.UploadInfo.metinfo.ecl_val |= (-s_temp_data)&0x8000;
|
||||
}
|
||||
else
|
||||
{
|
||||
upload_frame.data.UploadInfo.metinfo.ecl_val = s_temp_data;
|
||||
}
|
||||
//
|
||||
NbiotGetRSRP(&s_temp_data);
|
||||
upload_frame.data.UploadInfo.metinfo.RSRP_val = -s_temp_data;
|
||||
NbiotGetCSQ(&upload_frame.data.UploadInfo.metinfo.single_val);
|
||||
upload_frame.data.UploadInfo.metinfo.single_val = (upload_frame.data.UploadInfo.metinfo.single_val / 10)*16 + (upload_frame.data.UploadInfo.metinfo.single_val%10);
|
||||
//获取电压值
|
||||
upload_frame.data.UploadInfo.metinfo.bat_val.u16_data =HexToBcd16(PowerCheckValueSys());
|
||||
upload_frame.data.UploadInfo.metinfo.bat_threshold_val = 0x03;//欠压阈值3v
|
||||
}
|
||||
//更新数据包中的当前流量和信息状态
|
||||
void Upload_RenewCurrentData(void)
|
||||
{
|
||||
MET_STATE temp_state; //状态字
|
||||
u8 temp1 = 0;
|
||||
|
||||
tmp_float.gp22_u32 = Gp30CheckDataApp(2);
|
||||
upload_frame.data.CurrentFlow.datas = (u32)(tmp_float.gp22_float*10);//当前累计流量
|
||||
upload_frame.data.CurrentFlowForward.datas = upload_frame.data.CurrentFlow.datas;//当前累计正向流量
|
||||
tmp_float.gp22_u32 = Gp30CheckDataApp(3);//当前累积逆向流量
|
||||
upload_frame.data.CurrentFlowReverse.datas = (u32)(tmp_float.gp22_float*10);
|
||||
//获取:日最高流量(4字节),日最高流量持续时间(2字节),日最高流量开始时间(8字节,预留)
|
||||
RtccCheck_Hight_Flow(&hight_flow);
|
||||
for(temp1 = 0; temp1 <14 ;temp1++)
|
||||
{
|
||||
upload_frame.data.DailyHighestFlowAndTime[temp1] = *(hight_flow+temp1);
|
||||
}
|
||||
//获取:rsrp(2B),电池电压(2B),信噪比(2B),无线信号覆盖等级ecl(2B),CSQ(1B),电压阈值(1B)
|
||||
UploadGetInfo();//UploadGetReportInfo(upload_frame.data.UploadInfo.byte);
|
||||
//获取间隔流量:2B(间隔流量)X2(次/h)X24h=96B
|
||||
/*
|
||||
上报时通过UPLOAD_DATA_READ_HIS获取,0点存储时通过UPLOAD_DATA_STEP_FLOW获取
|
||||
*/
|
||||
//上报时间
|
||||
RtccGetDateTime(&Rtcc_time);//上报时间
|
||||
upload_frame.data.UploadTime[0] = Rtcc_time.s.second;
|
||||
upload_frame.data.UploadTime[1] = Rtcc_time.s.minute;
|
||||
upload_frame.data.UploadTime[2] = Rtcc_time.s.hour;
|
||||
upload_frame.data.UploadTime[3] = Rtcc_time.s.day;
|
||||
upload_frame.data.UploadTime[4] = Rtcc_time.s.month;
|
||||
upload_frame.data.UploadTime[5] = Rtcc_time.s.year;
|
||||
upload_frame.data.UploadTime[6] = 0x20;
|
||||
//间隔流量起始时间
|
||||
upload_frame.data.StepFlowStartTime[0]= 0x00;
|
||||
upload_frame.data.StepFlowStartTime[1]= 0x00;
|
||||
upload_frame.data.StepFlowStartTime[2]= 0x00;
|
||||
upload_frame.data.StepFlowStartTime[3]= g_date_jiange.s.day ;
|
||||
upload_frame.data.StepFlowStartTime[4]= g_date_jiange.s.month;
|
||||
upload_frame.data.StepFlowStartTime[5]= g_date_jiange.s.year;
|
||||
upload_frame.data.StepFlowStartTime[6]= 0x20;
|
||||
//状态字
|
||||
temp_state = FrameGetByte();
|
||||
upload_frame.data.StateBytes[0] = temp_state.stat0;
|
||||
upload_frame.data.StateBytes[1] = temp_state.stat1;
|
||||
upload_frame.data.StateBytes[2] = temp_state.stat2;
|
||||
upload_frame.data.StateBytes[3] = temp_state.stat3;
|
||||
upload_frame.data.StateBytes[4] = temp_state.stat4;
|
||||
//累计活跃时间
|
||||
upload_frame.data.DailyActiveTime.datas = g_activity_times;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,370 @@
|
|||
|
||||
#ifndef __UWater_SY_STORE_APP_H
|
||||
#define __UWater_SY_STORE_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "sys_config.h"
|
||||
#if PRODUCT_SY
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_Rtcc_driver.h"
|
||||
|
||||
#define STORE_SIZE_DATA_CIRCLE 16 //周期数据单条长度
|
||||
#define STORE_SIZE_DATA_FROZEN 32 //冻结数据单条长度
|
||||
|
||||
#define EEP_DATA_LEN_CIRCLE (STORE_SIZE_DATA_CIRCLE*24*6)//2352//周期数据存储和指针长度
|
||||
|
||||
#define EEP_ADDR_SY_STORE_CIRCLE FRAME_SHENYANG_STORE_ADD //0x7300~0x7C00 周期数据16*24*6=2304=0x900
|
||||
#define EEP_ADDR_SY_STORE_INDEX_CIRCLE (EEP_ADDR_SY_STORE_CIRCLE + STORE_SIZE_DATA_CIRCLE*24*6) //数据存储指针_周期数据_48BYTE
|
||||
#define EEP_ADDR_SY_STORE_INDEX_DAILY (EEP_ADDR_SY_STORE_INDEX_CIRCLE + 66)////数据存储指针_日冻结数据_1BYTE
|
||||
#define EEP_ADDR_SY_STORE_INDEX_MONTH (EEP_ADDR_SY_STORE_INDEX_DAILY + 1)////数据存储指针_月冻结数据_1BYTE
|
||||
#define EEP_ADDR_SY_STORE_INDEX_YEAR (EEP_ADDR_SY_STORE_INDEX_MONTH + 1)////数据存储指针_年冻结数据_1BYTE
|
||||
#define EEP_ADDR_SY_FIRST_PWON (EEP_ADDR_SY_STORE_INDEX_YEAR + 1)
|
||||
//参数存储地址
|
||||
#define EEP_ADDR_SY_TLVDATA (EEP_ADDR_SY_FIRST_PWON+1) //104字节
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#define EEP_DATA_LEN_FROZEN (STORE_SIZE_DATA_FROZEN*31)//995//冻结数据存储和指针长度
|
||||
|
||||
#define EEP_ADDR_SY_STORE_FROZEN_DAILY EEP_RTCC_APP_HISTORY_ADDR //0x440 日冻结数据(32*7)
|
||||
#define EEP_ADDR_SY_STORE_FROZEN_MONTH (EEP_ADDR_SY_STORE_FROZEN_DAILY + STORE_SIZE_DATA_FROZEN*7) //月冻结数据(32*18)
|
||||
#define EEP_ADDR_SY_STORE_FROZEN_YEAR (EEP_ADDR_SY_STORE_FROZEN_MONTH + STORE_SIZE_DATA_FROZEN*18) //年冻结数据(32*6)
|
||||
|
||||
#define SY_FIRST_POWERON_FLAG 0x56
|
||||
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
u8 buf[4];
|
||||
}SY_U32_To_Float;
|
||||
|
||||
//数据存储指针参数名称
|
||||
typedef enum
|
||||
{
|
||||
SY_StoreCurIndex_Daily = 0,//日冻结存储指针
|
||||
SY_StoreCurIndex_Month = 1,//月冻结存储指针
|
||||
SY_StoreCurIndex_Year = 2//月冻结存储指针
|
||||
} SY_ParaTypeDef;
|
||||
|
||||
//周期数据结构体
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u32 CurrentFlow;//正向累计流量
|
||||
u32 CurrentFlowReverse;//负向累计流量
|
||||
u32 InstantaneousFlow;//瞬时流量
|
||||
u16 Presure;//压力
|
||||
u16 Temprature;//温度
|
||||
}Data;
|
||||
u8 data_buf[STORE_SIZE_DATA_CIRCLE];
|
||||
}UNION_SY_STORE_CIRCLE;
|
||||
|
||||
//周期数据存储索引结构体
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
DateTime CircleDataTime;//年月日时(分秒),分秒为0,使用DateTime格式而不是DateTime_noweek格式,已便于计算
|
||||
u8 CircleCntStart;
|
||||
u8 CircleCntEnd;
|
||||
u8 ReadStart; //读取周期数据时使用
|
||||
u8 ReadEnd;
|
||||
}Data;
|
||||
u8 data_buf[11];
|
||||
}TYPE_CIRCLE_INDEX;
|
||||
|
||||
typedef union
|
||||
{
|
||||
TYPE_CIRCLE_INDEX CircleIndex[6];
|
||||
u8 data_buf[66];
|
||||
}UNION_SY_STORE_CIRCLE_INDEX;
|
||||
|
||||
//数据存储指针
|
||||
#define SIZE_SY_STORE_INDEX (11*6+3+1)//70
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UNION_SY_STORE_CIRCLE_INDEX Circle;//周期数据存储指针
|
||||
u8 Daily;//日冻结数据存储指针
|
||||
u8 Month;//月冻结数据存储指针
|
||||
u8 Year;//年冻结数据存储指针
|
||||
u8 firstPowerOn;//第一次上电标志
|
||||
}Data;
|
||||
u8 data_buf[SIZE_SY_STORE_INDEX];
|
||||
}UNION_SY_STORE_INDEX;
|
||||
|
||||
//冻结数据结构体
|
||||
/**
|
||||
日期 3
|
||||
时间 3
|
||||
正向累计流量 4
|
||||
负向累计流量 4
|
||||
峰值流量 4
|
||||
峰值流量时间 3
|
||||
电池电压 6
|
||||
水表状态 1
|
||||
水表故障 1
|
||||
阀门状态 1
|
||||
预留 1
|
||||
校验和 1
|
||||
总字节数 32
|
||||
*/
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
DateTime_noweek FrozenDataTime; //日期时间 6
|
||||
u32 CurrentFlow;//正向累计流量 4
|
||||
u32 CurrentFlowReverse;//负向累计流量 4
|
||||
u32 PeakCurrentFlow;//峰值流量 4
|
||||
u8 PeakCurrentFlowTime[3];//时分秒 3
|
||||
u8 BatPower[6];//电池电压 6
|
||||
u8 MeterState;//水表状态 1
|
||||
u8 MeterFault;//水表故障 1
|
||||
u8 ValveState;//阀门状态 1
|
||||
u8 Reverse; //预留 1
|
||||
u8 CheckSum;// 1
|
||||
}Data;
|
||||
u8 data_buf[STORE_SIZE_DATA_FROZEN];
|
||||
}UNION_SY_STORE_FROZEN;
|
||||
|
||||
/**TLV 数据格式的参数**/
|
||||
typedef enum
|
||||
{
|
||||
TagWarningId = 0, //即时报警ID
|
||||
TagOverFlowCurrent = 1, //过流报警的阈值,单位0.1L/H
|
||||
TagOverFlowMinute = 2, //持续过流时间
|
||||
TagReverseFlowCurrent = 3, //反流报警的阈值,单位0.1L/H
|
||||
TagReverseFlowMinute = 4, //持续反流报警时间
|
||||
TagLeakFlowMinute = 5, //漏水报警时间
|
||||
TagPowerLow001V = 6, //电压报警阈值
|
||||
TagNoWaterMinute = 7, //空管报警时间
|
||||
TagValveState = 8, //阀门状态
|
||||
TagUploadStartTime = 12, //数据上报起始时间a
|
||||
TagCircleData5Minutes = 13,//周期数据时间间隔a
|
||||
TagDataFrozenTimeDailay = 14,//日冻结时间
|
||||
TagDataFrozenTimeMonth = 15, //月冻结时间
|
||||
TagUploadRetryTimes = 16,//上报重发次数
|
||||
TagUploadRetryDelayMinite = 17,//重发延时时间
|
||||
TagUploadIntervalHour = 18,//数据上报时间间隔a
|
||||
TagServerIpPort = 21, //服务器地址a
|
||||
TagAPN = 22, //APN信息
|
||||
TagWorkTime = 31 //水表运行时间
|
||||
|
||||
}TypeDef_TLVTag;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LenWarningId = 2, //即时报警ID-----------------------------2
|
||||
LenOverFlowCurrent = 4, //过流报警的阈值,单位0.1L/H-------4
|
||||
LenOverFlowMinute = 1, //持续过流时间----------------------1
|
||||
LenReverseFlowCurrent = 4, //反流报警的阈值,单位0.1L/H----4
|
||||
LenReverseFlowMinute = 1, //持续反流报警时间---------------1
|
||||
LenLeakFlowMinute = 1, //漏水报警时间----------------------1
|
||||
LenPowerLow001V = 2, //电压报警阈值------------------------2
|
||||
LenNoWaterMinute = 1, //空管报警时间-----------------------1
|
||||
LenValveState = 7, //阀门状态---------------------------7
|
||||
LenUploadStartTime = 4, //数据上报起始时间a-------------4
|
||||
LenCircleData5Minutes = 1, //周期数据时间间隔a-------------1
|
||||
LenDataFrozenTimeDailay = 1, //日冻结时间------------------1
|
||||
LenDataFrozenTimeMonth = 2, //月冻结时间----------------2
|
||||
LenUploadRetryTimes = 1, //上报重发次数--------------------1
|
||||
LenUploadRetryDelayMinite = 1, //重发延时时间--------------1
|
||||
LenUploadIntervalHour = 1, //数据上报时间间隔a-------------1
|
||||
LenServerIpPort = 32, //服务器地址a--------------------32
|
||||
LenAPN = 32, //APN信息---------------------------------32
|
||||
LenWorkTime = 6 //水表运行时间-------------------------6
|
||||
}TypeDef_TLVDataLen;
|
||||
|
||||
//水表参数定义
|
||||
#define TLV_VALUE_LEN 104
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 ValueWarningId[2];//即时报警ID--------------------------2
|
||||
u8 ValueOverFlowCurrent[4];//过流报警的阈值,单位0.1L/H----4
|
||||
u8 ValueOverFlowMinute;//持续过流时间----------------------1
|
||||
u8 ValueReverseFlowCurrent[4];//反流报警的阈值,单位0.1L/H-4
|
||||
u8 ValueReverseFlowMinute;//持续反流报警时间---------------1
|
||||
u8 ValueLeakFlowMinute;//漏水报警时间----------------------1
|
||||
u8 ValuePowerLow001V[2];//电压报警阈值---------------------2
|
||||
u8 ValueNoWaterMinute;//空管报警时间-----------------------1
|
||||
u8 ValueValveState[7];//阀门状态---------------------------7
|
||||
u8 ValueUploadStartTime[4];//数据上报起始时间a-------------4
|
||||
u8 ValueCircleData5Minutes;//周期数据时间间隔a-------------1
|
||||
u8 ValueDataFrozenTimeDailay;//日冻结时间------------------1
|
||||
u8 ValueDataFrozenTimeMonth[2];//月冻结时间----------------2
|
||||
u8 ValueUploadRetryTimes;//上报重发次数--------------------1
|
||||
u8 ValueUploadRetryDelayMinite;//重发延时时间--------------1
|
||||
u8 ValueUploadIntervalHour;//数据上报时间间隔a-------------1
|
||||
u8 ValueServerIpPort[32];//服务器地址a--------------------32
|
||||
u8 ValueAPN[32];//APN信息---------------------------------32
|
||||
u8 ValueWorkTime[6];//水表运行时间-------------------------6
|
||||
}s;
|
||||
u8 data_buf[TLV_VALUE_LEN];
|
||||
}Type_TLVValue;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AddrWarningId = 0, //即时报警ID-----------------------------2
|
||||
AddrOverFlowCurrent = 2, //过流报警的阈值,单位0.1L/H-------4
|
||||
AddrOverFlowMinute = 6, //持续过流时间----------------------1
|
||||
AddrReverseFlowCurrent = 7, //反流报警的阈值,单位0.1L/H----4
|
||||
AddrReverseFlowMinute = 11,//持续反流报警时间---------------1
|
||||
AddrLeakFlowMinute = 12,//漏水报警时间----------------------1
|
||||
AddrPowerLow001V = 13,//电压报警阈值------------------------2
|
||||
AddrNoWaterMinute = 15,//空管报警时间-----------------------1
|
||||
AddrValveState = 16,//阀门状态---------------------------7
|
||||
AddrUploadStartTime = 23, //数据上报起始时间a-------------4
|
||||
AddrCircleData5Minutes = 27,//周期数据时间间隔a-------------1
|
||||
AddrDataFrozenTimeDailay = 28,//日冻结时间------------------1
|
||||
AddrDataFrozenTimeMonth = 29, //月冻结时间----------------2
|
||||
AddrUploadRetryTimes = 31,//上报重发次数--------------------1
|
||||
AddrUploadRetryDelayMinite = 32,//重发延时时间--------------1
|
||||
AddrUploadIntervalHour = 33,//数据上报时间间隔a-------------1
|
||||
AddrServerIpPort = 34, //服务器地址a--------------------32
|
||||
AddrAPN = 66, //APN信息---------------------------------32
|
||||
AddrWorkTime = 98 //水表运行时间-------------------------6
|
||||
}TypeDef_TLVDataAddr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const TypeDef_TLVTag Tag;
|
||||
const TypeDef_TLVDataLen Len;
|
||||
TypeDef_TLVDataAddr ValueAddr;
|
||||
u8 EditFlag;//是否修改,0不修改, 1修改
|
||||
} TypeDef_TLVStruct;
|
||||
|
||||
#define TLV_STR_BUF_LEN 19
|
||||
static TypeDef_TLVStruct TlvStrBuf[TLV_STR_BUF_LEN]={
|
||||
{TagWarningId, LenWarningId, AddrWarningId, 0},
|
||||
{TagOverFlowCurrent, LenOverFlowCurrent, AddrOverFlowCurrent, 0},
|
||||
{TagOverFlowMinute, LenOverFlowMinute, AddrOverFlowMinute, 0},
|
||||
{TagReverseFlowCurrent, LenReverseFlowCurrent, AddrReverseFlowCurrent, 0},
|
||||
{TagReverseFlowMinute, LenReverseFlowMinute, AddrReverseFlowMinute, 0},
|
||||
{TagLeakFlowMinute, LenLeakFlowMinute, AddrLeakFlowMinute, 0},
|
||||
{TagPowerLow001V, LenPowerLow001V, AddrPowerLow001V, 0},
|
||||
{TagNoWaterMinute, LenNoWaterMinute, AddrNoWaterMinute, 0},
|
||||
{TagValveState, LenValveState, AddrValveState, 0},
|
||||
{TagUploadStartTime, LenUploadStartTime, AddrUploadStartTime, 0},
|
||||
{TagCircleData5Minutes, LenCircleData5Minutes, AddrCircleData5Minutes, 0},
|
||||
{TagDataFrozenTimeDailay, LenDataFrozenTimeDailay, AddrDataFrozenTimeDailay, 0},
|
||||
{TagDataFrozenTimeMonth, LenDataFrozenTimeMonth, AddrDataFrozenTimeMonth, 0},
|
||||
{TagUploadRetryTimes, LenUploadRetryTimes, AddrUploadRetryTimes, 0},
|
||||
{TagUploadRetryDelayMinite, LenUploadRetryDelayMinite, AddrUploadRetryDelayMinite,0},
|
||||
{TagUploadIntervalHour, LenUploadIntervalHour, AddrUploadIntervalHour, 0},
|
||||
{TagServerIpPort, LenServerIpPort, AddrServerIpPort, 0},
|
||||
{TagAPN, LenAPN, AddrAPN, 0},
|
||||
{TagWorkTime, LenWorkTime, AddrWorkTime, 0}
|
||||
};
|
||||
/*报警触发上报标志位
|
||||
0 流量超限
|
||||
1 空管报警
|
||||
2 反流报警
|
||||
3 漏水报警
|
||||
4 低电压报警
|
||||
5 温度超范围
|
||||
6 上盖被打开
|
||||
7 阀门动作
|
||||
8-11 预留
|
||||
12-15 厂家自定义
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
UPLOAD_OVER_FLOW = 0,//流量超限--
|
||||
UPLOAD_NO_WATER, //空管报警--
|
||||
UPLOAD_REVERSE_FLOW, //反流报警--
|
||||
UPLOAD_LEAK_FLOW,//漏水报警--
|
||||
UPLOAD_LOW_POWER,//低电压报警---
|
||||
UPLOAD_TEMP_OVER,//温度超范围--
|
||||
UPLOAD_SHELL_OPEN,//上盖被打开
|
||||
UPLOAD_VALVE_CHANGE//阀门动作--
|
||||
}TypeDef_UploadWarning;
|
||||
/*状态号*/
|
||||
typedef enum{
|
||||
SY_STATE_S0 = 0,
|
||||
SY_STATE_S1,
|
||||
SY_STATE_S2,
|
||||
SY_STATE_S3,
|
||||
SY_STATE_S4,
|
||||
SY_STATE_S5,
|
||||
SY_STATE_S6,
|
||||
SY_STATE_S7,
|
||||
SY_STATE_S8,
|
||||
SY_STATE_S9,
|
||||
SY_STATE_S10,
|
||||
SY_STATE_S11,
|
||||
SY_STATE_S12,
|
||||
SY_STATE_S13,
|
||||
SY_STATE_S20,
|
||||
SY_STATE_S21,
|
||||
SY_STATE_S22,
|
||||
SY_STATE_S30,
|
||||
SY_STATE_S31,
|
||||
SY_STATE_S32,
|
||||
SY_STATE_S40,
|
||||
SY_STATE_S41,
|
||||
SY_STATE_S42,
|
||||
SY_STATE_S50,
|
||||
SY_STATE_S51,
|
||||
SY_STATE_S52,
|
||||
SY_STATE_S60,
|
||||
SY_STATE_S61,
|
||||
SY_STATE_S62,
|
||||
SY_STATE_S70,
|
||||
SY_STATE_S71,
|
||||
SY_STATE_S72,
|
||||
SY_STATE_S80,
|
||||
SY_STATE_S81,
|
||||
SY_STATE_S82,
|
||||
SY_STATE_S90,
|
||||
SY_STATE_S91,
|
||||
SY_STATE_S92
|
||||
}TYP_STATE_SY;
|
||||
|
||||
|
||||
|
||||
|
||||
void ShenYang_Store_InitApp(void);
|
||||
void ShenYang_Store_Machine(void);
|
||||
void ShenYang_SOE_Machine(void);
|
||||
u8 get_SY_StorePara(SY_ParaTypeDef paraType);
|
||||
u8 ShenYangStore_IfSleep(void);
|
||||
//int NB_SY_Frame_Upload_Warning(u8 *pBuf);
|
||||
|
||||
u8 getSY_StoreCircleIndex(void);
|
||||
u8 getSY_CircleUploadPackets(void);
|
||||
u8 getSY_ThisCirclePacket_Index(u8 current_packet);
|
||||
int NB_SY_Frame_Upload_Data(u8 index, u8 *pBuf);
|
||||
int NB_SY_Frame_Upload_CurrentData(u8 *pBuf);
|
||||
void SY_GetCircleDateTime(DateTime *pDT, u8 index, u8 UploadOrRead);
|
||||
u8 SY_GetCircleReadStartEnd(u8 index, u8 StartOrEnd);
|
||||
int ShenYang_CircleDataStore_ClearUploadIndex(u8 index);
|
||||
void ShenYang_TlvDataStoreMachine(void);
|
||||
//计算往前几天的日期和时间,带周
|
||||
DateTime getBackDateTime(u8 backDays);
|
||||
//计算往前几天的日期和时间,不带周
|
||||
DateTime_noweek getBackDateTimeNoWeek(u8 backDays);
|
||||
u8 getSY_CircleDataPackets(u8 readDays, u8 *pIndexBuf);
|
||||
u8 checkWarningUploadState(TypeDef_UploadWarning tWarningType);
|
||||
u8 GetTLVData(u8 Tag, u8 Len, u8* pValue);
|
||||
u8 SetTLVData(u8 Tag, u8 Len, u8* pValue);
|
||||
u8 getTlvTagIndex(u8 inTag);
|
||||
u8 getWaterState(void);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __UWater_JIANGXISTORE_APP_H */
|
||||
|
||||
/***************************************************************END OF FILE****/
|
|
@ -0,0 +1,778 @@
|
|||
|
||||
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_TemperatureCalculate_app.h"
|
||||
#include "UWater_gp22_driver.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
|
||||
//0-100℃对应的超声波速度 单位m/s
|
||||
const float sound_speed_in_water[101]=
|
||||
{1402.336,
|
||||
1407.31196 ,1412.173988,1416.924022,1421.563966,1426.095691,
|
||||
1430.521033,1434.841795,1439.059749,1443.176633,1447.194154,
|
||||
1451.113987,1454.937777,1458.667135,1462.303645,1465.84886 ,
|
||||
1469.304301,1472.671463,1475.95181 ,1479.146777,1482.257772,
|
||||
1485.286175,1488.233337,1491.100583,1493.889211,1496.600493,
|
||||
1499.235674,1501.795973,1504.282585,1506.69668 ,1509.039401,
|
||||
1511.311869,1513.515181,1515.65041 ,1517.718606,1519.720794,
|
||||
1521.657981,1523.531149,1525.341257,1527.089246,1528.776035,
|
||||
1530.40252 ,1531.969579,1533.478071,1534.928834,1536.322685,
|
||||
1537.660427,1538.942839,1540.170687,1541.344717,1542.465656,
|
||||
1543.534218,1544.551096,1545.51697 ,1546.432504,1547.298344,
|
||||
1548.115124,1548.88346 ,1549.603957,1550.277204,1550.903775,
|
||||
1551.484234,1552.01913 ,1552.508999,1552.954367,1553.355746,
|
||||
1553.713636,1554.028529,1554.300904,1554.53123 ,1554.719965,
|
||||
1554.86756 ,1554.974453,1555.041077,1555.067854,1555.055198,
|
||||
1555.003516,1554.913207,1554.784663,1554.61827 ,1554.414405,
|
||||
1554.173443,1553.89575 ,1553.581689,1553.231616,1552.845885,
|
||||
1552.424843,1551.968835,1551.478204,1550.953285,1550.394416,
|
||||
1549.801928,1549.176154,1548.517423,1547.826062,1547.102399,
|
||||
1546.346762,1545.559476,1544.740868,1543.891267,1543.011 ,
|
||||
};
|
||||
|
||||
#if WENDU_FANSUAN_OPEN
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
TEMP_IVVERSE_UNION_MSG temp_inverse_struct_msg;//温度反算对外消息联合体
|
||||
Temp_Inverse_Data1 Temp_Inverse_Data;//反算温度对于单程时间处理
|
||||
|
||||
|
||||
//单程时间滤波相关参数
|
||||
u32 gp30_tof_up_down_head =0;//
|
||||
u32 gp30_tof_up_down_length=0;
|
||||
u32 gp30_tof_up_data[MAX_TEMP_NUM]; //用于采集up单程时间 2020-12-05
|
||||
u32 gp30_tof_down_data[MAX_TEMP_NUM]; //用于采集up单程时间 2020-12-05
|
||||
u32 gp30_tof_up_filter_value =0;//up滤波值
|
||||
u32 gp30_tof_down_filter_value =0;//down滤波值
|
||||
|
||||
//单程时间校准插值相关参数
|
||||
u8 gp30_tof_buchang_head =0;
|
||||
u8 gp30_tof_buchang_length =0;
|
||||
float gp30_tof_up_chazhi_filter_value =0;//up滤波值
|
||||
float gp30_tof_down_chazhi_filter_value =0;//down滤波值
|
||||
float gp30_tof_up_buchang_data[MAX_TOF_BUCHANG_NUM]={0};
|
||||
float gp30_tof_down_buchang_data[MAX_TOF_BUCHANG_NUM]={0};
|
||||
|
||||
u8 tof_caliberate_state = TOF_BUCHANG_IDLE;//空闲状态不采集数据
|
||||
|
||||
|
||||
//单程时间原始数据存储BUF
|
||||
static u32 s_g_fhl_tof_up_data[GP22_APP_TEMP_INVERSE_DATA_SIZE_FIVE]={0}; //FHL_TOF_UP采集队列
|
||||
static u32 s_g_fhl_tof_down_data[GP22_APP_TEMP_INVERSE_DATA_SIZE_FIVE]={0}; //FHL_TOF_DOWN采集队列
|
||||
|
||||
u32 tof_down_data[MAX_TEMP_NUM]={0};//记录down的单程时间中与UP单程时间对应位置的数据
|
||||
|
||||
//继承变量
|
||||
extern GP30_SYS_Date gp22_app_data; //gp22当前数据
|
||||
extern GP30_SYS_Date gp22_test_data; //gp22检定状态下当前数据
|
||||
extern GP30_APP_SAVE_DATA g_sample_save_data; //当前数据备份
|
||||
extern u32 s_g_up_am[GP22_APP_TEMP_INVERSE_DATA_SIZE+GP22_APP_TEMP_INVERSE_DATA_SIZE]; //am采集队列 数组中前4个存储第4~第7个波形振幅,后4个存储第8~第11个波形振幅
|
||||
extern u32 s_g_down_am[GP22_APP_TEMP_INVERSE_DATA_SIZE+GP22_APP_TEMP_INVERSE_DATA_SIZE]; //down采集队列 数组中前4个存储第4~第7个波形振幅,后4个存储第8~第11个波形振幅
|
||||
extern float temp_calculate_last;
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*温度反算流程第一步:单程时间与振幅数据采集与处理*/
|
||||
|
||||
/****************************************************************
|
||||
Function: void Tof_And_AM_Data_Collect(u8 i,u32 s_g_tof_am_pointer)
|
||||
Description: 采集GP30给的up和down单程时间、up和down对应的振幅
|
||||
函数性质: 外部接口函数
|
||||
*****************************************************************/
|
||||
void Tof_And_AM_Data_Collect(u8 i,u32 s_g_tof_am_pointer)
|
||||
{
|
||||
u32 s_g_tof_am_data[GP22_APP_QUEUE_SIZE]={0};
|
||||
s_g_tof_am_data[i] = s_g_tof_am_pointer;
|
||||
s_g_tof_am_data[i] = (s_g_tof_am_data[i] & 0x000000FFU) << 24 | (s_g_tof_am_data[i] & 0x0000FF00U) << 8 | (s_g_tof_am_data[i] & 0x00FF0000U) >> 8 | (s_g_tof_am_data[i] & 0xFF000000U) >> 24; //大小端转换
|
||||
//温度反算传上来的TOF值和振幅值处理(详见设计文档里传输的数据内容)
|
||||
if((0==i%GP22_APP_TEMP_INVERSE_DATA_SIZE)&&(i!=GP22_APP_QUEUE_SIZE-1))//传输的第1 4 7 10 13个数据为FHL 5-9波的up单程时间
|
||||
{
|
||||
s_g_fhl_tof_up_data[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=s_g_tof_am_data[i];//传输的第1 4 7 10 个数据为FHL 5-9波的up单程时间
|
||||
}
|
||||
else if(1==i%GP22_APP_TEMP_INVERSE_DATA_SIZE)//传输的第2 5 8 11 14 个数据为FHL 5-9波的down单程时间
|
||||
{
|
||||
s_g_fhl_tof_down_data[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=s_g_tof_am_data[i];//传输的第2 5 8 11 14 个数据为FHL 5-9波的down单程时间
|
||||
}
|
||||
else if((2==i%GP22_APP_TEMP_INVERSE_DATA_SIZE)||(i==GP22_APP_QUEUE_SIZE-1))//传输的第3 6 9 12 15 16 个数据为FHL 5-10波的up(左移16位高16)|down(低16位)单程时间
|
||||
{
|
||||
s_g_up_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=s_g_tof_am_data[i]>>16;//获取UP的振幅
|
||||
if(0xF000==(s_g_up_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]&0xF000))//如果振幅F开头说明是负的振幅,负振幅处理为0
|
||||
{
|
||||
s_g_up_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=0;
|
||||
}
|
||||
s_g_down_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=s_g_tof_am_data[i]&0x0000FFFF;//获取DOWN的振幅
|
||||
if(0xF000==(s_g_down_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]&0xF000))//如果振幅F开头说明是负的振幅,负振幅处理为0
|
||||
{
|
||||
s_g_down_am[i/GP22_APP_TEMP_INVERSE_DATA_SIZE]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
Function: void Tof_Calcuate_Average(u32 *tof_up, u32 *tof_down, u8 data_len)
|
||||
Description: 分别对up 和Down 单程时间求取平均值
|
||||
函数性质: 内部函数
|
||||
*****************************************************************/
|
||||
void Tof_Calcuate_Average(u32 *tof_up, u32 *tof_down, u8 data_len)
|
||||
{
|
||||
u8 i = 0;
|
||||
u32 sum_tof_up=0,sum_tof_down=0;
|
||||
for(i = 0;i< data_len;i++)
|
||||
{
|
||||
sum_tof_up += tof_up[i];//求取UP单程时间均值
|
||||
sum_tof_down += tof_down[i];//求取Down单程时间均值
|
||||
}
|
||||
if((sum_tof_up!=0)&&(sum_tof_down!=0))//无水情况下 单程时间为零
|
||||
{
|
||||
gp22_test_data.s.TOF_up = (sum_tof_up/data_len)-TOF_6_US;//将up的单程时间平均值与6us做差后给到TOF_UP
|
||||
gp22_test_data.s.TOF_down = (sum_tof_down/data_len)-TOF_6_US;//将up的单程时间平均值与6us做差后给到TOF_DOWN
|
||||
}
|
||||
else
|
||||
{
|
||||
gp22_test_data.s.TOF_up = 0;
|
||||
gp22_test_data.s.TOF_down=0;
|
||||
}
|
||||
}
|
||||
/****************************************************************
|
||||
Function: AM_Calcuate_Average(u32 *up_am, u32 *down_am, u8 data_len)
|
||||
Description: 分别对up 和Down 振幅求取平均值
|
||||
函数性质: 内部函数
|
||||
*****************************************************************/
|
||||
void AM_Calcuate_Average(u32 *up_am, u32 *down_am, u8 data_len)
|
||||
{
|
||||
u8 i = 0,down_am_cnt=0,up_am_cnt=0;
|
||||
u32 sum_am_up=0,sum_am_down=0;
|
||||
|
||||
for(i = 0;i< data_len;i++)
|
||||
{
|
||||
if((s_g_up_am[i]>0)&&(s_g_up_am[i]<UP_AM_MAX))
|
||||
{
|
||||
sum_am_up += s_g_up_am[i];
|
||||
up_am_cnt++;
|
||||
}
|
||||
if((s_g_down_am[i]>0)&&(s_g_down_am[i]<DOWN_AM_MAX))
|
||||
{
|
||||
sum_am_down += s_g_down_am[i];
|
||||
down_am_cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
if(down_am_cnt!=0)
|
||||
{
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.down_am_average = sum_am_down / down_am_cnt;//求取Up振幅均值
|
||||
}
|
||||
else
|
||||
{
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.down_am_average = 0;//求取Down振幅均值
|
||||
}
|
||||
|
||||
if(up_am_cnt!=0)
|
||||
{
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.up_am_average = sum_am_up / up_am_cnt;//求取UP振幅均值
|
||||
}
|
||||
else
|
||||
{
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.up_am_average = 0;//求取UP振幅均值 = 0;
|
||||
}
|
||||
}
|
||||
/***************************************************************
|
||||
函数名称: Gp30_Tof_Save(void)
|
||||
功 能; 单程时间采集函数----分别将up和down的单程时间存储到相应的BUFFER中
|
||||
函数性质: 内部函数
|
||||
****************************************************************/
|
||||
void Gp30_Tof_Save(void)
|
||||
{
|
||||
gp30_tof_up_data[gp30_tof_up_down_head] = gp22_test_data.s.TOF_up; //将单程时间存入到数组中
|
||||
gp30_tof_down_data[gp30_tof_up_down_head]= gp22_test_data.s.TOF_down; //将单程时间存入到数组中
|
||||
gp30_tof_up_down_head++;
|
||||
if(MAX_TEMP_NUM!=gp30_tof_up_down_head)//采样数组满了一次
|
||||
{
|
||||
if(gp30_tof_up_down_length != MAX_TEMP_NUM)//当BUF中数据已经存满一次了
|
||||
{
|
||||
gp30_tof_up_down_length = gp30_tof_up_down_head;//
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gp30_tof_up_down_length = MAX_TEMP_NUM;
|
||||
}
|
||||
gp30_tof_up_down_head %= MAX_TEMP_NUM;
|
||||
}
|
||||
/****************************************************************
|
||||
Function: 单程时间滤波函数
|
||||
Description:*p 指向单程时间数组首地址 len 数据长度 flag 0:tof_up 1:tof_down
|
||||
函数性质: 内部函数
|
||||
*****************************************************************/
|
||||
u32 Filter_FOR_TOFDOWN(u32 *p, u8 len) //
|
||||
{
|
||||
u8 i,cnt=0,max_count=0,min_count=0;//max_count:记录大数单程时间个数 min_count:记录小数单程时间个数
|
||||
u32 sum=0,sum_max=0,sum_min=0,tof_max=0,tof_min=0,tof_dif_max=0,tof_dif_min=0,tof_current=0;/*sum:单程时间累加和;sum_max:大数单程时间之间累加和
|
||||
sum_min:大数单程时间之间累加和 tof_max:最大单程时间
|
||||
tof_min:最小单程时间 tof_dif_max:最大单程时间与各个单程时间的差值
|
||||
tof_dif_min:最大单程时间与各个单程时间的差值 tof_current: 本次计算得到的单程时间*/
|
||||
|
||||
static u32 tof_down_last=0;//记录up和down的上次数值的单程时间
|
||||
|
||||
if(0==tof_down_data[0])
|
||||
{
|
||||
tof_current = tof_down_last;
|
||||
return tof_current;
|
||||
}
|
||||
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
if(0==tof_down_data[i])
|
||||
{
|
||||
break;//确定数据长度
|
||||
}
|
||||
}
|
||||
cnt = i;//记录有效数据个数
|
||||
|
||||
if(1==cnt)
|
||||
{
|
||||
tof_current = tof_down_data[0];
|
||||
tof_down_last = tof_current; //存储上次的单程时间滤波值
|
||||
return tof_current;
|
||||
}
|
||||
|
||||
|
||||
tof_max = tof_down_data[0];
|
||||
tof_min = tof_down_data[0];
|
||||
|
||||
//找到最大 最小值
|
||||
for(i=0;i<cnt;i++)
|
||||
{
|
||||
if((tof_down_data[i]>=tof_max))
|
||||
{
|
||||
tof_max = tof_down_data[i];
|
||||
}
|
||||
if((tof_down_data[i]<=tof_min))
|
||||
{
|
||||
tof_min = tof_down_data[i];
|
||||
}
|
||||
}
|
||||
|
||||
//判定
|
||||
for(i=0;i<cnt;i++)
|
||||
{
|
||||
tof_dif_max = tof_max - tof_down_data[i];
|
||||
if(tof_dif_max <= TOF_MAX_DIF_FOR_HUADONG)//200ns
|
||||
{
|
||||
max_count++;
|
||||
sum_max += tof_down_data[i];
|
||||
}
|
||||
|
||||
tof_dif_min = tof_down_data[i] - tof_min;
|
||||
if(tof_dif_min <= TOF_MAX_DIF_FOR_HUADONG)
|
||||
{
|
||||
min_count++;
|
||||
sum_min +=tof_down_data[i];
|
||||
}
|
||||
}
|
||||
|
||||
//比较最大、最小个数的大小
|
||||
if(max_count==min_count)//
|
||||
{
|
||||
if((tof_max-tof_min) <= TOF_MAX_DIF_FOR_HUADONG)
|
||||
{
|
||||
tof_current = sum_max / max_count;//计算本次单程时间滤波值
|
||||
}
|
||||
else
|
||||
{
|
||||
tof_current = tof_down_last; //存储上次的单程时间滤波值
|
||||
}
|
||||
}
|
||||
else if(max_count>min_count)
|
||||
{
|
||||
len = max_count;
|
||||
sum = sum_max ;
|
||||
tof_current = sum / len;//计算本次单程时间滤波值
|
||||
}
|
||||
else
|
||||
{
|
||||
len = min_count;
|
||||
sum = sum_min;
|
||||
tof_current = sum / len;//计算本次单程时间滤波值
|
||||
}
|
||||
|
||||
//先判断合法性,再进行赋值
|
||||
if(tof_current!=0)
|
||||
{
|
||||
tof_down_last = tof_current; //存储上次的单程时间滤波值
|
||||
}
|
||||
else
|
||||
{
|
||||
tof_current = tof_down_last;
|
||||
}
|
||||
return tof_current;
|
||||
}
|
||||
/****************************************************************
|
||||
Function: 单程时间滤波函数
|
||||
Description:*p 指向单程时间数组首地址 len 数据长度 flag 0:tof_up 1:tof_down
|
||||
函数性质: 内部函数
|
||||
*****************************************************************/
|
||||
u32 Filter_FOR_TOFUP(u32 *tof_up, u32 *tof_down, u8 len) //
|
||||
{
|
||||
u8 i,max_count=0,min_count=0;//max_count:记录大数单程时间个数 min_count:记录小数单程时间个数
|
||||
u32 sum=0,sum_max=0,sum_min=0,tof_max=0,tof_min=0,tof_dif_max=0,tof_dif_min=0,tof_current=0;/*sum:单程时间累加和;sum_max:大数单程时间之间累加和
|
||||
sum_min:大数单程时间之间累加和 tof_max:最大单程时间
|
||||
tof_min:最小单程时间 tof_dif_max:最大单程时间与各个单程时间的差值
|
||||
tof_dif_min:最大单程时间与各个单程时间的差值 tof_current: 本次计算得到的单程时间*/
|
||||
|
||||
|
||||
static u32 tof_up_last=0;//记录up和down的上次数值的单程时间
|
||||
u32 temp_max[MAX_TEMP_NUM]={0},temp_min[MAX_TEMP_NUM]={0};//统计
|
||||
|
||||
tof_max = tof_up[0];
|
||||
tof_min = tof_up[0];
|
||||
if(len==1)
|
||||
{
|
||||
tof_current = tof_up[0];
|
||||
tof_up_last = tof_current; //存储上次的单程时间滤波值
|
||||
tof_down_data[0] = tof_down[0];//
|
||||
return tof_current;
|
||||
}
|
||||
//找到最大 最小值
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
if((tof_up[i]>=tof_max))
|
||||
{
|
||||
tof_max = tof_up[i];
|
||||
}
|
||||
if((tof_up[i]<=tof_min))
|
||||
{
|
||||
tof_min = tof_up[i];
|
||||
}
|
||||
}
|
||||
|
||||
//查看最大和最小值是否同为一个量级
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
|
||||
tof_dif_max = tof_max - tof_up[i];
|
||||
if(tof_dif_max <= TOF_MAX_DIF_FOR_HUADONG)//200ns
|
||||
{
|
||||
temp_max[max_count]= tof_down[i];
|
||||
max_count++;
|
||||
sum_max += tof_up[i];
|
||||
}
|
||||
|
||||
tof_dif_min = tof_up[i] - tof_min;
|
||||
if(tof_dif_min <= TOF_MAX_DIF_FOR_HUADONG)
|
||||
{
|
||||
temp_min[min_count]= tof_down[i];
|
||||
min_count++;
|
||||
sum_min +=tof_up[i];
|
||||
}
|
||||
}
|
||||
//比较最大、最小个数的大小
|
||||
if(max_count==min_count)//
|
||||
{
|
||||
if(max_count == MAX_TEMP_NUM)
|
||||
{
|
||||
tof_current = sum_max / max_count;//计算本次单程时间滤波值
|
||||
memcpy(tof_down_data,temp_max,MAX_TEMP_NUM*4);
|
||||
}
|
||||
else
|
||||
{
|
||||
tof_current = tof_up_last; //存储上次的单程时间滤波值
|
||||
memset(tof_down_data,0,MAX_TEMP_NUM*4);
|
||||
}
|
||||
}
|
||||
else if(max_count>min_count)
|
||||
{
|
||||
len = max_count;
|
||||
sum = sum_max ;
|
||||
tof_current = sum / len;//计算本次单程时间滤波值
|
||||
memcpy(tof_down_data,temp_max,MAX_TEMP_NUM*4);
|
||||
}
|
||||
else
|
||||
{
|
||||
len = min_count;
|
||||
sum = sum_min;
|
||||
tof_current = sum / len;//计算本次单程时间滤波值
|
||||
memcpy(tof_down_data,temp_min,MAX_TEMP_NUM*4);
|
||||
}
|
||||
|
||||
//先判断合法性,再进行赋值
|
||||
if(tof_current!=0)
|
||||
{
|
||||
tof_up_last = tof_current; //存储上次的单程时间滤波值
|
||||
}
|
||||
else
|
||||
{
|
||||
tof_current = tof_up_last;
|
||||
}
|
||||
return tof_current;
|
||||
}
|
||||
/***************************************************************
|
||||
函数名称: Gp30_TOF_and_DOWN_Data_Collect(void)
|
||||
功 能; 单程时间采集与处理函数 1、单程时间采集 2、单程时间滤波
|
||||
函数性质: 外部接口函数
|
||||
****************************************************************/
|
||||
void Gp30_Tof_Collect_and_Deal()
|
||||
{
|
||||
Tof_Calcuate_Average(s_g_fhl_tof_up_data,s_g_fhl_tof_down_data,5);//对单程时间进行滤波
|
||||
Gp30_Tof_Save();//存储滤波后的单程时间
|
||||
gp30_tof_up_filter_value = Filter_FOR_TOFUP(gp30_tof_up_data,gp30_tof_down_data,gp30_tof_up_down_length);//
|
||||
gp30_tof_down_filter_value = Filter_FOR_TOFDOWN(tof_down_data,gp30_tof_up_down_length);//
|
||||
AM_Calcuate_Average(s_g_up_am,s_g_down_am,6);//振幅均值计算
|
||||
}
|
||||
|
||||
/*温度反算流程第二步:1、单程时间校准 2、校准后单程时间进行计算温度*/
|
||||
|
||||
/***************************************************************
|
||||
函数名称: 单程时间校准函数
|
||||
功 能; time_dof_temp_float 用于计算流速 time_tof_up_float:Up单程时间 time_tof_up_float:Down单程时间
|
||||
函数性质: 内部函数
|
||||
****************************************************************/
|
||||
void Water_Meter_Caliberate(u32 time_dof,float time_tof_up_float,float time_tof_down_float)
|
||||
{
|
||||
float time_tof_up_xishu = 0,time_tof_down_xishu = 0;
|
||||
float temp_jiaozhun=0;//获取表计校准温度
|
||||
float sound_speed_C = 0;//声速
|
||||
float calculate_decimal ; //温度的小数部分
|
||||
float time_tof_up_float_jiaozhun_value =0;//校准的UP单程时间
|
||||
float time_tof_down_float_jiaozhun_value =0;//校准的DOWN单程时间
|
||||
u8 calculate_num=0;
|
||||
float time_dof_temp_float=0;
|
||||
|
||||
if(tof_caliberate_state==TOF_BUCHANG_START_SAMPLE)//表计如果处于采样状态就进行
|
||||
{
|
||||
temp_jiaozhun = Get_Temperature_Caliberate();//获取台子下发的温度值---待接收接口函数
|
||||
if((temp_jiaozhun < 0) || (temp_jiaozhun > 100)) //异常温度判断,防止数组越界
|
||||
{
|
||||
sound_speed_C = sound_speed_in_water[20];
|
||||
}
|
||||
else
|
||||
{
|
||||
calculate_num = (u8) (temp_jiaozhun); //查表位置
|
||||
calculate_decimal = temp_jiaozhun - calculate_num; //温度的小数部分
|
||||
sound_speed_C = sound_speed_in_water[calculate_num] + calculate_decimal * (sound_speed_in_water[calculate_num + 1] - sound_speed_in_water[calculate_num]);
|
||||
}
|
||||
|
||||
time_dof_temp_float = Gp30DataToFloat(time_dof); //先把有效时间差转换成浮点数
|
||||
time_dof_temp_float = time_dof_temp_float * (float)250;// 将us转换成真实的ns, /4 *1000=ns
|
||||
|
||||
float ins_flow_rate_float = sound_speed_C * sound_speed_C * time_dof_temp_float * LEGENTH_SPEED_SOUND_DAOSHU;//C^2*(t2-t1)/2L---求得理论流速 m/s
|
||||
|
||||
time_tof_up_float_jiaozhun_value = LEGENTH_SPEED_SOUND / (sound_speed_C+ins_flow_rate_float); //计算出UP单程时间us
|
||||
time_tof_down_float_jiaozhun_value = LEGENTH_SPEED_SOUND / (sound_speed_C-ins_flow_rate_float); //计算出DOWN单程时间us
|
||||
|
||||
time_tof_up_xishu = time_tof_up_float-time_tof_up_float_jiaozhun_value;//表计实际的Up单程时间与理论单程时间进行做差
|
||||
time_tof_down_xishu = time_tof_down_float-time_tof_down_float_jiaozhun_value;//表计实际的Down单程时间与理论单程时间进行做差
|
||||
//以后需要添加分别Up和Down的合法性判断!!!
|
||||
//合法性判断
|
||||
if(((time_tof_down_xishu - time_tof_up_xishu)>(float)0.5)||((time_tof_down_xishu - time_tof_up_xishu)<(float)-0.5))
|
||||
{
|
||||
time_tof_up_xishu = 0;
|
||||
time_tof_down_xishu = 0;
|
||||
}
|
||||
gp22_app_data.s.up_tof_dif.gp30_float = time_tof_up_xishu;//读取EE中存储的UP单程时间系数
|
||||
gp22_app_data.s.down_tof_dif.gp30_float = time_tof_down_xishu;//读取EE中存储的DOWN单程时间系数
|
||||
|
||||
//补偿值进行滑动滤波-----------------------
|
||||
gp30_tof_up_buchang_data[gp30_tof_buchang_head] = gp22_app_data.s.up_tof_dif.gp30_float; //将单程时间存入到数组中
|
||||
gp30_tof_down_buchang_data[gp30_tof_buchang_head]= gp22_app_data.s.down_tof_dif.gp30_float; //将单程时间存入到数组中
|
||||
gp30_tof_buchang_head++;
|
||||
if(MAX_TOF_BUCHANG_NUM!=gp30_tof_buchang_head)//采样数组满了一次
|
||||
{
|
||||
if(gp30_tof_buchang_length != MAX_TOF_BUCHANG_NUM)//当BUF中数据已经存满一次了
|
||||
{
|
||||
gp30_tof_buchang_length = gp30_tof_buchang_head;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gp30_tof_buchang_length = MAX_TOF_BUCHANG_NUM;
|
||||
}
|
||||
gp30_tof_buchang_head %= MAX_TOF_BUCHANG_NUM;
|
||||
//-------------防护收不到下发温度系数的情况发生!!!!!!!
|
||||
// if(gp30_tof_buchang_length == MAX_TOF_BUCHANG_NUM)
|
||||
// {
|
||||
// FrameClearMsgApp(MsgCaliberate);//清零单程时间校准标志
|
||||
// GP30_tof_buchang_filter(NOT_ALLOW_CALIBREATE);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名称: 反算温度
|
||||
功 能; time_dof_temp_float 用于计算流速
|
||||
函数性质: 外部接口函数
|
||||
****************************************************************/
|
||||
void Water_Meter_Temp_calculate(u32 time_dof_temp_float)
|
||||
{
|
||||
float time_tof_temp_float =0,temp_calculate_app=0,temp_buchang_chazhi=0,wendu=0;//time_tof_temp_float:up和Down 的单程时间倒数和变量
|
||||
float time_tof_up_float =0,time_tof_down_float =0;//实时的单程时间
|
||||
u32 heat_temp = 0;
|
||||
float heat_temp_xishu=0;//出口温度浮点数类型
|
||||
|
||||
if((gp22_test_data.s.TOF_up==0)||(gp22_test_data.s.TOF_down==0))//单程时间为0----认为是空管状态
|
||||
{
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.gp30_tof_up_filter_value_test = 0;//空管下UP单程时间清零
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.gp30_tof_down_filter_value_test = 0;//空管下DOWN单程时间清零
|
||||
GP30_tof_buchang_filter(NOT_ALLOW_CALIBREATE);//这里可以有效预防NB上位机导致表计校准
|
||||
return;
|
||||
}
|
||||
heat_temp = FrameCheckParaApp(FramePara_Tc0);//获取出口温度补偿系数
|
||||
if(heat_temp >= 0x80000000)//判定补偿系数的正负号
|
||||
{
|
||||
heat_temp &= 0x7FFFFFFF;
|
||||
heat_temp_xishu= 0- Gp30DataToFloat(heat_temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
heat_temp_xishu = Gp30DataToFloat(heat_temp);
|
||||
}
|
||||
|
||||
time_tof_up_float = Gp30DataToFloat(gp30_tof_up_filter_value)/(float)4; //UP单程时间---转化为us
|
||||
time_tof_down_float = Gp30DataToFloat(gp30_tof_down_filter_value)/(float)4;//Down单程时间---转化为us
|
||||
|
||||
Water_Meter_Caliberate(time_dof_temp_float,time_tof_up_float,time_tof_down_float);//判断是否需要校准单程时间
|
||||
|
||||
//1、单程时间修正-----
|
||||
time_tof_up_float = time_tof_up_float - gp22_app_data.s.up_tof_dif.gp30_float;
|
||||
time_tof_down_float = time_tof_down_float - gp22_app_data.s.down_tof_dif.gp30_float;
|
||||
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.gp30_tof_up_filter_value_test = FloatToGp30Data(time_tof_up_float)*(float)4;//活塞台子的单程时间---GP30格式
|
||||
Temp_Inverse_Data.Temp_Inverse_Data.gp30_tof_down_filter_value_test = FloatToGp30Data(time_tof_down_float)*(float)4;//活塞台子的单程时间---GP30格式
|
||||
|
||||
time_tof_temp_float = (float)1/time_tof_up_float+(float)1/time_tof_down_float;//单程时间转换 1/up + 1/down
|
||||
|
||||
|
||||
#if ROUND_LLGS_WDFS_DN15_BRASS_40KPA_GP30_32768 || Buxiugang_LLGS_WDFS_DN15_BXG_40KPA_GP30_32768 || Plastic_LLGS_WDFS_DN15_PALSTIC_40KPA_GP30_32768
|
||||
if(time_tof_temp_float <= TOF_UP_DOWN_DAOSHUHE_LOW) //小于35度
|
||||
{
|
||||
temp_calculate_app = (float)1164325060.28*time_tof_temp_float*time_tof_temp_float*time_tof_temp_float-(float)117666513.36*time_tof_temp_float*time_tof_temp_float + (float)3974951.33*time_tof_temp_float-(float)44879.30;
|
||||
}
|
||||
else if(time_tof_temp_float <= TOF_UP_DOWN_DAOSHUHE_MIDDLE) //35到45度
|
||||
{
|
||||
temp_calculate_app = (float)18099447.719*time_tof_temp_float*time_tof_temp_float - (float)1264215.524*time_tof_temp_float +(float)22102.772;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_calculate_app = (float)93075924.43*time_tof_temp_float*time_tof_temp_float -(float)6658976.07*time_tof_temp_float +(float)119144.49;
|
||||
}
|
||||
|
||||
#elif ROUND_LLGS_WDFS_DN20_BRASS_40KPA_GP30_32768 || Buxiugang_LLGS_WDFS_DN20_BXG_40KPA_GP30_32768
|
||||
|
||||
if(time_tof_temp_float <= TOF_UP_DOWN_DAOSHUHE_LOW) //小于35度
|
||||
{
|
||||
temp_calculate_app = (float)1523999897.62*time_tof_temp_float*time_tof_temp_float*time_tof_temp_float-(float)147356593.93*time_tof_temp_float*time_tof_temp_float +(float) 4761092.78*time_tof_temp_float -(float)51396.5;//温度差值补偿
|
||||
}
|
||||
else if(time_tof_temp_float <= TOF_UP_DOWN_DAOSHUHE_MIDDLE) //35到45度
|
||||
{
|
||||
temp_calculate_app = (float)18709611.192*time_tof_temp_float*time_tof_temp_float -(float)1245577.831*time_tof_temp_float +(float)20757.105 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_calculate_app = (float)147329123.77*time_tof_temp_float*time_tof_temp_float -(float)10079793.85*time_tof_temp_float +(float)172450.97 ;
|
||||
}
|
||||
#endif
|
||||
temp_calculate_app = temp_calculate_app - temp_buchang_chazhi + heat_temp_xishu;//默认状况下温度系数为0
|
||||
|
||||
//3、温度合法性判断
|
||||
temp_calculate_app = temp_calculate_app - wendu;//算出来温度---暂时不添加任何限制
|
||||
if((temp_calculate_app<0)||(temp_calculate_app>60))
|
||||
{
|
||||
temp_calculate_app = temp_calculate_last;//
|
||||
}
|
||||
else
|
||||
{
|
||||
#if Buxiugang_LLGS_WDFS_DN15_BXG_40KPA_GP30_32768 || Buxiugang_LLGS_WDFS_DN20_BXG_40KPA_GP30_32768
|
||||
if(temp_calculate_app<(float)22.8)
|
||||
{
|
||||
temp_calculate_app=temp_calculate_app+((float)-0.05*temp_calculate_app+(float)1.54); //不锈钢22.8 - 0度之间需要进行补偿
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_calculate_app=temp_calculate_app+((float)-0.1296*temp_calculate_app+(float)3.3556); //不锈钢22.8 - 60度之间需要进行补偿
|
||||
}
|
||||
#endif
|
||||
}
|
||||
temp_calculate_last = temp_calculate_app;
|
||||
// else //
|
||||
// {
|
||||
// temp_calculate_last = temp_calculate_app;//记录上次正常的温度数据-----从有水到无水时 用这个数据
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* @fun_name: TempInverseSetMsgApp
|
||||
* @brief : 置起反算消息类型
|
||||
* 函数性质 : 外部接口函数
|
||||
******************************************************************************/
|
||||
void TempInverseSetMsgApp(TempInverse_MsgTypeDef msgType)
|
||||
{
|
||||
if(msgType<TEMP_INVERSE_MSG_TYPE_CNT)
|
||||
{
|
||||
temp_inverse_struct_msg.MsgBuf[msgType] = 1;
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: TempInverseCheckMsgApp
|
||||
* @brief : 查询反算msg接口
|
||||
* @param[out]: msg 有消息1 无消息0
|
||||
******************************************************************************/
|
||||
u8 TempInverseCheckMsgApp(TempInverse_MsgTypeDef msgType)
|
||||
{
|
||||
if(msgType < TEMP_INVERSE_MSG_TYPE_CNT)
|
||||
{
|
||||
return temp_inverse_struct_msg.MsgBuf[msgType];
|
||||
}
|
||||
else
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
/*******************************************************************************
|
||||
* @fun_name: TempInverseClearMsgApp
|
||||
* @brief : 清除反算msg接口
|
||||
* @param[out]: 1成功 0失败
|
||||
******************************************************************************/
|
||||
u8 TempInverseClearMsgApp(TempInverse_MsgTypeDef msgType)
|
||||
{
|
||||
if(msgType < TEMP_INVERSE_MSG_TYPE_CNT)
|
||||
{
|
||||
temp_inverse_struct_msg.MsgBuf[msgType] = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
/****************************************************************
|
||||
Function: 单程时间插值补偿系数滤波
|
||||
Description:*p 指向单程时间补偿系数数组首地址 len 数据长度 ----用于进行单程时间补偿值的滤波
|
||||
函数性质: 内部函数
|
||||
*****************************************************************/
|
||||
float Filter_FOR_TOF_CHAZHI(float *p, u8 len) //
|
||||
{
|
||||
u8 i;
|
||||
float sum=0,tof_current=0,temp_max=p[0],temp_min=p[0];
|
||||
|
||||
if(len>3)
|
||||
{
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
if((p[i]>=temp_max))
|
||||
{
|
||||
temp_max = p[i];
|
||||
}
|
||||
if((p[i]<=temp_min))
|
||||
{
|
||||
temp_min = p[i];
|
||||
}
|
||||
sum += p[i];
|
||||
}
|
||||
tof_current = (sum-temp_min-temp_max) / (len-2);//计算本次单程时间差值滤波值
|
||||
}
|
||||
else //用实时数据
|
||||
{
|
||||
tof_current = p[len-1];
|
||||
}
|
||||
return tof_current;
|
||||
}
|
||||
|
||||
/****************************************
|
||||
Function: GP30_tof_buchang_filter
|
||||
Description: 开启和关闭单程时间校准补偿
|
||||
Return: 0 启动单程时间差值校准 1:停止单程时间差值校准 2:空管状态下清零校准 3:反算温度滤波
|
||||
Others: 外部接口函数
|
||||
****************************************************************/
|
||||
void GP30_tof_buchang_filter(u8 flag)
|
||||
{
|
||||
u8 i=0;
|
||||
switch (flag)
|
||||
{
|
||||
case START_CALIBREATE:
|
||||
{
|
||||
gp30_tof_buchang_head = 0;//数值指针头结点
|
||||
gp30_tof_buchang_length = 0;//数据长度
|
||||
gp30_tof_up_chazhi_filter_value =0;//up滤波值
|
||||
gp30_tof_down_chazhi_filter_value =0;//down滤波值
|
||||
gp22_app_data.s.up_tof_dif.gp30_float = 0;//清零单程时间差值数据
|
||||
gp22_app_data.s.down_tof_dif.gp30_float = 0;//清零单程时间差值数据
|
||||
|
||||
for(i=0;i<MAX_TOF_BUCHANG_NUM;i++)
|
||||
{
|
||||
gp30_tof_up_buchang_data[i] = 0; //
|
||||
gp30_tof_down_buchang_data[i]= 0; //
|
||||
}
|
||||
tof_caliberate_state = TOF_BUCHANG_START_SAMPLE;//先进行清零单程时间补偿系数值
|
||||
break;
|
||||
}
|
||||
case STOP_CALIBREATE:
|
||||
{
|
||||
if(tof_caliberate_state == TOF_BUCHANG_START_SAMPLE)//如果是采样状态下才刷新数据
|
||||
{
|
||||
tof_caliberate_state = TOF_BUCHANG_IDLE;
|
||||
TempInverseSetMsgApp(TofCaliberateMsg);
|
||||
if(0!=gp30_tof_buchang_length)
|
||||
{
|
||||
gp30_tof_up_chazhi_filter_value = Filter_FOR_TOF_CHAZHI(&gp30_tof_up_buchang_data[0],gp30_tof_buchang_length);
|
||||
gp30_tof_down_chazhi_filter_value = Filter_FOR_TOF_CHAZHI(&gp30_tof_down_buchang_data[0],gp30_tof_buchang_length);
|
||||
//计算完毕后需要进行差值补偿合法性判定 介于[-4,4]之间认为合格
|
||||
if(((gp30_tof_up_chazhi_filter_value)>TOF_COMPENSATION_COEFFICIENT)||((gp30_tof_down_chazhi_filter_value)>TOF_COMPENSATION_COEFFICIENT)|| \
|
||||
((gp30_tof_up_chazhi_filter_value)< -TOF_COMPENSATION_COEFFICIENT)||((gp30_tof_down_chazhi_filter_value)<-TOF_COMPENSATION_COEFFICIENT))
|
||||
{
|
||||
gp30_tof_up_chazhi_filter_value = 0;
|
||||
gp30_tof_down_chazhi_filter_value = 0;
|
||||
}
|
||||
gp22_app_data.s.up_tof_dif.gp30_float = gp30_tof_up_chazhi_filter_value;
|
||||
gp22_app_data.s.down_tof_dif.gp30_float = gp30_tof_down_chazhi_filter_value;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NOT_ALLOW_CALIBREATE:
|
||||
{
|
||||
tof_caliberate_state = TOF_BUCHANG_IDLE;//空闲状态
|
||||
gp22_app_data.s.up_tof_dif.gp30_float = g_sample_save_data.s.up_tof_dif.gp30_float;//
|
||||
gp22_app_data.s.down_tof_dif.gp30_float = g_sample_save_data.s.down_tof_dif.gp30_float;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/****************************************************************
|
||||
Function: GetTemperatureCalculateParameter
|
||||
Description: 获取反算参数 包括up单程时间、down单程时间、up振幅均值、down振幅均值
|
||||
函数性质: 外部接口函数
|
||||
*****************************************************************/
|
||||
u32 GetTemperatureCalculateParameter(u8 flag)
|
||||
{
|
||||
if(flag < TemperatureCalculateParameterTotal)
|
||||
{
|
||||
return Temp_Inverse_Data.Temp_Inverse[flag];
|
||||
}
|
||||
else
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
/****************************************************************
|
||||
Function: void
|
||||
Description: 反算校准超时查询函数
|
||||
函数性质: 外部接口函数
|
||||
*****************************************************************/
|
||||
void FanSuan_Caliberate_Timeout(void)
|
||||
{
|
||||
if(TRUE == FrameCheckMsgApp(MsgCaliberate))//单程时间校准标志查询
|
||||
{
|
||||
if(0==RtccCheckTimer(RTCC_TOF_CALIBERATE_TIME))//90s校准超时时间到
|
||||
{
|
||||
FrameClearMsgApp(MsgCaliberate);//清零单程时间校准标志
|
||||
GP30_tof_buchang_filter(NOT_ALLOW_CALIBREATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,73 @@
|
|||
#ifndef UWater_TEMPERATURE_CALCULATE_APP_H
|
||||
#define UWater_TEMPERATURE_CALCULATE_APP_H
|
||||
|
||||
#include "UWater_gp22_app.h"
|
||||
|
||||
/************************************************宏定义相关**********************************/
|
||||
#define START_CALIBREATE 0//开启校准单程时间
|
||||
#define STOP_CALIBREATE 1//停止校准单程时间
|
||||
#define NOT_ALLOW_CALIBREATE 2//空管下不允许校准单程时间
|
||||
|
||||
|
||||
#define TOF_UP 0//up单程时间角标
|
||||
#define TOF_DOWN 1//down单程时间角标
|
||||
#define UP_AM_AVERAGE 2//up振幅均值角标
|
||||
#define DOWN_AM_AVERAGE 3//down振幅均值角标
|
||||
|
||||
|
||||
#define RTCC_TOF_CALIBERATE_TIME_OUT 180// 3分钟超时防护超时防护时间,(活塞台子冲水+流量稳定)
|
||||
#define TOF_COMPENSATION_COEFFICIENT (float)4 //单程时间差值补偿系数
|
||||
/************************************************规约消息管理相关**********************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 tof_caliberate_msg; //单程时间补偿数据存储标志
|
||||
|
||||
} STRUCT_TEMP_INVERSE_MSG;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TofCaliberateMsg = 0, //单程时间补偿数据存储标志
|
||||
|
||||
|
||||
/*对外消息总个数*/
|
||||
Msg_TotalCount=1
|
||||
} TempInverse_MsgTypeDef;
|
||||
|
||||
#define TEMP_INVERSE_MSG_TYPE_CNT Msg_TotalCount
|
||||
|
||||
typedef union
|
||||
{
|
||||
STRUCT_TEMP_INVERSE_MSG MsgStruct;
|
||||
u8 MsgBuf[TEMP_INVERSE_MSG_TYPE_CNT];
|
||||
} TEMP_IVVERSE_UNION_MSG;
|
||||
|
||||
|
||||
#define TemperatureCalculateParameterTotal 4 //温度反算参数
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u32 gp30_tof_up_filter_value_test;//检定数据
|
||||
u32 gp30_tof_down_filter_value_test;//检定数据
|
||||
u32 up_am_average;//up振幅均值角标
|
||||
u32 down_am_average;//down振幅均值角标
|
||||
}Temp_Inverse_Data;
|
||||
|
||||
u32 Temp_Inverse[TemperatureCalculateParameterTotal];
|
||||
|
||||
}Temp_Inverse_Data1;
|
||||
|
||||
|
||||
//对外接口函数
|
||||
void Tof_And_AM_Data_Collect(u8 i,u32 s_g_tof_am_pointer);//单程时间与振幅原始数据采集
|
||||
void Gp30_Tof_Collect_and_Deal(void);//单程时间采集与处理
|
||||
void Water_Meter_Temp_calculate(u32 time_dof_temp_float);//单程时间校准与温度计算
|
||||
u8 TempInverseCheckMsgApp(TempInverse_MsgTypeDef msgType);//查询反算标志
|
||||
u8 TempInverseClearMsgApp(TempInverse_MsgTypeDef msgType);//清零反算标志
|
||||
u32 GetTemperatureCalculateParameter(u8 flag);//单程时间获取
|
||||
void GP30_tof_buchang_filter(u8 flag);//获取单程时间校准命令
|
||||
void FanSuan_Caliberate_Timeout(void);//反算校准超时查询和处理函数
|
||||
|
||||
extern const float sound_speed_in_water[101];
|
||||
|
||||
#endif
|
|
@ -0,0 +1,277 @@
|
|||
/*
|
||||
* File: wf200s_rtcc_app.c
|
||||
* Author: KingRay
|
||||
*
|
||||
* Created on June 14, 2016, 4:22 PM
|
||||
*/
|
||||
#include "sys_config.h"
|
||||
#if CARD_USED
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
#include "UWater_card_5557_driver.h"
|
||||
#include "UWater_Valve_driver.h"
|
||||
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_key_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_Valve_app.h"
|
||||
#include "UWater_card_5557_app.h"
|
||||
|
||||
#include "libbase.h"
|
||||
|
||||
Card_Data card_source_data;
|
||||
S_Card_Type1_Data card_source_data_congigue1_use;
|
||||
BOOL card_in = FALSE;
|
||||
BOOL card_read_sucess = FALSE;
|
||||
static u8 card_output_msg = CARD_NONE_MSG; //脉冲模块输出消息
|
||||
//Meter_Event_Para card_use_meter_state;
|
||||
//S_Flash_Data_Processor_Para flash_data_processor_temp_para;
|
||||
u8 card_key_machine_state = CARD_KEY_M_S0;
|
||||
u8 card_key_check_num = 0;
|
||||
BOOL card_key_flag = FALSE;
|
||||
|
||||
void card_generate_key(u8* buf, u8* key);
|
||||
|
||||
void SearchCardApp(void)
|
||||
{
|
||||
if(RtccCheckTimer(RTCC_CARD_SEARCH_TIME) == 0)//休眠状态与GP30唤醒同步,2s检测一次卡片,唤醒状态1s检测一次卡片
|
||||
{
|
||||
RtccSetTimer(RTCC_CARD_SEARCH_TIME, CARD_SEACHR_TIME_SECOND);
|
||||
RtccSetMsgApp(RtccMsg_Search_Card);
|
||||
}
|
||||
if(Gp30IfSleepApp() == TRUE)
|
||||
{
|
||||
if(RtccCheckMsgApp(RtccMsg_Search_Card))
|
||||
{
|
||||
RtccClearMsgApp(RtccMsg_Search_Card);
|
||||
|
||||
if(card_search())
|
||||
{
|
||||
card_output_msg |= CARD_IN;
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearCardMsg(CARD_IN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CardDataProcessorApp()
|
||||
{
|
||||
u8 i = 0;
|
||||
u8 j = 0;
|
||||
// u32 temp = 0;
|
||||
// s32 tmpdata;
|
||||
u8 card_key_result[4] = {0};
|
||||
// card_read_sucess = FALSE;
|
||||
|
||||
if(CheckCardMsg() & CARD_IN)
|
||||
{
|
||||
ClearCardMsg(CARD_IN);
|
||||
card_enable();
|
||||
|
||||
for(j = 0; j < 6; j++)
|
||||
{
|
||||
memset(card_source_data.data, 0, 28);
|
||||
Card5557ClrIntCnt();
|
||||
|
||||
if(card_read_all(card_source_data.data))
|
||||
{
|
||||
nop();
|
||||
|
||||
for(i = 0; i < 28; i++)
|
||||
{
|
||||
card_source_data.data [i] = (u8)( card_source_data.data [i] ^ i ^ 0xB9); // Card_Data. data为接收到的28字节
|
||||
}
|
||||
|
||||
card_generate_key(card_source_data.data, card_key_result);
|
||||
|
||||
if(0 == memcmp(card_source_data.code, card_key_result, 4))
|
||||
{
|
||||
card_read_sucess = TRUE;
|
||||
break;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
card_read_sucess = FALSE;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearCardSta();
|
||||
card_read_sucess = FALSE;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
card_disable();
|
||||
|
||||
if(card_read_sucess == FALSE)
|
||||
{
|
||||
//// LcdAppDpUserCard2(51); //密码错误
|
||||
}
|
||||
else
|
||||
{
|
||||
card_read_sucess = FALSE;
|
||||
KeySetLcdMsgApp(MENU_TWO);
|
||||
if(card_source_data.check == (add_check(card_source_data.data, 15) + add_check(&card_source_data.data[16], 8)) % 256)
|
||||
{
|
||||
switch(card_source_data.card_flag)
|
||||
{
|
||||
case OPEN_VALVE_CARD:
|
||||
{
|
||||
card_key_flag = TRUE;
|
||||
FrameSetMsgApp(Msg_ValveOpenEmergency);//应急开阀消息
|
||||
}
|
||||
break;
|
||||
|
||||
case CLOSE_VALVE_CARD:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*************************************************
|
||||
Function: u8 ChecPulsekMsg(void)
|
||||
Description: 检测当前事件Msg
|
||||
Input: None
|
||||
Return:
|
||||
Others: 处于MainSpace,第二类接口:工作接口。
|
||||
*************************************************/
|
||||
u8 CheckCardMsg(void)
|
||||
{
|
||||
return card_output_msg;
|
||||
}
|
||||
|
||||
/*************************************************
|
||||
Function: void ClearCardMsg(u8 msg)
|
||||
Description: 清MSG
|
||||
Input:
|
||||
Return: None
|
||||
Others: 处于MainSpace,第二类接口:工作接口。
|
||||
*************************************************/
|
||||
void ClearCardMsg(u8 msg)
|
||||
{
|
||||
card_output_msg = card_output_msg & (~msg);
|
||||
}
|
||||
|
||||
const u8 const_data[24] = { 0xDF, 0x39, 0x9D, 0xC5, 0x40, 0x86, 0x18, 0xB3, 0x67, 0xF1, 0x5A, 0x72, 0x24, 0xEC, 0xAE, 0x0B
|
||||
, 0xA3, 0XA5, 0X09, 0XC3, 0XAD, 0XEE, 0XAC, 0X08
|
||||
};
|
||||
void card_generate_key(u8* buf, u8* key)
|
||||
{
|
||||
u8 p[24]; //存放临时数据
|
||||
u8 p_num = 0, d_num = 0;
|
||||
p[p_num++] = const_data[(buf[0x0A] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x04] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x06] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x01] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x09] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x05] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x02] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x07] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x08] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x03] ^ const_data[d_num++]) % 24];
|
||||
|
||||
p[p_num++] = const_data[(buf[0x0C] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x10] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x0E] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x12] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x14] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x0B] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x13] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x0F] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x11] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x0D] ^ const_data[d_num++]) % 24];
|
||||
|
||||
p[p_num++] = const_data[(buf[0x00] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x16] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x15] ^ const_data[d_num++]) % 24];
|
||||
p[p_num++] = const_data[(buf[0x17] ^ const_data[d_num++]) % 24];
|
||||
memset(key, 0, 4);
|
||||
|
||||
for(int i = 0; i < 24; i++)
|
||||
{
|
||||
if(i % 2 == 0) // 0/2/4/6/8/10/12/14/16/18/20/22/
|
||||
{
|
||||
*key = (u8)(key[0] + p[i]);
|
||||
}
|
||||
|
||||
if(i % 2 == 1) // 1/3/5/7/9/11/13/15/17/19/21/23/
|
||||
{
|
||||
*(key + 1) = (u8)(key[1] + p[i]);
|
||||
}
|
||||
|
||||
if(i % 3 == 0) // 0/3/6/9/12/15/18/21/
|
||||
{
|
||||
*(key + 2) = (u8)(key[2] + p[i]);
|
||||
}
|
||||
|
||||
if(i % 3 == 1) // 1/4/7/10/13/16/19/22
|
||||
{
|
||||
*(key + 3) = (u8)(key[3] + p[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void CardKeyMsgMachine()
|
||||
{
|
||||
switch (card_key_machine_state)
|
||||
{
|
||||
case CARD_KEY_M_S0:
|
||||
{
|
||||
if(card_key_flag && (card_key_check_num == 0))
|
||||
{
|
||||
card_key_flag = FALSE;
|
||||
card_key_check_num++;
|
||||
RtccSetTimer(RTCC_CARD_KEY_TIME, CARD_KEY_TIME_SECOND); //检测时间30S
|
||||
}
|
||||
|
||||
if(RtccCheckTimer(RTCC_CARD_KEY_TIME) > 0)
|
||||
{
|
||||
if(card_key_flag)
|
||||
{
|
||||
card_key_flag = FALSE;
|
||||
card_key_check_num++;
|
||||
}
|
||||
|
||||
if(card_key_check_num >= 2)
|
||||
{
|
||||
//抛上报消息
|
||||
card_key_check_num = 0;
|
||||
KeySetLcdMsgApp(MENU_ACTIVE_RF);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
card_key_flag = FALSE;
|
||||
card_key_check_num = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
card_key_flag = FALSE;
|
||||
card_key_check_num = 0;
|
||||
card_key_machine_state = CARD_KEY_M_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
void CardMachine()
|
||||
{
|
||||
SearchCardApp();
|
||||
CardDataProcessorApp();
|
||||
CardKeyMsgMachine();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,133 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* Copyright(C) 2012 WANG XIBING All rights reserved.
|
||||
*
|
||||
* 文件:meter.h
|
||||
* 作者:wxb
|
||||
* 版本:V1.00
|
||||
* 日期:2012-1-1
|
||||
* 描述:主头文件
|
||||
* 属性:RL78
|
||||
* 修改:V1.00, 2012-1-1, wxb, 创建本文件
|
||||
*
|
||||
* 声明:本程序所有权归作者所有。
|
||||
* 本程序仅用于实现特定产品的功能,任何修改或其它目的的应用均不作保证,
|
||||
* 任何人未经作者同意不得将本程序的全部或部分用于商业目的。
|
||||
*******************************************************************************/
|
||||
#ifndef __METER_CARD_5557_APP_H__
|
||||
#define __METER_CARD_5557_APP_H__
|
||||
#include "ddl.h"
|
||||
#include "type.h"
|
||||
|
||||
//状态机状态
|
||||
#define CARD_KEY_M_S0 0 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S1 1 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S2 2 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S3 3 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S4 4 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S5 5 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S6 6 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S7 7 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S8 8 //卡按键驱动状态机状态号
|
||||
#define CARD_KEY_M_S9 9 //卡按键驱动状态机状态号
|
||||
|
||||
#define CARD_KEY_TIME_SECOND 30//30s,选用5ms当量定时器
|
||||
#define CARD_SEACHR_TIME_SECOND 1//2s
|
||||
|
||||
|
||||
#define CARD_NONE_MSG 0x00 //无消息
|
||||
#define CARD_IN 0x01 //有卡
|
||||
#define CARD_OPEN 0x02 //开阀
|
||||
#define CARD_CLOSE 0x04 //关阀
|
||||
|
||||
|
||||
|
||||
#define OPEN_ACCOUNT_CARD 0x01 //开户卡
|
||||
#define USE_CARD 0x11 //用户卡
|
||||
#define USE_CARD_2 0x22 //用户卡
|
||||
#define AREA_CARD 0x30 //区域代码设置卡
|
||||
#define CHECK_CARD 0x31 //查询卡
|
||||
#define REPURCHASE_CARD 0x32 //退购卡
|
||||
#define CLEARED_CARD 0x33 //清零卡
|
||||
#define OPEN_VALVE_CARD 0x34 //开阀卡
|
||||
#define CLOSE_VALVE_CARD 0x35 //关阀卡
|
||||
#define CHANGE_CARD 0x36 //换表卡
|
||||
#define IDSET_CARD 0x37 //表号设置卡
|
||||
#define CONFIGURATION1_CARD 0x41 //配置卡1
|
||||
#define CONFIGURATION2_CARD 0x42 //配置卡2
|
||||
#define SET_CARD 0x43 //设置卡
|
||||
#define INIT_CARD 0x44 //初始化参数卡
|
||||
#define CHECK_ERR_CARD 0x45 //故障查询卡
|
||||
#define CLEAR_ERR_CARD 0x46 //清故障卡
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 byte0;
|
||||
u8 byte1;
|
||||
|
||||
} byte;
|
||||
u16 datas;
|
||||
} U16_DATA;
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 byte0;
|
||||
u8 byte1;
|
||||
|
||||
} byte;
|
||||
s16 datas;
|
||||
} S16_DATA;
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 card_flag;
|
||||
u8 buy_value[3]; // 本次购买量
|
||||
U16_DATA company_number; //公司标志
|
||||
U16_DATA zone_number; //区域代码
|
||||
u8 card_number[3]; //卡号
|
||||
u8 write_succ_flag; //卡片反写成功标志
|
||||
u8 value_limit[3]; //可用剩余量
|
||||
u8 check; //校验
|
||||
U16_DATA buy_num; //购买次数
|
||||
u8 total_value[3]; //累积量
|
||||
u8 hoarding_value[3]; //囤积量
|
||||
u8 code[4];
|
||||
};
|
||||
|
||||
u8 data[28];
|
||||
} Card_Data;
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 card_flag;
|
||||
u8 idle;
|
||||
S16_DATA level_1_arrears_threshold ; //一级欠费阈值
|
||||
S16_DATA level_2_arrears_threshold ; //二级欠费阈值
|
||||
u8 valve_type; //阀门类型
|
||||
u8 battery_type; //电池类型
|
||||
u8 magnetic_interference_close_valve; //磁干扰是否关阀
|
||||
u8 valve_power_order; //阀门供电线序
|
||||
u8 valve_inplace_order; //阀门到位线序
|
||||
u8 write_succ_flag; //卡片反写成功标志
|
||||
u8 valve_adc_current_thd; //阀门堵转电流阈值
|
||||
u8 valve_time_s; //控阀时间
|
||||
u8 idle2[10];
|
||||
u8 code[4];
|
||||
|
||||
};
|
||||
u8 data[28];
|
||||
} S_Card_Type1_Data;
|
||||
|
||||
|
||||
void SearchCardApp(void);
|
||||
u8 CheckCardMsg(void);
|
||||
void ClearCardMsg(u8 data);
|
||||
void CardDataProcessorApp(void);
|
||||
void CardKeyMsgMachine(void);
|
||||
void CardMachine(void);
|
||||
|
||||
#endif /*__METER_CARD_5557_APP_H__*/
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,331 @@
|
|||
/*
|
||||
* File: __GP22GAS_IR_APP_C
|
||||
* Author:
|
||||
*
|
||||
* Created on:2016-3-7
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
#include "UWater_ir_app.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
#include "UWater_uart_driver.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_key_app.h"
|
||||
#include "UWater_DebugPrint.h"
|
||||
|
||||
u8 s_g_ir_control_state = IR_CONTROL_S0;
|
||||
u8 s_g_ir_state = 0;
|
||||
|
||||
/************************************************
|
||||
Function: void UartIrOpen()
|
||||
Description: 打开红外
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void UartIrOpen(void)
|
||||
{
|
||||
|
||||
IR_38KCarrier_Close();
|
||||
|
||||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, FALSE);
|
||||
UartInit(IR_UART_COM, BAUD2400, DATA_BIT_8, STOPBIT_1, UART_EVEN_PARITY, UART_LPUART_Disable);
|
||||
}
|
||||
|
||||
/************************************************
|
||||
Function: void UartIrClose()
|
||||
Description: 关闭红外
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void UartIrClose(void)
|
||||
{
|
||||
// Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, FALSE); //Base Timer外设时钟关闭
|
||||
Bt_M0_Stop(TIM2);
|
||||
|
||||
UartPreSleep(IR_UART_COM);
|
||||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||||
|
||||
//配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||||
Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||||
|
||||
}
|
||||
|
||||
/************************************************
|
||||
Function: void IrInitApp()
|
||||
Description: 初始化
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void IrInitApp(void)
|
||||
{
|
||||
IR_Uart_38K_Config();
|
||||
|
||||
//< RX 控制脚初始化
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdEnable; ///< 端口开漏输出配置
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(IR_UART_CTL_PORT, IR_UART_CTL_PIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);
|
||||
|
||||
UartIrOpen();
|
||||
s_g_ir_control_state = IR_CONTROL_S0;
|
||||
FrameSetMsgApp(MsgOpenIr);
|
||||
}
|
||||
|
||||
/************************************************
|
||||
Function: IrIfSleepApp()
|
||||
Description: 查询应用层模块是否允许进入休眠
|
||||
Input:
|
||||
return: 1 允许休眠 0不允许休眠
|
||||
Others:
|
||||
*************************************************/
|
||||
u8 IrIfSleepApp(void)
|
||||
{
|
||||
if( IR_CONTROL_S0 == s_g_ir_control_state)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
u8 IrIfInS0WakeTime(void)
|
||||
{
|
||||
if(s_g_ir_control_state == IR_CONTROL_S0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/************************************************
|
||||
Function: IrMachineApp()
|
||||
Description:
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void IrMachineApp(void)
|
||||
{
|
||||
switch (s_g_ir_control_state)
|
||||
{
|
||||
case IR_CONTROL_S0:
|
||||
{
|
||||
if(FrameCheckMsgApp(MsgOpenIr))
|
||||
{
|
||||
FrameClearMsgApp(MsgOpenIr);
|
||||
Set100msTimer(TIMER_100MS_IR_OPEN, 600);//复位之后定时60秒,关闭
|
||||
s_g_ir_control_state = IR_CONTROL_S1;
|
||||
}
|
||||
else if(KeyCheckIrOpenMsg() == TRUE )//检测到按键消息
|
||||
{
|
||||
KeyClearIrOpenMsg();//清除消息
|
||||
Set100msTimer(TIMER_100MS_IR_OPEN, 200);//按键唤醒定时20秒,关闭
|
||||
s_g_ir_control_state = IR_CONTROL_S1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IR_CONTROL_S1:
|
||||
{
|
||||
if(TASK_IDLE == UartIfIdle(IR_UART_COM))
|
||||
{
|
||||
UartIrOpen();
|
||||
s_g_ir_control_state = IR_CONTROL_S2;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case IR_CONTROL_S2:
|
||||
{
|
||||
//非检定且时间到
|
||||
if((0 == Check100msTimer(TIMER_100MS_IR_OPEN)) &&
|
||||
(TASK_IDLE == UartIfIdle(IR_UART_COM))&&
|
||||
(10 == LcdCheckStateApp())&&
|
||||
(FALSE ==GetPrintNbDataSwitch()&&
|
||||
(FrameIfSleepApp() == TRUE)))
|
||||
{
|
||||
UartIrClose();
|
||||
KeyClearIrOpenMsg();//清除消息
|
||||
s_g_ir_control_state = IR_DEAL_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
s_g_ir_control_state = IR_DEAL_S0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*************************************************
|
||||
Function: static void IR_Uart_38K_Config(void)
|
||||
Description: 红外38K 配置PWM相关寄存器
|
||||
Input: 无
|
||||
Return: 无
|
||||
Others:
|
||||
*************************************************/
|
||||
void IR_Uart_38K_Config(void)
|
||||
{
|
||||
#if IR_38K_OPEN
|
||||
u16 u16ArrValue;
|
||||
u16 u16CntValue;
|
||||
u16 u16Period;
|
||||
stc_bt_mode0_cfg_t stcBtBaseCfg;
|
||||
stc_gpio_cfg_t stcTIM1APort;
|
||||
|
||||
DDL_ZERO_STRUCT(stcTIM1APort);
|
||||
DDL_ZERO_STRUCT(stcBtBaseCfg);
|
||||
//PA03设置为TIM2_CHB
|
||||
stcTIM1APort.enDir = GpioDirOut;
|
||||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcTIM1APort);
|
||||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,IR_38K_AF);
|
||||
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能
|
||||
|
||||
stcBtBaseCfg.enWorkMode = BtWorkMode0; //定时器模式
|
||||
stcBtBaseCfg.enCT = BtTimer; //定时器功能,计数时钟为内部PCLK
|
||||
stcBtBaseCfg.enPRS = BtPCLKDiv1; //PCLK/3
|
||||
stcBtBaseCfg.enCntMode = Bt16bitArrMode; //自动重载16位计数器/定时器
|
||||
stcBtBaseCfg.bEnTog = TRUE;
|
||||
stcBtBaseCfg.bEnGate = FALSE;
|
||||
stcBtBaseCfg.enGateP = BtGatePositive;
|
||||
|
||||
Bt_Mode0_Init(TIM2, &stcBtBaseCfg); //TIM2 的模式0功能初始化8 *
|
||||
|
||||
u16Period = Sysctrl_GetPClkFreq() /(2 * 38000);
|
||||
u16ArrValue = 0x10000 - u16Period;
|
||||
Bt_M0_ARRSet(TIM2, u16ArrValue); //设置重载值(ARR = 0x10000 - 周期)
|
||||
u16CntValue = 0x10000 - u16Period;
|
||||
Bt_M0_Cnt16Set(TIM2, u16CntValue); //设置计数初值
|
||||
Bt_M0_Enable_Output(TIM2, TRUE); //TIM2 端口输出使能
|
||||
|
||||
#endif
|
||||
}
|
||||
//
|
||||
void IR_Uart_38K_PreSleep(void)
|
||||
{
|
||||
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, FALSE); //Base Timer外设时钟关闭
|
||||
Bt_M0_Stop(TIM2);
|
||||
|
||||
Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||||
|
||||
//配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||||
Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||||
}
|
||||
//
|
||||
//void IR_Uart_38K_Enable(boolean_t enCmd)
|
||||
//{
|
||||
//#if IR_38K_OPEN
|
||||
// if(TRUE == enCmd)
|
||||
// {
|
||||
// UartInit(IR_UART_COM,BAUD2400,DATA_BIT_8,STOPBIT_1,UART_EVEN_PARITY,UART_LPUART_Disable);//UART_EVEN_PARITY UART_NONE_PARITY
|
||||
// IR_Uart_38K_Config();
|
||||
// Bt_M0_Run(TIM2); //TIM2 运行
|
||||
//
|
||||
// Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, FALSE);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Gpio_WriteOutputIO(IR_38K_PORT,IR_38K_PIN, TRUE);//38K引脚输出为高
|
||||
// Gpio_WriteOutputIO(IR_UART_CTL_PORT, IR_UART_CTL_PIN, TRUE);//电源控制脚开漏输出高,红外模块断电
|
||||
// //配置红外接收RX口为输出,输出低,为了防止红外接收芯片漏电
|
||||
// stc_gpio_cfg_t stcGpioCfg;
|
||||
// DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
// stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
// stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
// stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
// stcGpioCfg.enPd = GpioPdDisable;
|
||||
// stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||||
// stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
// Gpio_Init(LPUART0_RX_PORT, LPUART0_RX_PIN, &stcGpioCfg);
|
||||
// Gpio_WriteOutputIO(LPUART0_RX_PORT, LPUART0_RX_PIN, FALSE);
|
||||
// Gpio_Init(LPUART0_TX_PORT, LPUART0_TX_PIN, &stcGpioCfg);
|
||||
// Gpio_WriteOutputIO(LPUART0_TX_PORT, LPUART0_TX_PIN, TRUE); //TX也配置为输出高
|
||||
// Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||||
// }
|
||||
//#endif
|
||||
//}
|
||||
|
||||
/*************************************************
|
||||
Function: void IR_38K_Open(void)
|
||||
Description: 红外38K 配置PWM相关寄存器,并开启38K载波
|
||||
Input: 无
|
||||
Return: 无
|
||||
Others:
|
||||
*************************************************/
|
||||
void IR_38KCarrier_Open(void)
|
||||
{
|
||||
IR_Uart_38K_Config();
|
||||
Bt_M0_Run(TIM2);
|
||||
|
||||
}
|
||||
|
||||
/*************************************************
|
||||
Function: void IR_38K_Close(void)
|
||||
Description: 关闭38K载波,把该引脚配置为输出高
|
||||
Input: 无
|
||||
Return: 无
|
||||
Others:
|
||||
*************************************************/
|
||||
void IR_38KCarrier_Close(void)
|
||||
{
|
||||
Bt_M0_Stop(TIM2);
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(IR_38K_PORT, IR_38K_PIN, &stcGpioCfg);
|
||||
Gpio_SetAfMode(IR_38K_PORT,IR_38K_PIN,GpioAf0); //普通IO
|
||||
Gpio_WriteOutputIO(IR_38K_PORT, IR_38K_PIN, TRUE);//38K引脚输出为高
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif //#ifdef __cplusplus
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* File: __GP22GAS_IR_APP_H
|
||||
* Author:
|
||||
*
|
||||
* Created on£º2016-3-7
|
||||
*/
|
||||
|
||||
#ifndef __UWater_IR_APP_H
|
||||
#define __UWater_IR_APP_H
|
||||
|
||||
|
||||
#include "type.h"
|
||||
|
||||
|
||||
|
||||
#define IR_CONTROL_S0 0
|
||||
#define IR_CONTROL_S1 1
|
||||
#define IR_CONTROL_S2 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define IR_DEAL_S0 0
|
||||
#define IR_DEAL_S1 1
|
||||
|
||||
void IrInitApp(void);
|
||||
u8 IrIfSleepApp(void);
|
||||
u8 IrIfInS0WakeTime(void);
|
||||
u8 IrCheckStateApp(void);
|
||||
void IrMachineApp(void);
|
||||
void IR_Uart_38K_Config(void);
|
||||
//void IR_Uart_38K_Enable(boolean_t enCmd);
|
||||
void IR_Uart_38K_PreSleep(void);
|
||||
void IR_38KCarrier_Close(void);
|
||||
void IR_38KCarrier_Open(void);
|
||||
#endif /* __UWater_IR_APP_H */
|
||||
|
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* File: __GP22Gas_KEY_APP_C
|
||||
* Author:
|
||||
*
|
||||
* Created on:2015-5-18
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
/*--------------------------------Including-------------------------------------------*/
|
||||
#include "UWater_key_app.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
#include "UWater_valve_driver.h"
|
||||
|
||||
/*------------------------------ Variable Define -------------------------------------*/
|
||||
static u8 s_g_key_sys_state; //按键应用状态机状态变量
|
||||
static u8 g_menu_change_msg; //切菜单MSG;
|
||||
static u8 g_key_res = 0;
|
||||
static u8 s_key_iropen = 0;
|
||||
static u8 s_old_tch_state;
|
||||
u8 s_valve_close_key_cnt=0;
|
||||
/*************************************************************************************
|
||||
* @fun_name: void KeyMainMachineDriver(void)
|
||||
* @brief : 按键模块应用层处理机;
|
||||
* @param[in] : None
|
||||
* @param[out] :None
|
||||
* @retval : None
|
||||
* @other : 处于MainSpace,处于main函数主循环中。
|
||||
*************************************************************************************/
|
||||
void KeyMachineApp(void)
|
||||
{
|
||||
switch (s_g_key_sys_state)
|
||||
{
|
||||
case KEY_SYS_S0:
|
||||
{
|
||||
g_key_res = KeyCheckMsg();
|
||||
switch (g_key_res)
|
||||
{
|
||||
case NO_EVENT:
|
||||
{
|
||||
if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) != s_old_tch_state)
|
||||
{
|
||||
s_old_tch_state = FrameCheckParaApp(FramePara_FuncCfg0_3)>>24;
|
||||
if(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) == 0xAA)
|
||||
{
|
||||
FrameSetMsgApp(MsgTouchKeyReset);
|
||||
}
|
||||
else
|
||||
{
|
||||
Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO, TCH_KEY_POWER_PIN, FALSE);//关闭按键开关
|
||||
}
|
||||
}
|
||||
if(FrameCheckMsgApp(MsgTouchKeyReset) &&(((FrameCheckParaApp(FramePara_FuncCfg0_3)>>24)&0xFF) == 0xAA))
|
||||
{
|
||||
FrameClearMsgApp(MsgTouchKeyReset);
|
||||
if(TchKey_GetPressLimitState() == 0)
|
||||
{
|
||||
EnableNvic(TCH_KEY_IRQ, TCH_KEY_PRIORITY, FALSE);
|
||||
Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO,TCH_KEY_POWER_PIN,FALSE);
|
||||
Set100msTimer(TIMER_100MS_TOUCH_RESET,10);//1s
|
||||
s_g_key_sys_state = KEY_SYS_S1;
|
||||
}
|
||||
s_valve_close_key_cnt=0;//关阀状态特殊按键次数限制每小时清0
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SHORT_PRESS:
|
||||
{
|
||||
KeyClearMsg(1);
|
||||
g_key_res = 0;
|
||||
g_menu_change_msg |= MENU_TWO;
|
||||
s_key_iropen = TRUE;
|
||||
FrameSetMsgApp(Msg_FactoryBleActive);//厂区唤醒蓝牙
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
break;
|
||||
case LONG_PRESS:
|
||||
{
|
||||
KeyClearMsg(2);
|
||||
g_key_res = 0;
|
||||
if (LcdCheckMeumApp() == ((((u16)A1) << 8) | A1B4) &&FrameCheckParaApp(FramePara_EnableTestFunc)) //在瞬时流量界面长按进入累计时间界面切换到检定
|
||||
{
|
||||
g_menu_change_msg = g_menu_change_msg | MENU_TEST;
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if MODULE_BLE_USED
|
||||
#else
|
||||
if (LcdCheckMeumApp() == ((((u16)A3) << 8) | A3B2)) // A3B1长按进入A3B2发起上报
|
||||
{
|
||||
g_menu_change_msg |= MENU_ACTIVE_RF;
|
||||
}
|
||||
#endif
|
||||
g_menu_change_msg |= MENU_ONE;
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LONGLONG_PRESS:
|
||||
{
|
||||
KeyClearMsg(4);
|
||||
g_key_res = 0;
|
||||
#if defined(VALVE)
|
||||
//关阀状态减少应急开阀和上报的按键难度
|
||||
if((ValveGetState() == VALVE_STATE_CLOSE_EMERGENCY)||(ValveGetState() == VALVE_STATE_CLOSE))
|
||||
{
|
||||
if(s_valve_close_key_cnt<2)//每小时限制2次
|
||||
{
|
||||
FrameSetMsgApp(Msg_ValveOpenEmergency);//应急开阀消息
|
||||
g_menu_change_msg |= MENU_ACTIVE_RF;
|
||||
s_valve_close_key_cnt++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
break;
|
||||
case ERR_PRESS:
|
||||
{
|
||||
KeyClearMsg(3);
|
||||
g_key_res = 0;
|
||||
g_menu_change_msg |= MENU_DEFAULT;
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
KeyClearMsg(1);
|
||||
KeyClearMsg(2);
|
||||
KeyClearMsg(3);
|
||||
KeyClearMsg(4);
|
||||
KeyClearMsg(5);
|
||||
KeyClearMsg(6);
|
||||
KeyClearMsg(7);
|
||||
KeyClearMsg(8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_SYS_S1:
|
||||
{
|
||||
if(TRUE ==Check100msTimer(TIMER_100MS_TOUCH_RESET))
|
||||
{
|
||||
Gpio_WriteOutputIO(TCH_KEY_POWER_GPIO,TCH_KEY_POWER_PIN,TRUE);
|
||||
EnableNvic(TCH_KEY_IRQ, TCH_KEY_PRIORITY, TRUE);
|
||||
s_g_key_sys_state = KEY_SYS_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/***********************应用层按键管理初始化***************************
|
||||
Function: void KeyInitApp(void)
|
||||
Description: 应用层按键管理初始化;
|
||||
Input: 无;
|
||||
Return: 无;
|
||||
Others: 处于MainSpace,第一类接口:初始化接口。
|
||||
*****************************************************************/
|
||||
void KeyInitApp(void)
|
||||
{
|
||||
s_g_key_sys_state = KEY_SYS_S0; //按键应用状态机状态变量
|
||||
g_menu_change_msg = FALSE; //切菜单MSG,初始化为0;
|
||||
g_key_res = 0;
|
||||
}
|
||||
|
||||
/***********************查询按键对LCD的MSG输出***************************
|
||||
|
||||
Function: u8 KeyCheckLcdMsgApp(void)
|
||||
Description: 查询按键对LCD的MSG输出;
|
||||
Input: 无;
|
||||
Return: bit0=1:切2级菜单MSG;bit1=1:切1级菜单MSG;bit2=1:切默认菜单;bit3=1:切检定状态菜单<EFBFBD>bit4=1:短按键开阀;bit5=1:按键使能无线进入活跃期MSG for GSM APP
|
||||
Others: 处于MainSpace,第二类接口:工作接口。
|
||||
****************************************************************/
|
||||
u8 KeyCheckLcdMsgApp(u8 msg)
|
||||
{
|
||||
return (g_menu_change_msg & msg);
|
||||
}
|
||||
|
||||
/***********************清除按键对LCD的MSG输出***************************
|
||||
|
||||
Function: u8 KeyClearLcdMessageApp (u8)
|
||||
Description: 清除按键对LCD的MSG输出;
|
||||
Input: 清除MSG 0:切2级菜单MSG;1:切1级菜单MSG;2:切默认菜单;3:切检定状态菜单; 4:短按键开阀 5:按键使能无线进入活跃期MSG for GSM APP
|
||||
Return: TRUE:操作成功;FALSE:操作失败;
|
||||
Others: 处于MainSpace,第二类接口:工作接口。
|
||||
****************************************************************/
|
||||
u8 KeyClearLcdMsgApp(u8 msg)
|
||||
{
|
||||
g_menu_change_msg &= (~msg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************查询模块是否允许休眠*****************
|
||||
Function: u8 KeyIfSleepApp(void)
|
||||
Description: 查询模块是否允许休眠;
|
||||
Input: 无;
|
||||
Return: TRUE:允许休眠; FALSE:不允许休眠。
|
||||
Others: 处于MainSpace,第三类接口:休眠前接口。
|
||||
****************************************************************/
|
||||
u8 KeyIfSleepApp(void)
|
||||
{
|
||||
if (s_g_key_sys_state == KEY_SYS_S0)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
/***********************设置按键唤醒红外消息***************************
|
||||
Function: void KeySetLcdMsgApp(u8 msg)
|
||||
Description: 设置按键唤醒红外10S
|
||||
Input: 无
|
||||
Return: 无;
|
||||
Others:
|
||||
*****************************************************************/
|
||||
void KeySetLcdMsgApp(u8 msg)
|
||||
{
|
||||
g_menu_change_msg |= msg;
|
||||
}
|
||||
|
||||
/***********************查询是否有按键唤醒红外10S***************************
|
||||
Function: void KeyCheckIrOpenMsg(void)
|
||||
Description: 查询是否有按键唤醒红外10S
|
||||
Input: 无
|
||||
Return: s_key_iropen;
|
||||
Others:
|
||||
*****************************************************************/
|
||||
u8 KeyCheckIrOpenMsg(void)
|
||||
{
|
||||
return s_key_iropen;
|
||||
}
|
||||
|
||||
/***********************清楚按键唤醒红外通信10s标志***************************
|
||||
Function: void KeyClearIrOpenMsg(void)
|
||||
Description: 清楚按键唤醒红外通信10s标志
|
||||
Input: 无;
|
||||
Return: 无;
|
||||
Others:
|
||||
*****************************************************************/
|
||||
void KeyClearIrOpenMsg(void)
|
||||
{
|
||||
s_key_iropen = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* File: __GP22Gas_KEY_APP_H
|
||||
* Author:
|
||||
*
|
||||
* Created on:2015-5-18
|
||||
*/
|
||||
|
||||
#ifndef __UWater_KEY_APP_H
|
||||
#define __UWater_KEY_APP_H
|
||||
|
||||
#include "type.h"
|
||||
#include "UWater_key_driver.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*------------------------------- Variable Define -----------------------------------*/
|
||||
#define KEY_SYS_S0 0 //按键应用状态机状态号
|
||||
#define KEY_SYS_S1 1
|
||||
|
||||
//#define MENU_TWO 0b10 // 切2级菜单MSG
|
||||
//#define MENU_ONE 0b01 // 切1级菜单MSG
|
||||
//#define MENU_DEFAULT 0b100 //切默认菜单MSG
|
||||
//#define MENU_TEST 0b1000 //切检定状态菜单MSG
|
||||
//#define MENU_TEST_GP30 0b10000 //切测试菜单MSG
|
||||
//#define MENU_ACTIVE_RF 0b100000 //无线活跃MSG 递传
|
||||
//#define MENU_ACTIVE_RF_APP 0b1000000 //无线活跃MSG 小无线应用
|
||||
|
||||
#define MENU_TWO 0x01//0b01 // 切2级菜单MSG
|
||||
#define MENU_ONE 0x02//0b10 // 切1级菜单MSG
|
||||
#define MENU_DEFAULT 0x04//0b100 //切默认菜单MSG
|
||||
#define MENU_TEST 0x08//0b1000 //切检定状态菜单MSG
|
||||
#define MENU_ACTIVE_RF 0x20//0b100000 //唤醒无线GSM
|
||||
|
||||
|
||||
/*-------------------------------- 外部接口函数 ---------------------------------*/
|
||||
void KeyInitApp(void); //应用层按键管理初始化
|
||||
void KeyMachineApp(void); //应用层建立任务接口
|
||||
u8 KeyCheckLcdMsgApp(u8 msg); //查询按键对LCD的MSG输出
|
||||
u8 KeyClearLcdMsgApp(u8); //清除按键对LCD的MSG输出
|
||||
void KeySetLcdMsgApp(u8 msg);
|
||||
u8 KeyIfSleepApp(void); //查询模块是否允许休眠
|
||||
void KeySetIrOpenMsg(void);
|
||||
u8 KeyCheckIrOpenMsg(void);
|
||||
void KeyClearIrOpenMsg(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif //#ifndef __cplusplus
|
||||
|
||||
|
||||
#endif /* __UWater_KEY_APP_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,140 @@
|
|||
|
||||
#ifndef __UWater_LCD_APP_H
|
||||
#define __UWater_LCD_APP_H
|
||||
#include "sys_config.h"
|
||||
#include "type.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define A1 1
|
||||
#define A2 2
|
||||
#define A3 3
|
||||
#define A4 4
|
||||
#define A5 5
|
||||
#define AB0 0
|
||||
#define AU 3
|
||||
|
||||
#define A1B1 1
|
||||
#define A1B2 2
|
||||
#define A1B3 3
|
||||
#define A1B4 4
|
||||
#define A1B5 5
|
||||
#define B1U 5
|
||||
|
||||
#define A2B1 1
|
||||
#define A2B2 2
|
||||
#define A2B3 3
|
||||
#define A2B4 4
|
||||
#define A2B5 5
|
||||
#define A2B6 6
|
||||
#define A2B7 7
|
||||
#define A2B8 8
|
||||
#define A2B9 9
|
||||
#define A2B10 10
|
||||
#define A2B11 11
|
||||
#define A2B12 12
|
||||
#define A2B13 13
|
||||
#define A2B14 14
|
||||
#define B2U 14
|
||||
|
||||
#define A3B1 1
|
||||
#define A3B2 2
|
||||
#define B3U 2
|
||||
|
||||
#define A4B1 1
|
||||
#define A4B2 2
|
||||
#define A4B3 3
|
||||
#define A4B4 4
|
||||
#define A4B5 5
|
||||
#define A4B6 6
|
||||
#define B4U 6
|
||||
|
||||
#define LCD_RF_TIME 10 //单位100ms
|
||||
#define LCD_UPDATE_TIME 1 //单位1s
|
||||
|
||||
//#define LCD_RAM_TIME 10 //单位100ms
|
||||
//#define LCD_A1_TIME 10 //单位s
|
||||
//#define LCD_A23_TIME 60 //单位s
|
||||
#define LCD_A4_TIME 10800 //3*60*60 //单位s
|
||||
//#define LCD_VAL_TIME 1 //单位s
|
||||
|
||||
//固化字符界面定义
|
||||
|
||||
//A1菜单
|
||||
#define A1_ACCUMULATE_FLOW ( FUN_M3 )//累计流量(m3)(显示分辨率为0.001M3/H)
|
||||
#define A1_ACCUMULATE_FLOW_REVERSE ( FUN_REVERSE | FUN_M3 )
|
||||
#define A1_TIME_FLOW ( FUN_M3 | FUN_FH | FUN_HOUR )//瞬时流量(显示分辨率为0.001M3/H)
|
||||
#define A1_ACCUMULATE_TIME ( FUN_HOUR ) //累计运行时间
|
||||
|
||||
//#define A1_UNITP ( FUN_YUAN )//单价
|
||||
//#define A1_REMAIN (FUN_SY | FUN_YUAN) //剩余金额
|
||||
//#define A1_PURCJASE (FUN_GR| FUN_YUAN) //购入
|
||||
//#define A1_W_COMUNICATION (FUN_GPRSING) //无线中心频率
|
||||
|
||||
|
||||
//A2菜单
|
||||
//#define A1_ACCUMULATE_TIME ( FUN_M3)//累计流量(m3)
|
||||
|
||||
//A4菜单共计 4屏不同的固化字符(检定模式)
|
||||
#define A4_ACCUMULATE_FLOW (FUN_TEST | FUN_M3)//累计流量(L)(检定时显示分辨率为0.0001M3/H显示单位改为L,即0.01L)
|
||||
#define A4_TIME_FLOW (FUN_TEST | FUN_FH | FUN_M3 | FUN_HOUR)//瞬时流量(m3/h)(分辨率为0.0001M3/H)
|
||||
#define A4_TOF_TIME (FUN_TEST | FUN_HOUR )//TOF时间差(分辨率为1h)
|
||||
#define A4_SINGLE_TIME (FUN_TEST | FUN_HOUR )//单程时间up(分辨率为1h)
|
||||
//#define A4_Pressure (FUN_TEST | FUN_PASCAL)//压力
|
||||
#define A4_Tem (FUN_TEST | FUN_TEMPERATURE)//温度
|
||||
|
||||
#define A4_ACCUMULATE_FLOW_NOTEST (FUN_M3)//累计流量(L)(检定时显示分辨率为0.0001M3/H显示单位改为L,即0.01L)
|
||||
#define A4_TIME_FLOW_NOTEST (FUN_FH | FUN_M3 | FUN_HOUR)//瞬时流量(m3/h)(分辨率为0.0001M3/H)
|
||||
#define A4_TOF_TIME_NOTEST (FUN_HOUR )//TOF时间差(分辨率为1h)
|
||||
#define A4_SINGLE_TIME_NOTEST (FUN_HOUR )//单程时间up(分辨率为1h)
|
||||
//#define A4_Pressure_NOTEST (FUN_PASCAL)//压力
|
||||
#define A4_Tem_NOTEST (FUN_TEMPERATURE)//温度
|
||||
//检定状态 共分四种状态
|
||||
/***************************************************/
|
||||
//#define ACCUMULATE_FLOW 0x00
|
||||
//#define TIME_FLOW 0x01
|
||||
//#define TOF_TIME 0x02
|
||||
//#define SINGLE_TIME 0x03
|
||||
//#define LCD_Pressure 0x04
|
||||
//#define LCD_Tem 0x05
|
||||
/******************************************************/
|
||||
|
||||
|
||||
//A1菜单共计0屏不同的固化字符(开发环境)
|
||||
#define A1_TOTAL_DISPLAY_4_D 1000//10方
|
||||
#define A1_TOTAL_DISPLAY_3_D 100000
|
||||
#define A1_TOTAL_DISPLAY_2_D 1000000
|
||||
#define A1_TOTAL_DISPLAY_1_D 10000000
|
||||
#define A1_TOTAL_DISPLAY_0_D 100000000
|
||||
//接口查询输入参数
|
||||
/***************************************************/
|
||||
|
||||
//#define GP22_APP_INS_FLOW 1//瞬时流量
|
||||
//#define GP22_APP_TOTAL_FLOW 2//累计流量
|
||||
/******************************************************/
|
||||
|
||||
typedef union //强制转化为浮点变量
|
||||
{
|
||||
u32 gp22_u32;
|
||||
float gp22_float;
|
||||
} To_lcd_Float;
|
||||
|
||||
//工作接口函数
|
||||
extern u8 LcdIfSleepApp(void);
|
||||
extern u8 LcdCheckStateApp(void);
|
||||
extern u16 LcdCheckMeumApp(void);
|
||||
extern void LcdMachineApp(void);
|
||||
extern void LcdInitApp(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __UWater_LCD_APP_H */
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,248 @@
|
|||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
#include "UWater_power_app.h"
|
||||
#include "UWater_adc_driver.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
#include "soe.h"
|
||||
/*------------------------------ Variable Define -------------------------------------*/
|
||||
|
||||
static u8 s_g_voltage_stat = NORMAL_POWER; // 初始化,电源电压正常
|
||||
static u8 s_g_power_machine_state_num = POWER_SYS_S0; // 电源电压检测处理机状态号
|
||||
static u8 s_power_adc_done = 0; // AD装换结果完成标志
|
||||
static u32 s_power_adc_result = 0; // AD转换后结果存放
|
||||
static u8 s_power_reset=0;
|
||||
|
||||
|
||||
u8 s_power_sleep_sum = 0;
|
||||
u8 s_power_sleep_flag = FALSE; // 电源管理之休眠
|
||||
u32 temp_value;
|
||||
|
||||
/*------------------------------ Function Define -------------------------------------*/
|
||||
|
||||
|
||||
/***********************电池电压检测使能***************************
|
||||
Function: void PowerADCEnable(void) void PowerADCDisable(void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
****************************************************************/
|
||||
void PowerADCEnable(void)
|
||||
{
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置:关闭开漏,使用推挽输出
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, TRUE);
|
||||
}
|
||||
|
||||
void PowerADCDisable(void)
|
||||
{
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置:关闭开漏,使用推挽输出
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, FALSE);
|
||||
}
|
||||
|
||||
/***********************上电初始化***************************
|
||||
Function: void PowerManageInitSys(void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
****************************************************************/
|
||||
void PowerManageInitSys(void)
|
||||
{
|
||||
s_g_voltage_stat = NORMAL_POWER; // 初始化,电源电压正常
|
||||
s_g_power_machine_state_num = POWER_SYS_S0; // 电源电压检测处理机状态号
|
||||
RtccSetTimer(RTCC_TIMER_BAT_NUM, 30); //上电30s后检测电池电压
|
||||
PowerADCDisable();
|
||||
}
|
||||
|
||||
/***********************查询欠压信息***************************
|
||||
Function: u8 PowerCheckStatusSys(void)
|
||||
Description: 查询当前电池是否欠压
|
||||
Input:
|
||||
Return: LOW_POWER :电池电压低 NORMAL_POWER:电压正常
|
||||
Others:
|
||||
****************************************************************/
|
||||
u8 PowerCheckStatusSys (void)
|
||||
{
|
||||
return (s_g_voltage_stat);
|
||||
}
|
||||
/***********************查询电压值信息***************************
|
||||
Function: u16 PowerCheckValueSys(void)
|
||||
Description: 查询当前电池值,采样处的值
|
||||
Input:
|
||||
Return: 放大100倍的 u16,16进制
|
||||
Others:
|
||||
****************************************************************/
|
||||
u16 PowerCheckValueSys(void)
|
||||
{
|
||||
return ((u16)temp_value);
|
||||
}
|
||||
/***********************任务建立接口***************************
|
||||
Function: void PowerMachineSys (void)
|
||||
Description: 应用层建立任务接口
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
*****************************************************************/
|
||||
void PowerMachineSys(void)
|
||||
{
|
||||
static u8 low_power_sum = 0;
|
||||
|
||||
switch (s_g_power_machine_state_num)
|
||||
{
|
||||
case POWER_SYS_S0:
|
||||
if (0 == RtccCheckTimer(RTCC_TIMER_BAT_NUM))
|
||||
{
|
||||
if(TASK_IDLE == AdcIfIdle())
|
||||
{
|
||||
PowerADCEnable();
|
||||
AdcStartConvert(POWER_CHECK_CHANNEL, POWER_CHECK_NUM, POWER_CHECK_INTERVAL, &s_power_adc_result, &s_power_adc_done);
|
||||
s_g_power_machine_state_num = POWER_SYS_S1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case POWER_SYS_S1:
|
||||
if (TRUE == s_power_adc_done)
|
||||
{
|
||||
PowerADCDisable();
|
||||
if (ADC_OK == AdcGetStatus())
|
||||
{
|
||||
if(s_power_adc_result <= LOW_POWER_ADC_VALUE) //欠压
|
||||
{
|
||||
low_power_sum ++;
|
||||
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL);
|
||||
if(low_power_sum >=6)
|
||||
{
|
||||
SaveNewSoe(SOE_BAT_LOW_LEVEL,SOE_REMARK_NOR); //存SOE
|
||||
s_g_voltage_stat = LOW_POWER;
|
||||
low_power_sum = 0;
|
||||
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //定时12h
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_voltage_stat = NORMAL_POWER;
|
||||
low_power_sum = 0;
|
||||
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //定时12h
|
||||
}
|
||||
temp_value = s_power_adc_result * 500; //((v/2)/2.5)*4096 = s_power_adc_result
|
||||
temp_value = temp_value/4096;
|
||||
if(s_power_reset==0)//法拉电容充电
|
||||
{
|
||||
s_power_reset =1;
|
||||
if(temp_value<360)
|
||||
{
|
||||
RtccSetTimer(RTCC_TIMER_BAT_NUM, 10);//10秒后重新测试
|
||||
}
|
||||
}
|
||||
s_g_power_machine_state_num = POWER_SYS_S0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************休眠处理函数***************************
|
||||
Function: u8 PowerIfSleepSys(void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
*****************************************************************/
|
||||
u8 PowerIfSleepSys(void)
|
||||
{
|
||||
if (s_g_power_machine_state_num == POWER_SYS_S0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void PowerPreSleepSys(void)
|
||||
{
|
||||
// PowerADCDisable(); //管脚控制
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//长时间不休眠处理函数2017-7-21/////////////////////////////////////
|
||||
|
||||
/***********************数据清零***************************
|
||||
Function: void PowerUnSleepClearSumSys (void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
*****************************************************************/
|
||||
void PowerUnSleepClearSumSys(void)
|
||||
{
|
||||
s_power_sleep_sum = 0;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************
|
||||
Function: u8 PowerUnSleepSaveDataMsgSys (void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
*****************************************************************/
|
||||
u8 PowerUnSleepSaveDataMsgSys(void)
|
||||
{
|
||||
return s_power_sleep_flag;
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
Function: void PowerUnSleepSaveDataClearMsgSys (void)
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
*****************************************************************/
|
||||
void PowerUnSleepSaveDataClearMsgSys(void)
|
||||
{
|
||||
s_power_sleep_flag = FALSE;
|
||||
}
|
||||
|
||||
|
||||
void PowerUnSleepSumAddSys(void)
|
||||
{
|
||||
s_power_sleep_sum++;
|
||||
if (s_power_sleep_sum >= 10)//10min
|
||||
{
|
||||
s_power_sleep_sum = 0;
|
||||
s_power_sleep_flag = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
|
||||
#ifndef __UWater_POWER_APP_H
|
||||
#define __UWater_POWER_APP_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
|
||||
|
||||
/*--------------------------------- Variable Define ------------------------------------*/
|
||||
//状态机状态定义
|
||||
#define POWER_SYS_S0 0
|
||||
#define POWER_SYS_S1 1
|
||||
|
||||
|
||||
//#define POWER_CHECK_ADC ADC_ONE
|
||||
#define POWER_CHECK_CHANNEL 10
|
||||
#define POWER_CHECK_NUM 3
|
||||
#define POWER_CHECK_INTERVAL 30000
|
||||
|
||||
//电池电压信息
|
||||
#define LOW_POWER 10 //电池电压低
|
||||
#define NORMAL_POWER 01 //电压正常
|
||||
|
||||
//电压低于
|
||||
#define LOW_POWER_ADC_VALUE 2540// //((3.1/2)/2.5)*4096 阈值3.1-V(无磁是3V) //0x9A0
|
||||
|
||||
//采样信息
|
||||
#define VOLTAGE_TEST_INTERVAL 43200 //电池电压检测间隔,12h(60*60*12)
|
||||
|
||||
#define VOLTAGE_ADC_INTERVAL 20 //电池电压采样间隔,20ms采集一次
|
||||
#define VOLTAGE_ADC_INTERVAL_SUM 10 //电池电压采样间隔,采样10次
|
||||
|
||||
#if (HARDWARE_VERSION==0x14)//方壳表
|
||||
#define BAT_CHECK_ENPORT GpioPortE
|
||||
#define BAT_CHECK_ENPIN GpioPin5
|
||||
|
||||
#elif (HARDWARE_VERSION==0x18)//圆壳表
|
||||
#define BAT_CHECK_ENPORT GpioPortF
|
||||
#define BAT_CHECK_ENPIN GpioPin0
|
||||
#endif
|
||||
/*---------------------------------- Function Declare -----------------------------------*/
|
||||
|
||||
void PowerMachineSys(void);
|
||||
u8 PowerCheckStatusSys(void);
|
||||
void PowerManageInitSys(void);
|
||||
|
||||
void PowerUnSleepClearSumSys(void);
|
||||
void PowerUnSleepSumAddSys(void);
|
||||
u8 PowerUnSleepSaveDataMsgSys(void);
|
||||
void PowerUnSleepSaveDataClearMsgSys(void);
|
||||
|
||||
|
||||
u8 PowerIfSleepSys(void);
|
||||
void PowerPreSleepSys(void);
|
||||
u16 PowerCheckValueSys(void);
|
||||
|
||||
#endif /* __UWater_POWER_MANAGE_SYS_H */
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,389 @@
|
|||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "type.h"
|
||||
#include "UWater_pt_app.h"
|
||||
#include "UWater_gpio_driver.h"
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
#include "UWater_adc_driver.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_sys.h"
|
||||
#include "sys_processor.h"
|
||||
|
||||
|
||||
static float s_g_temp_value = 20;//上电默认20℃
|
||||
static u32 s_temp_adc_result = 0;
|
||||
static u8 s_temp_adc_if_done = 0;
|
||||
|
||||
static u32 s_pt_tickstart = 0;
|
||||
|
||||
//static u32 s_temp_adc_arr[PT_FILTER_NUM]; //20181025 去掉滑动滤波
|
||||
//static u8 s_pt_arr_sub = 0; //20181025 去掉滑动滤波
|
||||
|
||||
|
||||
|
||||
static u8 s_g_temp_machine_state_num = TEMP_S0; // 电源电压检测处理机状态号
|
||||
//static float s_g_temp_value_last = 0;
|
||||
static float s_g_temp_value_now;
|
||||
float Temp_cal(float temp_result);
|
||||
|
||||
#if (TEMP_RM)//用热敏电阻
|
||||
|
||||
#else //用IC温度传感器
|
||||
static float s_g_temp_voltage;
|
||||
static float s_g_temp_result;
|
||||
static float s_g_temp_error;
|
||||
#endif
|
||||
|
||||
extern float temp_calculate_last;//获取温度数据
|
||||
/***************************************************************
|
||||
函数名称: u32 PtFilterJunZhi(u32 *data, u8 data_len)
|
||||
功 能:中值 + 算数平均滤波
|
||||
参 数:u32 *data 需要进行处理的数据数组地址
|
||||
返回值 :滤波完成后的值
|
||||
****************************************************************/
|
||||
//static u32 PtFilterJunZhi(u32 *data, u8 data_len) //20181025 去掉滑动滤波
|
||||
//{
|
||||
// u8 i, j, len, count;
|
||||
// u32 *p;
|
||||
// u32 temp = 0, sum = 0;
|
||||
|
||||
// p = data;
|
||||
// len = data_len;
|
||||
|
||||
// for (j = 0; j < len - 1; j++)
|
||||
// {
|
||||
// for (i = 0; i < len - 1 - j; i++)
|
||||
// {
|
||||
// if (p[i] > p[i + 1])
|
||||
// {
|
||||
// temp = p[i];
|
||||
// p[i] = p[i + 1];
|
||||
// p[i + 1] = temp;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (count = 2; count < len - 2; count++)
|
||||
// {
|
||||
// sum += p[count];
|
||||
// }
|
||||
|
||||
// return (sum / (len - 4));
|
||||
//}
|
||||
|
||||
/***********************温度传感器供电***************************
|
||||
Function:
|
||||
Description:
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
****************************************************************/
|
||||
void TempADCPowEnable(void)
|
||||
{
|
||||
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_SET);//高
|
||||
}
|
||||
|
||||
void TempADCPowDisable(void)
|
||||
{
|
||||
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//低
|
||||
}
|
||||
|
||||
|
||||
/************************************************
|
||||
Function: u8 TempStartTaskApp(void)
|
||||
Description: 启动温度测量
|
||||
Input:
|
||||
return: 0 启动失败 1 启动成功
|
||||
Others:
|
||||
*************************************************/
|
||||
u8 TempStartTaskApp(void)
|
||||
{
|
||||
if((s_g_temp_machine_state_num == TEMP_S0)&&(FixedTimeNbIoTUploadIfIdle() == TASK_IDLE))
|
||||
{
|
||||
TempADCPowEnable();
|
||||
s_pt_tickstart = Timer1usGetTick(); //power on delay
|
||||
s_g_temp_machine_state_num = TEMP_S2;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
/************************************************
|
||||
Function: float TempCheckValueApp(void)
|
||||
Description: 查询温度数据
|
||||
Input:
|
||||
return: 温度数据
|
||||
Others:
|
||||
*************************************************/
|
||||
float TempCheckValueApp(void)
|
||||
{
|
||||
#if WENDU_FANSUAN_OPEN
|
||||
s_g_temp_value = temp_calculate_last;//反算温度的实时数值
|
||||
#else
|
||||
if(s_g_temp_value > 90)
|
||||
{
|
||||
s_g_temp_value = 36;
|
||||
}
|
||||
else if(s_g_temp_value < -30)
|
||||
{
|
||||
s_g_temp_value = -1;
|
||||
}
|
||||
#endif
|
||||
return s_g_temp_value;
|
||||
}
|
||||
|
||||
|
||||
void TempInitApp(void)
|
||||
{
|
||||
//// u8 i; //20181025 去掉滑动滤波
|
||||
s_g_temp_machine_state_num = TEMP_S0;
|
||||
|
||||
stc_gpio_cfg_t stcGpioCfg;
|
||||
|
||||
DDL_ZERO_STRUCT(stcGpioCfg);
|
||||
//PF7
|
||||
stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出
|
||||
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->驱动能力
|
||||
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
|
||||
stcGpioCfg.enPd = GpioPdDisable;
|
||||
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭
|
||||
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
|
||||
Gpio_Init(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, &stcGpioCfg);
|
||||
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//输出低电平
|
||||
|
||||
#if WENDU_FANSUAN_OPEN
|
||||
|
||||
#else
|
||||
TempStartTaskApp();//上电就立马启动温度采集 添加原因:表计复位后,非检定6s才启动温度采集,导致前6s的温度值是0
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************
|
||||
Function: TempPreSleep()
|
||||
Description: 休眠前处理函数
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void TempPreSleep(void)
|
||||
{
|
||||
Gpio_WriteOutputIO(TEMP_PWR_GPIOx, TEMP_PWR_GPIO_NUM, GPIO_PIN_RESET);//低
|
||||
}
|
||||
|
||||
/************************************************
|
||||
Function: TempWakeSleep()
|
||||
Description: 唤醒处理函数
|
||||
Input:
|
||||
return:
|
||||
Others:
|
||||
*************************************************/
|
||||
void TempWakeSleep(void)
|
||||
{
|
||||
; //空
|
||||
}
|
||||
|
||||
u8 TempIfSleepApp(void)
|
||||
{
|
||||
if(s_g_temp_machine_state_num == TEMP_S0)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
void TempMachineApp(void)
|
||||
{
|
||||
switch (s_g_temp_machine_state_num)
|
||||
{
|
||||
case TEMP_S0:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case TEMP_S1:
|
||||
{
|
||||
if(Timer1usGetTick() - s_pt_tickstart > POWER_ON_DELAY)
|
||||
{
|
||||
s_g_temp_machine_state_num = TEMP_S2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TEMP_S2:
|
||||
{
|
||||
if(TASK_IDLE == AdcIfIdle()) //温度
|
||||
{
|
||||
// AdcStartConvert(T_CHECK_ADC, T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_arr[s_pt_arr_sub],&s_temp_adc_if_done);
|
||||
AdcStartConvert(T_CHECK_CHANNEL, T_CHECK_NUM ,T_CHECK_INTERVAL,&s_temp_adc_result,&s_temp_adc_if_done);//20181025 去掉滑动滤波
|
||||
s_g_temp_machine_state_num = TEMP_S3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TEMP_S3:
|
||||
{
|
||||
if (TRUE == s_temp_adc_if_done)
|
||||
{
|
||||
if (ADC_OK == AdcGetStatus())
|
||||
{
|
||||
#if (TEMP_RM)//用热敏传感器
|
||||
if(s_temp_adc_result>TEMP_SEGMENT_SMALL)
|
||||
{
|
||||
s_g_temp_value_now = (float)0.000000004785*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result -(float)0.0000595*s_temp_adc_result*s_temp_adc_result + (float)0.2187*s_temp_adc_result -(float)247.9;//温度传感器建模-20~3
|
||||
s_g_temp_value_now = s_g_temp_value_now - (float)0.7;
|
||||
}
|
||||
else if(s_temp_adc_result>TEMP_SEGMENT_MIDDLE)
|
||||
{
|
||||
s_g_temp_value_now = (float)-0.000000002058*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.00001525*s_temp_adc_result*s_temp_adc_result - (float)0.05455*s_temp_adc_result + (float)82.24;//3~43
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_temp_value_now = (float)-0.00000005296*s_temp_adc_result*s_temp_adc_result*s_temp_adc_result + (float)0.0001457*s_temp_adc_result*s_temp_adc_result - (float)0.1697*s_temp_adc_result + (float)117.5;//43度以上
|
||||
}
|
||||
#else
|
||||
// s_g_temp_value_now = s_g_temp_result;
|
||||
|
||||
// s_temp_adc_result = PtFilterJunZhi(s_temp_adc_arr, PT_FILTER_NUM); //滑动平均滤波
|
||||
// s_pt_arr_sub++;
|
||||
// s_pt_arr_sub %= PT_FILTER_NUM;
|
||||
|
||||
//根据temp_adc_result计算温度值曲线
|
||||
|
||||
// s_g_temp_voltage = ((float)s_g_temp_result)*1.2/10000.0/TMEP_NUM;
|
||||
// s_g_temp_voltage = (s_g_temp_voltage - 0.5)/0.01;
|
||||
// s_g_temp_error = 0.000244*(125 - s_g_temp_voltage)*(s_g_temp_voltage +40) - 2;
|
||||
|
||||
s_g_temp_voltage = (float)250*s_temp_adc_result/(float)4095; //放大100倍
|
||||
|
||||
|
||||
s_g_temp_result = s_g_temp_voltage;
|
||||
if(s_g_temp_result >= 50)
|
||||
{
|
||||
s_g_temp_result -= 50;
|
||||
s_g_temp_voltage = s_g_temp_result;
|
||||
|
||||
if(s_g_temp_result < 125)
|
||||
{
|
||||
s_g_temp_result = (125 - s_g_temp_result) * (s_g_temp_result + 40);
|
||||
s_g_temp_result = s_g_temp_result * (float)0.000244;
|
||||
s_g_temp_error = s_g_temp_result - 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_temp_error = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_temp_result = 50 - s_g_temp_result;
|
||||
s_g_temp_voltage = - s_g_temp_result;
|
||||
if(s_g_temp_result >= 40)
|
||||
{
|
||||
s_g_temp_result = (125 + s_g_temp_result) * (40 - s_g_temp_result );
|
||||
s_g_temp_result = s_g_temp_result * (float)0.000244;
|
||||
s_g_temp_error = s_g_temp_result - 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
s_g_temp_error = 0;
|
||||
}
|
||||
}
|
||||
s_g_temp_value_now = s_g_temp_voltage - s_g_temp_error;
|
||||
#endif
|
||||
|
||||
// if(s_g_temp_value_last == 0)
|
||||
// {
|
||||
// ;
|
||||
// }
|
||||
// else if(s_g_temp_value_now >= s_g_temp_value_last)
|
||||
// {
|
||||
// if((s_g_temp_value_now - s_g_temp_value_last) > 1)
|
||||
// {
|
||||
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if((s_g_temp_value_last - s_g_temp_value_now) > 1)
|
||||
// {
|
||||
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// s_g_temp_value_now = s_g_temp_value_last + (float)0.1*(s_g_temp_value_now - s_g_temp_value_last);
|
||||
// }
|
||||
// }
|
||||
// s_g_temp_value_last = s_g_temp_value_now;
|
||||
s_g_temp_value = Temp_cal(s_g_temp_value_now);
|
||||
}
|
||||
TempADCPowDisable();
|
||||
|
||||
s_g_temp_machine_state_num = TEMP_S0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
float Temp_cal(float temp_result)
|
||||
{
|
||||
// float temp = temp_result ;
|
||||
float temp;
|
||||
u32 heat_temp = FrameCheckParaApp(FramePara_Tc0);
|
||||
if(heat_temp >= 0x80000000)
|
||||
{
|
||||
heat_temp &= 0x7FFFFFFF;
|
||||
temp = temp_result - Gp30DataToFloat(heat_temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = temp_result + Gp30DataToFloat(heat_temp);
|
||||
}
|
||||
#if (TEMP_RM)//热敏电阻
|
||||
|
||||
#else//IC传感器才生效
|
||||
|
||||
if(temp >= (float)23)
|
||||
{
|
||||
temp += (float)0.2;
|
||||
}
|
||||
else if(temp > 15)
|
||||
{
|
||||
|
||||
}
|
||||
else if(temp >= (float)8.5)
|
||||
{
|
||||
// temp -= (float)0.3;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp -= (float)(0.55 );
|
||||
}
|
||||
// if(temp <= 0)
|
||||
// {
|
||||
// temp = temp*(-1);
|
||||
// heat_temp = FloatToGp30Data(temp);
|
||||
// heat_temp = heat_temp|0x80000000;
|
||||
// return heat_temp;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// return FloatToGp30Data(temp);
|
||||
// }
|
||||
#endif
|
||||
return (temp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif //#ifdef __cplusplus
|
|
@ -0,0 +1,74 @@
|
|||
/***********************************************************************************
|
||||
* @Copyright (c):(C)2017, Qindao ieslab Co., Ltd
|
||||
* @FileName : GP22Gas_pt_app.h
|
||||
* @Author :
|
||||
* @Version :V1.0
|
||||
* @Date :2017-5-19
|
||||
* @Description :Data type definition
|
||||
************************************************************************************/
|
||||
|
||||
#ifndef __UWater_PT_APP_H
|
||||
#define __UWater_PT_APP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "sys_config.h"
|
||||
#include "type.h"
|
||||
#include "ddl.h"
|
||||
|
||||
#if (HARDWARE_VERSION==0x14)//方壳表
|
||||
#define TEMP_PWR_GPIOx (GpioPortF)
|
||||
#define TEMP_PWR_GPIO_NUM (GpioPin7)
|
||||
|
||||
#define T_CHECK_CHANNEL 12//PC2端口 12通道
|
||||
|
||||
#elif (HARDWARE_VERSION==0x18)//圆壳表
|
||||
#define TEMP_PWR_GPIOx (GpioPortA)
|
||||
#define TEMP_PWR_GPIO_NUM (GpioPin6)
|
||||
|
||||
#define T_CHECK_CHANNEL 7//PA5端口 5通道
|
||||
#endif
|
||||
|
||||
#define T_CHECK_NUM 6
|
||||
#define T_CHECK_INTERVAL 100
|
||||
|
||||
#define POWER_ON_DELAY 4000 //4000us
|
||||
|
||||
#define PT_FILTER_NUM 10
|
||||
#define TMEP_NUM 10
|
||||
|
||||
//温度检测状态机
|
||||
#define TEMP_S0 0 //IDLE
|
||||
#define TEMP_S1 1
|
||||
#define TEMP_S2 2
|
||||
#define TEMP_S3 3
|
||||
#define TEMP_S4 4
|
||||
#define TEMP_S5 5
|
||||
#define TEMP_S6 6
|
||||
#define TEMP_S7 7
|
||||
#define TEMP_S8 8
|
||||
#define TEMP_S9 9
|
||||
#define TEMP_S10 10
|
||||
|
||||
#define TEMP_SEGMENT_SMALL 2853
|
||||
#define TEMP_SEGMENT_MIDDLE 929
|
||||
|
||||
|
||||
void TempInitApp(void);
|
||||
void TempMachineApp(void);
|
||||
u8 TempStartTaskApp(void);
|
||||
float TempCheckValueApp(void);
|
||||
u8 TempIfSleepApp(void);
|
||||
void TempPreSleep(void);
|
||||
void TempWakeSleep(void);
|
||||
#endif /* __GP30W_TEMP_APP_H */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
* File: __GP22LoRa_RTCC_APP_C
|
||||
* Author:
|
||||
*
|
||||
* Created on:2017-7-24
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "type.h"
|
||||
#include "UWater_rtcc_driver.h"
|
||||
#include "UWater_power_app.h"
|
||||
#include "UWater_eeprom_driver.h"
|
||||
#include "UWater_valve_driver.h"
|
||||
#include "UWater_timer1uS_driver.h"
|
||||
|
||||
#include "UWater_rtcc_app.h"
|
||||
#include "UWater_frame_app.h"
|
||||
#include "UWater_lcd_app.h"
|
||||
#include "UWater_gp22_app.h"
|
||||
#include "UWater_valve_app.h"
|
||||
#include "UWater_DataTools_App.h"
|
||||
//#include "sys_processor.h"
|
||||
#include "UWater_pt_app.h"
|
||||
|
||||
|
||||
|
||||
//static RTCC_EE_DATA ee_data; //RTCC永久性数据
|
||||
RTCC_HISTORY_DATA ee_history_data; //历史数据单元
|
||||
|
||||
u8 miji_collect_buf[384];//密集采集流量暂存寄存器
|
||||
static u8 miji_collect_send_buf[192];//密集采集流量对外接口
|
||||
RTCC_To_Float old_total_flow;//5min累积量初值
|
||||
RTCC_To_Float new_total_flow;//5min累计量终值
|
||||
RTCC_UNION_2U8TOU16 miji_date;
|
||||
static u16 date_remember = 0;
|
||||
RTCC_To_Float temp_to_gloat;//数据转换专用
|
||||
RTCC_UNION_2U8TOU16 jiange_date;
|
||||
//static u16 pulse_day_max_flow_time_temp;
|
||||
//static u32 old_total_speed = 0;
|
||||
//static u32 new_total_speed = 0;
|
||||
//static u8 date_flag = 0;
|
||||
static u8 s_g_rtcc_is_error = 0; //2015-6-3 默认正常
|
||||
static u8 s_g_rtcc_msg = 0; //2015-6-3
|
||||
//static float s_daily_temprature[3];
|
||||
//static u16 s_daily_temprature_min_max[2];
|
||||
|
||||
/*****************************/
|
||||
u8 RtccIsError()
|
||||
{
|
||||
if((RTC_ClkSource()==1)||(s_g_rtcc_is_error == 1))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RtccClearError(void)
|
||||
{
|
||||
s_g_rtcc_is_error = 0;
|
||||
}
|
||||
/*************************************************
|
||||
Function:void RtccInitApp()
|
||||
Description:RTCC INIT
|
||||
Input:void
|
||||
Output:void
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
|
||||
|
||||
/*************************************************
|
||||
Function:u8 RtccCheckMsgApp(void)
|
||||
Description:查询当前是否在活跃状态(每一小时判断一次的接口)、递传
|
||||
Input:
|
||||
Output:bit0:无线活跃状态(每一小时判断一次的接口)
|
||||
bit1:递传活跃状态(每一小时判断一次的接口)
|
||||
bit2:连续定时时间到MSG查询接口 1:定时时间到,0:未到
|
||||
bit3:自动递传时间到MSG
|
||||
bit4: 校时后不在递传活跃期msg
|
||||
bit5: 退出域信道MSG
|
||||
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
u8 RtccCheckMsgApp(Rtcc_MsgTypeDef msg_bit)
|
||||
{
|
||||
return (s_g_rtcc_msg & (1 << msg_bit));
|
||||
}
|
||||
/*************************************************
|
||||
Function:u8 RtccClearMsgApp()
|
||||
Description:清MSG:当前是否在活跃状态(每一小时判断一次的接口)、递传
|
||||
Input:clear_bit:
|
||||
* 0:状态,不能清,缺省
|
||||
* 1:状态,不能清,缺省
|
||||
* 2:清连续定时时间到MSG
|
||||
* 3:清自动递传时间到MSG
|
||||
* 4:清校时后不在递传活跃期msg
|
||||
* 5:清退出域信道MSG
|
||||
* 输入 :0,1,2,3,4,5
|
||||
Output:
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
void RtccClearMsgApp(Rtcc_MsgTypeDef clear_bit)
|
||||
{
|
||||
s_g_rtcc_msg &= ~(1 << clear_bit);
|
||||
}
|
||||
|
||||
void RtccSetMsgApp(Rtcc_MsgTypeDef set_bit)
|
||||
{
|
||||
s_g_rtcc_msg |= (1 << set_bit);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
Function: void RtccAppCheckMiJi(DateTime alarm_time)
|
||||
Description: 查询密集上报,每5min查一次
|
||||
Input:
|
||||
Return:
|
||||
Others:
|
||||
|
||||
*****************************************************************/
|
||||
void RtccAppCheckMiJi(DateTime alarm_time) //每5min查一次
|
||||
{
|
||||
To_u32_Rtcc miji_begin_date, miji_begin_time, miji_end_date;
|
||||
u8 miji_now_time , miji_begin_time_hex; u32 temp_value = 0;
|
||||
|
||||
miji_begin_date.rtcc_u32 = FrameCheckParaApp(FramePara_ReportStartDMY); //密集上报开始时间日月年bcd
|
||||
miji_begin_time.rtcc_u32 = FrameCheckParaApp(FramePara_ReportStartSMH); //密集上报开始时间秒分时bcd
|
||||
miji_end_date.rtcc_u32 = FrameCheckParaApp(FramePara_ReportEndSMH); //密集上报结束时间日月年bcd
|
||||
temp_value = (alarm_time.s.year<<16) | (alarm_time.s.month<<8) | (alarm_time.s.day) ;
|
||||
|
||||
if((miji_begin_date.rtcc_u32 <= temp_value) && (miji_end_date.rtcc_u32 >= temp_value)) //在开始日期和结束日期之内(年月日)
|
||||
{
|
||||
u16 tmpi =0;
|
||||
if(miji_begin_time.rtcc_u8[0] <= alarm_time.s.hour) //只判断到小时,固定是00分。
|
||||
{
|
||||
if((miji_begin_time.rtcc_u8[0] == alarm_time.s.hour) && (0 == alarm_time.s.minute)) //刚开始存,清除buf
|
||||
{
|
||||
//清存储buf
|
||||
for (tmpi = 0;tmpi < 384;tmpi++)
|
||||
{
|
||||
miji_collect_buf[tmpi] = 0;
|
||||
date_remember = 0;
|
||||
}
|
||||
old_total_flow.gp22_u32 = Gp30CheckDataApp(2); //更新密集采集初始值
|
||||
}
|
||||
else
|
||||
{
|
||||
miji_now_time = (alarm_time.s.hour >> 4)*10 + (alarm_time.s.hour & 0x0F);//转化为16进制比较
|
||||
miji_begin_time_hex = (miji_begin_time.rtcc_u8[0] >> 4)*10 + (miji_begin_time.rtcc_u8[0] & 0x0F);
|
||||
if((miji_begin_time_hex + 4) >= miji_now_time) //密集上报时间内
|
||||
{
|
||||
//密集上报存储
|
||||
new_total_flow.gp22_u32 = Gp30CheckDataApp(2);
|
||||
miji_date.datas = (u16)((new_total_flow.gp22_float - old_total_flow.gp22_float)*10);
|
||||
miji_collect_buf[date_remember] = miji_date.datas_map.data0;
|
||||
miji_collect_buf[date_remember+1] = miji_date.datas_map.data1;
|
||||
miji_collect_buf[date_remember+2] = 0;
|
||||
miji_collect_buf[date_remember+3] = 0;
|
||||
old_total_flow.gp22_u32 = new_total_flow.gp22_u32;
|
||||
date_remember = date_remember +4;
|
||||
if(384 == date_remember )
|
||||
{
|
||||
date_remember = 384;
|
||||
}
|
||||
}
|
||||
if(((miji_begin_time_hex + 4) == miji_now_time) && (0 == alarm_time.s.minute)) //密集上报结束时刻
|
||||
{
|
||||
if(date_remember >192)
|
||||
{
|
||||
date_remember = date_remember -192;
|
||||
}
|
||||
else
|
||||
{
|
||||
date_remember =0;
|
||||
}
|
||||
for (tmpi = 0;tmpi < 192;tmpi++)
|
||||
{
|
||||
miji_collect_send_buf[tmpi] = miji_collect_buf[date_remember+tmpi];
|
||||
}
|
||||
for (tmpi = 0;tmpi < 384;tmpi++)
|
||||
{
|
||||
miji_collect_buf[tmpi] = 0;//清接收数据BUF
|
||||
}
|
||||
date_remember = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
RtccSetMsgApp(RtccMsg_MiJiCaiJi);//s_g_rtcc_msg |= BIT1; //密集采集时间段内(开始年月日-结束年月日),4h采集完成MSG
|
||||
}
|
||||
else
|
||||
{
|
||||
RtccClearMsgApp(RtccMsg_MiJiCaiJi);//s_g_rtcc_msg &= ~BIT1;
|
||||
}
|
||||
}
|
||||
/*************************************************
|
||||
Function:u32 RtccGetWorkHourApp()
|
||||
Description:获取工作累计时间
|
||||
Input:void
|
||||
Output:void
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
u32 RtccGetWorkHourApp(void)
|
||||
{
|
||||
return Sys_data_object.ee_data.data.work_hour;
|
||||
}
|
||||
/*************************************************
|
||||
Function<EFBFBD>p30CheckJianGeDataApp(u8 *addr)
|
||||
Description:获取最新的密集流量
|
||||
Input:void
|
||||
Output:void
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
void Gp30CheckMiJiDataApp(u8 **addr)
|
||||
{
|
||||
*addr = miji_collect_send_buf;
|
||||
}
|
||||
/*************************************************
|
||||
Function<EFBFBD>p30CheckJianGeDataApp(u8 *addr)
|
||||
Description:获取最新的间隔流量
|
||||
Input:void
|
||||
Output:void
|
||||
Return:void
|
||||
Others:
|
||||
*************************************************/
|
||||
void Gp30CheckJianGeDataApp(u8 **addr)
|
||||
{
|
||||
*addr = 0;//jiange_collect_send_buf;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue