
// Cmc_TestAppDlg.cpp : 구현 파일
//

#include "stdafx.h"
#include "Cmc_TestApp.h"
#include "Cmc_TestAppDlg.h"
#include "afxdialogex.h"

#include "ComiEcatSdk_Api.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 대화 상자 데이터입니다.
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

// 구현입니다.
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CCmc_TestAppDlg 대화 상자




CCmc_TestAppDlg::CCmc_TestAppDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCmc_TestAppDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_nWorkSpeed = 0;
	m_nAcceleration = 0;
	m_nDeceleration = 0;
	m_nTargetPosition = 0;
	m_nTargetVelocity = 0;
	m_nHomeWorkSpd = 0;
	m_nHomeStopSpd = 0;
	m_nHomeAcc = 0;
}

void CCmc_TestAppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT_WORK, m_nWorkSpeed);
	DDX_Text(pDX, IDC_EDIT_ACC, m_nAcceleration);
	DDX_Text(pDX, IDC_EDIT_DEC, m_nDeceleration);
	DDX_Text(pDX, IDC_EDIT_DISTANCE, m_nTargetPosition);
	DDX_Text(pDX, IDC_EDIT_VELOCITY, m_nTargetVelocity);
	DDX_Text(pDX, IDC_EDIT_HOMEWORK, m_nHomeWorkSpd);
	DDX_Text(pDX, IDC_EDIT_HOMESTOP, m_nHomeStopSpd);
	DDX_Text(pDX, IDC_EDIT_HOMEACC, m_nHomeAcc);
}

BEGIN_MESSAGE_MAP(CCmc_TestAppDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_CHECK_SVON, &CCmc_TestAppDlg::OnClick_CheckSvon)
	ON_BN_CLICKED(IDC_BTN_READCFG, &CCmc_TestAppDlg::OnClick_BtnReadcfg)
	ON_BN_CLICKED(IDC_BTN_WRITECFG, &CCmc_TestAppDlg::OnClick_BtnWritecfg)
	ON_BN_CLICKED(IDC_BTN_STOP, &CCmc_TestAppDlg::OnClick_BtnStop)
	ON_BN_CLICKED(IDC_BTN_RELMOVE, &CCmc_TestAppDlg::OnClick_BtnRelmove)
	ON_BN_CLICKED(IDC_BTN_ABSMOVE, &CCmc_TestAppDlg::OnClick_BtnAbsmove)
	ON_BN_CLICKED(IDC_BTN_VELMOVE, &CCmc_TestAppDlg::OnClick_BtnVelmove)
	ON_BN_CLICKED(IDC_BTN_ESTOP, &CCmc_TestAppDlg::OnClick_BtnEstop)
	ON_BN_CLICKED(IDC_BTN_HMOVE, &CCmc_TestAppDlg::OnClick_BtnHmove)
	ON_CBN_SELENDOK(IDC_CMB_HMETHOD, &CCmc_TestAppDlg::OnCbnSelendokCmbHmethod)
	ON_BN_CLICKED(IDC_BTN_READHOMECFG, &CCmc_TestAppDlg::OnClick_BtnReadhomecfg)
	ON_BN_CLICKED(IDC_BTN_WRITEHOMECFG, &CCmc_TestAppDlg::OnClick_BtnWritehomecfg)
	ON_CBN_SELENDOK(IDC_CMB_AXIS, &CCmc_TestAppDlg::OnCbnSelendokCmbAxis)
END_MESSAGE_MAP()


// CCmc_TestAppDlg 메시지 처리기

BOOL CCmc_TestAppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	CComboBox *pAxisSelCombo = (CComboBox *)GetDlgItem(IDC_CMB_AXIS);
	UpdateAxsiListComboBox(pAxisSelCombo); // 축선택 콤보박스에 축리스트 업데이트하기

	//SetTimer(0, 100, NULL);

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

void CCmc_TestAppDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.

