81 lines
4.5 KiB
C
81 lines
4.5 KiB
C
/**
|
||
* 链路模块内部的跨文件协作声明,不属于供业务调用的稳定公开API。
|
||
*
|
||
* “内部”指使用范围限于链路实现,不是C语言的static内部链接。
|
||
* 本文件声明的函数均定义在IEC104_Link.c,供公共链路及角色实现调用,
|
||
* 因此采用外部链接。角色状态组合校验是Link.c中的static函数,不在此声明。
|
||
* 若改为static,必须同时消除跨编译单元调用;仅移动或删除头文件声明无效。
|
||
* 只在一个.c内使用的辅助函数直接定义为static,不应加入本头文件。
|
||
*
|
||
* 校验调用顺序:Role_Valid -> State_Valid -> Link.c内对应角色的static State_Consistent。
|
||
* 最后一级不能反调前两级,否则形成递归。其余辅助函数依赖各自列出的前置条件。
|
||
* 同一连接的检查、编码、状态提交和完成事件由调用方串行化;这里不提供锁或调度。
|
||
* 业务调用方使用Common、Master_StartStop、Slave_StartStop公开头文件,或兼容总头文件IEC104_Link.h。
|
||
* SendManager通过公开的Get_Send_Progress和Is_Initial_State查询,不包含本头文件。
|
||
*/
|
||
#ifndef IEC104_LINK_INTERNAL_H
|
||
#define IEC104_LINK_INTERNAL_H
|
||
|
||
#include "IEC104_Link_Common.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/**
|
||
* 功能:检查公共字段定义域、S状态/快照组合,以及当前角色的启停状态约束。
|
||
* 定义/调用:定义于IEC104_Link.c;公共接口及主站超时查询使用,角色入口经Role_Valid使用。
|
||
* 输入参数:state——待检查对象;允许NULL,返回0。
|
||
* 输出参数:无,不修改state。
|
||
* 返回值:通过检查为1,否则为0;不是IEC104_LinkResult_t事件结果。
|
||
* 说明:不判断TCP连接、FIFO事件身份或本次报文序号;这些由对应处理步骤负责。
|
||
*/
|
||
int IEC104_Link_State_Valid_Internal(const IEC104_LinkState_t *state);
|
||
|
||
/**
|
||
* 功能:完成上述状态检查,并要求本端角色与指定接口相符。
|
||
* 定义/调用:定义于IEC104_Link.c;主站和子站的角色专用入口调用。
|
||
* 输入参数:state——待检查对象;role——入口要求的CONTROLLING或CONTROLLED。
|
||
* 输出参数:无,不修改state。
|
||
* 返回值:状态合法且角色匹配为1;NULL、状态非法或角色不匹配为0。
|
||
* 说明:检查的是本端固定角色,不会设置角色,也不会推进启停过程。
|
||
*/
|
||
int IEC104_Link_Role_Valid_Internal(const IEC104_LinkState_t *state, IEC104_LinkRole_t role);
|
||
|
||
/**
|
||
* 功能:计算已收但尚未由成功发送的I/S帧确认的I帧数。
|
||
* 定义/调用:定义于IEC104_Link.c;公共确认逻辑和子站停止排空使用。
|
||
* 前置条件:state非NULL,acked_nr和vr为有效15位序号,未确认区间未占满序号环。
|
||
* 输出参数:无,不修改state;不重复执行完整状态校验。
|
||
* 返回值:从acked_nr到vr的循环距离,范围0..32767;0表示无待确认数据。
|
||
*/
|
||
uint16_t IEC104_Link_Unconfirmed_Rx_Internal(const IEC104_LinkState_t *state);
|
||
|
||
/**
|
||
* 功能:判断当前接收位置已确认,或已由在途S帧的N(R)完整覆盖。
|
||
* 定义/调用:定义于IEC104_Link.c;主站准备STOPDT_ACT及接收STOPDT_CON使用。
|
||
* 前置条件:state已通过完整状态校验;调用方保证同连接FIFO与事件串行顺序。
|
||
* 输出参数:无,不修改state。
|
||
* 返回值:acked_nr==vr,或在途S帧s_ack_nr==vr时为1,否则为0。
|
||
* 说明:返回1不等于S已发送完成,不能据此推进acked_nr;旧V(R)快照不算完整覆盖。
|
||
*/
|
||
int IEC104_Link_Rx_Ack_Covered_Internal(const IEC104_LinkState_t *state);
|
||
|
||
/**
|
||
* 功能:编码一帧S确认并保存它的实际N(R)快照,供普通确认及两端STOPDT复用。
|
||
* 定义/调用:定义于IEC104_Link.c;公共S准备、主站/子站停止准备调用。
|
||
* 前置条件:state已校验且无S帧在途;response非NULL且至少有IEC104_APCI_LEN字节;
|
||
* receive_number是本次选定的有效15位确认号。容量和是否应确认由调用方判断。
|
||
* 输出参数:成功写入response,设置s_ack_nr及S_ACK_SEND_PENDING;不更新acked_nr。
|
||
* 返回值:6表示构帧成功,-1表示编码失败且不提交状态;不执行网络发送。
|
||
* 说明:完整发送后才能通过Complete_S_Ack_Send提交确认;本函数不重新读取vr或规划报文。
|
||
*/
|
||
int IEC104_Link_Prepare_S_Ack_Internal(IEC104_LinkState_t *state,
|
||
uint8_t *response, uint16_t receive_number);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* IEC104_LINK_INTERNAL_H */
|