
#include "ruanyictrl.h"

#if (BUSCTRL_MOTO == RUANYI)

#include "modbus_m.h"
#include "workctrl.h"

typedef struct
{
	u16 motoreturndat;	//电机回包数据
	u16 motoparaval;	//参数设置值
	u16 zerocodeval;	//零位编码值
	int curtozeroval;	//当前位置与零位编码值
	u32 curtozeroabs;

	u8 zeroflag;
	s16 motocurpuspos;
}RYDriverCtrl;

RYDriverCtrl g_rydriverctrl;

void InitRuanyiCom(void)	//初始化
{
	memset(&g_rydriverctrl, 0, sizeof(RYDriverCtrl));

}


/*移动电机到某位置 (绝对位置)
 * decIdx:电机设备地址：1-127
 * pos:目标位置（脉冲数）
 * spd:速度 0：不改变速度
 * */

int MoveRyiToAbsolutePos(u8 devIdx, s16 pos, u16 spd)
{
	int err = 0;
	static u16 oldRyspd = 500;
	if(spd != oldRyspd)
	{
		oldRyspd = spd;
		err = ModbusComm16(0,devIdx, MODBUS_WR, 8256, (u16)spd, &g_rydriverctrl.motoreturndat);  //更改最高速度
		DelayRef(300);
	}
	if(err >= 0 &&
			pos != 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, 9473, (u16)pos, &g_rydriverctrl.motoreturndat);
		if(g_rydriverctrl.motoreturndat != (u16)pos)
		{
			err = -10;
		}
	}

	return err;
}



/*移动电机到某位置（相对位置）
 * decIdx:电机设备地址：1-127
 * pos:目标位置（脉冲数）
 * spd:速度 0：不改变速度
 * */

int MoveRyiToRelativePos(u8 devIdx, s16 pos, u16 spd)
{
	int err = 0;
	static u16 oldRyspd = 1500;
	if(spd != oldRyspd)
	{
		oldRyspd = spd;
		err = ModbusComm16(0,devIdx, MODBUS_WR, 8256, (u16)spd, &g_rydriverctrl.motoreturndat);  //更改最高速度
		DelayRef(300);
	}
	if(err >= 0 &&
			pos != 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, 9475, (u16)pos, &g_rydriverctrl.motoreturndat);
		if(g_rydriverctrl.motoreturndat != (u16)pos)
		{
			err = -10;
		}
	}

	return err;
}

/*电机JOG+ 运行
 * decIdx:电机设备地址：1-127
 * spd:速度 0：不改变速度
 * */

int MoveRyiJOGP(u8 devIdx, u16 spd)
{
	int err = 0;
	if(spd != 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, 8241, (u16)spd, &g_rydriverctrl.motoreturndat);	//点动速度
	}
	if(err >= 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITJOGPCMD, &g_rydriverctrl.motoreturndat);
	}
	return err;
}

int MoveRyiJOGN(u8 devIdx, u16 spd)
{
	int err = 0;
	if(spd != 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, 8241, (u16)spd, &g_rydriverctrl.motoreturndat);	//点动速度
	}
	if(err >= 0)
	{
		err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITJOGNCMD, &g_rydriverctrl.motoreturndat);
	}
	return err;
}

//电机停止
int RyiMotoStop(u8 devIdx)
{
	int err = 0;
	err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITSTOPCMD, &g_rydriverctrl.motoreturndat);
	return err;
}

//当前位置给定
int SetRyiCurPos(u8 devIdx, s16 pos)
{
	int err = 0;
	err = ModbusComm16(0,devIdx, MODBUS_WR, 9472, pos, &g_rydriverctrl.motoreturndat);
	return err;
}

//当前位置清零
int RyiMotoSetCurPosZero(u8 devIdx)
{
	int err = 0;
	err = ModbusComm16(0,devIdx, MODBUS_WR, BITMOVEADDR, BITSETCPOSZEROCMD, &g_rydriverctrl.motoreturndat);
	return err;
}

//到对应位置
int RyiMotoToPos(u8 devIdx, u16 pos)
{
	int err = 0;
	err = ModbusComm16(0,devIdx, MODBUS_WR, BITTOPOSADDR, pos, &g_rydriverctrl.motoreturndat);
	return err;
}


//读取电机位置 单位：脉冲
int GetCurPusPos(u8 devIdx, s16 * puspos)
{
	int err = 0;
	u16 upuspos = 0;
	err = ModbusComm16(0,devIdx, MODBUS_RD, 9729, 0, &upuspos);
	*puspos = (s16)upuspos;
	return err;
}

//读取电机状态 当前指令是否完成0：未完成；1：完成 2：堵转 3：错误
int GetCurStatus(u8 devIdx, int * statuflg)
{
	int err = 0;
	u16 sta = 0;
	err = ModbusComm16(0,devIdx, MODBUS_RD, 9728, 0, &sta);
	if(err < 0)
	{
		return err;
	}
	else
	{
		if(sta == 1)
		{
			*statuflg = 1;
		}
		else if(sta == 0)
		{
			*statuflg = 0;
		}
		else
		{
			*statuflg = -1;
		}
	}
	return err;
}

#endif
