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

📄 fservice.c

📁 包括EPA协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
			++gSubESN; 
		}
		
		// 接收到的SN必须大于LRSN
		if(gSubLRSN < rmtsn) {
			// 接收到的SN必须等于ESN
			if(rmtsn == gSubESN) {
				gSubLRSN = rmtsn;
				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 {
				// report error: lost packet
				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 error: repitition
			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: data bit 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_Read_req(uint8 DesIPAddr[4], uint16 DesAppID, uint16 DesObjectID, uint16 SubIndex, uint8* pUsrData) {
void FS_Read_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(5, (void*)psock, FSRetryOutput);
		FS_ComOpen_req(psock->dstip, srcappid);
	}
}


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

	if(GetFSComState() == SAFETYCOM_OPEN && GetFSComRmtIP() == psock->srcip) {
		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);
		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, &dstobjid);
				n2h16(psock->payload + 22, &subindex);
				// Call EPA usr layer to deal with data
				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 Read正响应报文                   -*
 *--------------------------------------------------------------------*/
void FS_Read_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, 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);
	}
}

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

	datalen= psock->length;
	
	if(GetFSComState() == SAFETYCOM_OPEN) {
		switch(gCrcMode) {
			case 1:
				localcrc = crc81_check(psock->payload + 4, datalen - 4, GetFSComKey());
				break;
			case 2:
				localcrc = crc81_check(psock->payload + 4, datalen - 4, GetFSComKey());
				break;
			case 3:
				localcrc = crc16_check(psock->payload + 4, datalen - 4, GetFSComKey());
				break;
			case 4:
				localcrc = crc32_check(psock->payload + 4, datalen - 4, GetFSComKey());
				break;
		}
		n2h32(psock->payload, &rmtcrc);
		
		if(localcrc == rmtcrc) {
			n2h16(psock->payload + 4, &rmtsn);
			localsn = GetFSComESN() + 1;
			if(rmtsn == localsn) {
				// Call EPA usr layer to deal with data
				SetFSComESN(localsn);
				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 Read负响应报文                   -*
 *--------------------------------------------------------------------*/
void FS_Read_neg(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, 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 Read 负响应 服务处理函数, 通过时间戳, CRC, SN       -*
 *-   检查后读取指定数据,  未通过检查则产  																-*
 *-   生对应错误报告                                                 -*
 *--------------------------------------------------------------------*/
void FS_Read_neghandle(PSock psock) {
	uint16 localsn, rmtsn;
	uint32 rmtcrc, localcrc;
	FSCommunicationFailureObject fscfo;

	if(GetFSComState() == SAFETYCOM_OPEN) {
		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;
		}
		n2h32(psock->payload, &rmtcrc);
		
		if(localcrc == rmtcrc) {
			n2h16(psock->payload + 4, &rmtsn);
			localsn = GetFSComESN() + 1;
			if(rmtsn == localsn) {
				// Call EPA usr layer to deal with data
				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

⌨️ 快捷键说明

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