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

📄 cbse_killmessage.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "..\sys\Include.h"


/* 返回确认消息给CBC_proxy */
int Process_Kill_Message_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage);


/* KillMessage 初始化 */
int Process_Kill_Message_init(KILLMESSAGE_t *s_KillMessage);

/* 发送消息给BSC
   发送失败小区列表给CBC_Proxy */
int Process_Send_KillMessage_To_BSC(PID_t s_Pid, DIVIDE_CELLLIST_BUF_t *s_DivideCellListBuf);

//删除预约消息
int process_Delete_Schedual_Message(PID_t s_OriginalPid,PID_t s_NewPid);


int Process_CBSE_KILL_MESSAGE(unsigned char *MessageBuf,PID_t s_Pid)
{
	int                      iReturnValue;
	KILLMESSAGE_t            *LPm_KillMessage;
	PID_t                    s_OriginalPid;
	int                      iRelativeTime;
	long                     lCurrentTime;  
	//拆分小区缓冲区
	DIVIDE_CELLLIST_BUF_t    s_DivideCellListBuf;
	CELLID_t                 s_CellId;
	KILL_PROCESS_DATA_STRUCT *LPs_KillProcessDataStruct;
	CELLLIST_i               s_FailureList; 
//    WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	int  i,j;

	memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));
	memset(&s_FailureList,0,sizeof(CELLLIST_i));

	memset(&ProcessData[s_Pid.iProcessId][0],0,LPCB_DATA_SIZE);

	/* 填写返回类型 */
	LPs_KillProcessDataStruct=(KILL_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];
	
	LPs_KillProcessDataStruct->cResponseType=CBCPROXY_REPORT_KILL;

	/* 数据拷贝到进程数据区 */
	memcpy(&LPs_KillProcessDataStruct->s_CBCMessage,MessageBuf,sizeof(CBEMESSAGE_t));
	
	/* 去掉MessageHead */
	LPm_KillMessage=(KILLMESSAGE_t *)&LPs_KillProcessDataStruct->s_CBCMessage.cMessage[0];

#ifdef DEBUG_PRINT 
	Print_Kill(s_Pid,LPm_KillMessage,LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid);
