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

📄 cbse_writereplace.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 4 页
字号:
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{ 
		if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].cResendTimes>0)
		{
			/* 存在重发 
			bResendExist=1;
			break;
		}
	}
*/
	
	iPosi=sizeof(REPORT_MESSAGE_i)+sizeof(short);

	switch (LPs_WriteReplaceProcessDataStruct->cResponseType)
	{
	case CBCPROXY_REPORT_WRITE:   /* 写入消息报告 */
		{
			/* 完成列表 */
			LPs_Report->bComlListFlag=0;
			LPs_Report->cComlListNumberOfBSC=0;

			/* 状态报告列表 */
			LPs_Report->bReportListFlag=1;
			LPs_Report->cReportListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;

			/* 压缩ResponseCellList参数 */
			for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
			{
				memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i],
					(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
				iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
			}

			iLen=iPosi-sizeof(short);

			LPs_Report->s_MessageHead.iMessageType=CBCPROXY_REPORT_WRITE;
			LPs_Report->s_MessageHead.iMessageLength=iLen-sizeof(MESSAGE_HEAD_t);

			memcpy(&ResponseBuf[0],&iLen,sizeof(short));

#ifdef DEBUG_PRINT
            printf("Send Write All Response to CBCProxy.\n"); 
			printf("Serialnumber=%d.\n\n", LPs_Report->p_Serialnumber.iSerialNumber); 
			Printf_file_ResponseList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList);
#endif

			AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);


		}
		break;

	case CBCPROXY_REPORT_REPLACE: /* 替换操作的报告 */ 
		{
			/* 完成列表 */
			LPs_Report->bComlListFlag=LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.bFlag;
			LPs_Report->cComlListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;

			/* 状态报告列表 */
			LPs_Report->bReportListFlag=1;
			LPs_Report->cReportListNumberOfBSC=LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;

			/* 压缩ComlList参数 */
			for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
			{
				memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i],
					LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].ilength*sizeof(NOOFBROADCASTSCOML_i)+sizeof(short)+BSC_INDENTIFIER_LEN);
				iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].ilength*sizeof(NOOFBROADCASTSCOML_i)
					+sizeof(short)+BSC_INDENTIFIER_LEN;
				
			}

			/* 压缩ResponseCellList参数 */
			for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
			{
				memcpy(&ResponseBuf[iPosi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i],
					(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
				iPosi=iPosi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);
			}

			iLen=iPosi-sizeof(short);

			LPs_Report->s_MessageHead.iMessageType=CBCPROXY_REPORT_REPLACE;
			LPs_Report->s_MessageHead.iMessageLength=iLen-sizeof(MESSAGE_HEAD_t);

			memcpy(&ResponseBuf[0],&iLen,sizeof(short));

#ifdef DEBUG_PRINT
            printf("Send Replace All Response to CBCProxy.\n"); 
			Printf_file_ResponseList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList);
			Printf_file_ComlList(s_Pid,LPs_WriteReplaceProcessDataStruct->cResponseType,&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList);
#endif

			AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);

		}
		break;
	}
	
}

/*
  写操作报告单条响应
  s_Pid:进程ID
  BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_WriteReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
	unsigned short                    Len;
	int                               Posi;
	char                              ResponseBuf[3096];    
	REPORT_MESSAGE_i                  s_Report;
	WRITEREPLACE_REQUEST_t            *LPm_WriteReplace_Request;
	WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	int                               i;
	
	memset(&ResponseBuf[0],0,3096);
	memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));

	LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT  *)&ProcessData[s_Pid->iProcessId][0];

	LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];	

    s_Report.s_MessageHead.iMessageAreaId=A;

	/* 写操作的响应 */
	s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_WRITE;
	
	memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
	memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
		&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));

	s_Report.bComlListFlag=0;
	s_Report.cComlListNumberOfBSC=0;

	memcpy(&s_Report.p_MessageIdentifier,&LPm_WriteReplace_Request->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
	memcpy(&s_Report.p_Serialnumber,&LPm_WriteReplace_Request->p_NewSerialnumber,sizeof(SERIALNUMBER_t));
	memcpy(&s_Report.p_ChannelIndicator,&LPm_WriteReplace_Request->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));

	s_Report.bReportListFlag=1;
	s_Report.cReportListNumberOfBSC=1;

	memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));

	Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
	
	/* 状态未知改为成功 */
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength;i++)
	{
		if (LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus==UNKNOW_STATUS)
		{
			LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus=CELL_SUCCESS;
		}
	}

	memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi],
		(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
	
	Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);

	Len=Posi-sizeof(short);

	memcpy(&ResponseBuf[0],&Len,sizeof(short));

	s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);

	AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}

/*
  替换操作报告单条响应
  s_Pid:进程ID
  BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_ReplaceReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
	unsigned short                    Len;
	int                               Posi;
	char                              ResponseBuf[3096];    
	REPORT_MESSAGE_i                  s_Report;
	WRITEREPLACE_REQUEST_t            *LPm_WriteReplace_Request;
	WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	int                               i;
	int                               ComlListBscPosi;
	
	memset(&ResponseBuf[0],0,3096);
	memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));

	LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT  *)&ProcessData[s_Pid->iProcessId][0];

	LPm_WriteReplace_Request=(WRITEREPLACE_REQUEST_t *)&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.cMessage[0];	

    s_Report.s_MessageHead.iMessageAreaId=A;

	/* 替换操作的响应 */
	s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_REPLACE;
	
	memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
	memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
		&LPs_WriteReplaceProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));

	ComlListBscPosi=-1;

	for (i=0;LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
	{
		if(memcmp(&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].BSCIdentifier[0],
			&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].BSCIdentifier[0],BSC_INDENTIFIER_LEN)==0)
		{
			ComlListBscPosi=i;
			break;
		}
	}
	
    if(ComlListBscPosi>=0)
	{
		s_Report.bComlListFlag=1;
	    s_Report.cComlListNumberOfBSC=1;
	}

	memcpy(&s_Report.p_MessageIdentifier,&LPm_WriteReplace_Request->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
	memcpy(&s_Report.p_Serialnumber,&LPm_WriteReplace_Request->p_NewSerialnumber,sizeof(SERIALNUMBER_t));
	memcpy(&s_Report.p_ChannelIndicator,&LPm_WriteReplace_Request->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));

	s_Report.bReportListFlag=1;
	s_Report.cReportListNumberOfBSC=1;

	memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));

	Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
	
	/* 状态未知改为成功 */
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength;i++)
	{
		if (LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus==UNKNOW_STATUS)
		{
			LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].s_CellReport[i].cCellStatus=CELL_SUCCESS;
		}
	}

	memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi],
		(LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short)));

	Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short);

	memcpy(&ResponseBuf[Posi],&LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi],
		(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
	
	Posi=Posi+LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);

	Len=Posi-sizeof(short);

	memcpy(&ResponseBuf[0],&Len,sizeof(short));

	s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);

	AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}

/*
  删除操作报告单条响应
  s_Pid:进程ID
  BSCPosi:单个BSC在报告列表中的偏移量
*/
void Process_KillReturnSingleResponseToCBCProxy(PID_t *s_Pid,int BSCPosi)
{
	unsigned short                    Len;
	int                               Posi;
	char                              ResponseBuf[3096];    
	REPORT_MESSAGE_i                  s_Report;
	KILL_PROCESS_DATA_STRUCT          *LPs_KillProcessDataStruct;
	KILLMESSAGE_t                     *LPm_KillMessage; 
	int                               i;
	int                               ComlListBscPosi;
	CELLLIST_i                        s_FailureList;
	
	memset(&s_FailureList,0,sizeof(CELLLIST_i));
	memset(&ResponseBuf[0],0,3096);
	memset(&s_Report,0,sizeof(REPORT_MESSAGE_i));

	LPs_KillProcessDataStruct=(KILL_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid->iProcessId][0];

	LPm_KillMessage=(KILLMESSAGE_t *)&LPs_KillProcessDataStruct->s_CBCMessage.cMessage[0];	

    s_Report.s_MessageHead.iMessageAreaId=A;

	/* 删除操作的响应 */
	s_Report.s_MessageHead.iMessageType=CBCPROXY_REPORT_KILL;
	
	memcpy(&s_Report.s_MessageHead.s_SenderPid,s_Pid,sizeof(PID_t));
	memcpy(&s_Report.s_MessageHead.s_ReceiverPid,
		&LPs_KillProcessDataStruct->s_CBCMessage.s_MessageHead.s_SenderPid,sizeof(PID_t));

	ComlListBscPosi=-1;

	for (i=0;LPs_KillProcessDataStruct->s_NoofBroadcastComlList.cNumberOfBSC;i++)
	{
		if(memcmp(&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[i].BSCIdentifier[0],
			&LPs_KillProcessDataStruct->s_FailureList.s_BSCCellList[BSCPosi].BSCIdentifier[0],BSC_INDENTIFIER_LEN)==0)
		{
			ComlListBscPosi=i;
			break;
		}
	}
	
    if(ComlListBscPosi>=0)
	{
		s_Report.bComlListFlag=1;
	    s_Report.cComlListNumberOfBSC=1;
	}

	memcpy(&s_Report.p_MessageIdentifier,&LPm_KillMessage->p_MessageIdentifier,sizeof(MESSAGEIDENTIFIER_t));
	memcpy(&s_Report.p_Serialnumber,&LPm_KillMessage->p_OldSerialnumber,sizeof(SERIALNUMBER_t));
	memcpy(&s_Report.p_ChannelIndicator,&LPm_KillMessage->p_ChannelIndicator,sizeof(CHANNELINDICATOR_t));

	s_Report.bReportListFlag=1;
	s_Report.cReportListNumberOfBSC=1;

	memcpy(&ResponseBuf[sizeof(short)],&s_Report,sizeof(REPORT_MESSAGE_i));

	Posi=sizeof(REPORT_MESSAGE_i)+sizeof(short);
	
	
	memcpy(&ResponseBuf[Posi],&LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi],
		(LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short)));

	Posi=Posi+LPs_KillProcessDataStruct->s_NoofBroadcastComlList.s_BSC_NoOfBroadCastcoml[ComlListBscPosi].ilength*sizeof(NOOFBROADCASTSCOML_i)+BSC_INDENTIFIER_LEN+sizeof(short);

	Abstract_Failure_Cell(&LPs_KillProcessDataStruct->s_FailureList,&s_FailureList);

	memcpy(&ResponseBuf[Posi],&s_FailureList.s_BSCCellList[BSCPosi],
		(s_FailureList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short)));
	
	Posi=Posi+s_FailureList.s_BSCCellList[BSCPosi].ilength*sizeof(CELLREPORT_i)+BSC_INDENTIFIER_LEN+sizeof(short);

	Len=Posi-sizeof(short);

	memcpy(&ResponseBuf[0],&Len,sizeof(short));

	s_Report.s_MessageHead.iMessageLength=Len-sizeof(MESSAGE_HEAD_t);

	AppendCBESendMessage((CBEMESSAGE_t *)&ResponseBuf[0]);
}


