#ifndef __NETWORC_H__
#define __NETWORC_H__

// 名前の生成規則をC言語形式に指定
#ifdef __cplusplus
extern "C"
{
#endif

////////////////////////////////////////////////////////////////////////////////
//
// ※ 変数名称について
//
//  Position:  P型の配列 Tx, Ty, Tz, Rx, Ry, Rz, Fig                    の７要素の配列を表す
//
//  Joint:     J型の配列 J1, J2, J3, J4, J5, J6, J7, J8                 の８要素の配列を表す
//
//  Trans:     T型の配列 Tx, Ty, Tz, Ox, Oy, Oz, Ax, Ay, Az             の９要素の配列を表す
//
//  Pos:       Tx, Ty, Tz, Rx, Ry, Rz                                   の Figを除いた６要素の配列を表す
//
//  Jnt:       J1, J2, J3, J4, J5, J6                                   の ６要素の配列を表す
//
//  Area:      Tx, Ty, Tz, Rx, Ry, Rz, Dx, Dy, Dz, IO, Pos, Err, Enable の １３要素の配列を表す
//
////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////
// ▼ タスク開始/終了のモード設定値
enum {
	START_ON_CYCLE = 1,	// サイクル実行
	START_CYCLE,		// 連続実行
	START_STEP,			// ステップ実行
	START_RESUME = 5	// コンティ起動
};

enum {
	STOP_DEFAULT = 0,	// デフォルト停止
	STOP_INSTANT,		// 瞬時停止
	STOP_STEP,			// ステップ停止
	STOP_CYCLE,			// サイクル停止
	STOP_INITIALIZE,	// 初期化停止
	STOP_RESUME			// コンティ停止
};

////////////////////////////////////////////////////////////////////////
// ▼ タスクの状態
enum {
	TASK_NON_EXISTENT = 0,
	TASK_DORMANT,
	TASK_READY,
	TASK_RUN,
	TASK_WAIT,
	TASK_SUSPEND = 6,
};

////////////////////////////////////////////////////////////////////////
// ▼ コントローラへ接続/切断
// コントローラへ接続
long WINAPI nrc_Connect(char *pConnection, long lTimeout, char *pOption);
// コントローラの切断
long WINAPI nrc_Disconnect(void);

////////////////////////////////////////////////////////////////////////
// ▼ コントローラ実行
long WINAPI nrc_ControllerExecute(char* pCommand, VARIANT vntParam, VARIANT* pVal);

////////////////////////////////////////////////////////////////////////
// ▼ コントローラの状態
// ROMバージョンの取得
long WINAPI nrc_get_RomVersion(char *szVersion, long sizeBuf);
// シリアル番号の取得
long WINAPI nrc_get_SerialNo(char *szSirialNo, long sizeBuf);
// ロボットタイプの取得
long WINAPI nrc_get_RobotType(char *szRobotType, long sizeBuf);
// モードの取得 @MODEを使用
long WINAPI nrc_get_OperationMode(long *lMode);
// 自動イネーブルの状態を取得
long WINAPI nrc_get_AutoEnable(long *lAutoEnable);
// 保護停止の状態を取得
long WINAPI nrc_get_ProtectiveStop(long *lProtectiveStop);
// デッドマンスイッチの状態を取得
long WINAPI nrc_get_DeadmanSwitch(long *lDeadman);
// 非常停止スイッチの状態を取得
long WINAPI nrc_get_EmergencyStop(long *lEmergency);

// 内部/外部自動モードの設定
long WINAPI nrc_put_AutoMode(long lAutoMode);
// 内部/外部自動モードの取得
long WINAPI nrc_get_AutoMode(long *lAutoMode);
// モータのON/OFFの設定
long WINAPI nrc_put_MotorState(long lState);
// モータの状態の取得
long WINAPI nrc_get_MotorState(long *lState);

////////////////////////////////////////////////////////////////////////
// ▼ CNFの取得/設定
// 指定したCNFの取得
long WINAPI nrc_get_CnfData(char *pCnfName, long lParamNo, long *lParamValue);
// 指定したCNFの設定
long WINAPI nrc_put_CnfData(char *pCnfName, long lParamNo, long lParamValue);

// Calデータの取得
long WINAPI nrc_get_CalData(float *fJnt);
// Calデータの設定
long WINAPI nrc_put_CalData(float *fJnt);
// Linkパラメータの取得
long WINAPI nrc_get_LinkParam(float *fLinkSJnt, float *fLinkAJnt);
// Linkパラメータの設定
long WINAPI nrc_put_LinkParam(float *fLinkSJnt, float *fLinkAJnt);
// CalデータおよびLinkパラメータの補正
long WINAPI nrc_Calibrate(float *fRotDiff, float *fLenDiff);

////////////////////////////////////////////////////////////////////////
// ▼ エラーの取得/クリア
// エラー番号の取得
long WINAPI nrc_get_ErrorCode(long *lErrorCode);
// エラーの説明を取得
long WINAPI nrc_get_ErrorDescription(char *szError, long sizeBuf);
// エラーをクリア
long WINAPI nrc_ClearError(long lErrorCode);

////////////////////////////////////////////////////////////////////////
// ▼ 速度の取得/設定
// 内部速度の取得
long WINAPI nrc_get_Speed(float *fSpeed);
// 外部速度の取得
long WINAPI nrc_get_ExtSpeed(float *fExtSpeed);
// 内部速度の設定
long WINAPI nrc_put_Speed(float fSpeed);
// 外部速度の設定
long WINAPI nrc_put_ExtSpeed(float fExtSpeed);

////////////////////////////////////////////////////////////////////////
// ▼ ロボット実行
long WINAPI nrc_RobotExecute(char *pCommand, VARIANT vntParam, VARIANT* pVal);

////////////////////////////////////////////////////////////////////////
// ▼ ロボットの動作
// 現在位置の取得 P型指定
long WINAPI nrc_get_CurrentP(float *fPosition);
// 現在位置の取得 J型指定
long WINAPI nrc_get_CurrentJ(float *fJnt);
// 現在位置の取得 T型指定
long WINAPI nrc_get_CurrentT(float *fTrans);
// ロボットの移動 P型指定
long WINAPI nrc_MoveP(long lComp, char *pPath, float *fPosition, char *pOption);
// ロボットの移動 J型指定
long WINAPI nrc_MoveJ(long lComp, char *pPath, float *fJnt, char *pOption);
// ロボットの移動 T型指定
long WINAPI nrc_MoveT(long lComp, char *pPath, float *fTrans, char *pOption);
// ツール座標系指定の絶対動作 P型指定
long WINAPI nrc_ApproachP(long lComp, float *fPosition, char *pPath, float fApproachlen, char *pOption);
// ツール座標系指定の絶対動作 J型指定
long WINAPI nrc_ApproachJ(long lComp, float *fJnt, char *pPath, float fApproachlen, char *pOption);
// ツール座標系指定の絶対動作 T型指定
long WINAPI nrc_ApproachT(long lComp, float *fTrans, char *pPath, float fApproachlen, char *pOption);
// ツール座標系指定で相対動作
long WINAPI nrc_Depart(long lComp, char *pPath, float fDepartlen, char *pOption);
// 各軸の絶対動作
long WINAPI nrc_DriveA(char *pPath, float *fJnt, char *pOption);
// 各軸の相対動作
long WINAPI nrc_Drive(char *pPath, float *fJnt, char *pOption);
// ロボットの動作状態を取得
long WINAPI nrc_get_MotionState(long *lState);

////////////////////////////////////////////////////////////////////////
// ▼ ツール/ワーク/エリア取得/設定
// 現在のツール番号の取得
long WINAPI nrc_get_CurTool(long *lTool);
// 現在のワーク番号の取得
long WINAPI nrc_get_CurWork(long *lWork);
// 使用するツール番号の設定
long WINAPI nrc_put_CurTool(long lTool);
// 使用するワーク番号の設定
long WINAPI nrc_put_CurWork(long lWork);

// ツール定義の取得
long WINAPI nrc_get_ToolDef(long lTool, float *fPos);
// ワーク定義の取得
long WINAPI nrc_get_WorkDef(long lWork, float *fPos);
// エリア定義の取得
long WINAPI nrc_get_AreaDef(long lWork, float *fArea);
// ツール定義の設定
long WINAPI nrc_put_ToolDef(long lTool, float *fPos);
// ワーク定義の設定
long WINAPI nrc_put_WorkDef(long lWork, float *fPos);
// エリア定義の設定
long WINAPI nrc_put_AreaDef(long lArea, float *fArea);

////////////////////////////////////////////////////////////////////////
// ▼ 変数への取得/設定
// I型変数の取得
long WINAPI nrc_get_VarI(long lNo, long *lValue);
// F型変数の取得
long WINAPI nrc_get_VarF(long lNo, float *fValue);
// D型変数の取得
long WINAPI nrc_get_VarD(long lNo, double *dValue);
// S型変数の取得
long WINAPI nrc_get_VarS(long lNo, char *szString, long sizeBuf);
// V型変数の取得
long WINAPI nrc_get_VarV(long lNo, float *fVec);
// P型変数の取得
long WINAPI nrc_get_VarP(long lNo, float *fPosition);
// J型変数の取得
long WINAPI nrc_get_VarJ(long lNo, float *fJnt);
// T型変数の取得
long WINAPI nrc_get_VarT(long lNo, float *fTrans);
// IO変数の取得
long WINAPI nrc_get_VarIO(long lNo, long *lValue);
// I型変数の設定
long WINAPI nrc_put_VarI(long lNo, long lValue);
// F型変数の設定
long WINAPI nrc_put_VarF(long lNo, float fValue);
// D型変数の設定
long WINAPI nrc_put_VarD(long lNo, double dValue);
// S型変数の設定
long WINAPI nrc_put_VarS(long lNo, char *szString);
// V型変数の設定
long WINAPI nrc_put_VarV(long lNo, float *fVec);
// P型変数の設定
long WINAPI nrc_put_VarP(long lNo, float *fPosition);
// J型変数の設定
long WINAPI nrc_put_VarJ(long lNo, float *fJnt);
// T型変数の設定
long WINAPI nrc_put_VarT(long lNo, float *fTrans);
// IO変数の設定
long WINAPI nrc_put_VarIO(long lNo, long lValue);

////////////////////////////////////////////////////////////////////////
// ▼ 計算関数
// DEVの計算
long WINAPI nrc_Dev(float *fPos1, float *fPos2, float *fPosition);
// DEVHの計算
long WINAPI nrc_DevH(float *fPos1, float *fPos2, float *fPosition);

// J型からP型へ変換
long WINAPI nrc_J2P(float *fJoint, float *fPosition);
// J型からT型へ変換
long WINAPI nrc_J2T(float *fJoint, float *fTrans);
// P型からJ型へ変換
long WINAPI nrc_P2J(float *fPosition, float *fJoint);
// P型からT型へ変換
long WINAPI nrc_P2T(float *fPosition, float *fTrans);
// T型からP型へ変換
long WINAPI nrc_T2P(float *fTrans, float *fPosition);
// T型からJ型へ変換
long WINAPI nrc_T2J(float *fTrans, float *fJoint);
// PTP動作時の最大内部速度に対する割合の取得
long WINAPI nrc_RPM(long lAxis, float fRevolution, float *fRate);
// CP動作時の最大内部速度に対する割合の取得
long WINAPI nrc_MPS(float fSpeed, float *fRate);

////////////////////////////////////////////////////////////////////////
// ▼ タスク
// タスクの開始
long WINAPI nrc_StartTask(char *szTaskName, long lMode, char *szOption);
// タスクの終了
long WINAPI nrc_StopTask(char *szTaskName, long lMode, char *szOption);
// タスクの状態を取得
long WINAPI nrc_get_TaskState(char* szTaskName, long *lTask);
// RoboSlaveの開始
long WINAPI nrc_StartRobSlave(void);
// RoboSlaveの終了
long WINAPI nrc_StopRobSlave(void);
// RoboSlaveの状態を取得
long WINAPI nrc_get_RobSlaveState(long *lState);

#ifdef __cplusplus
}
#endif
#endif // defined __NETWORC_H__