/*
 *      软艺电机EF_A协议
 */

#ifndef _EF_A_H_
#define _EF_A_H_

#include "config.h"
#include "serial.h"

typedef struct
{
	int idx;
	u8 addr;
	u16 wrdat;
	u16 rddat;
}EFCmd;

#ifndef MAX_EF_CMD
#define MAX_EF_CMD			50
#endif

typedef void (*ResvEFProc)(EFCmd * pcmd);			// 收到数据处理函数

typedef struct
{
	EFCmd cmdbuf[MAX_EF_CMD];

	// 收发控制
	int working;	// 正在读写中; = 1, 工作中，不能收发新命令

	int bufCmdNum;		// 命令个数; != 0, 有新命令
	int bufHead;
	int bufTail;

	int steps;
	u32 stepTime;

	ResvEFProc resvefproc;		// 收到数据处理函数

	int efrsvTimout;		// 读取超时时间

}AsyncEFCtrl;

typedef void (*CommOutFunc)(void);

typedef struct
{
	u32 efSendWait;		// 通讯延时, 单位us,发送一个字节所需时间

	// 通讯函数指针
	UsartSendData EFCommSend;			// 发送数据
	UsartGetData EFCommReceive;			// 接收数据
	UsartCleanRsBuf	EFCommCleanRsBuf;	// 清空接收缓冲区
	IsUsartSendOver IsEFCommSendOver;	// 判断发送缓冲区是否为空

	CommOutFunc CommOutEn;	// 数据发送允许
	CommOutFunc CommOutDis;	// 数据发送禁止

}EFCommCtrl;

void InitEF(int idx, int usart, BAUD_TypeDef baud, char dat, char parity, char stop);
int EFTx(int idx, u8 addr, u16 data, int steps);
int EFRx(int idx, u16 * pData, int steps);
int EFComm(int idx, u8 addr, u16 wrDat, u16 * pRdBuf);

void InitAsyncEFCtrl(int idx, int rsvtimout);
void RegEFCmdProc(int idx, ResvEFProc proc);
int AddEFCmd(EFCmd * pCmd);
int GetEFCmdBufLen(int idx);
int AsyncEFTask(int idx);

#endif /* _EF_A_H_ */
