515 lines
14 KiB
C
515 lines
14 KiB
C
#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
|
||
|