void CCmc_TestAppDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 아이콘을 그립니다.
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
HCURSOR CCmc_TestAppDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CCmc_TestAppDlg::UpdateAxsiListComboBox(CComboBox *pComboBox)
{
	t_ui8 AxisList[64];
	t_i32 nErrCode;
	CString sOrgDispText, s;
	t_i32 nCurDispAxisIdx, nCurDispAxisComboIdx;
	t_bool bIsCurDispAxisValid = false;

	// 1) 현재 마스터 장치에 연결되어 있는 모션축 리스트를 얻어온다 //
	int NumAxes = ecmGn_GetAxisList(NETID, AxisList, 64, &nErrCode);
	nCmcAxes = ComiCMC.GetNumAxis();
	nTotalAxes = NumAxes + nCmcAxes;

	// 2) 현재 디스플레이 상에서 선택되어진 축번호를 저장 => 이후에 축리스트를 갱신하고 나서 이전에 선택되었던 축 번호는 그대로 유지되도록 하기 위한 작업 //
	pComboBox->GetWindowText(sOrgDispText);
	pComboBox->ResetContent();
	nCurDispAxisIdx = _ttoi(sOrgDispText); // 현재 디스플레이상에서 선택되어진 축 번호 저장 

	// 3) 콤보박스에 축 리스트 갱신 //
	for(int i=0; i<NumAxes; i++) {
		s.Format(_T("%02d"), AxisList[i]);
		pComboBox->AddString(s);
		if(nCurDispAxisIdx == AxisList[i]){ // 3.1) 이전에 선택된 축이 축리스트에 포함되어 있으면 해당 축이 콤보박스의 값 중에서 선택된 값으로 반영되도록...
			bIsCurDispAxisValid = true;
			nCurDispAxisComboIdx = i;
		}
	}
	for(int i=NumAxes; i<nTotalAxes; i++) {
		s.Format(_T("%02d"), i+1);
		pComboBox->AddString(s);
		if(nCurDispAxisIdx == i+1){ // 3.1) 이전에 선택된 축이 축리스트에 포함되어 있으면 해당 축이 콤보박스의 값 중에서 선택된 값으로 반영되도록...
			bIsCurDispAxisValid = true;
			nCurDispAxisComboIdx = i;
		}
	}

	// 4) 콤보박스에 현재 선택된 값을 표시하기 //

	// 4.1) 이전에 선택되었던 축이 축리스트에 있으면 그 축번호를 콤보박스의 선택값으로 적용한다. //
	if(bIsCurDispAxisValid){ 
		pComboBox->SetCurSel(nCurDispAxisComboIdx);
	}
	// 4.2) 이전에 선택되었던 축이 현재는 축리스트에 없다면... //
	else if(nTotalAxes < 1){ // 4.2.1) 연결된 축이 하나도 없으면 그냥 콤보박스의 텍스트를 유지한다. 
		pComboBox->SetWindowText(sOrgDispText);
	}else{ // 4.2.2) 연결된 축이 하나라도 있으면 첫번째 축을 콤보박스의 텍스트로 적용한다. 
		pComboBox->SetCurSel(0);
	}
}

void CCmc_TestAppDlg::OnTimer(UINT_PTR nIDEvent)
{
	CString sTemp;
	CString ErrString;
	int nTemp;
	int Axis = GetAxisSel();
	int ErrCode = 0;


	// 1) 축의 연결 상태 및 AL-STATE 체크 및 표시 //
	int SlaveIdx;
	if(Axis > (nTotalAxes - nCmcAxes))						// 선택된 축이 CMC 보드의 축인 경우
		SlaveIdx = ComiCMC.GetSlaveIndex();
	else											// 일반 서보의 축인 경우
		SlaveIdx = ecmGn_AxisToSlaveIndex(NETID, Axis, NULL); // 축번호를 슬레이브 순서로 변환 

	if(SlaveIdx >= 0){
		TCHAR szTemp[50];
		EEcAlState SlvAlState = ecSlv_GetAlState_A(NETID, SlaveIdx, NULL); // AL STATE 읽기 
		GetAlStateText(SlvAlState, szTemp, 50);
		GetDlgItem(IDC_EDIT_ALSTATE)->SetWindowText(szTemp);
	}else{
		GetDlgItem(IDC_EDIT_ALSTATE)->SetWindowText(_T("Invalid Axis"));
	}
	
	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);

		// 3) Status Word (Motion Flags) //
		TSxSt_Flags MotFlag;
		if(!ComiCMC.StGetMotFlag(Axis, &MotFlag.word, &ErrCode)) {
			ErrString.Format("StGetMotFlag function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		sTemp.Format("0x%04X", MotFlag.word);
		GetDlgItem(IDC_EDIT_MOTFLAG)->SetWindowTextA(sTemp); // 화면에 Status Word (Flags) 표시 //
		CheckDlgButton(IDC_CHECK_SVON, MotFlag.bit.OperEnabled); // Servo-ON 상태 Display (체크박스에 표시)


		// 4) Command Position //
		if(!ComiCMC.StGetPosition(Axis, CNT_COMM, &nTemp, &ErrCode)) {
			ErrString.Format("StGetPosition function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		sTemp.Format("%d", nTemp);
		GetDlgItem(IDC_EDIT_CMDPOS)->SetWindowTextA(sTemp);

		// 5) Feedback Position
		if(!ComiCMC.StGetPosition(Axis, CNT_FEED, &nTemp, &ErrCode)) {
			ErrString.Format("StGetPosition function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		sTemp.Format("%d", nTemp);
		GetDlgItem(IDC_EDIT_FEEDPOS)->SetWindowTextA(sTemp);

		// 6) Command Velocity //
		if(!ComiCMC.StGetCurSpeed(Axis, CNT_COMM, &nTemp, &ErrCode)) {
			ErrString.Format("StGetCurSpeed function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		sTemp.Format("%d", nTemp);
		GetDlgItem(IDC_EDIT_CMDVEL)->SetWindowTextA(sTemp);

		// 7) Feedback Velocity //
		if(!ComiCMC.StGetCurSpeed(Axis, CNT_FEED, &nTemp, &ErrCode)) {
			ErrString.Format("StGetCurSpeed function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		sTemp.Format("%d", nTemp);
		GetDlgItem(IDC_EDIT_FEEDVEL)->SetWindowTextA(sTemp);
		
	}
	
	

	CDialogEx::OnTimer(nIDEvent);
}

int CCmc_TestAppDlg::GetAxisSel()
{
	TCHAR szTemp[128];
	BOOL IsSuccess=false;
	//GetDlgItem(IDC_CMB_AXIS)->GetWindowText(szTemp, 128);
	int nIndex = ((CComboBox*)GetDlgItem(IDC_CMB_AXIS))->GetCurSel();
	((CComboBox*)GetDlgItem(IDC_CMB_AXIS))->GetLBText(nIndex, szTemp);
	
	return _ttoi(szTemp);
}

void CCmc_TestAppDlg::GetAlStateText(int nAlState, TCHAR szBuf[], int nBufLen)
{
	TCHAR szTemp[50];
	t_byte PureAlState = nAlState & 0xf;
	t_bool IsAlStateError = (nAlState>>4) & 0x1;
	if(PureAlState == 0) _tcscpy(szTemp, _T("Disconnected"));
	else if(PureAlState == 1) _tcscpy(szTemp, _T("Initial"));
	else if(PureAlState == 2) _tcscpy(szTemp, _T("PreOP"));
	else if(PureAlState == 3) _tcscpy(szTemp, _T("Bootstrap"));
	else if(PureAlState == 4) _tcscpy(szTemp, _T("SafeOP"));
	else if(PureAlState == 8) _tcscpy(szTemp, _T("OP"));
	else _tcscpy(szTemp, _T("Unknown State"));

	if(IsAlStateError){
		_tcscat(szTemp, _T("(Error)")); 
	}

	if(nBufLen < _tcslen(szTemp)){
		memcpy(szBuf, szTemp, sizeof(TCHAR)*(nBufLen-1));
		szBuf[nBufLen-1] = _T('\0');
	}else{
		_tcscpy(szBuf, szTemp);
	}
}

void CCmc_TestAppDlg::OnClick_CheckSvon()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	KillTimer(0); // Svon 상태를 타이머 핸들러에서 주기적으로 읽어서 화면을 갱신하므로 여기에서 셋팅하는 것과 충돌될 수 있으므로 타이머루틴을 일시적으로 정지시킨다.

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우

		if(IsDlgButtonChecked(IDC_CHECK_SVON)){ // CMC 서보온
			if(!ComiCMC.SetSvon(Axis-(nTotalAxes-6), TRUE, &ErrCode)) {
				ErrString.Format("SERVO-ON Fail! err_code = %d", ErrCode);
				AfxMessageBox(ErrString);
			}
		}
		else { // CMC 서보오프
			if(!ComiCMC.SetSvon(Axis-(nTotalAxes-6), FALSE, &ErrCode)) {
				ErrString.Format("SERVO-OFF Fail! err_code = %d", ErrCode);
				AfxMessageBox(ErrString);
			}
		}
	}
	else {		// 일반 서보의 축인 경우
		if(IsDlgButtonChecked(IDC_CHECK_SVON)){ // 서보온
			if(!ecmSxCtl_SetSvon(NETID, Axis, true, &ErrCode)){
				ecUtl_ShowError_A (GetSafeHwnd(), "SERVO-ON Fail! err_code = %d", ErrCode);
			}
		}else{ // 서보오프
			if(!ecmSxCtl_SetSvon(NETID, Axis, false, &ErrCode)){
				ecUtl_ShowError_A (GetSafeHwnd(), "SERVO-OFF Fail! err_code = %d", ErrCode);
			}
		}
	}

	SetTimer(0, 100, NULL);
}


void CCmc_TestAppDlg::OnClick_BtnReadcfg()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.GetSpeedEnv(Axis, &m_nWorkSpeed, &m_nAcceleration, &m_nDeceleration, &ErrCode)) {
			ErrString.Format("GetSpeedEnv function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		if(!ComiCMC.GetTargetVelocity(Axis, &m_nTargetVelocity, &ErrCode)) {
			ErrString.Format("GetTargetVelocity function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}

	UpdateData(false);
}


void CCmc_TestAppDlg::OnClick_BtnWritecfg()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	UpdateData();

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.SetSpeedEnv(Axis, m_nWorkSpeed, m_nAcceleration, m_nDeceleration, &ErrCode)) {
			ErrString.Format("SetSpeedEnv function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
		if(!ComiCMC.SetTargetVelocity(Axis, m_nTargetVelocity, &ErrCode)) {
			ErrString.Format("SetTargetVelocity function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnClick_BtnRelmove()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	UpdateData();

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.MoveStart(Axis, m_nTargetPosition, &ErrCode)) {
			ErrString.Format("MoveStart function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}

	}
}


void CCmc_TestAppDlg::OnClick_BtnAbsmove()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	UpdateData();

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.MoveToStart(Axis, m_nTargetPosition, &ErrCode)) {
			ErrString.Format("MoveToStart function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnClick_BtnVelmove()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.VMoveStart(Axis, &ErrCode)) {
			ErrString.Format("VMoveStart function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnClick_BtnStop()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.Stop(Axis, &ErrCode)) {
			ErrString.Format("Stop function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnClick_BtnEstop()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.EmgStop(Axis, &ErrCode)) {
			ErrString.Format("EmgStop function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
	
}


void CCmc_TestAppDlg::OnClick_BtnHmove()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.HomeMoveStart(Axis, &ErrCode)) {
			ErrString.Format("HomeMoveStart function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnCbnSelendokCmbHmethod()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	TCHAR szTemp[128];
	int nIndex = ((CComboBox*)GetDlgItem(IDC_CMB_HMETHOD))->GetCurSel();
	((CComboBox*)GetDlgItem(IDC_CMB_HMETHOD))->GetLBText(nIndex, szTemp);
	nHomeMethod = _ttoi(szTemp);

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.SetHomeMode(Axis, nHomeMethod, &ErrCode)) {
			ErrString.Format("SetHomeMode function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnClick_BtnReadhomecfg()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.GetHomeSpeedEnv(Axis, &m_nHomeWorkSpd, &m_nHomeStopSpd, &m_nHomeAcc, &ErrCode)) {
			ErrString.Format("GetHomeSpeedEnv function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}

	UpdateData(false);
}


void CCmc_TestAppDlg::OnClick_BtnWritehomecfg()
{
	int Axis = GetAxisSel();
	int ErrCode = 0;
	CString ErrString;

	UpdateData();

	if(Axis > (nTotalAxes - nCmcAxes)) {			// 선택된 축이 CMC 보드의 축인 경우
		Axis = Axis - (nTotalAxes - nCmcAxes);
		if(!ComiCMC.SetHomeSpeedEnv(Axis, m_nHomeWorkSpd, m_nHomeStopSpd, m_nHomeAcc, &ErrCode)) {
			ErrString.Format("SetSpeedEnv function fail!, ec = %d", ErrCode);
			AfxMessageBox(ErrString);
		}
	}
}


void CCmc_TestAppDlg::OnCbnSelendokCmbAxis()
{
	OnClick_BtnReadcfg();
	OnClick_BtnReadhomecfg();
}
