⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbse_writereplace.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -