#pragma once
#include "pch.h"
#include "AbstractPort.h"
using namespace std;
// #ifdef IRIS_API_EXPORTS
// 
// #ifdef __cplusplus
// #define IRIS_API_FUNC extern "C" __declspec(dllexport)
// #else
// #define IRIS_API_FUNC __declspec(dllexport)
// #endif
// 
// #else
// 
// #ifdef __cplusplus
// #define IRIS_API_FUNC extern "C" __declspec(dllimport)
// #else
// #define IRIS_API_FUNC __declspec(dllimport)
// #endif
// 
// #endif
// 
// 
// #ifdef IRIS_API_EXPORTS
// #define IRIS_API_CLASS  __declspec(dllexport)
// #else
// #define IRIS_API_CLASS  __declspec(dllimport)
// #endif
#define MAXDISTANCE 1265000
class /*IRIS_API_CLASS*/ CVSMD12XControl
{
public:
	CVSMD12XControl();
	~CVSMD12XControl();
private:
	int *m_piPositionInPulses;

	CAbstractPort *m_pAbsPort;
	unValue m_unValue;
	MSInfo m_stuMSInfo;
	ControllerParams m_stuControllerParams;
	int m_iProtocolType;
	int m_iCID;
	std::string m_strCID;
public:
	bool m_bIsSyncMove;
	//////////////////////////////////////////////////////////////////////////
	//for IRIS Linear Motor - Electric Shutter
	//Initialize communication setup iPortType(0:RS232  1:RS485)  iCID(For RS485 device) bSyncMove(move mode)
	bool ILMES_InitializeComm(QString portName,int bandrate=9600, int iPortType = 1, int iCID = 1, bool bSyncMove = true);
	//Initialize communication setup iPortType(0:RS232  1:RS485)  iCID(For RS485 device) bSyncMove(move mode)
	bool ILMES_InitializeComm(PortInfo portinfo,int iPortType = 1,int iCID = 1, bool bSyncMove = true);

	//Initialize Controller params
	bool ILMES_InitializeParams(ControllerParams cpParams);

	//Set the light hole position(pulses)
	void ILMES_SetPosition(int *piPositionInPulse,size_t szSize);

	bool ILMES_MoveToPos(int iPositionIndex);
    bool IsMotionFinished();
public:
	int waitetime;
	////init port 
	void SetProtocolType(int iProtocolType = 0);//0:RS232  1:RS485 call before send any command
	void SetCID(int iID);//set device id when using RS485 protocol call before send any command
	void SetSyncMode(bool bSyncMove = false);
	bool InitAndOpenPort(PortInfo portinfo);//Init comport by PortInfo Struct
	
	//////////////////////////////////////////////////////////////////////////for debug or unsupported function
	std::string ReadReceive();
	int         SendCommand(const std::string strSend); // return indicates how many char has been sent
	//////////////////////////////////////////////////////////////////////////motor control
	////init&misc
	bool  InitController(); //Init Motor controller hand shake

	bool  Enable();  //enbale
	bool  Disable(); //disable

	bool  GetStatus(MSInfo &stuMotorParam);  //load motor status see MSInfo Struct
	////motion control
	bool  Move(int iRelPulse);  // relative move mode,pulse     (-2147483647��2147483647)
	bool  MoveTo(int iAbsPulse);//absolute mode,pulse     (-2147483647��2147483647)
	bool  Move_NoSyn(int iRelPulse);  // relative move mode,pulse     (-2147483647��2147483647)
	bool  MoveTo_NoSyn(int iAbsPulse);//absolute mode,pulse     (-2147483647��2147483647)
	bool  SetLogicZero();  //set logic zero

	bool  StartBackZero();//back zero
	bool  StopBackZero();// stop back zero & reset register
	////Set&Get
	bool  SetBaudRate(int iBaudRate);//set controller baud rates,default B9600     (2400 �� 921600)
	int   GetBaudRate();  // -1:should retry;
	 
	bool  SetMicroSteps(int iMicroSteps);//set micro steps     (0��5)->(1/2/4/8/16/32)
	int   GetMicroSteps();

	bool  SetAccSpeed(float fAccSpd);//set acceleration speed in pulse     (0 �� 192000000)
	float GetAccSpeed();

	bool  SetRunSpeed(float fRunSpeed);//set normal running speed in pulse     (0 �� 192000000)
	float GetRunSpeed();

	bool  SetDecSpeed(float fDecSpeed);//set deceleration speed in pulse     (0 �� 192000000)
	float GetDecSpeed();

	bool  SetSpeed(float fRunSpeed, float fAccSpd, float fDecSpeed);//see above three functions

	bool  SetHoldCurrent(float fHoldCurrent);//set hold current ( 0 �� 8.0 )Amp? pay attention to your motor specification.
	float GetHoldCurrent();

	bool  SetAccCurrent(float fAccCurrent);//set acceleration current ( 0 �� 8.0 )Amp? pay attention to your motor specification.
	float GetAccCurrent();

	bool  SetRunCurrent(float fRunCurrent);//set normal running current ( 0 �� 8.0 )Amp? pay attention to your motor specification.
	float GetRunCurrent();

	bool  SetCurrent(float fAccCurrent, float fRunCurrent, float fHoldCurrent);//see above three functions

	bool  SetS1FETE(ZZ_U8 bS1FETE);//S1 register falling edge trigger event,see enum
	ZZ_U8  GetS1FETE();

	bool  SetS1RETE(ZZ_U8 bS1RETE);//S1 register rising edge trigger event
	ZZ_U8  GetS1RETE();

	bool  SetS2FETE(ZZ_U8 bS2FETE);//S2 register falling edge trigger event
	ZZ_U8  GetS2FETE();

	bool  SetS2RETE(ZZ_U8 bS2RETE);//S2 register rising edge trigger event
	ZZ_U8  GetS2RETE();

	//(ZeroMode 0:off 1:once 2:once + safe position 3:twice 4:twice + safe position) (OpenVoltageLevel 0:Low Level 1:High Level)
	//(ZeroSensor 0:S1 1:S2 2:S3 3:S4 4:S5 5:S6)( ZeroVelocity ��-192000) ����192000��pulse)(SafePosition ��-2147483647) ����2147483647��)
	bool  SetZeroParams(ZZ_U8 bZeroMode, ZZ_U8 bSwitchOpenVL, ZZ_U8 bZeroSensor, float fZeroVelocity, int iSafePosition);
	ZZ_U8  GetZeroMode();
	ZZ_U8  GetSwitchOpenVoltageLevel();
	ZZ_U8  GetZeroSensor();
	int   GetSafePosition();
	float GetZeroVelocity();
	
private:
	bool  ParseReturnedString(std::string &strRecv,int iType);
	bool  ParseReturnedParam(std::string &strRecv);
	void  VSMD_BitShift(ZZ_U8* src, unValue* dst);
	char* VSMD_Split(char* cStr, char cSplit);
};

