📄 cbse_writereplace.c
字号:
#include "..\sys\Include.h"
/* 初始参数检查 */
int Process_Write_Replace_init(WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request);
/* 返回给CBC_Proxy确认
cNumberOfReturnMessage:拆分的个数 */
int Process_Write_Replace_Return(PID_t s_pid,unsigned char cNumberOfReturnMessage);
/* 发送消息给BSC
发送失败给Cbc_proxy */
int Process_Send_Write_Replace_To_BSC(PID_t s_Pid, DIVIDE_CELLLIST_BUF_t *s_DivideCellListBuf);
/*决定操作类型
NEW_WRITE_MESSAGE =1, //新加一条消息
NEW_SCHEDUAL_MESSAGE =2, //预约一条消息
UPDATE_ALREADY_SEND_MESSAGE =3, //修改已发送消息
UPDATA_SCHEDUAL_TIME =4, //修改预约发送时间和消息
UPDATA_PENDING_SEND_MESSAGE =5 //修改预约发送消息
返回:
<0:失败 */
int process_Determine_Opratertype(WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request);
/* 修改预约时间,发送周期和次数,
RelativeTime=0,则不修改时间
<0:失败 */
int process_update_Pending_Send_Message(PID_t s_NewPid,PID_t s_OldPid, int RelativeTime);
/*
Replace
返回给CBC_Proxy确认
*/
int Process_Replace_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage,PID_t s_SendPid);
/* 处理WriteReplace操作
返回:
>0 成功;
<0 失败,释放进程在错误处理函数中实现 */
int Process_Write_Replace_Request(unsigned char *MessageBuf,PID_t s_Pid)
{
int iReturnValue;
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
WRITEREPLACE_REQUEST_t *LPm_OldWriteReplace_Request;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_OldWriteReplaceProcessDataStruct;
int iRelativeTime;
long lCurrentTime;
int iMessageType;
PID_t s_OldPid;
DIVIDE_CELLLIST_BUF_t s_DivideCellListBuf; /* 拆分小区缓冲区 */
CELLID_t s_CellId;
CELLLIST_i s_ResponseCellList;
memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
memset(&ProcessData[s_Pid.iProcessId][0],0,LPCB_DATA_SIZE);
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
/* 数据拷贝到进程数据区 */
memcpy(&LPs_WriteReplaceProcessDataStruct->s_CBCMessage,MessageBuf,sizeof(CBEMESSAGE_t));
/* 去掉MessageHead */
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
#ifdef DEBUG_PRINT
Print_WriteReplace(s_Pid,
LPm_WriteReplace_Request,
LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid);
#endif
/* 判断参数 */
iReturnValue=Process_Write_Replace_init(LPm_WriteReplace_Request);
if (iReturnValue<0)
{
return iReturnValue;
}
iMessageType=iReturnValue;
memset(&s_ResponseCellList,0,sizeof(CELLLIST_i));
/* 构造响应结果 */
/* 小区负荷控制标志 关*/
if(s_RuntimeInfo.bCellLoadingControl==0)
{
iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_WriteReplace_Request->p_CellList,
LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&s_ResponseCellList,&s_CellId);
}
else
{
iReturnValue=Process_Divide_CellList_AccordingToResponse_LC(&LPm_WriteReplace_Request->p_CellList,
LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&s_ResponseCellList,&s_CellId,LPm_WriteReplace_Request->p_Category.cCategory);
}
if (iReturnValue<0)
{
return iReturnValue;
}
memcpy(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList ,
&s_ResponseCellList,sizeof(CELLLIST_i));
/* 从响应列表得到拆分列表 */
Process_Get_DividedCellList_from_ResponseCellList(&s_ResponseCellList,&s_DivideCellListBuf);
/* 标志是否等待响应 */
IfNeedResponse(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,&s_DivideCellListBuf);
/* 此时用s_DivideCellListBuf.s_CellListOfBSC,
不用s_ResponseCellList.cNumberOfBSC
前者可能小于后者 */
LPs_WriteReplaceProcessDataStruct->cNoOfResponseReq=s_DivideCellListBuf.cNumberOfCellList;
/* 小区全失败 */
if (LPs_WriteReplaceProcessDataStruct->cNoOfResponseReq==0)
{
return ALL_CELLS_NOT_AVAILABLE;
}
/* 两个记录定时器的ID都置为-1 */
LPs_WriteReplaceProcessDataStruct->iTimerId=-1;
LPs_WriteReplaceProcessDataStruct->iLifeTimerId=-1;
switch (iMessageType)
{
case NEW_WRITE_MESSAGE: /* 新加一条消息 */
{
#ifdef OPEN_STATISTIC
s_CBSECount.s_CbcProxyReqCnt.iCBCProxyWriteReqCnt++;
#endif
/* 分配序列号 */
Alloc_SerialNumber(&LPm_WriteReplace_Request->p_NewSerialnumber,&LPm_WriteReplace_Request->p_MessageIdentifier);
/* 返回确认给CBC_Proxy */
Process_Write_Replace_Return(s_Pid,s_ResponseCellList.cNumberOfBSC);
#ifdef KILL_BEFORE_WRITE
/* 删除该序列号以前消息 */
Process_Send_Kill_To_BSC_Before_Write(s_Pid, &s_DivideCellListBuf);
#endif
/* 发送消息给BSC */
Process_Send_Write_Replace_To_BSC(s_Pid, &s_DivideCellListBuf);
/* 填写响应类型 */
LPs_WriteReplaceProcessDataStruct->cResponseType=CBCPROXY_REPORT_WRITE;
/* 创建回复定时器 */
iReturnValue=create_timer(WRITE_RETURN_RETURN_DELAY_TIME,
WRITE_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
/* 创建定时器失败 */
//sys
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
LPs_WriteReplaceProcessDataStruct->iTimerId=iReturnValue;
return CONTINUANCE;
}
}
break;
case NEW_SCHEDUAL_MESSAGE: /* 预约一条消息 */
{
#ifdef OPEN_STATISTIC
s_CBSECount.s_CbcProxyReqCnt.iCBCProxyWriteReqCnt++;
#endif
time(&lCurrentTime);
lCurrentTime=lCurrentTime-TimeZone;
iRelativeTime=LPm_WriteReplace_Request->p_NewTime.lTime-lCurrentTime;
/* 大于系统最大相对时间或小与10秒 */
if ((iRelativeTime>s_RuntimeInfo.iMaxRelativeTime)||
(iRelativeTime<10))
{
return ASSIGN_TIME_OUT_OF_RANGE;
}
/* 分配序列号 */
Alloc_SerialNumber(&LPm_WriteReplace_Request->p_NewSerialnumber,&LPm_WriteReplace_Request->p_MessageIdentifier);
/* 返回确认给CBC_Proxy */
Process_Write_Replace_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
/* 填写响应类型 */
LPs_WriteReplaceProcessDataStruct->cResponseType=CBCPROXY_REPORT_WRITE;
/*
返回响应给CBCProxy
只报告响应
*/
Process_WriteReplace_Return_To_CBCProxy(s_Pid);
iReturnValue=create_timer(iRelativeTime*1000,SCHEDULED_NEW_MESSAGE,(char *)&s_Pid,NULL);
LPs_WriteReplaceProcessDataStruct->iScheduleTimerId=iReturnValue;
/* 创建定时器失败
//sys
*/
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
return CONTINUANCE;
}
}
break;
case UPDATE_ALREADY_SEND_MESSAGE:/* 修改已发送消息 */
{
#ifdef OPEN_STATISTIC
s_CBSECount.s_CbcProxyReqCnt.iCBCProxyReplaceReqCnt++;
#endif
/* 返回确认给CBC_Proxy */
Process_Write_Replace_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
/* 发送消息给BSC */
Process_Send_Write_Replace_To_BSC(s_Pid, &s_DivideCellListBuf);
/* 填写响应类型 */
LPs_WriteReplaceProcessDataStruct->cResponseType=CBCPROXY_REPORT_REPLACE;
/* 创建回复定时器 */
iReturnValue=create_timer(REPLACE_RETURN_DELAY_TIME,
REPLACE_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
/* 创建定时器失败
//sys
*/
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
LPs_WriteReplaceProcessDataStruct->iTimerId=iReturnValue;
return CONTINUANCE;
}
}
break;
case UPDATA_SCHEDUAL_TIME: /* 修改预约发送时间和消息 */
{
#ifdef OPEN_STATISTIC
s_CBSECount.s_CbcProxyReqCnt.iCBCProxyReplaceReqCnt++;
#endif
time(&lCurrentTime);
lCurrentTime=lCurrentTime-TimeZone;
/* 是否已发 */
iRelativeTime=LPm_WriteReplace_Request->p_OldTime.lTime-lCurrentTime;
if (iRelativeTime<0)
return MESSAGE_ALREADY_SEND;
/* 新预约时间的合法性 */
iRelativeTime=LPm_WriteReplace_Request->p_NewTime.lTime-lCurrentTime;
/* 大于系统最大相对时间或小与10秒 */
if ((iRelativeTime>s_RuntimeInfo.iMaxRelativeTime)||
(iRelativeTime<10))
return ASSIGN_TIME_OUT_OF_RANGE;
/* 填写响应类型 */
LPs_WriteReplaceProcessDataStruct->cResponseType=CBCPROXY_REPORT_REPLACE;
memcpy(&s_OldPid,&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid,sizeof(PID_t));
/* 修改预约时间,发送周期和次数,
RelativeTime=0,则不修改时间
*/
iReturnValue=process_update_Pending_Send_Message(s_Pid,s_OldPid,iRelativeTime);
if (iReturnValue<0)
return iReturnValue;
/* 返回确认给CBC_Proxy */
Process_Replace_Return(s_Pid,0,s_OldPid);
LPs_OldWriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_OldPid.iProcessId][0];
LPm_OldWriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_OldWriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
memset(&s_ResponseCellList,0,sizeof(CELLLIST_i));
/* 构造响应结果 */
iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_OldWriteReplace_Request->p_CellList,
LPm_OldWriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&s_ResponseCellList,&s_CellId);
if (iReturnValue<0)
{
return iReturnValue;
}
memcpy(&LPs_OldWriteReplaceProcessDataStruct->s_ResponseCellList ,
&s_ResponseCellList,sizeof(CELLLIST_i));
memcpy(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList ,
&s_ResponseCellList,sizeof(CELLLIST_i));
/* 返回全部响应 */
Process_WriteReplace_Return_To_CBCProxy(s_Pid);
return END;
}
break;
case UPDATA_PENDING_SEND_MESSAGE:/* 修改预约发送消息 */
{
#ifdef OPEN_STATISTIC
s_CBSECount.s_CbcProxyReqCnt.iCBCProxyReplaceReqCnt++;
#endif
time(&lCurrentTime);
lCurrentTime=lCurrentTime-TimeZone;
iRelativeTime=LPm_WriteReplace_Request->p_OldTime.lTime-lCurrentTime;
/* 填写响应类型 */
LPs_WriteReplaceProcessDataStruct->cResponseType=CBCPROXY_REPORT_REPLACE;
if (iRelativeTime<0)
{/* 已发 */
/* 和已发送的一样处理 */
/* 返回确认给CBC_Proxy */
Process_Write_Replace_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
/* 发送消息给BSC */
Process_Send_Write_Replace_To_BSC(s_Pid, &s_DivideCellListBuf);
iReturnValue=create_timer(REPLACE_RETURN_DELAY_TIME,
REPLACE_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
/*创建定时器失败
//sys
*/
if (iReturnValue<0)
{
printf("Create timer Error!\n");
return iReturnValue;
}
else
{
LPs_WriteReplaceProcessDataStruct->iTimerId=iReturnValue;
return CONTINUANCE;
}
}
else
{/* 未发 */
memcpy(&s_OldPid,&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid,sizeof(PID_t));
/* 修改预约时间,发送周期和次数,
RelativeTime=0,则不修改时间
*/
iReturnValue=process_update_Pending_Send_Message(s_Pid,s_OldPid,0);
if (iReturnValue<0)
return iReturnValue;
/* 返回确认给CBC_Proxy */
Process_Replace_Return(s_Pid,0,s_OldPid);
LPs_OldWriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_OldPid.iProcessId][0];
LPm_OldWriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_OldWriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
memset(&s_ResponseCellList,0,sizeof(CELLLIST_i));
/* 构造响应结果 */
iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_OldWriteReplace_Request->p_CellList,
LPm_OldWriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&s_ResponseCellList,&s_CellId);
if (iReturnValue<0)
{
return iReturnValue;
}
memcpy(&LPs_OldWriteReplaceProcessDataStruct->s_ResponseCellList ,
&s_ResponseCellList,sizeof(CELLLIST_i));
memcpy(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList ,
&s_ResponseCellList,sizeof(CELLLIST_i));
/*
返回全部响应
*/
Process_WriteReplace_Return_To_CBCProxy(s_Pid);
return END;
}
}
break;
}
/*
//释放进程
if (free_pid((char *)&s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_Pid.iProcessId);
}
*/
return SUCCESS;
}
/* 修改预约时间,发送周期和次数,
RelativeTime=0,则不修改时间 */
int process_update_Pending_Send_Message(PID_t s_NewPid,PID_t s_OldPid, int RelativeTime)
{
int iReturnValue;
WRITEREPLACE_REQUEST_t *LpWriteReplace_Old;
WRITEREPLACE_REQUEST_t *LpWriteReplace_New;
CBEMESSAGE_t *LpCBEMessage_Old;
/* 老进程区指针 */
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
/* 可能出现新旧Pid相等的情况 */
if(s_NewPid.iProcessId==s_OldPid.iProcessId)
{
return NO_PROCESS;
}
/* 进程不忙 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -