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

📄 fservice.c

📁 包括EPA协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= LOSS_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
		}
		else {
			// Report: CRC check error
			FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			fscfo.DeviceFailure |= DATABIT_ERROR;
			fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
			fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
			FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
		}
	}
	FreeSock(psock);
}

void FS_Write_req(PSock psock) {
	uint16 srcappid;
	uint32 crc;
	
	ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
	memset(psock->payload + 6, 0, 10);
	if(GetFSComState() == SAFETYCOM_OPEN) {
		h2n16(GetFSComESN(), psock->payload + 4);
		switch(gCrcMode) {
			case 1:
				crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 2:
				crc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 3:
				crc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 4:
				crc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
		}
		h2n32(crc, psock->payload);
		EPAOutput(psock);
	}
	else {
		n2h16(psock->payload + 16, &srcappid);
		AddSt(10, (void*)psock, FSRetryOutput);
		FS_ComOpen_req(psock->dstip, srcappid);
	}
}


/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Safety Write 服务处理函数, 通过时间戳, CRC, SN      -*
 *-   检查后写入指定数据, 根据读取情况返回正/负响应, 未通过检查则产  -*
 *-   生对应错误报告                                                 -*
 *--------------------------------------------------------------------*/
void FS_Write_reqhandle(PSock psock) {
	uint16 rmtsn, localsn;
	uint32 localcrc, rmtcrc;
	uint16 srcappid, dstappid, objid, subindex;
	FSCommunicationFailureObject fscfo;
	
	if(GetFSComState() == SAFETYCOM_OPEN && psock->srcip == GetFSComRmtIP()) {
		
		switch(gCrcMode) {
			case 1:
				localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 2:
				localcrc = crc81_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 3:
				localcrc = crc16_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			case 4:
				localcrc = crc32_check(psock->payload + 4, psock->length - 4, GetFSComKey());
				break;
			default:
				return;
		}
		n2h32(psock->payload, &rmtcrc);
		localsn = GetFSComESN();
		if(localcrc == rmtcrc) {
			n2h16(psock->payload + 4, &rmtsn);
			localsn = GetFSComESN();
			if(rmtsn == localsn) {
				n2h16(psock->payload + 16, &srcappid);
				n2h16(psock->payload + 18, &dstappid);
				n2h16(psock->payload + 20, &objid);
				n2h16(psock->payload + 22, &subindex);
				ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
				
#if NS_MODULE_EN > 0
				if(psock->comtype & NS_COM_TYPE) {
					// NS In
				}
				else {
					OSQPost(gpFBMsgQ, (void*)psock);
				}
#else
				OSQPost(gpFBMsgQ, (void*)psock);
#endif	// NS_MODULE_EN

				SetFSComESN(localsn + 1);
			}
			else if(rmtsn < localsn) {
				// report error: repetition
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= REPETITION_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
			else {
				// report error: loss
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= LOSS_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
		}
		else {
			// Report: CRC check error
			FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			fscfo.DeviceFailure |= DATABIT_ERROR;
			fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
			fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
			FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
		}
	}
	FreeSock(psock);
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *-   Datelen 数据长度                                               -*
 *- Description: 根据参数发送Safety Write正响应报文                   -*
 *--------------------------------------------------------------------*/
void FS_Write_pos(PSock psock){
	uint32 crc;

	ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
	memset(psock->payload + 6, 0, 10);
	if(GetFSComState() == SAFETYCOM_OPEN) {
		h2n16(GetFSComESN(), psock->payload + 4);
		switch(gCrcMode) {
			case 1:
				crc = crc81_check(psock->payload + 4, 14, GetFSComKey());
				break;
			case 2:
				crc = crc81_check(psock->payload + 4, 14, GetFSComKey());
				break;
			case 3:
				crc = crc16_check(psock->payload + 4, 14, GetFSComKey());
				break;
			case 4:
				crc = crc32_check(psock->payload + 4, 14, GetFSComKey());
				break;
		}
		h2n32(crc, psock->payload);
		EPAOutput(psock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Safety write 正响应 服务处理函数, 通过时间戳, CRC, SN       -*
 *-   检查后读取指定数据,  未通过检查则产  																-*
 *-   生对应错误报告                                                 -*
 *--------------------------------------------------------------------*/
//void FS_Write_poshandle(uint16 Smo_Socket_Index) {
void FS_Write_poshandle(PSock psock) {
	uint16 rmtsn, localsn;
	uint32 rmtcrc, localcrc;
	FSCommunicationFailureObject fscfo;

	if(GetFSComState() == SAFETYCOM_OPEN) {
		switch(gCrcMode) {
			case 1:
				localcrc = crc81_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 2:
				localcrc = crc81_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 3:
				localcrc = crc16_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 4:
				localcrc = crc32_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
		}
		n2h32(psock->payload, &rmtcrc);
		if(localcrc == rmtcrc) {
			localsn = GetFSComESN();
			n2h16(psock->payload + 4, &rmtsn);
			if(rmtsn == localsn + 1) {
				ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
				
#if NS_MODULE_EN > 0
				if(psock->comtype & NS_COM_TYPE) {
					// NS In
				}
				else {
					OSQPost(gpFBMsgQ, (void*)psock);
				}
#else
				OSQPost(gpFBMsgQ, (void*)psock);
#endif	// NS_MODULE_EN

			}
			else if(rmtsn < localsn) {
				// report error: repetition
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= REPETITION_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
			else {
				// report error: loss
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= LOSS_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
		}
		else {
			// Report: CRC check error
			FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			fscfo.DeviceFailure |= DATABIT_ERROR;
			fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
			fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
			FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
		}
	}
	FreeSock(psock);
}

/*--------------------------------------------------------------------*
 *- Parameter: DesIPAddr 目标IP, UdpPort 目标端口, 对应请求的MsgID   -*
 *-   pData 需要发送的数据, 以网络序的Octet串形式提供                -*
 *-   Datelen 数据长度                                               -*
 *- Description: 根据参数发送Safety Write负响应报文                   -*
 *--------------------------------------------------------------------*/
void FS_Write_neg(PSock psock) {
	uint32 crc;

	ShiftOutSock(psock, PROTOCOL_EPASSFB, PROTOCOL_EPASFB);
	memset(psock->payload + 6, 0x00, 10);
	if(GetFSComState() == SAFETYCOM_OPEN) {
		h2n16(GetFSComESN(), psock->payload + 4);
		switch(gCrcMode) {
			case 1:
				crc = crc81_check(psock->payload + 4, 52, GetFSComKey());
				break;
			case 2:
				crc = crc81_check(psock->payload + 4, 52, GetFSComKey());
				break;
			case 3:
				crc = crc16_check(psock->payload + 4, 52, GetFSComKey());
				break;
			case 4:
				crc = crc32_check(psock->payload + 4, 52, GetFSComKey());
				break;
		}
		h2n32(crc, psock->payload);	
		EPAOutput(psock);
	}
}

/*--------------------------------------------------------------------*
 *- Parameter: Smo_Socket_Index 数据索引,由通信栈获得                -*
 *- Description: Safety write 负响应 服务处理函数, 通过时间戳, CRC, SN       -*
 *-   检查后读取指定数据,  未通过检查则产  																-*
 *-   生对应错误报告                                                 -*
 *--------------------------------------------------------------------*/
void FS_Write_neghandle(PSock psock) {
	uint16 rmtsn, localsn;
	uint32 rmtcrc, localcrc;
	FSCommunicationFailureObject fscfo;

	if(GetFSComState() == SAFETYCOM_OPEN) {
		switch(gCrcMode){
			case 1:
				localcrc = crc81_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 2:
				localcrc = crc81_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 3:
				localcrc = crc16_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
			case 4:
				localcrc = crc32_check(psock->payload + 4, psock->length - 12, GetFSComKey());
				break;
		}
		n2h32(psock->payload, &rmtcrc);
		
		if(localcrc == rmtcrc) {
			n2h16(psock->payload + 4 + 4, &rmtsn);
			localsn = GetFSComESN() ;
			if(rmtsn == localsn+ 1) {
				ShiftInSock(psock, PROTOCOL_EPASFB, PROTOCOL_EPASSFB);
				
#if NS_MODULE_EN > 0
				if(psock->comtype & NS_COM_TYPE) {
					// NS In
				}
				else {
					OSQPost(gpFBMsgQ, (void*)psock);
				}
#else
				OSQPost(gpFBMsgQ, (void*)psock);
#endif	// NS_MODULE_EN

			}
			else if(rmtsn < localsn) {
				// report error: repetition
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= REPETITION_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & REPETITION_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & REPETITION_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
			else {
				// report error: loss
				FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
				fscfo.DeviceFailure |= LOSS_ERROR;
				fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & LOSS_ERROR);
				fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & LOSS_ERROR);
				FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			}
		}
		else {
			// Report: CRC check error
			FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
			fscfo.DeviceFailure |= DATABIT_ERROR;
			fscfo.FailureReportState |= ((~fscfo.FailureReportConfiguration) & DATABIT_ERROR);
			fscfo.FailureAcknowledgeState |= ((~fscfo.FailureAcknowledgeConfiguration) & DATABIT_ERROR);
			FSMIB_Set(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
		}
	}
	FreeSock(psock);
}

/*--------------------------------------------------------------------*
 *- Parameter: void                                                  -*
 *- Description: 检查Communication failure对象, 发送时间通知         -*
 *--------------------------------------------------------------------*/

void FS_ComFailure_EvenNotification(void) {
	PSock psock;
	FSCommunicationFailureObject fscfo;
	
	FSMIB_Get(FSCOMFAILUREO_BASE_OBJECTID, (uint8 *)&fscfo);
	psock = GetOutSock(PROTOCOL_EPASTUSR);
	psock->dstip = gNetIf.bcaddr;
	if(fscfo.DeviceFailure != 0) {
		h2n16(fscfo.DeviceFailure, psock->payload);
		// Call EPA event notification function to send a 
	}
}

⌨️ 快捷键说明

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