R2UWaterRS485UW500/app/UWater_Frame/UWater_frame_func_ReplyJian...

515 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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