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

📄 cbse_writereplace.c

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