
#ifndef __MOTION_H__
#define	__MOTION_H__

#include "config.h"

//--------------------------------------------------
// 运动控制

#ifndef MAX_AXIS_NUM
#define MAX_AXIS_NUM	4
#endif

//----------------------------------------------------------------------------------------------------------

// 电机速度结构
typedef struct
{
	u32 startPPS;			// 启动速度
	u32 stopPPS;			// 停止速度
	u32 runPPS;				// 运动速度
	u32 slowPPS;			// 慢速速度
	u32 addPPSS;			// 变速加速度
	u32 brkPPSS;			// 刹车加速度
	u32 slowPPSS;			// 慢速加速度
}MotionSpeedCtrl;

typedef struct
{
	void (*RefreshPosition)(u32, s32*);	// 坐标刷新回调函数
	u32 refPosPara;						// 坐标刷新参数

	int (*GetSlowDown)(u32,u32);		// 慢速运动条件函数，当为空时，不检测降速条件; 不为空时，条件满足，速度降低，条件消失，速度恢复
	int (*GetNormalStop)(u32,u32);		// 一般停止条件函数，当为空时，不检测停止条件; 不为空时，条件满足，降速到停止（按降速加速度）
	int (*GetQuickStop)(u32,u32);		// 快速停止条件函数，当为空时，不检测停止条件; 不为空时，条件满足，降速到停止（按刹车加速度）
	int (*GetEmergencyStop)(u32,u32);	// 紧急停止条件函数，当为空时，不检测急停条件; 不为空时，条件满足，立刻停止发送脉冲（无需降速）
	u32 condPara1, condPara2;			// 条件函数参数

}MotionCallbackCtrl;

//--------------------------------------------------
// 单轴异步轨迹运动

#define	SPM_PARA_NUM	100		// 大于等于SeparateMotionCtrl.paraList

typedef struct
{
	int motoIdx;				// 运动轴索引
	int runtype;				// 运动模式，0, 位移模式（位移完成，然后停止）; 1, 速度模式（无限运动模式，直到停止条件触发停止）
	int blockRun;				// 阻塞运行标志
	s32 movement;				// 位移量

	MotionSpeedCtrl spdPara;		// 速度

	// 回调函数
	MotionCallbackCtrl callback;

	// 反馈信息
	int errInfo;			// 错误信息
	int exerslt;			// 执行结果
	int runningflag;		// 运行标志
	int startflag;			// 启动标志
	int stopflag;			// 停止标志（外部设置）

	// 中间变量
	union
	{
		u32 buff[SPM_PARA_NUM];

		struct
		{
			int initedflag;
			int outdir;
			int oldcondsel;

			s32 posbeforerun;		// 运动前的位置

			float startpps, runpps, slowpps, stoppps;		// 速度
			float addppss, brkppss, slowppss;				// 加速度

			u32 totalnum, runmidx;
			u32 mvmtseg[3];			// 运动的三段的位移
			u32 decpoint;			// 降速分界点
			u32 tablen12, tablen3;
			u32 slowmvmt;

			int slowsta, inslow;	// 降速状态，正在降速标志
			int brksta, inbrk;		// 刹车状态，正在刹车标志
			int nstpsta, innstp;	// 停车状态，正在停车标志
		}paraList;
	}ctrlPara;

}SeparateMotionCtrl;


#define	PULSE_DIR_POSI		1
#define	PULSE_DIR_NEGA		-1

#define	SEPRUN_TPYE_MVMT		0	// 位置控制
#define	SEPRUN_TPYE_SPEED		1	// 速度控制

//--------------------------------------------------
// 多轴直线插补运动

// 直线插补运动控制结构
typedef struct
{
	s32 movement[MAX_AXIS_NUM];		// 各个轴的运动量，0，无运动；其他，运动长度，单位p

	MotionSpeedCtrl spdPara;			// 速度控制参数

	// 回调函数及参数
	MotionCallbackCtrl callback;

	// 反馈信息
	int errInfo;					// 错误信息

}InterMotionCtrl;

//--------------------------------------------------
// 单轴连续位移运动

// 交换数据
typedef struct
{
	// 设置数据
	u32 mvmtStatus;				// 本次运动数据状态，0，无效，1，有效
	s32 movement;				// 位移参数，本段位移

	s32 thisIdx;
	float thisBegPPS;			// 本次的启动速度,也是上段结束时的速度
	float thisEndPPS;			// 本次结束时的速度
	float thisRunPPS;			// 本次的运行速度
	float thisAddPPSS;			// 本次的运行加速度

	//----反馈状态
	int bufsta;					// 缓冲区状态
	int runsta;
	s32 exeingIdx;
	float exeingMaxPPS;

	s32 lastmvmt;				// 上段的位移
	float lastRunPPS;
	float lastEndPPS;			// 上次结束时的速度，也就是本段（正在执行段）的起始速度（每次表结束时设置）
	float lastAddPPSS;			//

	int rslt;
	int err;

}MotionSwapData;

typedef struct
{
	int motoIdx;				// 运动轴索引

	// 回调函数
	void (*RefreshPosition)(u32, s32*);	// 坐标刷新回调函数
	u32 refPosPara;						// 坐标刷新参数

	void (*RefreshData)(u32, u32);		// 数据刷新回调函数
	u32 refDatPara;						// 数据刷新函数参数

	MotionSwapData swapData;			// 交换的位移和速度

	// 反馈信息
	int errInfo;				// 错误信息
	int exerslt;
	int stopflag;
	int runningflag;

	// 中间变量

}ContinuousMotionCtrl;


#endif
