
#include "RESOURCE.H"


// Function Code

#define  OPEN_PORT                1000
#define  IS_SLOCK                 1001
#define  GET_VERSION              1002
#define  GET_ID_NUM               1003
#define  GET_CODE_NUM             1004
#define  READ_WORD                1005
#define  WRITE_WORD               1006


// Status Code

#define  SLOCK_OK                 0
#define  SLOCK_NOT_OK             1

#define  Max_Memory               119


#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllimport) int CALLBACK sLock(UINT FuncCode, UINT Pass1, UINT Pass2, UINT InPut1, UINT InPut2, UINT *Retrun1, UINT *Return2);

#ifdef __cplusplus
};
#endif


LRESULT CALLBACK sLock_Test(HWND, UINT, WPARAM, LPARAM);

void    Check_Multi_Port(HWND);

UINT    Current_PassWord1 = 12345, Current_PassWord2 = 3333;
UINT    Old_PassWord1 = 0, Old_PassWord2 = 0;

unsigned char Temp[] = "                                                   ";


LRESULT CALLBACK sLock_Test(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  
    int Status_Value;
    unsigned int Return_Value1, Return_Value2;
	    
		
    switch (Msg) {
		   
           case WM_INITDIALOG :

                SetDlgItemInt(hDlg, IDC_Pass1_Box, 12345, 0);
                SetDlgItemInt(hDlg, IDC_Pass2_Box, 3333, 0);
						
                SetDlgItemInt(hDlg, IDC_InPut1_Box, 0, 0);
                SetDlgItemInt(hDlg, IDC_InPut2_Box, 0, 0);
               
                SetDlgItemInt(hDlg, IDC_Address_Box, 0, 0);
                SetDlgItemInt(hDlg, IDC_Data_Box, 0, 0);                		
		

                // OPEN_PORT [ 1000 ] - SLock II 최초 실행시 사용하는 명령으로
                //                      현재 SLock II 가 연결된 프린터 포트 [ LPT1, LPT2, ... ] 를 자동으로 감지하며,
                //                      아래 함수들이 사용할 포트를 지정하는 작업.

                // sLock(OPEN_PORT, 0, 0, 0, Port_Num, &Return_Value1, 0)
                // Port_Num - 0 : 자동 검색, 1 : LPT1, 2 : LPT2, ...

                Status_Value = sLock(OPEN_PORT, 0, 0, 0, 0, &Return_Value1, 0);


                Check_Multi_Port(hDlg);
			
                // IS_SLOCK [ 1001 ] - 현재 시스템의 지정된 프린터 포트 [ OPEN_PORT 작업 실행 후 설정 값 ] 상에
                //                     SLock II 가 정상적으로 연결되었는가를 확인하는 작업

                // sLock(IS_LOCK, 0, 0, 0, 0, &Return_Value1, 0)

                Status_Value = sLock(IS_SLOCK, 0, 0, 0, 0, &Return_Value1, 0);

				
                SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);

                if (Status_Value == SLOCK_OK) {

                   SetDlgItemText(hDlg, IDC_Status_Box, " SLock II 가 정상적으로 연결되었습니다.");
                   SetDlgItemText(hDlg, IDC_Error_Box, "");
                }
                else {

                     SetDlgItemText(hDlg, IDC_Status_Box, "오류 발생 !! ");
                     SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                }

                break;


           case WM_COMMAND :


                switch (LOWORD (wParam)) {
 				       

                       case ID_Exit :

                            EndDialog(hDlg, IDOK);
                            
                            break;
                       

                       // GET_ID_NUM [ 1003 ] - 현재 설치된 SLock II 의 고유 번호을 점검하는 작업

                       case IDC_ID_Num_Test :

                            SetDlgItemText(hDlg, IDC_Status_Box, Temp);
                            SetDlgItemText(hDlg, IDC_Error_Box, "");

                            SetDlgItemInt(hDlg, IDC_ID_Num1_Box, 0, 0);
                            SetDlgItemInt(hDlg, IDC_ID_Num2_Box, 0, 0);


                            // sLock(GET_ID_NUM, Pass1, Pass2, 0, 0, ID_Num1, ID_Num2)

                            Status_Value = sLock(GET_ID_NUM,
                                                GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0),
                                                0, 0,
                                                &Return_Value1, &Return_Value2);


                            if (Status_Value == SLOCK_OK) {
							 						
                               SetDlgItemInt(hDlg, IDC_ID_Num1_Box, Return_Value1, 0);
                               SetDlgItemInt(hDlg, IDC_ID_Num2_Box, Return_Value2, 0);
                            }
                            else {

                                 SetDlgItemText(hDlg, IDC_Status_Box, " 오류 발생 !! ");
                                 SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                            }
								 
                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);
							
                            break;



                       // GET_VERSION [ 1002 ] - 현재 설치된 SLock II 의 제품 버젼을 점검하는 작업

                       case IDC_Version_Test :

                            SetDlgItemText(hDlg, IDC_Status_Box, Temp);
                            SetDlgItemText(hDlg, IDC_Error_Box, "");

                            SetDlgItemInt(hDlg, IDC_Version1_Box, 0, 0);
                            SetDlgItemInt(hDlg, IDC_Version2_Box, 0, 0);

                            // sLock(GET_VERSION, Pass1, Pass2, 0, 0, Version1, Version2)

                            Status_Value = sLock(GET_VERSION,
                                                GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0),
                                                0, 0,
                                                &Return_Value1, &Return_Value2);


                            if (Status_Value == SLOCK_OK) {
							
                               SetDlgItemInt(hDlg, IDC_Version1_Box, Return_Value1, 0);
                               SetDlgItemInt(hDlg, IDC_Version2_Box, Return_Value2, 0);

                            }
                            else {

                                 SetDlgItemText(hDlg, IDC_Status_Box, " 오류 발생 !! ");
                                 SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                            }
								 
                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);

                            break;



                       // GET_CODE_NUM [ 1004 ] - 현재 설치된 SLock II 의 반환 값을 점검하는 작업

                       case IDC_Code_Num_Test :

                            SetDlgItemText(hDlg, IDC_Status_Box, Temp);
                            SetDlgItemText(hDlg, IDC_Error_Box, "");

                            SetDlgItemInt(hDlg, IDC_Code_Num1_Box, 0, 0);
                            SetDlgItemInt(hDlg, IDC_Code_Num2_Box, 0, 0);

                            if (GetDlgItemInt(hDlg, IDC_InPut1_Box, NULL, 0) <= 0
                                || GetDlgItemInt(hDlg, IDC_InPut1_Box, NULL, 0) > 65535)
                               
                               SetDlgItemInt(hDlg, IDC_InPut1_Box, 0, 0);

                            if (GetDlgItemInt(hDlg, IDC_InPut2_Box, NULL, 0) <= 0
                                || GetDlgItemInt(hDlg, IDC_InPut2_Box, NULL, 0) > 65535)

                               SetDlgItemInt(hDlg, IDC_InPut2_Box, 0, 0);


                            SetDlgItemInt(hDlg, IDC_InPut1_Box, GetDlgItemInt(hDlg, IDC_InPut1_Box, NULL, 0), 0);
                            SetDlgItemInt(hDlg, IDC_InPut2_Box, GetDlgItemInt(hDlg, IDC_InPut2_Box, NULL, 0), 0);

                  
                            // sLock(GET_CODE_NUM, Pass1, Pass2, InPut1_Num, InPut2_Num, Code_Num1, Code_Num2)

                            Status_Value = sLock(GET_CODE_NUM,
                                                GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_InPut1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_InPut2_Box, NULL, 0),
                                                &Return_Value1, &Return_Value2);

						   
                            if (Status_Value == SLOCK_OK) {
							
                               SetDlgItemInt(hDlg, IDC_Code_Num1_Box, Return_Value1, 0);
                               SetDlgItemInt(hDlg, IDC_Code_Num2_Box, Return_Value2, 0);
                            }
                            else {

                                 SetDlgItemText(hDlg, IDC_Status_Box, " 오류 발생 !! ");
                                 SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                            }
								 
                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);

                            break;



                       // READ_WORD [ 1005 ] - 현재 설치된 SLock II 의 메모리 번지 내 데이터를 점검하는 작업

                       case IDC_Read_Test :

                            SetDlgItemText(hDlg, IDC_Status_Box, Temp);
                            SetDlgItemText(hDlg, IDC_Error_Box, "");

                            SetDlgItemInt(hDlg, IDC_Data_Box, 0, 0);


                            if (GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0) <= 0
                                || GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0) > 65535)

                               SetDlgItemInt(hDlg, IDC_Address_Box, 0, 0);

                            SetDlgItemInt(hDlg, IDC_Address_Box, GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0), 0);
						

                            // sLock(READ_WORD, Pass1, Pass2, Address, 0, Return_Word, 0)

                            Status_Value = sLock(READ_WORD,
                                                GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0),
                                                0,
                                                &Return_Value1, 0);

                            if (Status_Value == SLOCK_OK) {
							
                               SetDlgItemInt(hDlg, IDC_Data_Box, Return_Value1, 0);
                            }
                            else {

                                 SetDlgItemText(hDlg, IDC_Status_Box, " 오류 발생 !! ");
                                 SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                            }
								 
                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);

                            break;



                       // WRITE_WORD [ 1006 ] - 현재 설치된 SLock II 의 메모리 번지 내 데이터를 변경하는 작업

                       case IDC_Write_Test :

                            SetDlgItemText(hDlg, IDC_Status_Box, Temp);

                            if (GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0) <= 0
                                || GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0) > 65535)

                               SetDlgItemInt(hDlg, IDC_Address_Box, 0, 0);

                            if (GetDlgItemInt(hDlg, IDC_Data_Box, NULL, 0) <= 0
                                || GetDlgItemInt(hDlg, IDC_Data_Box, NULL, 0) > 65535)

                               SetDlgItemInt(hDlg, IDC_Data_Box, 0, 0);

                            SetDlgItemInt(hDlg, IDC_Address_Box, GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0), 0);


                            // sLock(WRITE_WORD, Pass1, Pass2, Address, InPut_Data, Error_Code, 0)

                            Status_Value = sLock(WRITE_WORD,
                                                GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Address_Box, NULL, 0),
                                                GetDlgItemInt(hDlg, IDC_Data_Box, NULL, 0),
                                                &Return_Value1, 0);
						   

                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);

                            if (Status_Value == SLOCK_OK)
							
                               SetDlgItemText(hDlg, IDC_Status_Box, " 지정 번지값의 데이타를 정상적으로 변경하였습니다. !! ");
                            
                            else {

                                 SetDlgItemText(hDlg, IDC_Status_Box, " 오류 발생 !! ");
                                 SetDlgItemInt(hDlg, IDC_Error_Box, Return_Value1, 0);
                            }
							
                            SetDlgItemInt(hDlg, IDC_Status_Value_Box, Status_Value, 0);
						
                            SetDlgItemInt(hDlg, IDC_Data_Box, 0, 0);

                            break;
                     
                }



                // 한 시스템상에 2 개 이상의 SLock II 를 각각 서로 다른 프린트 포트상에 연결한 경우의 점검
				
                case EN_KILLFOCUS :
                     {
                        int HIGH, LOW;

                        HIGH = (int) HIWORD(wParam);
                        LOW  = (int) LOWORD(wParam);

	
                        if ((LOW == 1005 || LOW == 1006) && HIGH == 512) {

                           if (LOW == 1005) {

                              if (GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0) <= 0
                                 || GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0) > 65535)
                               
                                 SetDlgItemInt(hDlg, IDC_Pass1_Box, 0, 0);


                              Current_PassWord1 = GetDlgItemInt(hDlg, IDC_Pass1_Box, NULL, 0);
							
                              if (Current_PassWord1 != Old_PassWord1) Check_Multi_Port(hDlg);
                           }
                           else {

                                if (GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0) <= 0
                                   || GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0) > 65535)
                               
                                   SetDlgItemInt(hDlg, IDC_Pass2_Box, 0, 0);


                                Current_PassWord2 = GetDlgItemInt(hDlg, IDC_Pass2_Box, NULL, 0);

                                if (Current_PassWord2 != Old_PassWord2)  Check_Multi_Port(hDlg);
                           }
                        }
                     }
					
                     break;
			
           default : return FALSE;
    }


    return TRUE;
}




// 한 시스템상에 2 개 이상의 SLock II 를 각각 서로 다른 프린트 포트상에 연결한 경우의 점검

void Check_Multi_Port(HWND hDialog)
{
    int   LPT_Num = 1, Status_Value;
    UINT  Temp_Value, Return_Value;

    char  Check_LPT[10];


    SetDlgItemText(hDialog, IDC_Status_Box, Temp);
    SetDlgItemText(hDialog, IDC_Error_Box, "");

    do {

       Status_Value = sLock(OPEN_PORT, 0, 0, 0, LPT_Num++, &Temp_Value, NULL);

       Status_Value = sLock(GET_VERSION,
                            GetDlgItemInt(hDialog, IDC_Pass1_Box, NULL, 0),
                            GetDlgItemInt(hDialog, IDC_Pass2_Box, NULL, 0),
                            0, 0,
                            &Temp_Value, &Temp_Value);
	   
    } while (Status_Value == 1 && LPT_Num < 4);


    if (Status_Value) {

       LPT_Num = 1;

       do {
		  
          Status_Value = sLock(OPEN_PORT, 0, 0, 0, LPT_Num++, &Temp_Value, NULL);
       }  while (Status_Value == 1 && LPT_Num < 4);
    }

    Status_Value = sLock(GET_VERSION,
                         GetDlgItemInt(hDialog, IDC_Pass1_Box, NULL, 0),
                         GetDlgItemInt(hDialog, IDC_Pass2_Box, NULL, 0),
                         0, 0,
                         &Return_Value, &Temp_Value);

	
    SetDlgItemInt(hDialog, IDC_Status_Value_Box, Status_Value, 0);

    if (Status_Value == SLOCK_OK)

       SetDlgItemText(hDialog, IDC_Status_Box,  " SLock II 가 정상적으로 연결되었습니다.");

    else {

         SetDlgItemText(hDialog, IDC_Status_Box, " 오류 발생 !! ");
         SetDlgItemInt(hDialog, IDC_Error_Box, Return_Value, 0);
    }


    wsprintf(Check_LPT, " USB : %d", LPT_Num - 1);
    SetDlgItemText(hDialog, IDC_LPT_NUM, Check_LPT);

    SetDlgItemText(hDialog, IDC_Code_Num1_Box, "");
    SetDlgItemText(hDialog, IDC_Code_Num2_Box, "");

    SetDlgItemText(hDialog, IDC_ID_Num1_Box, "");
    SetDlgItemText(hDialog, IDC_ID_Num2_Box, "");
	
    SetDlgItemText(hDialog, IDC_Version1_Box, "");
    SetDlgItemText(hDialog, IDC_Version2_Box, "");

    Old_PassWord1 = Current_PassWord1;
    Old_PassWord2 = Current_PassWord2;

    return;
}

