📄 cbse_writereplace.c
字号:
if(is_busy_pid((char *)&s_OldPid)!=0)
{
return NO_PROCESS;
}
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_OldPid.iProcessId][0];
LpWriteReplace_New=(WRITEREPLACE_REQUEST_t *)&ProcessData[s_NewPid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];
LpWriteReplace_Old=(WRITEREPLACE_REQUEST_t *)&ProcessData[s_OldPid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];
if(memcmp(&LpWriteReplace_New->p_MessageIdentifier.iMessageIdentifier,&LpWriteReplace_Old->p_MessageIdentifier.iMessageIdentifier,sizeof(short))!=0)
{
return MSGID_OR_SERIALNUMBER_UNMATCHED;
}
if(memcmp(&LpWriteReplace_New->p_NewSerialnumber,&LpWriteReplace_Old->p_NewSerialnumber,sizeof(short))!=0)
{
return MSGID_OR_SERIALNUMBER_UNMATCHED;
}
LpCBEMessage_Old=(CBEMESSAGE_t *)&ProcessData[s_OldPid.iProcessId][sizeof(short)];
/* 修改发送次数 */
memcpy(&LpWriteReplace_Old->p_NoOfBroadcastReq,&LpWriteReplace_New->p_NoOfBroadcastReq,sizeof(NOOFBROADCASTREQ_t));
/* 修改发送周期 */
memcpy(&LpWriteReplace_Old->p_RepetionRate,&LpWriteReplace_New->p_RepetionRate,sizeof(REPETITIONRATE_t));
if (RelativeTime!=0)
{
/* 重建定时器 */
iReturnValue=kill_timer(LPs_WriteReplaceProcessDataStruct->iScheduleTimerId, (char *)&s_OldPid);
//sys error
if (iReturnValue<0)
{
return iReturnValue;
}
iReturnValue=create_timer(RelativeTime*1000,SCHEDULED_NEW_MESSAGE,(char *)&s_OldPid,NULL);
LPs_WriteReplaceProcessDataStruct->iScheduleTimerId=iReturnValue;
// LpCBEMessage_Old->iTimeId=iReturnValue;
if (iReturnValue<0)
{
//sys error
/* 创建定时器失败,删除进程 */
free_pid((char *)&s_OldPid);
return iReturnValue;
}
}
return SUCCESS;
}
/* 返回给CBC_Proxy确认 */
int Process_Write_Replace_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage)
{
CBEMESSAGE_t s_CBEMessage;
CBEMESSAGE_t *LPCBEMessage;
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
SENDING_MESSAGE_CONFIRM_i s_MessageConfirm;
MESSAGE_HEAD_t *LPMessageHead;
memset(&s_MessageConfirm,0,sizeof(SENDING_MESSAGE_CONFIRM_i));
memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));
LPMessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(short)];
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&ProcessData[s_Pid.iProcessId][(sizeof(short)+sizeof(MESSAGE_HEAD_t))];
LPCBEMessage=(CBEMESSAGE_t *)&ProcessData[s_Pid.iProcessId][0];
s_MessageConfirm.s_MessageHead.iMessageAreaId=A;
s_MessageConfirm.s_MessageHead.iMessageType=LPMessageHead->iMessageType;
memcpy(&s_MessageConfirm.s_MessageHead.s_ReceiverPid,&LPMessageHead->s_SenderPid,sizeof(PID_t));
memcpy(&s_MessageConfirm.s_MessageHead.s_SenderPid,&s_Pid,sizeof(PID_t));
s_MessageConfirm.s_MessageHead.iMessageLength=sizeof(MESSAGEIDENTIFIER_t)+sizeof(SERIALNUMBER_t)+sizeof(int);
/* 填MessageIdentifier */
memcpy(&s_MessageConfirm.p_MessageIdentifier,&LPm_WriteReplace_Request->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
/* 填SerialNumber */
memcpy(&s_MessageConfirm.p_Serialnumber,&LPm_WriteReplace_Request->p_NewSerialnumber,sizeof(SERIALNUMBER_t));
s_MessageConfirm.NumberOfReturnMessage=cNumberOfReturnMessage;
s_CBEMessage.iLen=s_MessageConfirm.s_MessageHead.iMessageLength+sizeof(MESSAGE_HEAD_t);
// s_CBEMessage.SocketHandle=LPCBEMessage->SocketHandle;
memcpy(&s_CBEMessage.s_MessageHead,&s_MessageConfirm.s_MessageHead,sizeof(MESSAGE_HEAD_t));
memcpy(&s_CBEMessage.cMessage[0],&s_MessageConfirm.NumberOfReturnMessage,s_MessageConfirm.s_MessageHead.iMessageLength);
#ifdef DEBUG_PRINT
printf("Return Write confirm to CBCProxy.\n");
printf("Serialnumber=%d.\n\n", s_MessageConfirm.p_Serialnumber.iSerialNumber);
#endif
AppendCBESendMessage(&s_CBEMessage);
return SUCCESS;
}
/*
Replace
返回给CBC_Proxy确认
*/
int Process_Replace_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage,PID_t s_SendPid)
{
CBEMESSAGE_t s_CBEMessage;
CBEMESSAGE_t *LPCBEMessage;
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
SENDING_MESSAGE_CONFIRM_i s_MessageConfirm;
MESSAGE_HEAD_t *LPMessageHead;
memset(&s_MessageConfirm,0,sizeof(SENDING_MESSAGE_CONFIRM_i));
memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));
LPMessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(short)];
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&ProcessData[s_Pid.iProcessId][(sizeof(short)+sizeof(MESSAGE_HEAD_t))];
LPCBEMessage=(CBEMESSAGE_t *)&ProcessData[s_Pid.iProcessId][0];
s_MessageConfirm.s_MessageHead.iMessageAreaId=A;
s_MessageConfirm.s_MessageHead.iMessageType=LPMessageHead->iMessageType;
memcpy(&s_MessageConfirm.s_MessageHead.s_ReceiverPid,&LPMessageHead->s_SenderPid,sizeof(PID_t));
memcpy(&s_MessageConfirm.s_MessageHead.s_SenderPid,&s_SendPid,sizeof(PID_t));
s_MessageConfirm.s_MessageHead.iMessageLength=sizeof(MESSAGEIDENTIFIER_t)+sizeof(SERIALNUMBER_t)+sizeof(int);
/* 填MessageIdentifier */
memcpy(&s_MessageConfirm.p_MessageIdentifier,&LPm_WriteReplace_Request->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
/* 填SerialNumber */
memcpy(&s_MessageConfirm.p_Serialnumber,&LPm_WriteReplace_Request->p_NewSerialnumber,sizeof(SERIALNUMBER_t));
s_MessageConfirm.NumberOfReturnMessage=cNumberOfReturnMessage;
s_CBEMessage.iLen=s_MessageConfirm.s_MessageHead.iMessageLength+sizeof(MESSAGE_HEAD_t);
// s_CBEMessage.SocketHandle=LPCBEMessage->SocketHandle;
memcpy(&s_CBEMessage.s_MessageHead,&s_MessageConfirm.s_MessageHead,sizeof(MESSAGE_HEAD_t));
memcpy(&s_CBEMessage.cMessage[0],&s_MessageConfirm.NumberOfReturnMessage,s_MessageConfirm.s_MessageHead.iMessageLength);
#ifdef DEBUG_PRINT
printf("Return Write confirm to CBCProxy.\n");
printf("Serialnumber=%d.\n\n", s_MessageConfirm.p_Serialnumber.iSerialNumber);
#endif
AppendCBESendMessage(&s_CBEMessage);
return SUCCESS;
}
/* 处理定时发送消息 */
int Process_Scheduled_Write(PID_t s_Pid)
{
WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request;
WRITEREPLACE_PROCESS_DATA_STRUCT *LPs_WriteReplaceProcessDataStruct;
int iReturnValue;
/* 拆分小区缓冲区 */
DIVIDE_CELLLIST_BUF_t s_DivideCellListBuf;
CELLID_t s_CellId;
memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
/* 去掉MessageHead */
LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];
memset(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,0,sizeof(CELLLIST_i));
/* 构造响应结果 */
// Process_Divide_CellList_AccordingToResponse(&LPm_WriteReplace_Request->p_CellList,
// LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,&s_CellId);
/* 构造响应结果 */
/* 小区负荷控制标志 关*/
if(s_RuntimeInfo.bCellLoadingControl==0)
{
iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_WriteReplace_Request->p_CellList,
LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,&s_CellId);
}
else
{
iReturnValue=Process_Divide_CellList_AccordingToResponse_LC(&LPm_WriteReplace_Request->p_CellList,
LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,&s_CellId,LPm_WriteReplace_Request->p_Category.cCategory);
}
/* 从响应列表得到拆分列表 */
Process_Get_DividedCellList_from_ResponseCellList(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList
,&s_DivideCellListBuf);
/* 标志是否等待响应 */
IfNeedResponse(&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList,&s_DivideCellListBuf);
/* 此时用s_DivideCellListBuf.s_CellListOfBSC,
不用s_ResponseCellList.cNumberOfBSC
前者可能小于后者 */
LPs_WriteReplaceProcessDataStruct->cNoOfResponseReq=s_DivideCellListBuf.cNumberOfCellList;
/* 两个记录定时器的ID都置为-1 */
LPs_WriteReplaceProcessDataStruct->iTimerId=-1;
LPs_WriteReplaceProcessDataStruct->iLifeTimerId=-1;
#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;
}
}
/* 出错返回给CBC_proxy */
int Process_Write_Replace_Error(PID_t s_Pid,int ErrorCode)
{
SENDING_MESSAGE_ERROR_i s_SendingMessageError;
MESSAGE_HEAD_t *s_MessageHead;
CBEMESSAGE_t s_CBEMessage;
memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));
s_MessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(unsigned short)];
// s_SendingMessageError.s_MessageHead.cHandToHandSingnal
s_SendingMessageError.s_MessageHead.iMessageAreaId=A;
s_SendingMessageError.s_MessageHead.iMessageType=CBCPROXY_WRITE_REPLACE;
/* 填写接受Pid */
memcpy(&s_SendingMessageError.s_MessageHead.s_ReceiverPid.iProcessId,&s_MessageHead->s_SenderPid.iProcessId,sizeof(PID_t));
/* 填写发送者Pid */
memcpy(&s_SendingMessageError.s_MessageHead.s_SenderPid.iProcessId,&s_Pid.iProcessId,sizeof(PID_t));
s_SendingMessageError.s_MessageHead.iMessageLength=sizeof(int);
s_SendingMessageError.iErrorCode=ErrorCode;
s_SendingMessageError.ilen=sizeof(MESSAGE_HEAD_t)+sizeof(int);
/* */
memcpy(&s_CBEMessage.iLen,&s_SendingMessageError.ilen,sizeof(SENDING_MESSAGE_ERROR_i));
/* 发送给CBCproxy */
AppendCBESendMessage(&s_CBEMessage);
return SUCCESS;
}
int Process_Write_Replace_init(WRITEREPLACE_REQUEST_t *LPm_WriteReplace_Request)
{
int iReturnValue;
/* 检查必备参数 */
if (LPm_WriteReplace_Request->p_MessageIdentifier.bFlag!=EXIST)
{
return NO_MESSAGE_IDENTIFIER;
}
if (LPm_WriteReplace_Request->p_NewSerialnumber.bFlag!=EXIST)
{
return NO_NEW_SERIAL_NUNBER;
}
if (LPm_WriteReplace_Request->p_CellList.bFlag!=EXIST)
{
return NO_CELLLIST;
}
if (LPm_WriteReplace_Request->p_NoOfBroadcastReq.bFlag!=EXIST)
{
return NO_NO_OF_BROADCASTS_REQUESTED;
}
if (LPm_WriteReplace_Request->p_NumberOfPages.bFlag!=EXIST)
{
return NO_NUMBEROFPAGES;
}
if (LPm_WriteReplace_Request->p_CbsPageInf.bFlag!=EXIST)
{
return NO_CBS_PAGE_INFO;
}
/* 检查参数内容 */
/* 检查小区识别器CellIdDisc */
if ((LPm_WriteReplace_Request->p_CellList.cCellIdDisc!=1)&&
(LPm_WriteReplace_Request->p_CellList.cCellIdDisc!=2)&&
(LPm_WriteReplace_Request->p_CellList.cCellIdDisc!=5)&&
(LPm_WriteReplace_Request->p_CellList.cCellIdDisc!=6))
{
return CELLIDDISC_OUTOFRANG;
}
/* 对于必备参数不用判断其存在
// 检查小区数目
*/
if ((LPm_WriteReplace_Request->p_CellList.iLength<=0)||(LPm_WriteReplace_Request->p_CellList.iLength>MAXCELLCOUNT))
{
return NUMBEROFCELL_ERROR;
}
/* 检查信道指示 */
if (LPm_WriteReplace_Request->p_ChannelIndicator.bFlag==EXIST)
{
if(LPm_WriteReplace_Request->p_ChannelIndicator.cChannelIndicator>1)
{
return NUMBEROFCELL_ERROR;
}
}
/* 检查消息属性 */
if (LPm_WriteReplace_Request->p_Category.bFlag==EXIST)
{
if (LPm_WriteReplace_Request->p_Category.cCategory>2)
{
return CATEGORY_ERROR;
}
/* 该参数存在,但不打包 */
LPm_WriteReplace_Request->p_Category.bFlag=0;
}
else
{
/* 缺省为正常优先级 */
LPm_WriteReplace_Request->p_Category.cCategory=NORMAL_PRIORITY;
}
/* 检查重复周期 */
if ((LPm_WriteReplace_Request->p_RepetionRate.iRepetitionRate>MAX_REPETITION_RATE)
||(LPm_WriteReplace_Request->p_RepetionRate.iRepetitionRate<MIN_REPETITION_RATE))
{
return REPETIONRATE_ERROR;
}
/* 检查请求重发次数 */
if (LPm_WriteReplace_Request->p_NoOfBroadcastReq.iNumberOfBroadcastReq>MAX_NUMBER_OF_BROADCAST_REQ)
{
return NOOFBROADCASTREQ_ERROR;
}
/* 检查消息页数 */
if (LPm_WriteReplace_Request->p_NumberOfPages.cNumberOfPages>1)
{
return NUMBEROFPAGES_ERROR;
}
if ((LPm_WriteReplace_Request->p_CbsPageInf.cLength==0))
{
return NO_CBS_PAGE_INFO;
}
/* 新老小区一样,用于替换 */
if (LPm_WriteReplace_Request->p_OldSerialnumber.bFlag==EXIST)
{
memcpy(&LPm_WriteReplace_Request->p_NewSerialnumber.bFlag,&LPm_WriteReplace_Request->p_OldSerialnumber.bFlag,sizeof(SERIALNUMBER_t));
}
/* //不能同时存在老序列号和预约时间
if ((LPm_WriteReplace_Request->p_OldSerialnumber.bFlag==1)&&
(LPm_WriteReplace_Request->p_NewTime.bFlag==1))
{
return MISUNDERSTAND;
}*/
/* 检查操作类型 */
iReturnValue=process_Determine_Opratertype(LPm_WriteReplace_Request);
return iReturnValue;
}
/*决定操作类型
//返回:
// 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)
{
if (LPm_WriteReplace_Request->p_OldSerialnumber.bFlag==EXIST)
{
//老序列号存在
if(LPm_WriteReplace_Request->p_NewTime.bFlag==EXIST)
{
//Newtime存在
if(LPm_WriteReplace_Request->p_OldTime.bFlag==EXIST)
{//OldTime存在
return UPDATA_SCHEDUAL_TIME;
}
else
{//OldTime不存在
return INCOMPATIBLE_PARAMETER;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -