
//[구동선택]{****
//[ ]맷돌가상구동
//[v]맷돌직접연결
//}************

//[설명]{-----------------------------------------------------------------
//
//맷돌(G.MTDL.X)에 내장된 [포트핀 이벤트(EXIT)] 실험.
//
//1) P0, P1 포트의 모든 핀에 스위치를 연결하고 이 스위치가 눌리면
//2) [상승/하강] 시에 해당 핀의 이벤트가 발생하고
//3) 각각 해당 이벤트 처리부에서 맷돌(G.MTDLX) 의 [통신포트:COM0] 로 대응 문자열 출력.
//4) [맷돌-통합개발환경] 에서 문자열 수신.
//
//2012.03.21.수
//기계닉스 첨단 대장장이 김갑철(金甲哲)
//}----------------------------------------------------------------------

//[방법]{-----------------------------------------------------------------------
//
//1) { 설계묶음->참고자료->회로도 } 대로 연결 후 예제로 만들어진 가상기계(GVMX) 설치.
//
//2) 맷돌(G.MTDL.X) 재기동.
//
//3) 맷돌(G.MTDL.X)의 내장 [4핀포트] 에 연결된 G.CO.RS232.XV 를 해제하고
//   맷돌(G.MTDL.X) 의 [통신포트:COM0] 에 연결(회로도 참고).
//   단, 통신케이블이 두개 있는 경우는 각각 연결하면 됨.
//
//4) [맷돌-통합개발환경] 아래 [출력창:개발검증내용] 의 [열기] 선택.
//   현재 [맷돌-통합개발환경] 의 <[v]맷돌직접연결> 과 같은 통신포트를 사용 중이라면
//   자동적으로 <[v]맷돌직접연결> 이 해제되고 통신포트가 전환됨.
//
//   케이블이 두개이라면 <[v]맷돌직접연결> 에 사용된 PC 통신포트와 다른 통신포트를 동시 사용가능.
//
//5) 맷돌(G.MTDL.X)에 연결된 스위치를 누르면 대응하는 [핀:이벤트] 문자열이 출력됨.
//}----------------------------------------------------------------------------

//[주의]{--------------------------------------------------------------------
//
//[맷돌-통합개발환경] 아래 [출력창:개발검증내용] 에는 문자열이 수신되는 대로 바로 출력되지 않고
//문자열의 끝 '\0' 문자를 수신해야 한꺼번에 출력됨.
//따라서, 전송시에는 반드시 문자열 전송후 '\0'(0x00) 까지 출력해야 됨.
//예제에서는 자동으로 문자열 끝의 '\0' 까지 출력되도록 처리돼 있음.
//}-------------------------------------------------------------------------

//[참고]{-------------------------------------------------------------------
//
//직렬통신에 사용되는 PC 쪽 [직렬통신포트] 는 [USB:직렬통신포트 변환 케이블] 로 간단하게
//추가할수 있음.
//
//스위치 동작시 생기는 잡음에 [핀이벤트] 가 민감하게 반응하는 것을 막기 위하여 스위치가 연결된
//각 핀에는 0.1uF 모놀리딕이나 세라믹 콘덴서로 GND 와 연결해 주는 것이 좋음.
//자세한 내용은 첨부한 [회로도] 의 내용을 참고.
//}------------------------------------------------------------------------


#include "함수묶음.h"

//[내부정의]
//{
    #define  true     1
    #define  false    0

    #define  NULL     0

    //I/O 포트번호 정의.
    #define  P0       0
    #define  P1       1
    #define  P2       2

    //통신포트번호 정의.
    #define  COM0     0
    #define  COM1     1

//}


//[VAR]
//{
    //[알림문 저장소] 선언(<선언크기 - 1> 이 유효).
    unsigned char   알림문저장소[256];

    //통신포트로 출력할 자료열을 임시 저장.
    unsigned char   전송저장소[256];

    char           *문자열;

//}


void event(void)
{
  //[!]{-----------------------------------------------------------------
  //[이벤트] 처리(이벤트 처리를 위한 고정이름 함수).
  //이벤트 발생시 이곳에서 [알림문저장소] 의 [알림문] 을 읽어 해당 처리 함수를 호출하거나
  //직접 처리.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      //[알림문] 한개는 1 바이트 크기.
      unsigned char  알림문;

  //}

  //[<알림문> 한개 꺼내기]
  //{
      알림문 = _MsgQ_읽기_();

  //}

  //[알림문] 에 따른 처리 수행.
  switch(알림문)
  {
    case d_EvtMsg_Gpio00 : //포트0.0 이벤트.
    {
      문자열 = "포트0.0 이벤트 발생!\r\n";
      //문자열 끝 '\0' 까지 출력--------------------------------------v
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio01 : //포트0.1 이벤트.
    {
      문자열 = "포트0.1 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio02 : //포트0.2 이벤트.
    {
      문자열 = "포트0.2 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio03 : //포트0.3 이벤트.
    {
      문자열 = "포트0.3 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio04 : //포트0.4 이벤트.
    {
      문자열 = "포트0.4 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio05 : //포트0.5 이벤트.
    {
      문자열 = "포트0.5 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio06 : //포트0.6 이벤트.
    {
      문자열 = "포트0.6 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio07 : //포트0.7 이벤트.
    {
      문자열 = "포트0.7 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio10 : //포트1.0 이벤트.
    {
      문자열 = "포트1.0 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio11 : //포트1.1 이벤트.
    {
      문자열 = "포트1.1 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio12 : //포트1.2 이벤트.
    {
      문자열 = "포트1.2 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio13 : //포트1.3 이벤트.
    {
      문자열 = "포트1.3 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio14 : //포트1.4 이벤트.
    {
      문자열 = "포트1.4 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio15 : //포트1.5 이벤트.
    {
      문자열 = "포트1.5 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio16 : //포트1.6 이벤트.
    {
      문자열 = "포트1.6 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

    case d_EvtMsg_Gpio17 : //포트1.7 이벤트.
    {
      문자열 = "포트1.7 이벤트 발생!\r\n";
      _Com_쓰기_(COM0, (unsigned char *)문자열, _Str_길이얻기(문자열) + 1);

    } break;

  }

}

void main(void)
{
  //[VAR]
  //{
      int  i;

  //}

  //[알림문저장소 설정]
  //{
      //<알림문저장소> 공간을 사용자 정의 크기로 생성.
      //선언한 해당 저장소크기와 같은 크기로 지정.
      _MsgQ_생성_(알림문저장소, 256);

  //}

  //[맷돌(G.MTDL.X) 통신포트:COM0 설정]
  //{
      //115200BPS 로 송신만 사용.
      //수신을 사용하지 않으므로 수신 저장소는 NULL 로 설정하고 저장소 크기는 0 으로 설정.
      //수신 미사용------------v
      //송신 사용-------v
      _Com_열기_(COM0, true, false, NULL, 0, 115200);

  //}

  //[전체 이벤트 허용]
  //{
      _Event_전체_(true);

  //}

  //[핀 이벤트 실험]
  //{
      //[!]{-------------------------------------------------------
      //핀 이벤트는 P0, P1 포트의 16 개 핀에만 적용.
      //각각의 핀은 모두 [상승/하강] 이벤트 발생 조건을 개별적으로 설정할수 있으며
      //둘다 사용 설정하면 두 경우 모두 이벤트가 발생.
      //}----------------------------------------------------------

      //[핀 이벤트 설정]
      //{
          //P0 의 모든 핀은 [상승] 시에 이벤트를 발생시키도록 설정.
          for(i = 0; i < 8; i++) { _Gpio_이벤트_(P0, i, true, false); }

          //P1 의 모든 핀은 [하강] 시에 이벤트를 발생시키도록 설정.
          for(i = 0; i < 8; i++) { _Gpio_이벤트_(P1, i, false, true); }

      //}

      //[핀:이벤트] 발생 대기.
      while(1);

  //}

}

