
//[2012.07.08.일][생성!!!]

//[!]{----------------------
#include "GUI\GUI_주기설정.h"
//}-------------------------

#include "함수묶음.h"

#include "GUI\GUI.h"

#include "일반함수.h"
#include "색상정의.h"
#include "전역정보.h"


void GUI_생성자_주기설정(void)
{
  //[2012.07.08.일][생성!!!]

  //[VAR]
  //{

  //}

  //[GUI/전역변수]{------
  struct 전역정보  *gv;
  struct GUI     *gui;
  전역정보_위치얻기(&gv);
  GUI_위치얻기(&gui);
  //}------------------

  //[Lb_제목]
  //{
      _GLabel_생성_(gui->주기설정.Lb_제목, gui->기본틀.GVmos, GID_생성(),
                   _GLabel_X_(gui->기본조정설정.Lb_기본판, 0, d_읽기) + _GLabel_폭_(gui->기본조정설정.Lb_기본판, 0, d_읽기) + 4,
                   _GLabel_Y_(gui->영점조정설정.Lb_기본판, 0, d_읽기) + _GLabel_높이_(gui->영점조정설정.Lb_기본판, 0, d_읽기) + 4,
                   40, 16,
                   true);

      _GLabel_제목_(gui->주기설정.Lb_제목, "주기 설정", d_쓰기);
      _GLabel_자동폭_(gui->주기설정.Lb_제목, true, d_쓰기);

      _GLabel_배경색_(gui->주기설정.Lb_제목, _GColor_밝기_(clGray, 100), d_쓰기);
      _GLabel_문자색_(gui->주기설정.Lb_제목, clWhite, d_쓰기);

      _GLabel_테두리_(gui->주기설정.Lb_제목, true, d_쓰기);

  //}

  //[Lb_기본판]
  //{
      _GLabel_생성_(gui->주기설정.Lb_기본판, gui->기본틀.GVmos, GID_생성(),
                   _GLabel_X_(gui->기본조정설정.Lb_기본판, 0, d_읽기) + _GLabel_폭_(gui->기본조정설정.Lb_기본판, 0, d_읽기) + 4,
                   _GLabel_Y_(gui->주기설정.Lb_제목, 0, d_읽기) + _GLabel_높이_(gui->주기설정.Lb_제목, 0, d_읽기)/2,
                   230, 32,
                   true);

      _GLabel_제목_(gui->주기설정.Lb_기본판, "", d_쓰기);
      _GLabel_테두리_(gui->주기설정.Lb_기본판, true, d_쓰기);
      _GLabel_배경색_(gui->주기설정.Lb_기본판, _GColor_밝기_(clGray, d_환경_배경밝기), d_쓰기);

  //}

  //[!]{----------------------------
  //제목줄 앞으로.
  _GX_가장앞으로_(gui->주기설정.Lb_제목);
  //}-------------------------------

  //[주기]
  //{
      //[Btn_주기]
      //{
          _GButton_생성_(gui->주기설정.Btn_주기, gui->주기설정.Lb_기본판, GID_생성(),
                        4,
                        _GLabel_높이_(gui->주기설정.Lb_제목, 0, d_읽기)/2 + 4,
                        30, 16,
                        true);
          _GButton_제목_(gui->주기설정.Btn_주기, "20", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->주기설정.Btn_주기, true, d_쓰기);

          //}

          //[풍선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->주기설정.Btn_주기,
               "서보를 구동하는 PWM 주기를 읽기/쓰기 합니다.\r\n"
               "주기는 3 - 50 ms 사이의 값이 적당한 값이며\r\n"
               "일반적인 아날로그/디지탈 서보의 기본값은 20ms 입니다.\r\n"
               "입력 후 오른쪽 [쓰] 버튼을 눌러 설정하면 됩니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->주기설정.Btn_주기, false, d_쓰기);

          //}

      //}

      //[Lb_주기]
      //{
          _GLabel_생성_(gui->주기설정.Lb_주기, gui->주기설정.Lb_기본판, GID_생성(),
                       _GButton_X_(gui->주기설정.Btn_주기, 0, d_읽기) + _GButton_폭_(gui->주기설정.Btn_주기, 0, d_읽기) + 2,
                       _GButton_Y_(gui->주기설정.Btn_주기, 0, d_읽기),
                       40, 16,
                       true);

          _GLabel_제목_(gui->주기설정.Lb_주기, "ms(3 - 50 사이 값)", d_쓰기);
          _GLabel_자동폭_(gui->주기설정.Lb_주기, true, d_쓰기);
          _GLabel_배경색_(gui->주기설정.Lb_주기, _GColor_밝기_(clGray, d_환경_배경밝기), d_쓰기);

      //}

      //[Btn_주기_읽기]
      //{
          _GButton_생성_(gui->주기설정.Btn_주기_읽기, gui->주기설정.Lb_기본판, GID_생성(),
                        _GLabel_폭_(gui->주기설정.Lb_기본판, 0, d_읽기) - (16 + 2)*2 - 2,
                        _GLabel_Y_(gui->주기설정.Lb_주기, 0, d_읽기),
                        16, 16,
                        true);
          _GButton_제목_(gui->주기설정.Btn_주기_읽기, "읽", d_쓰기);
          _GButton_배경색_(gui->주기설정.Btn_주기_읽기, _GColor_밝기_(clBlack2, 125), d_쓰기);
          _GButton_문자색_(gui->주기설정.Btn_주기_읽기, clWhite, d_쓰기);
          _GButton_테두리색_(gui->주기설정.Btn_주기_읽기, clBlack2, d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_읽기, true, d_쓰기);

          //}

          //[풍선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->주기설정.Btn_주기_읽기,
               "현재 주기값을 제어기로부터 읽어서 표시합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->주기설정.Btn_주기_읽기, false, d_쓰기);

          //}

      //}

      //[Btn_주기_쓰기]
      //{
          _GButton_생성_(gui->주기설정.Btn_주기_쓰기, gui->주기설정.Lb_기본판, GID_생성(),
                        _GButton_X_(gui->주기설정.Btn_주기_읽기, 0, d_읽기) + _GButton_폭_(gui->주기설정.Btn_주기_읽기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->주기설정.Btn_주기_읽기, 0, d_읽기),
                        16, 16,
                        true);
          _GButton_제목_(gui->주기설정.Btn_주기_쓰기, "쓰", d_쓰기);
          _GButton_배경색_(gui->주기설정.Btn_주기_쓰기, _GColor_밝기_(clBlack2, 125), d_쓰기);
          _GButton_문자색_(gui->주기설정.Btn_주기_쓰기, clWhite, d_쓰기);
          _GButton_테두리색_(gui->주기설정.Btn_주기_쓰기, clBlack2, d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_쓰기, true, d_쓰기);

          //}

          //[풍선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->주기설정.Btn_주기_쓰기,
               "왼쪽 편집기의 주기값을 제어기에 전송하여 설정합니다.\r\n"
               "이 설정값은 제어기 내부 EEprom 안에 보존됩니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->주기설정.Btn_주기_쓰기, false, d_쓰기);

          //}

      //}

  //}

}

