/* * 被控站STARTDT/STOPDT:受理时改变传输状态,发送完成只校验CON结果。 * 本层不执行socket I/O、不维护发送队列、不计时;所有调用必须串行。 */ #ifndef IEC104_LINK_SLAVE_STARTSTOP_H #define IEC104_LINK_SLAVE_STARTSTOP_H #include "IEC104_Link_Common.h" #ifdef __cplusplus extern "C" { #endif /* * 每个合法STARTDT_ACT生成6字节CON,立即置STARTED/IDLE,可结束停止等待。 * 先预留发送空间再调用,OK后按FIFO提交;提交失败须断链,不能回滚后重放。 * 不暂存相反请求、不撤回已排队CON、不重置序号;非法输入FATAL且不修改输出。 */ extern IEC104_LinkResult_t IEC104_Link_Handle_Startdt_Act( IEC104_LinkState_t *state, const IEC104_ApciInfo_t *apci, uint8_t *response, uint16_t capacity); /* 恰好6字节为OK,否则FATAL;完成不修改当前启停状态。 */ extern IEC104_LinkResult_t IEC104_Link_Complete_Startdt_Con_Send( IEC104_LinkState_t *state, int sent_len); /* * 合法STOP立即置STOPPED/STOP_DRAINING,返回OK,不生成报文。 * 既有START_CON仍按FIFO完成;不等待它、不暂存STOP、不因启停交错断链。 * 排空中的重复STOP返回IGNORED且不延长期限;STOPPED/IDLE再次STOP会重新应答。 * 非法输入返回FATAL且不修改状态。 */ extern IEC104_LinkResult_t IEC104_Link_Handle_Stopdt_Act( IEC104_LinkState_t *state, const IEC104_ApciInfo_t *apci); /* 只读查询:1可生成S或STOP_CON,0无义务或等待,-1非法。 */ extern int IEC104_Link_Can_Prepare_Stopdt_Response(const IEC104_LinkState_t *state); /* * 先确认已收到的数据,再等待本端已预留I帧获ACK,不发送新的业务I帧。 * 已排队且覆盖V(R)的S允许STOP_CON紧随排队,发送及完成顺序由FIFO保证。 * FRAME_READY写response和tx;生成STOP_CON即结束排空,保持STOPPED。 * 后到START可结束未生成CON的排空;已生成的CON仍须按序完成。 * WAIT_SEND等既有S,WAIT_PEER_ACK等I帧确认,NOT_ACTIVE表示无停止义务。 */ extern IEC104_StopdtPrepareResult_t IEC104_Link_Prepare_Stopdt_Response( IEC104_LinkState_t *state, uint8_t *response, uint16_t capacity, IEC104_StopdtTx_t *tx); /* 恰好6字节为OK,否则FATAL;旧STOP_CON完成不覆盖后到START的状态。 */ extern IEC104_LinkResult_t IEC104_Link_Complete_Stopdt_Con_Send( IEC104_LinkState_t *state, int sent_len); #ifdef __cplusplus } #endif #endif /* IEC104_LINK_SLAVE_STARTSTOP_H */