package jbCAP;

import jVARIANT.VARIANT;
import jVARIANT.VARENUM;
import java.util.Arrays;

/** @file bCapRobot.java
 *
 *  @brief b-CAP client library
 *
 *  @version	1.2
 *	@date		2014/5/26
 *	@author		DENSO WAVE (m)
 *
 */
public class bCapRobot extends bCapObjectTmpl{
	private bCapVariables m_vars;
	
	protected bCapRobot(int iHandle, bCapSocket sock)
	{
		m_hr = 0;
		m_iHandle = iHandle;
		m_iOffset = 77;
		
		m_bCapSock = sock;
			
		m_vars = new bCapVariables(m_iHandle, m_bCapSock, 3);
	}
	
	@Override
	protected void Disconnect()
	{
		// Clear bCap Objects
		m_vars.Clear();
		
		// Disconnect bCapRobot
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 84; // Robot_Release
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
		
	public VARIANT get_VariableNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 63; // Robot_GetVariableNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;		
	}
	
	public bCapVariables get_Variables()
	{
		return m_vars;
	}
	
	public bCapVariable AddVariable(String strName, String strOption)
	{
		bCapVariable var = m_vars.Add(strName, strOption);
		m_hr = m_vars.HRESULT();
		
		return var;
	}
	
	public void Accelerate(int iAxis, float fAccel, float fDecel)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 65; // Robot_Accelerate
		
		VARIANT[] vnt = new VARIANT[4];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_I4, iAxis);
		vnt[2] = new VARIANT(VARENUM.VT_R4, fAccel);
		vnt[3] = new VARIANT(VARENUM.VT_R4, fDecel);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public void Change(String strName)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 66; // Robot_Change
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strName);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public void Chuck(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 67; // Robot_Chuck
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public void Drive(int iNo, float fMov, String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 68; // Robot_Drive
		
		VARIANT[] vnt = new VARIANT[4];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_I4, iNo);
		vnt[2] = new VARIANT(VARENUM.VT_R4, fMov);
		vnt[3] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;	
	}
	
	public void GoHome()
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 69; // Robot_GoHome
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public void Halt(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 70; // Robot_Halt
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}	
	
	public void Hold(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 71; // Robot_Hold
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public void Move(int iComp, VARIANT vntPose, String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 72; // Robot_Move
		
		VARIANT[] vnt = new VARIANT[4];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_I4, iComp);
		vnt[2] = vntPose != null ? vntPose : new VARIANT();
		vnt[3] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public void Rotate(VARIANT vntRotSuf, float fDeg, VARIANT vntPivot, String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 73; // Robot_Rotate
		
		VARIANT[] vnt = new VARIANT[5];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = vntRotSuf != null ? vntRotSuf : new VARIANT();
		vnt[2] = new VARIANT(VARENUM.VT_R4, fDeg);
		vnt[3] = vntPivot != null ? vntPivot : new VARIANT();
		vnt[4] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public void Speed(int iAxis, float fSpeed)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 74; // Robot_Speed
		
		VARIANT[] vnt = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_I4, iAxis);
		vnt[2] = new VARIANT(VARENUM.VT_R4, fSpeed);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;			
	}
	
	public void Unchuck(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 75; // Robot_Unchuck
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}	
	
	public void Unhold(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 76; // Robot_Unhold
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public VARIANT Execute(String strCommand, VARIANT vntParam)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 64; // Robot_Execute
		
		VARIANT[] vnt = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);	
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strCommand);
		vnt[2] = vntParam != null ? vntParam : new VARIANT();
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;

		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}

		return vntReturn;
	}
}