/* 生命定时器到时,释放进程 */
int Process_lifeEnd(PID_t *LPs_Pid)
{
	/* 进程存在 */
	if(is_busy_pid((char *)LPs_Pid)==0 )
	{
		return END;
	}
	return SUCCESS;
}


/* 处理WRITE回复定时器到时 */
int Process_Write_Response_timer_Expired(PID_t s_Pid)
{
	int                               i;
	unsigned char                     ResendExist;
    WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	int                               iReturnValue;
	
	LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];

	ResendExist=0;

	/* 返回全部响应 */
	Process_WriteReplace_Return_To_CBCProxy(s_Pid);

	/* 回复定时器置-1 */
	LPs_WriteReplaceProcessDataStruct->iTimerId=-1;

	/* 是否有重发 */
	for(i=0;i<LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.cNumberOfBSC;i++)
	{
		if(LPs_WriteReplaceProcessDataStruct->s_ResponseCellList.s_BSCCellList[i].bResendFlag==1)
		{
			ResendExist=1;
			break;
		}
	}


	if(ResendExist==1)
	{/* 有重发 */
    	return CONTINUANCE;
	}
	else
	{/* 无重发 */
		
		/* 没有全响应 */
			
        /* 创建生命定时器 */  
    	iReturnValue=create_timer(WAIT_RESPONSE_TIME,LIFE_PERIOD,(char *)&s_Pid,NULL);
		if (iReturnValue<0)
		{
   			printf("Create Resend timer Error!\n");
			return END;
		}
		LPs_WriteReplaceProcessDataStruct->iLifeTimerId=iReturnValue;

		return CONTINUANCE;
	}
}


/* 处理REPLACE回复定时器到时 */
int Process_Replace_Response_timer_Expired(PID_t s_Pid)
{
    WRITEREPLACE_PROCESS_DATA_STRUCT  *LPs_WriteReplaceProcessDataStruct;
	int                               iReturnValue;
	
	LPs_WriteReplaceProcessDataStruct=(WRITEREPLACE_PROCESS_DATA_STRUCT *)&ProcessData[s_Pid.iProcessId][0];


	/* 返回全部响应 */
	Process_WriteReplace_Return_To_CBCProxy(s_Pid);

	/* 回复定时器置-1 */
	LPs_WriteReplaceProcessDataStruct->iTimerId=-1;

	/* 没有全响应 */
    /* 创建生命定时器 */  
   	iReturnValue=create_timer((WAIT_RESPONSE_TIME),LIFE_PERIOD,(char *)&s_Pid,NULL);
	if (iReturnValue<0)
	{
		printf("Create Resend timer Error!\n");
		return END;
	}
	LPs_WriteReplaceProcessDataStruct->iLifeTimerId=iReturnValue;

	return CONTINUANCE;
	
}

⌨️ 快捷键说明

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