#endif

	/* 判断参数 */
	iReturnValue=Process_Kill_Message_init(LPm_KillMessage);
	if (iReturnValue<0)
	{
		return iReturnValue;
	}

	
	/* 构造响应结果 */
    iReturnValue=Process_Divide_CellList_AccordingToResponse(&LPm_KillMessage->p_CellList,
		0,&s_FailureList,&s_CellId);
	if (iReturnValue<0)
	{
		return iReturnValue;
	}

	memcpy(&LPs_KillProcessDataStruct->s_FailureList ,
		&s_FailureList,sizeof(CELLLIST_i));
	
    /* 从响应列表得到拆分列表 */
    Process_Get_DividedCellList_from_ResponseCellList(&s_FailureList,&s_DivideCellListBuf);

    /* 标志是否等待响应 */
	IfNeedResponse(&LPs_KillProcessDataStruct->s_FailureList,&s_DivideCellListBuf);


	/* 此时用s_DivideCellListBuf.s_CellListOfBSC,
	  不用s_ResponseCellList.cNumberOfBSC 
      前者可能小于后者              */
	LPs_KillProcessDataStruct->cNoOfResponseReq=s_DivideCellListBuf.cNumberOfCellList;

	/* 小区全失败 */
	if (LPs_KillProcessDataStruct->cNoOfResponseReq==0)
	{
		return ALL_CELLS_NOT_AVAILABLE;
	}

	/* 两个记录定时器的ID都置为-1 */
	LPs_KillProcessDataStruct->iTimerId=-1;
	LPs_KillProcessDataStruct->iLifeTimerId=-1;


	//是否删除预约发送
	if (LPm_KillMessage->p_BeginTime.bFlag==EXIST)
	{
		time(&lCurrentTime);
		lCurrentTime=lCurrentTime-TimeZone;
		iRelativeTime=LPm_KillMessage->p_BeginTime.lTime-lCurrentTime;

        if (iRelativeTime<0)
		{
			/* 已发送,直接发消息到BSC */

			/* 返回确认给CBC_Proxy */
			Process_Kill_Message_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);

			/* 发送消息给BSC */
			Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);    

			/* 创建回复定时器 */
			iReturnValue=create_timer(KILL_RETURN_DELAY_TIME,
				KILL_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
			/* 创建定时器失败 */
			//sys
			if (iReturnValue<0)
			{
				printf("Create timer Error!\n");
				return iReturnValue;
			}
			else
			{
				LPs_KillProcessDataStruct->iTimerId=iReturnValue;
				return CONTINUANCE;
			}

		}
		else
		{
			/* 未发送,在进程区 */
			memcpy(&s_OriginalPid,&LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_ReceiverPid,sizeof(PID_t));
			iReturnValue=process_Delete_Schedual_Message(s_OriginalPid,s_Pid);
			if (iReturnValue<0)
				return iReturnValue;

			/* 完成列表全置0 */
/*			
            LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_OriginalPid.iProcessId][0];

			LPs_KillProcessDataStruct->s_NoofBroadcastComlList.bFlag=1;
			for (i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
			{
				LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].ilength=
					LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;

				memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].BSCIdentifier[0],
					&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].BSCIdentifier[0],BSC_INDENTIFIER_LEN);

				for(j=0;j<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength;j++)
				{
					memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].s_NoOfBroadcastComl[j].s_Cellid.cCellId[0],
						&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],4);
				}

				LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC++;
			}
*/
			/* 完成列表全置0 */
			/* 完成列表为该删除消息的小区 */
			LPs_KillProcessDataStruct->s_NoofBroadcastComlList.bFlag=1;
			for (i=0;i<LPs_KillProcessDataStruct->s_FailureList.cNumberOfBSC;i++)
			{
				LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].ilength=
					LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].ilength;

				memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].BSCIdentifier[0],
					&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].BSCIdentifier[0],BSC_INDENTIFIER_LEN);

				for(j=0;j<LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].ilength;j++)
				{
					memcpy(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC].s_NoOfBroadcastComl[j].s_Cellid.cCellId[0],
						&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[i].s_CellReport[j].s_CellId.cCellId[0],4);
				}

				LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC++;
			}

			/* 进程区消息无失败列表 */
			memset(&LPs_KillProcessDataStruct->s_FailureList,0,sizeof(CELLLIST_i));

            /*
			  成功后确认0 
			  返回确认给CBC_Proxy
			*/
			Process_Kill_Message_Return(s_Pid,0);
			
			/* 返回全部响应 */
        	Process_KillMessage_Return_To_CBCProxy(s_Pid);
			
			return END;
		}

	}
	else
	{
		//正常删除消息
		//返回确认给CBC_Proxy
		Process_Kill_Message_Return(s_Pid,s_DivideCellListBuf.cNumberOfCellList);
		/* 发送消息给BSC */
		
		Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);    
		
		/* 创建回复定时器 */
		iReturnValue=create_timer(KILL_RETURN_DELAY_TIME,
		KILL_RETURN_TO_CBC_PROXY,(char *)&s_Pid,NULL);
		//创建定时器失败
		//sys
		if (iReturnValue<0)
		{
			printf("Create timer Error!\n");
			return iReturnValue;
		}
		else
		{
			LPs_KillProcessDataStruct->iTimerId=iReturnValue;
			return CONTINUANCE;
		}

	}
	
}

//KillMessage 初始化
int Process_Kill_Message_init(KILLMESSAGE_t *s_KillMessage)
{
	//检查必备参数

	if (s_KillMessage->p_MessageIdentifier.bFlag!=EXIST)
	{
		return NO_MESSAGE_IDENTIFIER;
	}

	if (s_KillMessage->p_OldSerialnumber.bFlag!=EXIST)
	{
		return NO_OLD_SERIAL_NUMBER;
	}

	if (s_KillMessage->p_CellList.bFlag!=EXIST)
	{
		return NO_CELLLIST;
	}


	//检查参数内容

	//检查小区识别器CellIdDisc
	if ((s_KillMessage->p_CellList.cCellIdDisc!=1)&&
		(s_KillMessage->p_CellList.cCellIdDisc!=2)&&
		(s_KillMessage->p_CellList.cCellIdDisc!=5)&&
		(s_KillMessage->p_CellList.cCellIdDisc!=6))
	{
		return CELLIDDISC_OUTOFRANG;
	}

	//对于必备参数不用判断其存在
	//检查小区数目
	if ((s_KillMessage->p_CellList.iLength<=0)||(s_KillMessage->p_CellList.iLength>MAXCELLCOUNT))
	{
		return NUMBEROFCELL_ERROR;
	}

	//检查信道指示
	if (s_KillMessage->p_ChannelIndicator.bFlag==EXIST)
	{
		if(s_KillMessage->p_ChannelIndicator.cChannelIndicator>1)
		{
			return NUMBEROFCELL_ERROR;
		}
	}

	return SUCCESS;
}