void GUI_소멸자_주기설정(void)
{
  //[2012.07.08.일][생성!!!]

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}----------------

  //[주기]
  //{
      _GButton_삭제_(gui->주기설정.Btn_주기_쓰기);
      _GButton_삭제_(gui->주기설정.Btn_주기_읽기);
      _GLabel_삭제_(gui->주기설정.Lb_주기);
      _GButton_삭제_(gui->주기설정.Btn_주기);

  //}

  _GLabel_삭제_(gui->주기설정.Lb_기본판);
  _GLabel_삭제_(gui->주기설정.Lb_제목);

}

bool GUI_동작함수_주기설정(struct GUI알림문64  *pGUI알림문64)
{
  //[2012.07.15.일][생성!!!]{---------
  //해당 [알림문] 만 처리.
  //처리한 알림문이 있다면 <true> 를 반환.
  //}--------------------------------

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  if     (pGUI알림문64->식별자 == GID_읽기(gui->주기설정.Btn_주기))
  {
    if(pGUI알림문64->알림문 == d_GuiMsg_MClick) { 주기설정_Btn_주기_이벤트_MClick(); return(true); }

  }

  //[읽기/쓰기]
  //{
      else if(pGUI알림문64->식별자 == GID_읽기(gui->주기설정.Btn_주기_읽기))
      {
        if(pGUI알림문64->알림문 == d_GuiMsg_MClick) { 주기설정_Btn_주기_읽기_이벤트_MClick(); return(true); }

      }
      else if(pGUI알림문64->식별자 == GID_읽기(gui->주기설정.Btn_주기_쓰기))
      {
        if(pGUI알림문64->알림문 == d_GuiMsg_MClick) { 주기설정_Btn_주기_쓰기_이벤트_MClick(); return(true); }

      }

  //}

  //여기까지 온것은 처리하지 않은 것으로 보고.
  return(false);

}


void 주기설정_Btn_주기_이벤트_MClick(void)
{
  //[2012.07.23.월][생성!!!]{-------------------------
  //[2012.07.28.토][수정!!!]--------------------------
  //EEprom 에 기록하므로 실제 쓰지 않고 [제목] 에 표시만 한다.
  //반드시 "[쓰]" 를 누른 경우만 EEprom 에 기록돼야 한다.
  //}------------------------------------------------

  //[VAR]
  //{
      char  문자열[16];

      bool  확인취소;

      int   주기;

  //}

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[이벤트:무효화]{-------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기, false, d_쓰기);
  //}-------------------------------------------------------

  //[알림창:한줄편집기]
  //{
      Ide_활성(false);
      //{
          //[현재 설정값 출력]
          //{
              //버튼 제목이 현재 설정된 제어기 번호.
              _GButton_제목_(gui->주기설정.Btn_주기, 문자열, d_읽기);

              //[알림창:한줄 편집기] 에 출력.
              _GMsgBox_한줄편집기문자열_(gui->공용알림창, 문자열, d_쓰기);

          //}

          확인취소 = _GMsgBox_한줄편집기_
                   (gui->공용알림창, d_기계닉스,
                    "[주기] 는 3 - 50 까지 사용가능합니다.\r\n"
                    "10진수로 입력."
                   );

      //}
      Ide_활성(true);

      //[확인/취소]
      //{
          //[취소] 인 경우는 처리하지 않고 바로 종료.
          if(확인취소 == false) goto lb끝;

      //}

  //}

  //[형식 검사]
  //{
      _GMsgBox_한줄편집기문자열_(gui->공용알림창, 문자열, d_읽기);

      if(_Check_10진수규칙_(문자열) != true)
      {
        Ide_알림(d_오류,
                "10진수 문자열이 아닙니다.\r\n"
                "0 - 9 의 숫자로 이루어진 10진수 문자열만 사용가능하며\r\n"
                "앞뒤에 공백이 없어야 합니다."
               );

        //더이상 처리하지 않고 종료.
        goto lb끝;

      }

  //}

  //[범위 검사]
  //{
      //[문자열 => 값]
      //{
          //범위 검사를 위하여 값으로 변환.
          주기 = _Conv_10진수표기_Int값_(문자열);

      //}

      //[주기] 은 3 - 50 까지만 사용 가능.
      if(!((3 <= 주기) && (주기 <= 50)))
      {
        Ide_알림(d_오류,
                "[주기] 는 3 - 50 까지만 사용가능합니다."
               );

        //더이상 처리하지 않고 종료.
        goto lb끝;

      }

  //}

  //[표시]
  //{
      _GButton_제목_(gui->주기설정.Btn_주기, 문자열, d_쓰기);

  //}

  //[!]{-------------------------------------------------------------
  //EEprom 에 기록하는 것은 [버튼:<쓰>] 로만 가능하므로 여기서는 제목에만 표시한다.
  //}----------------------------------------------------------------

  lb끝:

  //[이벤트:유효화]{------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기, true, d_쓰기);
  //}------------------------------------------------------

}

void 주기설정_Btn_주기_읽기_이벤트_MClick(void)
{
  //[2012.07.23.월][생성!!!]

  //[VAR]
  //{
      char           문자열[16];

      unsigned char  주기;

  //}

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[통신포트 열림 확인]
  //{
      //[2012.07.29.일][추가!!!]{-----------------------------------
      //읽기의 경우 [통신포트:열림] 상태에서만 처리 가능하므로 여기서 일괄 검사후
      //[닫혀] 있다면 아무것도 처리하지 않는다.
      //}----------------------------------------------------------

      if(항목줄_통신포트열림확인() != true) return;

  //}

  //[이벤트:무효화]{-----------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_읽기, false, d_쓰기);
  //}-----------------------------------------------------------

  //[명령 처리]
  //{
      //[제어기] 에 설정.
      if(_GMRCBASIC_PeriodRead(기본조정설정_제어기번호(), &주기) != true) { Ide_통신오류알림(); goto lb끝; }

  //}

  //[표시]
  //{
      _Conv_Long값_문자열_(주기, 0, false, false, 문자열);

      _GButton_제목_(gui->주기설정.Btn_주기, 문자열, d_쓰기);

  //}

  lb끝:

  //[이벤트:유효화]{----------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_읽기, true, d_쓰기);
  //}----------------------------------------------------------

}

void 주기설정_Btn_주기_쓰기_이벤트_MClick(void)
{
  //[2012.07.23.월][생성!!!]

  //[VAR]
  //{
      char  문자열[16];

  //}

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  //[이벤트:무효화]{-----------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_쓰기, false, d_쓰기);
  //}-----------------------------------------------------------

  //[제목 읽기]
  //{
      _GButton_제목_(gui->주기설정.Btn_주기, 문자열, d_읽기);

  //}

  //[명령 처리]
  //{
      //[통신포트] 가 열려있는 경우만 처리.
      if(항목줄_통신포트열림확인() == true)
      {
        //[제어기] 에 설정.
        if(_GMRCBASIC_PeriodSet(기본조정설정_제어기번호(), _Conv_10진수표기_Int값_(문자열)) != true) { Ide_통신오류알림(); goto lb끝; }

      }

  //}

  lb끝:

  //[이벤트:유효화]{----------------------------------------------
  _GButton_이벤트_MClick_(gui->주기설정.Btn_주기_쓰기, true, d_쓰기);
  //}----------------------------------------------------------

}

//----------------------------------------------------------------------------
//[함수]-----------------------------------------------------------------------
//----------------------------------------------------------------------------

void 주기설정_풍선도움말_사용유무(bool  p사용유무)
{
  //[2012.07.31.화][생성!!!]

  //[GUI]{----------
  struct GUI  *gui;
  GUI_위치얻기(&gui);
  //}---------------

  _GButton_풍선도움말_(gui->주기설정.Btn_주기, p사용유무, d_쓰기);

  _GButton_풍선도움말_(gui->주기설정.Btn_주기_읽기, p사용유무, d_쓰기);

  _GButton_풍선도움말_(gui->주기설정.Btn_주기_쓰기, p사용유무, d_쓰기);

}



