
#include "함수묶음.h"

#include "GUI_버튼줄.h"

#include "main.h"
#include "GUI.h"
#include "일반함수.h"

//[2012.07.11.수][추가!!!]
#include "GUI\GUI_모양만들기.h"

//[2011.05.토][추가!!! ]
#include "GUI\GUI_Flash문서.h"
#include "GUI\GUI_EEprom문서.h"

//[2011.11.25.금][추가!!!]
#include "AVR-ISP\AVR-병렬접근.h"

#include "AVR-ISP\AVR-ISP.h"


void Ide_모양만들기_버튼줄(void)
{
  //[2011.09.24.토][생성!!!]{--
  //[버튼줄] 을 구현한다.
  //}-------------------------

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

  //[Btn_지우기]
  //{
      _GButton_생성_(gui->Btn_지우기, gui->GVmos, GID_Btn_지우기,
                    3, 26,
                    50, 20,
                    true);
      _GButton_제목_(gui->Btn_지우기, "지우기", d_쓰기);

      //[이벤트]
      //{
          _GButton_이벤트_MClick_(gui->Btn_지우기, true, d_쓰기);

      //}

      //[퐁선도움말]
      //{
          _GButton_풍선도움말문자열_
          (gui->Btn_지우기,
           "AVR 의 Flash, EEprom, 보안설정 등을 전부 지웁니다.",
           d_쓰기);

          _GButton_풍선도움말_(gui->Btn_지우기, false, d_쓰기);

      //}

  //}

  //[Flash]
  //{
      //[Lb_Flash]
      //{
          _GLabel_생성_(gui->Lb_Flash, gui->GVmos, GID_Lb_Flash,
                       _GButton_X_(gui->Btn_지우기, 0, d_읽기) + _GButton_폭_(gui->Btn_지우기, 0, d_읽기) + 8,
                       _GButton_Y_(gui->Btn_지우기, 0, d_읽기) + 2,
                       100, 16,
                       true);
          _GLabel_제목_(gui->Lb_Flash, "Flash:", d_쓰기);
          _GLabel_자동폭_(gui->Lb_Flash, true, d_쓰기);

      //}

      //[Btn_Flash_쓰기]
      //{
          _GButton_생성_(gui->Btn_Flash_쓰기, gui->GVmos, GID_Btn_Flash_쓰기,
                        _GLabel_X_(gui->Lb_Flash, 0, d_읽기) + _GLabel_폭_(gui->Lb_Flash, 0, d_읽기),
                        _GButton_Y_(gui->Btn_지우기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_Flash_쓰기, "쓰기", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_Flash_쓰기, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_Flash_쓰기,
               "Flash 에 기록합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_Flash_쓰기, false, d_쓰기);

          //}

      //}

      //[Btn_Flash_읽기]
      //{
          _GButton_생성_(gui->Btn_Flash_읽기, gui->GVmos, GID_Btn_Flash_읽기,
                        _GButton_X_(gui->Btn_Flash_쓰기, 0, d_읽기) + _GButton_폭_(gui->Btn_Flash_쓰기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->Btn_Flash_쓰기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_Flash_읽기, "읽기", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_Flash_읽기, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_Flash_읽기,
               "Flash 내용을 읽어들여 임시 저장소에 저장합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_Flash_읽기, false, d_쓰기);

          //}

      //}

      //[Btn_Flash_확인]
      //{
          _GButton_생성_(gui->Btn_Flash_확인, gui->GVmos, GID_Btn_Flash_확인,
                        _GButton_X_(gui->Btn_Flash_읽기, 0, d_읽기) + _GButton_폭_(gui->Btn_Flash_읽기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->Btn_Flash_읽기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_Flash_확인, "확인", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_Flash_확인, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_Flash_확인,
               "Flash 기록한 내용이 일치하는지 확인합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_Flash_확인, false, d_쓰기);

          //}

      //}

  //}

  //[EEprom]
  //{
      //[Lb_EEprom]
      //{
          _GLabel_생성_(gui->Lb_EEprom, gui->GVmos, GID_Lb_EEprom,
                       _GButton_X_(gui->Btn_Flash_확인, 0, d_읽기) + _GButton_폭_(gui->Btn_Flash_확인, 0, d_읽기) + 8,
                       _GButton_Y_(gui->Btn_Flash_확인, 0, d_읽기) + 2,
                       100, 16,
                       true);
          _GLabel_제목_(gui->Lb_EEprom, "EEprom:", d_쓰기);
          _GLabel_자동폭_(gui->Lb_EEprom, true, d_쓰기);

      //}

      //[Btn_EEprom_쓰기]
      //{
          _GButton_생성_(gui->Btn_EEprom_쓰기, gui->GVmos, GID_Btn_EEprom_쓰기,
                        _GLabel_X_(gui->Lb_EEprom, 0, d_읽기) + _GLabel_폭_(gui->Lb_EEprom, 0, d_읽기),
                        _GButton_Y_(gui->Btn_지우기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_EEprom_쓰기, "쓰기", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_EEprom_쓰기, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_EEprom_쓰기,
               "EEprom 에 기록합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_EEprom_쓰기, false, d_쓰기);

          //}

      //}

      //[Btn_EEprom_읽기]
      //{
          _GButton_생성_(gui->Btn_EEprom_읽기, gui->GVmos, GID_Btn_EEprom_읽기,
                        _GButton_X_(gui->Btn_EEprom_쓰기, 0, d_읽기) + _GButton_폭_(gui->Btn_EEprom_쓰기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->Btn_EEprom_쓰기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_EEprom_읽기, "읽기", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_EEprom_읽기, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_EEprom_읽기,
               "EEprom 내용을 읽어들여 임시 저장소에 저장합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_EEprom_읽기, false, d_쓰기);

          //}

      //}

      //[Btn_EEprom_확인]
      //{
          _GButton_생성_(gui->Btn_EEprom_확인, gui->GVmos, GID_Btn_EEprom_확인,
                        _GButton_X_(gui->Btn_EEprom_읽기, 0, d_읽기) + _GButton_폭_(gui->Btn_EEprom_읽기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->Btn_EEprom_읽기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_EEprom_확인, "확인", d_쓰기);

          //[이벤트]
          //{
              _GButton_이벤트_MClick_(gui->Btn_EEprom_확인, true, d_쓰기);

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_EEprom_확인,
               "EEprom 기록한 내용이 일치하는지 확인합니다.",
               d_쓰기);

              _GButton_풍선도움말_(gui->Btn_EEprom_확인, false, d_쓰기);

          //}

      //}

  //}

  //[AVR설정]
  //{
      //[Lb_AVR설정]
      //{
          _GLabel_생성_(gui->Lb_AVR설정, gui->GVmos, GID_Lb_AVR설정,
                       _GButton_X_(gui->Btn_EEprom_확인, 0, d_읽기) + _GButton_폭_(gui->Btn_EEprom_확인, 0, d_읽기) + 8,
                       _GButton_Y_(gui->Btn_EEprom_확인, 0, d_읽기) + 2,
                       100, 16,
                       true);
          _GLabel_제목_(gui->Lb_AVR설정, "Lock/Fuse:", d_쓰기);
          _GLabel_자동폭_(gui->Lb_AVR설정, true, d_쓰기);

      //}

      //[Btn_AVR설정_쓰기]
      //{
          _GButton_생성_(gui->Btn_AVR설정_쓰기, gui->GVmos, GID_Btn_AVR설정_쓰기,
                        _GLabel_X_(gui->Lb_AVR설정, 0, d_읽기) + _GLabel_폭_(gui->Lb_AVR설정, 0, d_읽기),
                        _GButton_Y_(gui->Btn_지우기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_AVR설정_쓰기, "쓰기", d_쓰기);

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

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_AVR설정_쓰기,
               "현재 설정을 AVR 에 적용합니다.",
               d_쓰기);

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

          //}

      //}

      //[Btn_AVR설정_읽기]
      //{
          _GButton_생성_(gui->Btn_AVR설정_읽기, gui->GVmos, GID_Btn_AVR설정_읽기,
                        _GButton_X_(gui->Btn_AVR설정_쓰기, 0, d_읽기) + _GButton_폭_(gui->Btn_AVR설정_쓰기, 0, d_읽기) + 2,
                        _GButton_Y_(gui->Btn_AVR설정_쓰기, 0, d_읽기),
                        30, 20,
                        true);
          _GButton_제목_(gui->Btn_AVR설정_읽기, "읽기", d_쓰기);

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

          //}

          //[퐁선도움말]
          //{
              _GButton_풍선도움말문자열_
              (gui->Btn_AVR설정_읽기,
               "AVR 의 현재 설정 내용을 읽어들여 대화상자에 보여줍니다",
               d_쓰기);

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

          //}

      //}

  //}

  //[Btn_자동진행]
  //{
      _GButton_생성_(gui->Btn_자동진행, gui->GVmos, GID_Btn_자동진행,
                    _GButton_X_(gui->Btn_AVR설정_읽기, 0, d_읽기) + _GButton_폭_(gui->Btn_AVR설정_읽기, 0, d_읽기) + 8,
                    _GButton_Y_(gui->Btn_AVR설정_읽기, 0, d_읽기),
                    60, 20,
                    true);
      _GButton_제목_(gui->Btn_자동진행, "자동진행", d_쓰기);

      //[이벤트]
      //{
          _GButton_이벤트_MClick_(gui->Btn_자동진행, true, d_쓰기);

      //}

      //[퐁선도움말]
      //{
          _GButton_풍선도움말문자열_
          (gui->Btn_자동진행,
           "지우기->Flash쓰기/확인->EEprom쓰기/확인->LockFuse쓰기/확인\r\n까지 자동실행합니다.",
           d_쓰기);

          _GButton_풍선도움말_(gui->Btn_자동진행, false, d_쓰기);

      //}

  //}

  //[Btn_실행]
  //{
      _GButton_생성_(gui->Btn_실행, gui->GVmos, GID_Btn_실행,
                    _GButton_X_(gui->Btn_자동진행, 0, d_읽기) + _GButton_폭_(gui->Btn_자동진행, 0, d_읽기) + 8,
                    _GButton_Y_(gui->Btn_자동진행, 0, d_읽기),
                    30, 20,
                    true);
      _GButton_제목_(gui->Btn_실행, "실행", d_쓰기);

      //[이벤트]
      //{
          _GButton_이벤트_MClick_(gui->Btn_실행, true, d_쓰기);

      //}

      //[퐁선도움말]
      //{
          _GButton_풍선도움말문자열_
          (gui->Btn_실행,
           "AVR 을 실행시킵니다.",
           d_쓰기);

          _GButton_풍선도움말_(gui->Btn_실행, false, d_쓰기);

      //}

  //}

}

void Ide_모양삭제_버튼줄(void)
{
  //[2011.11.22.화][생성!!!]{--------
  //[버튼줄] 을 삭제한다.
  //
  //[2012.04.30.월][수정!!!]---------
  //안전을 위하여 선언한 역순으로 삭제한다.
  //}-------------------------------

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

  _GButton_삭제_(gui->Btn_실행);
  _GButton_삭제_(gui->Btn_자동진행);
  _GButton_삭제_(gui->Btn_AVR설정_읽기);
  _GButton_삭제_(gui->Btn_AVR설정_쓰기);
  _GLabel_삭제_(gui->Lb_AVR설정);
  _GButton_삭제_(gui->Btn_EEprom_확인);
  _GButton_삭제_(gui->Btn_EEprom_읽기);
  _GButton_삭제_(gui->Btn_EEprom_쓰기);
  _GLabel_삭제_(gui->Lb_EEprom);
  _GButton_삭제_(gui->Btn_Flash_확인);
  _GButton_삭제_(gui->Btn_Flash_읽기);
  _GButton_삭제_(gui->Btn_Flash_쓰기);
  _GLabel_삭제_(gui->Lb_Flash);
  _GButton_삭제_(gui->Btn_지우기);

}

void Ide_버튼줄_보이기(bool  p보이기_감추기)
{
  //[2011.11.23.수][생성!!!]{---------------------
  //[병렬접근전환] 을 위하여 비관련 부분을 보이거나 감춘다.
  //}--------------------------------------------

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

  //[2011.11.25.금][수정!!!]{---------------------------------
  //[지우기] 는 [병렬접근방식] 에서도 사용되어야 한다.
  //[보안설정] 이 돼 있는 경우는 다른 [설정] 이 변결되지 않기 때문에
  //이 경우는 [지우기] 로 [보안설정] 이 해제되어야만 [설정] 되기 때문이다.
  //_GButton_보이기_(gui->Btn_지우기, p보이기_감추기, 쓰기);
  //}--------------------------------------------------------

  _GLabel_보이기_(gui->Lb_Flash, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_Flash_쓰기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_Flash_읽기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_Flash_확인, p보이기_감추기, d_쓰기);
  _GLabel_보이기_(gui->Lb_EEprom, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_EEprom_쓰기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_EEprom_읽기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_EEprom_확인, p보이기_감추기, d_쓰기);
  _GLabel_보이기_(gui->Lb_AVR설정, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_AVR설정_쓰기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_AVR설정_읽기, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_자동진행, p보이기_감추기, d_쓰기);
  _GButton_보이기_(gui->Btn_실행, p보이기_감추기, d_쓰기);

}

bool Btn_지우기_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]

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

  //[처리 시작 상태]{--------------------------------
  _GButton_문자색_(gui->Btn_지우기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_지우기, clGray, d_쓰기);
  //}---------------------------------------------

  //[<AVR-ISP/ISP활성화> 구분 처리]
  //{
      //[2011.11.25.금][수정!!!]{---------------------
      //[AVR-ISP] 와 [ISP 활성화] 상태를 구분하여 처리한다.
      //}--------------------------------------------

      if(_GCheckButton_확인_(gui->Chk_ISP활성화, NULL, d_읽기) == false)
      {
        //[!]{-------------
        //[AVR-ISP] 로 처리.
        //}----------------

        //[전처리]
        //{
            if(pISP진입처리수행여부 == true)
            {
              if(Ide_통신개방확인() != true)
              {
                //[2011.11.06.일][추가!!!]{-------------------
                //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
                //}------------------------------------------

                Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

                goto lb오류;

              }

              if(Isp_맷돌존재확인() != true) goto lb오류;
              if(Isp_ISP진입() != true)    goto lb오류;
              if(Isp_고유번호확인() != true) goto lb오류;

            }

        //}

        //[처리내용]
        //{
            if(Isp_지우기() != true) goto lb오류;

        //}

      }
      else
      {
        //[!]{---------------
        //[ISP 활성화] 로 처리.
        //}------------------

        //[전처리]
        //{
            if(pISP진입처리수행여부 == true)
            {
              if(Ide_통신개방확인() != true)
              {
                //[2011.11.06.일][추가!!!]{-------------------
                //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
                //}------------------------------------------

                Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

                goto lb오류;

              }

              if(Isp_맷돌존재확인() != true) goto lb오류;

              //[병렬방식] 접근 함수를 사용.
              if(Isp_병렬_진입() != true) goto lb오류;
              if(Isp_병렬_고유번호확인() != true) goto lb오류;

            }

        //}

        //[처리내용]
        //{
            if(Isp_병렬_지우기() != true) goto lb오류;

        //}

      }

  //}

  lb이상없음:
  //{
      //[처리 끝 상태]{---------------------------------
      _GButton_문자색_(gui->Btn_지우기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_지우기, clWhite, d_쓰기);
      //}---------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //[처리 끝 상태]{---------------------------------
      _GButton_문자색_(gui->Btn_지우기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_지우기, clWhite, d_쓰기);
      //}---------------------------------------------

      return(false);

  //}

}

bool Btn_Flash_쓰기_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[VAR]
  //{
      int           i;

      //[2011.11.08.화][추가!!!]
      unsigned int  채워진끝페이지번호;

  //}

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

  //[처리 시작 상태]{------------------------------------
  _GButton_문자색_(gui->Btn_Flash_쓰기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_Flash_쓰기, clGray, d_쓰기);
  //}-------------------------------------------------

  //[문서 다시 열기]
  //{
      //[2011.11.05.토][추가!!!]
      if(Ide_Flash문서_다시열기() != true)
      {
        Ide_알림(d_정보, "Flash 에 기록할 내용이 없습니다.");

        goto lb오류;

      }

  //}

  //[보기창 처리]
  //{
      //[2011.11.26.토][추가!!!]{----------------
      //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
      //단, [자동진행] 인 경우는 처리하지 않는다.
      //}---------------------------------------

      if((pISP진입처리수행여부 == true) &&
         (_GForm_보이기_(gui->Form_보기창, NULL, d_읽기) == true))
      {
        Form_보기창_Flash_보기();

      }

  //}

  //[채워진 끝 페이지번호 얻기]
  //{
      //[2011.11.08.화][추가!!!]{-------------------------------
      //Flash 용량이 큰 경우 항상 전체를 기록하는 경우 시간이 많이 걸리므로
      //유효한 자료가 있는 페이지까지만 기록.
      //}------------------------------------------------------

      if(Ide_Flash_저장소_채워진_끝페이지번호_얻기(&채워진끝페이지번호) != true)
      {
        //모든 내용이 <0xffff> 로 기록할 필요가 없는 경우.
        //[오류] 는 아니지만 더이상 처리할 것이 없으므로 바로 종료.
        goto lb이상없음;

      }

  //}

  //[전처리]
  //{
      if(pISP진입처리수행여부 == true)
      {
        if(Ide_통신개방확인() != true)
        {
          //[2011.11.06.일][추가!!!]{-------------------
          //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
          //}------------------------------------------

          Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

          goto lb오류;

        }

        if(Isp_맷돌존재확인() != true) goto lb오류;
        if(Isp_ISP진입() != true)    goto lb오류;
        if(Isp_고유번호확인() != true) goto lb오류;

      }

  //}

  //[처리내용]
  //{
      //[진행막대 설정]
      //{
          //_GProgress_최대값_(gui->Prog_Flash문서_진행, (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기), 쓰기);
          _GProgress_최대값_(gui->Prog_Flash문서_진행, 채워진끝페이지번호, d_쓰기);
          _GProgress_최소값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_Flash문서_진행, true, d_쓰기);

      //}

      //for(i = 0; i < (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기); i++)
      //[2011.11.08.화][수정!!!]
      //[유효 페이지] 까지만 기록.
      for(i = 0; i <= 채워진끝페이지번호; i++)
      {
        //오류 발생의 경우는 더이상 처리하지 않는다.
        if(Isp_Flash_쓰기(i*gv->AVR명세.flash페이지크기/2) != true) goto lb오류;

        _GProgress_진행값_(gui->Prog_Flash문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_쓰기, clWhite, d_쓰기);
      //}--------------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_쓰기, clWhite, d_쓰기);
      //}--------------------------------------------------

      return(false);

  //}

}

void Btn_Flash_읽기_이벤트_MClick(void)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[VAR]
  //{
      int  i;

  //}

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

  //[처리 시작 상태]{------------------------------------
  _GButton_문자색_(gui->Btn_Flash_읽기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_Flash_읽기, clGray, d_쓰기);
  //}-------------------------------------------------

  //[전처리]
  //{
      if(Ide_통신개방확인() != true)
      {
        //[2011.11.06.일][추가!!!]{-------------------
        //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
        //}------------------------------------------

        Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

        goto lb오류;

      }

      if(Isp_맷돌존재확인() != true) goto lb오류;
      if(Isp_ISP진입() != true)    goto lb오류;
      if(Isp_고유번호확인() != true) goto lb오류;

  //}

  //[처리내용]
  //{
      //[진행막대 설정]
      //{
          _GProgress_최대값_(gui->Prog_Flash문서_진행, (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기), d_쓰기);
          _GProgress_최소값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_Flash문서_진행, true, d_쓰기);

      //}

      for(i = 0; i < (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기); i++)
      {
        //오류 발생의 경우는 더이상 처리하지 않는다.
        if(Isp_Flash_읽기(i*gv->AVR명세.flash페이지크기/2) != true) goto lb오류;

        _GProgress_진행값_(gui->Prog_Flash문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_읽기, clWhite, d_쓰기);
      //}--------------------------------------------------

      //[보기창 처리]
      //{
          //[2011.11.26.토][추가!!!]{----------------
          //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
          //}---------------------------------------

          //[읽기] 는 독립적인 기능으로 항상 보여주는 것으로 한다.
          //if(_GForm_보이기_(gui->Form_보기창, NULL, 읽기) == true)
          //{
            Form_보기창_Flash_보기();

          //}

      //}

      return;

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_읽기, clWhite, d_쓰기);
      //}--------------------------------------------------

      return;

  //}

}

bool Btn_Flash_확인_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[주의!!!]{--------------------------------------------------------------------
  //<전역변수:flash[]> 를 [쓰기/읽기] 의 경우 같이 사용하기 때문에 전체를 한꺼번에 처리할수 없다.
  //먼저 비교할 <*.hex> 문서(원본) 를 [다시읽기] 로 <전역변수:flash[]> 에 저장후 처리.
  //
  //[방법!!!]---------------------------------------------------------------------
  //1) <전역변수:flash[]> 의 1개 페이지 내용을 임시변수에 복사.
  //2) AVR 로 부터 1개 페이지를 읽기(이 자료는 <전역변수:flash[]> 의 해당 페이지 위치에 저장).
  //3) 1), 2) 의 내용을 서로 비교.
  //4) 1) - 3) 의 과정을 반복.
  //
  //의 방법으로 처리한다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      //AVR 최대 페이지 크기(256) 보다 여유있게 설정.
      unsigned char  비교할원본페이지[1024];

      char           문자열[1024];

      int            i, c, s;

      //[2011.11.08.화][추가!!!]
      unsigned int   채워진끝페이지번호;

  //}

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

  //[처리 시작 상태]{------------------------------------
  _GButton_문자색_(gui->Btn_Flash_확인, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_Flash_확인, clGray, d_쓰기);
  //}-------------------------------------------------

  //[비교문서 다시 열기]
  //{
      //[2011.11.05.토][추가!!!]
      if(Ide_Flash문서_다시열기() != true)
      {
        Ide_알림(d_정보, "비교할 Flash 내용이 없습니다.");

        goto lb오류;

      }

      //[!]{----------------------------------------
      //비교할 [원본] 이 <전역변수:flash[]> 에 올려져 있다.
      //}-------------------------------------------

  //}

  //[보기창 처리]
  //{
      //[2011.11.26.토][추가!!!]{----------------
      //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
      //단, [자동진행] 인 경우는 처리하지 않는다.
      //}---------------------------------------

      if((pISP진입처리수행여부 == true) &&
         (_GForm_보이기_(gui->Form_보기창, NULL, d_읽기) == true))
      {
        Form_보기창_Flash_보기();

      }

  //}

  //[채워진 끝 페이지번호 얻기]
  //{
      //[2011.11.08.화][추가!!!]{-------------------------------
      //Flash 용량이 큰 경우 항상 전체를 기록하는 경우 시간이 많이 걸리므로
      //유효한 자료가 있는 페이지까지만 기록.
      //}------------------------------------------------------

      if(Ide_Flash_저장소_채워진_끝페이지번호_얻기(&채워진끝페이지번호) != true)
      {
        //모든 내용이 <0xffff> 로 기록할 필요가 없는 경우.
        //[오류] 는 아니지만 더이상 처리할 것이 없으므로 바로 종료.
        goto lb이상없음;

      }

  //}

  //[전처리]
  //{
      if(pISP진입처리수행여부 == true)
      {
        if(Ide_통신개방확인() != true)
        {
          //[2011.11.06.일][추가!!!]{-------------------
          //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
          //}------------------------------------------

          Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

          goto lb오류;

        }

        if(Isp_맷돌존재확인() != true) goto lb오류;
        if(Isp_ISP진입() != true)    goto lb오류;
        if(Isp_고유번호확인() != true) goto lb오류;

      }

  //}

  //[읽기/비교]
  //{
      //[!]{-----------------------------------------
      //원본과 AVR 의 기록본을 [페이지] 단위로 읽어서 비교처리.
      //}--------------------------------------------

      //[진행막대 설정]
      //{
          //_GProgress_최대값_(gui->Prog_Flash문서_진행, (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기), 쓰기);
          _GProgress_최대값_(gui->Prog_Flash문서_진행, 채워진끝페이지번호, d_쓰기);
          _GProgress_최소값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_Flash문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_Flash문서_진행, true, d_쓰기);

      //}

      //for(i = 0; i < (gv->AVR명세.flash크기/gv->AVR명세.flash페이지크기); i++)
      //[2011.11.08.화][수정!!!]
      //[유효 페이지] 까지만 기록.
      for(i = 0; i <= 채워진끝페이지번호; i++)
      {
        //[페이지 원본 복사]
        //{
            //[참고!!!]{----------------------------------------------
            //[읽기] 시 <전역변수:flash[]> 공간의 같은 위치에 읽어들이기 때문에,
            //읽기전 먼저 원본을 임시저장소에 복사.
            //}------------------------------------------------------

            for(c = 0; c < gv->AVR명세.flash페이지크기; c++)
            {
              비교할원본페이지[c] = gv->flash[i*gv->AVR명세.flash페이지크기 + c];

            }

        //}

        //[페이지 읽기]
        //{
            //오류 발생의 경우는 더이상 처리하지 않는다.
            if(Isp_Flash_읽기(i*gv->AVR명세.flash페이지크기/2) != true) goto lb오류;

        //}

        //[비교]
        //{
            //[주의!!!]{----------------------------------
            //AVR 은 [1주소:2바이트] 이므로 [1주소] 단위로 비교.
            //}------------------------------------------

            for(c = 0; c < gv->AVR명세.flash페이지크기/2; c++)
            {
              if(((unsigned short *)비교할원본페이지)[c] != ((unsigned short *)(gv->flash))[i*gv->AVR명세.flash페이지크기/2 + c])
              {
                //[!]{----------------------------------------------
                //일치하지 않는 부분이 발견되었으므로 자세한 오류정보를 알려준다.
                //}-------------------------------------------------

                //[오류 정보 합성]
                //{
                    s = 0;

                    s += _Str_할당_(문자열, "일치하지 않는 부분이 발견되었습니다.\r\n\r\n");

                    s += _Str_더하기_(&(문자열[s]), "오류주소 : 0x");
                    _Conv_Long값_16진수표기_(i*gv->AVR명세.flash페이지크기/2 + c, 8, &(문자열[s]));
                    //주소는 8개 자리.
                    s += 8;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                    s += _Str_더하기_(&(문자열[s]), "쓰   기 : 0x");
                    _Conv_Long값_16진수표기_(((unsigned short *)비교할원본페이지)[c], 4, &(문자열[s]));
                    //값은 4개 자리.
                    s += 4;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                    s += _Str_더하기_(&(문자열[s]), "읽   기 : 0x");
                    _Conv_Long값_16진수표기_(((unsigned short *)(gv->flash))[i*gv->AVR명세.flash페이지크기/2 + c], 4, &(문자열[s]));
                    //값은 4개 자리.
                    s += 4;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                //}

                Ide_알림(d_오류, 문자열);

                //더이상 처리 하지 않는다.
                goto lb오류;

              }

            }

        //}

        _GProgress_진행값_(gui->Prog_Flash문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_확인, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_확인, clWhite, d_쓰기);
      //}--------------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_Flash문서_진행, false, d_쓰기);

      //[처리 끝 상태]{--------------------------------------
      _GButton_문자색_(gui->Btn_Flash_확인, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_Flash_확인, clWhite, d_쓰기);
      //}--------------------------------------------------

      return(false);

  //}

}

bool Btn_EEprom_쓰기_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[VAR]
  //{
      int           i;

      //[2011.11.08.화][추가!!!]
      unsigned int  채워진끝단위묶음번호;

  //}

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

  //[처리 시작 상태]{-------------------------------------
  _GButton_문자색_(gui->Btn_EEprom_쓰기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_EEprom_쓰기, clGray, d_쓰기);
  //}--------------------------------------------------

  //[문서 다시 열기]
  //{
      if(Ide_EEprom문서_다시열기() != true)
      {
        Ide_알림(d_정보, "EEprom 에 기록할 내용이 없습니다.");

        goto lb오류;

      }

  //}

  //[보기창 처리]
  //{
      //[2011.11.26.토][추가!!!]{----------------
      //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
      //단, [자동진행] 인 경우는 처리하지 않는다.
      //}---------------------------------------

      if((pISP진입처리수행여부 == true) &&
         (_GForm_보이기_(gui->Form_보기창, NULL, d_읽기) == true))
      {
        Form_보기창_EEprom_보기();

      }

  //}

  //[채워진 끝 페이지번호 얻기]
  //{
      //[2011.11.08.화][추가!!!]{--------------------------------
      //EEprom 용량이 큰 경우 항상 전체를 기록하는 경우 시간이 많이 걸리므로
      //유효한 자료가 있는 단위묶음까지만 기록.
      //}-------------------------------------------------------

      if(Ide_EEprom_저장소_채워진_끝단위묶음번호_얻기(&채워진끝단위묶음번호) != true)
      {
        //모든 내용이 <0xff> 로 기록할 필요가 없는 경우.
        //[오류] 는 아니지만 더이상 처리할 것이 없으므로 바로 종료.
        goto lb이상없음;

      }

  //}

  //[전처리]
  //{
      if(pISP진입처리수행여부 == true)
      {
        if(Ide_통신개방확인() != true)
        {
          //[2011.11.06.일][추가!!!]{-------------------
          //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
          //}------------------------------------------

          Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

          goto lb오류;

        }

        if(Isp_맷돌존재확인() != true) goto lb오류;;
        if(Isp_ISP진입() != true)    goto lb오류;;
        if(Isp_고유번호확인() != true) goto lb오류;;

      }

  //}

  //[처리내용]
  //{
      //[진행막대 설정]
      //{
          //_GProgress_최대값_(gui->Prog_EEprom문서_진행, (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위), 쓰기);
          _GProgress_최대값_(gui->Prog_EEprom문서_진행, 채워진끝단위묶음번호, d_쓰기);
          _GProgress_최소값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_EEprom문서_진행, true, d_쓰기);

      //}

      //for(i = 0; i < (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위); i++)
      for(i = 0; i <= 채워진끝단위묶음번호; i++)
      {
        //오류 발생의 경우는 더이상 처리하지 않는다.
        if(Isp_EEprom_쓰기(i*d_AVRINFO_eep처리단위) != true) goto lb오류;;

        _GProgress_진행값_(gui->Prog_EEprom문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_쓰기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_쓰기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(false);

  //}

}

void Btn_EEprom_읽기_이벤트_MClick(void)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[VAR]
  //{
      int  i;

  //}

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

  //[처리 시작 상태]{-------------------------------------
  _GButton_문자색_(gui->Btn_EEprom_읽기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_EEprom_읽기, clGray, d_쓰기);
  //}--------------------------------------------------

  //[전처리]
  //{
      if(Ide_통신개방확인() != true)
      {
        //[2011.11.06.일][추가!!!]{-------------------
        //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
        //}------------------------------------------

        Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

        goto lb오류;

      }

      if(Isp_맷돌존재확인() != true) goto lb오류;
      if(Isp_ISP진입() != true)    goto lb오류;
      if(Isp_고유번호확인() != true) goto lb오류;

  //}

  //[처리내용]
  //{
      //[진행막대 설정]
      //{
          _GProgress_최대값_(gui->Prog_EEprom문서_진행, (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위), d_쓰기);
          _GProgress_최소값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_EEprom문서_진행, true, d_쓰기);

      //}

      for(i = 0; i < (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위); i++)
      {
        //오류 발생의 경우는 더이상 처리하지 않는다.
        if(Isp_EEprom_읽기(i*d_AVRINFO_eep처리단위) != true) goto lb오류;

        _GProgress_진행값_(gui->Prog_EEprom문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_읽기, clWhite, d_쓰기);
      //}---------------------------------------------------

      //[보기창 처리]
      //{
          //[2011.11.26.토][추가!!!]{----------------
          //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
          //}---------------------------------------

          //[읽기] 는 독립적인 기능으로 항상 보여주는 것으로 한다.
          //if(_GForm_보이기_(gui->Form_보기창, NULL, 읽기) == true)
          //{
            Form_보기창_EEprom_보기();

          //}

      //}

      return;

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_읽기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return;

  //}

}

bool Btn_EEprom_확인_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

  //[주의!!!]{---------------------------------------------------------------------
  //<전역변수:eeprom[]> 를 [쓰기/읽기] 의 경우 같이 사용하기 때문에 전체를 한꺼번에 처리할수 없다.
  //먼저 비교할 <*.hex> 문서(원본) 를 [다시읽기] 로 <전역변수:eeprom[]> 에 저장후 처리.
  //
  //[방법!!!]----------------------------------------------------------------------
  //1) <전역변수:eeprom[]> 의 1개 페이지 내용을 임시변수에 복사.
  //2) AVR 로 부터 1개 페이지를 읽기(이 자료는 <전역변수:eeprom[]> 의 해당 페이지 위치에 저장).
  //3) 1), 2) 의 내용을 서로 비교.
  //4) 1) - 3) 의 과정을 반복.
  //
  //의 방법으로 처리한다.
  //}-----------------------------------------------------------------------------

  //[VAR]
  //{
      //EEprom 은 <d_AVRINFO_eep처리단위> 로만 처리된다.
      unsigned char  비교할원본페이지[d_AVRINFO_eep처리단위];

      char           문자열[1024];

      int            i, c, s;

      //[2011.11.08.화][추가!!!]
      unsigned int   채워진끝단위묶음번호;

  //}

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

  //[처리 시작 상태]{-------------------------------------
  _GButton_문자색_(gui->Btn_EEprom_확인, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_EEprom_확인, clGray, d_쓰기);
  //}--------------------------------------------------

  //[비교문서 다시 열기]
  //{
      if(Ide_EEprom문서_다시열기() != true)
      {
        Ide_알림(d_정보, "비교할 EEprom 내용이 없습니다.");

        goto lb오류;

      }

      //[!]{-----------------------------------------
      //비교할 [원본] 이 <전역변수:eeprom[]> 에 올려져 있다.
      //}--------------------------------------------

  //}

  //[보기창 처리]
  //{
      //[2011.11.26.토][추가!!!]{----------------
      //[보기창] 이 보이고 있는 경우라면 내용을 보여준다.
      //단, [자동진행] 인 경우는 처리하지 않는다.
      //}---------------------------------------

      if((pISP진입처리수행여부 == true) &&
         (_GForm_보이기_(gui->Form_보기창, NULL, d_읽기) == true))
      {
        Form_보기창_EEprom_보기();

      }

  //}

  //[채워진 끝 페이지번호 얻기]
  //{
      //[2011.11.08.화][추가!!!]{--------------------------------
      //EEprom 용량이 큰 경우 항상 전체를 기록하는 경우 시간이 많이 걸리므로
      //유효한 자료가 있는 단위묶음까지만 기록.
      //}-------------------------------------------------------

      if(Ide_EEprom_저장소_채워진_끝단위묶음번호_얻기(&채워진끝단위묶음번호) != true)
      {
        //모든 내용이 <0xff> 로 기록할 필요가 없는 경우.
        //[오류] 는 아니지만 더이상 처리할 것이 없으므로 바로 종료.
        goto lb이상없음;

      }

  //}

  //[전처리]
  //{
      if(pISP진입처리수행여부 == true)
      {
        if(Ide_통신개방확인() != true)
        {
          //[2011.11.06.일][추가!!!]{-------------------
          //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
          //}------------------------------------------

          Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

          goto lb오류;

        }

        if(Isp_맷돌존재확인() != true) goto lb오류;
        if(Isp_ISP진입() != true)    goto lb오류;
        if(Isp_고유번호확인() != true) goto lb오류;

      }

  //}

  //[읽기/비교]
  //{
      //[!]{-----------------------------------------
      //원본과 AVR 의 기록본을 [페이지] 단위로 읽어서 비교처리.
      //}--------------------------------------------

      //[진행막대 설정]
      //{
          //_GProgress_최대값_(gui->Prog_EEprom문서_진행, (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위), 쓰기);
          _GProgress_최대값_(gui->Prog_EEprom문서_진행, 채워진끝단위묶음번호, d_쓰기);
          _GProgress_최소값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_진행값_(gui->Prog_EEprom문서_진행, 0, d_쓰기);
          _GProgress_보이기_(gui->Prog_EEprom문서_진행, true, d_쓰기);

      //}

      //for(i = 0; i < (gv->AVR명세.eep크기/d_AVRINFO_eep처리단위); i++)
      for(i = 0; i <= 채워진끝단위묶음번호; i++)
      {
        //[페이지 원본 복사]
        //{
            //[참고!!!]{-----------------------------------------------
            //[읽기] 시 <전역변수:eeprom[]> 공간의 같은 위치에 읽어들이기 때문에,
            //읽기전 먼저 원본을 임시저장소에 복사.
            //}-------------------------------------------------------

            for(c = 0; c < d_AVRINFO_eep처리단위; c++)
            {
              비교할원본페이지[c] = gv->eeprom[i*d_AVRINFO_eep처리단위 + c];

            }

        //}

        //[페이지 읽기]
        //{
            //오류 발생의 경우는 더이상 처리하지 않는다.
            if(Isp_EEprom_읽기(i*d_AVRINFO_eep처리단위) != true) goto lb오류;

        //}

        //[비교]
        //{
            //[주의!!!]{----------------------------------
            //AVR 은 [1주소:2바이트] 이므로 [1주소] 단위로 비교.
            //}------------------------------------------

            for(c = 0; c < d_AVRINFO_eep처리단위; c++)
            {
              if(비교할원본페이지[c] != gv->eeprom[i*d_AVRINFO_eep처리단위 + c])
              {
                //[!]{----------------------------------------------
                //일치하지 않는 부분이 발견되었으므로 자세한 오류정보를 알려준다.
                //}-------------------------------------------------

                //[오류 정보 합성]
                //{
                    s = 0;

                    s += _Str_할당_(문자열, "일치하지 않는 부분이 발견되었습니다.\r\n\r\n");

                    s += _Str_더하기_(&(문자열[s]), "오류주소 : 0x");
                    _Conv_Long값_16진수표기_(i*d_AVRINFO_eep처리단위 + c, 8, &(문자열[s]));
                    //주소는 8개 자리.
                    s += 8;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                    s += _Str_더하기_(&(문자열[s]), "쓰   기 : 0x");
                    _Conv_Long값_16진수표기_(비교할원본페이지[c], 2, &(문자열[s]));
                    //값은 2개 자리.
                    s += 2;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                    s += _Str_더하기_(&(문자열[s]), "읽   기 : 0x");
                    _Conv_Long값_16진수표기_(gv->eeprom[i*d_AVRINFO_eep처리단위 + c], 2, &(문자열[s]));
                    //값은 2개 자리.
                    s += 2;
                    s += _Str_더하기_(&(문자열[s]), "\r\n");

                //}

                Ide_알림(d_오류, 문자열);

                //더이상 처리 하지 않는다.
                goto lb오류;

              }

            }

        //}

        _GProgress_진행값_(gui->Prog_EEprom문서_진행, i, d_쓰기);

      }

  //}

  lb이상없음:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_확인, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_확인, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //진행막대 감추기.
      _GProgress_보이기_(gui->Prog_EEprom문서_진행, false, d_쓰기);

      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_EEprom_확인, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_EEprom_확인, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(false);

  //}

}

bool Btn_AVR설정_쓰기_이벤트_MClick(bool  pISP진입처리수행여부)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]

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

  //[처리 시작 상태]{-------------------------------------
  _GButton_문자색_(gui->Btn_AVR설정_쓰기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_AVR설정_쓰기, clGray, d_쓰기);
  //}--------------------------------------------------

  //[전처리]
  //{
      if(pISP진입처리수행여부 == true)
      {
        if(Ide_통신개방확인() != true)
        {
          //[2011.11.06.일][추가!!!]{-------------------
          //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
          //}------------------------------------------

          Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

          goto lb오류;

        }

        if(Isp_맷돌존재확인() != true) goto lb오류;
        if(Isp_ISP진입() != true)    goto lb오류;
        if(Isp_고유번호확인() != true) goto lb오류;

      }

  //}

  //[처리내용]
  //{
      //[주의!!!]{-------------------------------------------
      //[보안설정] 을 가장 나중에 쓴다.
      //
      //[중요!!!][2011.11.08.화][추가!!!]---------------------
      //해당 설정정보가 존재하지 않는 경우는 아예 이 함수자체를 건너뛴다.
      //ATmega16 의 경우는 아예 [확장설정] 자체가 존재하지 않는다.
      //}---------------------------------------------------

      if(Ide_설정비트정보_존재확인(gv->AVR명세.하위설정) == true)
      { if(Isp_하위설정_쓰기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.상위설정) == true)
      { if(Isp_상위설정_쓰기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.확장설정) == true)
      { if(Isp_확장설정_쓰기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.보안설정) == true)
      { if(Isp_보안설정_쓰기() != true) goto lb오류; }

  //}

  lb이상없음:
  //{
      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_AVR설정_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_AVR설정_쓰기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(true);

  //}

  lb오류:
  //{
      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_AVR설정_쓰기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_AVR설정_쓰기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return(false);

  //}

}

void Btn_AVR설정_읽기_이벤트_MClick(void)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]

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

  //[처리 시작 상태]{-------------------------------------
  _GButton_문자색_(gui->Btn_AVR설정_읽기, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_AVR설정_읽기, clGray, d_쓰기);
  //}--------------------------------------------------

  //[전처리]
  //{
      if(Ide_통신개방확인() != true)
      {
        //[2011.11.06.일][추가!!!]{-------------------
        //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
        //}------------------------------------------

        Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

        goto lb오류;

      }

      if(Isp_맷돌존재확인() != true) goto lb오류;
      if(Isp_ISP진입() != true)    goto lb오류;
      if(Isp_고유번호확인() != true) goto lb오류;

  //}

  //[처리내용]
  //{
      //[주의!!!]{-------------------------------------------
      //[보안설정] 을 가장 나중에 읽는다.
      //
      //[중요!!!][2011.11.08.화][추가!!!]---------------------
      //해당 설정정보가 존재하지 않는 경우는 아예 이 함수자체를 건너뛴다.
      //ATmega16 의 경우는 아예 [확장설정] 자체가 존재하지 않는다.
      //}---------------------------------------------------

      if(Ide_설정비트정보_존재확인(gv->AVR명세.하위설정) == true)
      { if(Isp_하위설정_읽기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.상위설정) == true)
      { if(Isp_상위설정_읽기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.확장설정) == true)
      { if(Isp_확장설정_읽기() != true) goto lb오류; }

      if(Ide_설정비트정보_존재확인(gv->AVR명세.보안설정) == true)
      { if(Isp_보안설정_읽기() != true) goto lb오류; }

  //}

  lb이상없음:
  //{
      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_AVR설정_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_AVR설정_읽기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return;

  //}

  lb오류:
  //{
      //[처리 끝 상태]{---------------------------------------
      _GButton_문자색_(gui->Btn_AVR설정_읽기, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_AVR설정_읽기, clWhite, d_쓰기);
      //}---------------------------------------------------

      return;

  //}

}

void Btn_자동진행_이벤트_MClick(void)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.05.토][수정!!!]
  //[2011.11.26.토][수정!!!]

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

  //}

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

  //[보기창 감추기]
  //{
      //[2011.11.26.토][추가!!!]{--------------------------------------
      //[자동진행] 시에는 [보기창] 의 내용이 [쓰기] 내용과 일치하지 않을수 있으므로
      //보이지 않도록 감추고 시작한다.
      //}-------------------------------------------------------------

      _GForm_보이기_(gui->Form_보기창, false, d_쓰기);

  //}

  //[처리 시작 상태]{---------------------------------
  _GButton_문자색_(gui->Btn_자동진행, clWhite, d_쓰기);
  _GButton_배경색_(gui->Btn_자동진행, clGray, d_쓰기);
  //}----------------------------------------------

  if(Ide_통신개방확인() != true)
  {
    //[2011.11.06.일][추가!!!]{-------------------
    //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
    //}------------------------------------------

    Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

    goto lb오류;

  }

  if(Btn_지우기_이벤트_MClick(true) != true) goto lb오류;

  //[Flash]
  //{
      //<Lb_Flash문서_경로:풍선도움말> 안에 들어있다.
      _GLabel_풍선도움말문자열_(gui->Lb_Flash문서_경로, 문자열, d_읽기);

      //기록할 것이 있는 경우만 처리.
      if(_Str_일치확인_(문자열, "기계닉스 첨단 대장간", false) != true)
      {
        if(Btn_Flash_쓰기_이벤트_MClick(false) != true) goto lb오류;
        if(Btn_Flash_확인_이벤트_MClick(false) != true) goto lb오류;

      }

  //}

  //[EEprom]
  //{
      //<Lb_EEprom문서_경로:풍선도움말> 안에 들어있다.
      _GLabel_풍선도움말문자열_(gui->Lb_EEprom문서_경로, 문자열, d_읽기);

      //기록할 것이 잇는 경우만 처리.
      if(_Str_일치확인_(문자열, "http://www.gigyenics.co.kr", false) != true)
      {
        if(Btn_EEprom_쓰기_이벤트_MClick(false) != true) goto lb오류;
        if(Btn_EEprom_확인_이벤트_MClick(false) != true) goto lb오류;

      }

  //}

  if(Btn_AVR설정_쓰기_이벤트_MClick(false) != true) goto lb오류;

  lb이상없음:
  //{
      //[처리 끝 상태]{-----------------------------------
      _GButton_문자색_(gui->Btn_자동진행, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_자동진행, clWhite, d_쓰기);
      //}-----------------------------------------------

      return;

  //}

  lb오류:
  //{
      //[처리 끝 상태]{-----------------------------------
      _GButton_문자색_(gui->Btn_자동진행, clBlack, d_쓰기);
      _GButton_배경색_(gui->Btn_자동진행, clWhite, d_쓰기);
      //}-----------------------------------------------

      return;

  //}

}

void Btn_실행_이벤트_MClick(void)
{
  //[2011.09.25.일][생성!!!]
  //[2011.11.04.금][수정!!!]

  //[전처리]
  //{
      if(Ide_통신개방확인() != true)
      {
        //[2011.11.06.일][추가!!!]{-------------------
        //통신포트가 열려있지 않은 경우는 아예 처리하지 않는다.
        //}------------------------------------------

        Ide_알림(d_오류, "통신포트가 열려있지 않습니다.");

        return;

      }

      if(Isp_맷돌존재확인() != true) return;
      if(Isp_ISP진입() != true)    return;
      if(Isp_고유번호확인() != true) return;

  //}

  //[처리내용]
  //{
      if(Isp_AVR_재기동() != true) return;

  //}

}




