
#include "함수묶음.h"

#include "폼디자인\폼디자인.h"

#include "영점조정설정.h"

#include "__Main.h"

#include "통신.h"

#include "맷돌설정문서.h"

#include "서보제어.h"


void 영점조정설정_GUI에_반영(void)
{
  //[2024.05.22.금][추가]{--------------------------------
  //[영점] 문서를 읽어서 [환경변수] 에 설정.
  //
  //[방법]-----------------------------------------------
  //1) [폴더:gvmx] 안의 "영점" 문서를 읽기.
  //
  //2) 전역정보 <서보영점> 에 1) 에서 읽은 12 개 서보 값 설정.
  //
  //3) 현재 보이는 [영점조정설정] 의 해당 서보 영점을 GUI 에 반영.
  //
  //}---------------------------------------------------

  //[VAR]
  //{
      char  문자열_[1024];

      int   pwm_번호;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[PWM 번호 얻기]
  //{
      _GButton_제목_(폼디자인_->영점조정설정_PWM번호선택_GBtn, 문자열_, d_읽기);

      pwm_번호 = _Conv_10진수표기_Int값_(&(문자열_[1]));

  //}

  if     (_GRadioButton_확인_(폼디자인_->영점조정설정_0도_GRdoBtn, NULL, d_읽기) == true)
  {
    _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, gv_->맷돌환경변수.서보영점_[pwm_번호].영점0도, d_쓰기);

  }
  else if(_GRadioButton_확인_(폼디자인_->영점조정설정_90도_GRdoBtn, NULL, d_읽기) == true)
  {
    _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, gv_->맷돌환경변수.서보영점_[pwm_번호].영점90도, d_쓰기);

  }
  else if(_GRadioButton_확인_(폼디자인_->영점조정설정_180도_GRdoBtn, NULL, d_읽기) == true)
  {
    _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, gv_->맷돌환경변수.서보영점_[pwm_번호].영점180도, d_쓰기);

  }

  //[2024.06.02.일][추가]
  영점조정설정_PWM값_GBtn에_반영();

}

void 영점조정설정_PWM값_GBtn에_반영(void)
{
  //[2024.05.22.화][생성]{----------------------------------
  //<영점조정설정_PWM_GScrollH> 의 설정값을 <PWM값_GBtn> 에 반영.
  //}------------------------------------------------------

  //[VAR]
  //{
      char  문자열_[1024];

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[현재 <영점조정설정_PWM_GScrollH> 값을 문자열로 변환]
  //{
      _Conv_Long값_문자열_(_GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, NULL, d_읽기),
                         //4 자리수로 표기.
                         4,
                         //+- 부호를 앞에 붙일 것인지(true:부호사용).
                         false,
                         //양수인 경우 '+' 부호 사용 유무(true:양수부호사용).
                         false,
                         문자열_);

  //}

  //[<PWM값_GBtn> 제목에 반영]
  //{
      _GButton_제목_(폼디자인_->영점조정설정_PWM값_GBtn, 문자열_, d_쓰기);

  //}

}

void 영점조정설정_PWM모드연계_활성화(//무조건 비활성화 하는 경우는 true.
                               bool  p비활성화)
{
  //[2024.05.23.목][생성]{--------------------------
  //<영점조정설정_모드_GChkBtn:true> 와 연동되어 동작된다.
  //}----------------------------------------------

  //[VAR]
  //{
      bool  활성유무;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[활성유무 얻기]
  //{
      활성유무 = _GCheckButton_확인_(폼디자인_->영점조정설정_모드_GChkBtn, NULL, d_읽기);

  //}

  //[무조건 비활성화 인가?]
  //{
      if(p비활성화 == true)
      {
        활성유무 = false;

      }

  //}

  //[PWM(영점)모드 관련 활성유무 설정]
  //{
      _GButton_유효_(폼디자인_->영점조정설정_PWM번호선택_GBtn, 활성유무, d_쓰기);

      _GButton_유효_(폼디자인_->영점조정설정_PWM값_GBtn, 활성유무, d_쓰기);
      _GButton_유효_(폼디자인_->영점조정설정_쓰기_GBtn, 활성유무, d_쓰기);
      _GScrollH_유효_(폼디자인_->영점조정설정_PWM_GScrollH, 활성유무, d_쓰기);

      _GRadioButton_유효_(폼디자인_->영점조정설정_0도_GRdoBtn, 활성유무, d_쓰기);
      _GRadioButton_유효_(폼디자인_->영점조정설정_180도_GRdoBtn, 활성유무, d_쓰기);
      _GCheckButton_유효_(폼디자인_->영점조정설정_90도_GChkBtn, 활성유무, d_쓰기);
      _GRadioButton_유효_(폼디자인_->영점조정설정_90도_GRdoBtn,
                         _GCheckButton_확인_(폼디자인_->영점조정설정_90도_GChkBtn, NULL, d_읽기) &&
                         _GCheckButton_유효_(폼디자인_->영점조정설정_90도_GChkBtn, NULL, d_읽기),
                         d_쓰기);

  //}

}

bool 영점조정설정_모드(void)
{
  //[2024.06.01.토][생성]{-----------------------------------------
  //<영점조정설정_모드_GChkBtn:확인> 에 따라 [모드:PWM/서보] 로 맷돌을 설정.
  //}-------------------------------------------------------------

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[모드 설정]
  //{
      if(_GCheckButton_확인_(폼디자인_->영점조정설정_모드_GChkBtn, NULL, d_읽기) == true)
      {
        //[!]{---------------
        //[모드:PWM] 으로 설정.
        //}------------------

        if(영점조정설정_맷돌_모드(d_통신종류_모드_PWM) != true) return(false);

        //[PWM 번호 설정 반영]
        //{
            //[2024.06.01.토][추가]{---------------------------------------------------
            //[영점조정:활성화] 시 자동으로 현재 선택된 [PWM 번호] 의 [선택] 처리를 한다.
            //이는 자동으로 현재 선택돼 있는 [PWM 번호] 에 해당하는 핀에 즉시 PWM 을 출력시키기 위함.
            //}-----------------------------------------------------------------------

            if(영점조정설정_맷돌_PWM번호() != true) return(false);

            if(영점조정설정_맷돌_PWM값() != true) return(false);

        //}

      }
      else
      {
        //[!]{-------------
        //[모드:서보] 로 설정.
        //}----------------

        //[주의]{****************************************************************
        //<gv_->맷돌환경변수.모드> 는 <영점조정설정_맷돌_모드()> 함수 안에서 유일하게 설정된다.
        //<gv_->맷돌환경변수.모드> 는 <맷돌_GUI_연동_초기설정()> 에서 중요하게 사용된다.
        //}*********************************************************************

        if(영점조정설정_맷돌_모드(d_통신종류_모드_서보) != true) return(false);

        if(맷돌_GUI_연동_초기설정() != true) return(false);

      }

  //}

}

void 영점조정설정_PWM_버튼_처리(void)
{
  //[2024.06.02.일][생성]{---------------------
  //<영점조정설정_PWM값_GBtn에_반영()> 의 반대 함수.
  //}-----------------------------------------

  //[VAR]
  //{
      char  문자열_[1024];
      int   눌린버튼;

      t_u2  pwm_값;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[대화상자 보이기]
  //{
      //[현재 설정값 출력]
      //{
          //버튼 제목이 현재 선택된 통신포트 번호.
          _GButton_제목_(폼디자인_->영점조정설정_PWM값_GBtn, 문자열_, d_읽기);

      //}

      눌린버튼 = Ide_알림_한줄편집기(d_기계닉스,
                                "PWM 값(0 - 4000)을 10진수로 입력합니다.",
                                문자열_);

  //}

  //[눌린버튼 구분 처리]
  //{
      switch(눌린버튼)
      {
        case 0 : //눌린버튼 없음.
        {
          return;

        } break;

        case 1 : //확인.
        {
          //계속 다음 진행.

        } break;

        case 2 : //취소.
        {
          return;

        } break;

      }

  //}

  //[문자열 검사]
  //{
      //[한줄편집기:문자열] 얻기.
      _GMsgBox_한줄편집기문자열_(gv_->GXMsgBox, 문자열_, d_읽기);

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

        //더이상 처리하지 않고 종료.
        return;

      }

  //}

  //[환경변수:설정]
  //{
      //10진수 문자열을 값으로 변환후 환경변수에 저장.
      pwm_값 = _Conv_10진수표기_Int값_(문자열_);

  //}

  //[범위 확인]
  //{
      //[!]{---------------------
      //<0 - 4000> 사이 값인지 확인.
      //}------------------------

      if(!((0 <= pwm_값) && (pwm_값 <= 4000)))
      {
        Ide_알림(d_오류,
                "PWM 값의 범위는 0 - 4000 입니다."
               );

        return;

      }

  //}

  //[버튼 문자열]
  //{
      _Conv_Long값_문자열_(pwm_값, 0, false, false, 문자열_);

      _GButton_제목_(폼디자인_->영점조정설정_PWM값_GBtn, 문자열_, d_쓰기);

  //}

  //[<영점조정설정_PWM_GScrollH> 에 반영]
  //{
      _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, pwm_값, d_쓰기);

      //맷돌에 전송은 [줄이동자:이벤트] 에서 자동 처리.

  //}

}

bool 영점조정설정_맷돌_쓰기(void)
{
  //[2024.05.29.수][생성]{------------------------------------
  //1) 해당 서보의 GUI 상 영점 3개를 [맷돌환경변수] 에 기록.
  //2) <실행경로:gvmx\맷돌설정.set> 의 문서에 저장.
  //3) 맷돌에 영점 설정.
  //
  //[중요]---------------------------------------------------
  //단, 1) 단계에서 <[v]90도> 유/무에 따라서 0도/180도 [쓰기] 확정시
  //90도 값을 자동 계산할지를 적용해야 한다.
  //<[ ]90도> : 0도/180도 결정시 90도 자동 계산 적용.
  //<[v]90도> : 0도/180도 결정시 90도 미 적용.
  //            90 도는 별도 설정.
  //}-------------------------------------------------------

  //[VAR]
  //{
      char   문자열_[1024];

      int    pwm_번호;

      struct ts_통신묶음_영점  설정;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[PWM 번호 얻기]
  //{
      _GButton_제목_(폼디자인_->영점조정설정_PWM번호선택_GBtn, 문자열_, d_읽기);

      pwm_번호 = _Conv_10진수표기_Int값_(&(문자열_[1]));

  //}

  //[맷돌환경변수:기록]
  //{
      if     (_GRadioButton_확인_(폼디자인_->영점조정설정_0도_GRdoBtn, NULL, d_읽기) == true)
      {
        gv_->맷돌환경변수.서보영점_[pwm_번호].영점0도 = _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, NULL, d_읽기);

      }
      else if(_GRadioButton_확인_(폼디자인_->영점조정설정_90도_GRdoBtn, NULL, d_읽기) == true)
      {
        gv_->맷돌환경변수.서보영점_[pwm_번호].영점90도 = _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, NULL, d_읽기);

      }
      else if(_GRadioButton_확인_(폼디자인_->영점조정설정_180도_GRdoBtn, NULL, d_읽기) == true)
      {
        gv_->맷돌환경변수.서보영점_[pwm_번호].영점180도 = _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, NULL, d_읽기);

      }

  //}

  //[영점 90도 처리]
  //{
      //[!]{---------------------------------------------------------
      //<[ ]90도> : 0도/180도 결정시 90도 자동 계산 적용.
      //<[v]90도> : 0도/180도 결정시 90도 미 적용(90 도는 사용자가 직접 설정).
      //}------------------------------------------------------------

      if(_GCheckButton_확인_(폼디자인_->영점조정설정_90도_GChkBtn, NULL, d_읽기) != true)
      {
        //[!]{------------------------------------------------------
        //이 경우는 90도를 [영점0도/영점180도] 의 [중립위치] 로 자동 계산 적용.
        //}---------------------------------------------------------

        gv_->맷돌환경변수.서보영점_[pwm_번호].영점90도 = gv_->맷돌환경변수.서보영점_[pwm_번호].영점0도 +
                                                 (gv_->맷돌환경변수.서보영점_[pwm_번호].영점180도 - gv_->맷돌환경변수.서보영점_[pwm_번호].영점0도)/2;

      }

  //}

  //[<맷돌설정문서.set> 에 저장]
  //{
      맷돌설정문서_쓰기();

  //}

  //[맷돌:전송]
  //{
      설정.쓰기읽기 = d_통신묶음_쓰기;
      설정.종류    = d_통신종류_영점;
      설정.서보번호 = pwm_번호;
      설정.영점0   = gv_->맷돌환경변수.서보영점_[pwm_번호].영점0도;
      설정.영점90  = gv_->맷돌환경변수.서보영점_[pwm_번호].영점90도;
      설정.영점180 = gv_->맷돌환경변수.서보영점_[pwm_번호].영점180도;

      //<ts_통신묶음_영점:2^4> 크기.
      //---------------v
      if(통신_전송(&설정, 4, 900) != true) return(false);

  //}

  return(true);

}

bool 영점조정설정_맷돌_PWM번호(void)
{
  //[2024.05.30.목][생성]{-----------------
  //전체 PWM 을 중지 시키고, 해당 PWM핀만 출력.
  //
  //[방법]--------------------------------
  //
  //1) 맷돌의 모든 PWM 출력을 중지.
  //
  //2) 선택된 PWM 핀만 개방.
  //
  //}------------------------------------

  //[VAR]
  //{
      char  문자열_[1024];

      int   pwm_번호;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[PWM 번호 얻기]
  //{
      _GButton_제목_(폼디자인_->영점조정설정_PWM번호선택_GBtn, 문자열_, d_읽기);

      pwm_번호 = _Conv_10진수표기_Int값_(&(문자열_[1]));

  //}

  //맷돌 PWM 전체 출력 중지.
  if(서보제어_맷돌_PWM_출력(false) != true) return(false);

  //지정 PWM 핀만 PWM 을 출력시킨다.
  if(서보제어_맷돌_PWM_핀(pwm_번호, true) != true) return(false);

  return(true);

}

bool 영점조정설정_맷돌_PWM값(void)
{
  //[2024.06.01.토][생성]{---
  //[맷돌] 에 현재 PWM 을 전송.
  //}-----------------------

  //[VAR]
  //{
      char   문자열_[1024];

      int    pwm_번호;

      struct ts_통신묶음_PWM  설정;

      bool   처리결과;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[이벤트:비활성화]
  //{
      //내부 처리중 계속 이벤트가 발생하여 쌓이는 것을 방지하기 위한것.
      _GScrollH_이벤트_Scroll_(폼디자인_->영점조정설정_PWM_GScrollH, false, d_쓰기);

  //}

  //[PWM 번호 얻기]
  //{
      _GButton_제목_(폼디자인_->영점조정설정_PWM번호선택_GBtn, 문자열_, d_읽기);

      pwm_번호 = _Conv_10진수표기_Int값_(&(문자열_[1]));

  //}

  //[맷돌:전송]
  //{
      설정.쓰기읽기 = d_통신묶음_쓰기;
      설정.종류    = d_통신종류_PWM값;
      설정.PWM번호 = pwm_번호;
      설정.PWM    = _GScrollH_위치_(폼디자인_->영점조정설정_PWM_GScrollH, NULL, d_읽기);

      //<ts_통신묶음_PWM:2^3> 크기.
      //---------------------v
      처리결과 = 통신_전송(&설정, 3, 900);

  //}

  //[이벤트:활성화]
  //{
      //내부 처리중 계속 이벤트가 발생하여 쌓이는 것을 방지하기 위한것.
      _GScrollH_이벤트_Scroll_(폼디자인_->영점조정설정_PWM_GScrollH, true, d_쓰기);

  //}

  return(처리결과);

}

bool 영점조정설정_맷돌_모드(t_u1  p모드)
{
  //[2024.06.01.토][생성]{--------
  //맷돌의 동작 모드를 구분(서보/PWM).
  //}----------------------------

  //[VAR]
  //{
      int   각도;

      struct ts_통신묶음_모드  설정;

  //}

  //[환경변수]{=================
  struct ts_폼디자인  *폼디자인_;
  struct t_전역정보  *gv_;
  _폼디자인_위치얻기(&폼디자인_);
  _전역정보_주소얻기(&gv_);
  //}=========================


  //[맷돌환경변수:기록]
  //{
      gv_->맷돌환경변수.모드 = p모드;

  //}

  //[맷돌:전송]
  //{
      설정.쓰기읽기 = d_통신묶음_쓰기;
      설정.종류    = d_통신종류_모드;
      설정.모드    = p모드;

      //<ts_통신묶음_모드:2^2> 크기.
      //------------v
      if(통신_전송(&설정, 2, 900) != true) return(false);

  //}

  return(true);

}