//返回确认消息给CBC_proxy
int Process_Kill_Message_Return(PID_t s_Pid,unsigned char cNumberOfReturnMessage)
{
    CBEMESSAGE_t               s_CBEMessage;
//	CBEMESSAGE_t               *LPCBEMessage;
	KILLMESSAGE_t              *LP_mKillMessage; 
    SENDING_MESSAGE_CONFIRM_i  s_MessageConfirm;
	MESSAGE_HEAD_t             *LPMessageHead;

	memset(&s_MessageConfirm,0,sizeof(MESSAGE_CONFIRM_i));
	memset(&s_CBEMessage,0,sizeof(CBEMESSAGE_t));

	LPMessageHead=(MESSAGE_HEAD_t *)&ProcessData[s_Pid.iProcessId][sizeof(short)];
	LP_mKillMessage=(KILLMESSAGE_t *)&ProcessData[s_Pid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];

	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(int)+sizeof(MESSAGEIDENTIFIER_t)+sizeof(SERIALNUMBER_t);
	s_MessageConfirm.NumberOfReturnMessage=cNumberOfReturnMessage;

	s_CBEMessage.iLen=s_MessageConfirm.s_MessageHead.iMessageLength+sizeof(MESSAGE_HEAD_t);


	memcpy(&s_CBEMessage.s_MessageHead,&s_MessageConfirm.s_MessageHead,sizeof(MESSAGE_HEAD_t));
    
	memcpy(&s_MessageConfirm.p_MessageIdentifier,&LP_mKillMessage->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));

	memcpy(&s_MessageConfirm.p_Serialnumber,&LP_mKillMessage->p_OldSerialnumber,sizeof(SERIALNUMBER_t));

	memcpy(&s_CBEMessage.cMessage[0],&s_MessageConfirm.NumberOfReturnMessage,s_MessageConfirm.s_MessageHead.iMessageLength);
    

#ifdef DEBUG_PRINT
    printf("Return Kill confirm to CBCProxy.ConfirmValue=%d\n",cNumberOfReturnMessage); 
	printf("Return Kill confirm to CBCProxy.SerialNumber=%d\n",LP_mKillMessage->p_OldSerialnumber.iSerialNumber); 
#endif
	AppendCBESendMessage(&s_CBEMessage);

	return SUCCESS;
}

/*
//处理定时KillMessage
int Process_Scheduled_KillMessage(PID_t s_Pid)
{
	int iReturnValue;
    //
	KILLMESSAGE_t *LPKillMessage;

	//拆分小区缓冲区
	DIVIDE_CELLLIST_BUF_t  s_DivideCellListBuf;

	memset(&s_DivideCellListBuf,0,sizeof(DIVIDE_CELLLIST_BUF_t));

	//去掉MessageHead
	LPKillMessage=(KILLMESSAGE_t *)&ProcessData[s_Pid.iProcessId][(sizeof(MESSAGE_HEAD_t)+sizeof(short))];


	//分配小区路由
	//
    Process_Divide_CellList_EX(&LPKillMessage->p_CellList,&s_DivideCellListBuf);
	
    //发送消息给BSC
    //发送失败小区列表给CBC_Proxy
    Process_Send_KillMessage_To_BSC(s_Pid, &s_DivideCellListBuf);


	//释放进程
	iReturnValue=free_pid((char *)&s_Pid);
	if (iReturnValue<0)
	{
		//sys error
		printf("Warning! Free Pid Error.pid=%d\n",s_Pid.iProcessId);
		return iReturnValue;
	}

	return SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -