//---------------------------------------------------------------------------

#ifndef gmrcbasic_DialogBoxH
#define gmrcbasic_DialogBoxH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------


#include "font.h"

#include "gui_bmpbutton.h"
#include "gui_button.h"
#include "gui_check_button.h"
#include "gui_Label.h"
#include "gui_edit.h"
#include "gui_scroll_h.h"

//[2009.11.20.금]
#include "gui_radio_button.h"
#include <ExtCtrls.hpp>

class Tgmrcbasic_DialogBox_Form : public TForm
{
__published:	// IDE-managed Components
    TTimer *captionMoveTimer;
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
        void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall captionMoveTimerTimer(TObject *Sender);
private:	// User declarations
public:		// User declarations

        __fastcall Tgmrcbasic_DialogBox_Form(TComponent* Owner);

        //[2012.04.30.월][완료!!!]
        __fastcall ~Tgmrcbasic_DialogBox_Form(void);

        //[서브클래싱]
        //{
            void __fastcall WndProc(Messages::TMessage &Message);

        //}

        //[VAR]
        //{
            //[환경변수]
            //{
                //[2007.10.02.화][추가!!!]
                struct  IDE_OPTION   *_ide_option;

            //}

            //[실제 그리는 영역]
            //{
                Graphics::TBitmap    *_bmp_;

            //}

            //[사용글꼴]
            //{
                struct FONTPACK       _font;

            //}

            //caption 에 표시할 문자열을 기록한다.
            char               _caption[256];

            int                _caption_height;
            int                _caption_width;

            //caption 을 마우스로 끄는 경우 true.
            bool               _caption_selected;

            //[제목줄 이동 관련]
            //{
                //[2018.03.17.토][추가!!!]
                int  deltaLeft;
                int  deltaTop;

            //}

            //[기본 부품]
            //{
                //닫기 버튼.
                Tgui_bmpbutton_Form   *_close_bmpbtns;

            //}

            //[내부 부품들]
            //{
                //[제어기 번호]
                //{
                    Tgui_Label_Form   *_did_Label;
                    Tgui_button_Form  *_did_Btn;

                //}

                //[서보 선택]
                //{
                    //총 8 개의 서보를 선택한다(1개 제어기는 8 개의 서보를 갖는다).
                    Tgui_Label_Form         *_sv_Label[8];
                    Tgui_radio_button_Form  *_sv_RadioBtn[8];

                //}

                //[PWM/AD 설정]
                //{
                    //바탕라벨.
                    Tgui_Label_Form         *_base_Label;

                    //PWM.
                    Tgui_Label_Form         *_pwm_Label;
                    Tgui_check_button_Form  *_pwm_CheckBtn;

                    //A/D.
                    Tgui_Label_Form         *_ad_Label;
                    Tgui_button_Form        *_ad_Btn;

                //}

                //[설정 줄이동자]
                //{
                    Tgui_Label_Form     *_title_Label;

                    Tgui_Label_Form     *_min_Label,
                                        *_max_Label;

                    Tgui_button_Form    *_value_Btn;

                    Tgui_scroll_h_Form  *_value_ScrollH;

                //}

                //[설정 항목]
                //{
                    //각도.
                    Tgui_radio_button_Form  *_itemDeg_RadioBtn;
                    Tgui_Label_Form         *_itemDeg_Label;

                    //속도.
                    Tgui_radio_button_Form  *_itemSpd_RadioBtn;
                    Tgui_button_Form        *_itemSpd_Btn;

                    //주기.
                    Tgui_radio_button_Form  *_itemPrd_RadioBtn;
                    Tgui_button_Form        *_itemPrd_Btn;

                    //영점0도.
                    Tgui_radio_button_Form  *_itemZero0_RadioBtn;
                    Tgui_button_Form        *_itemZero0_Btn;

                    //영점180도.
                    Tgui_radio_button_Form  *_itemZero180_RadioBtn;
                    Tgui_button_Form        *_itemZero180_Btn;

                //}

                //[제어기 제어]
                //{
                    Tgui_bmpbutton_Form  *_cntReset_BmpBtn,
                                         *_cntStart_BmpBtn,
                                         *_cntStop_BmpBtn;

                    Tgui_button_Form  *_cntFix_Btn,
                                      *_cntFormat_Btn;

                //}

                //[통신포트 번호]
                //{
                    //맷돌의 통신포트 번호 선택.

                    Tgui_Label_Form         *_comBase_Label;
                    Tgui_Label_Form         *_comText_Label;

                    Tgui_radio_button_Form  *_com0_RadioBtn;
                    Tgui_Label_Form         *_com0_Label;

                    Tgui_radio_button_Form  *_com1_RadioBtn;
                    Tgui_Label_Form         *_com1_Label;

                //}

                //[설명글]
                //{
                    Tgui_Label_Form         *_text_Label;

                //}

            //}

            //[변수]
            //{
                //true 이면 돈다.
                bool   loop;

            //}

        //}

        //[FUNCTION]
        //{
            void __fastcall _FormCut(void);

            void __fastcall _Draw(void);

            void __fastcall _Border(void);

            void __fastcall _Shape(void);


            //[2007.12.14.금][완료!!!]
            void __fastcall _Caption(char  *pCaption);

            //[2007.12.14.금][완료!!!]
            void __fastcall _Width(int  pWidth);

            //[2007.12.14.금][완료!!!]
            void __fastcall _Height(int  pHeight);

        //}

        //[대화상자 처리 관련 함수]
        //{
            //[2009.11.28.토][완료!!!]
            unsigned char __fastcall Dlg_Did(void);

            //[2009.11.28.토][완료!!!]
            unsigned char __fastcall Dlg_SvNum(void);

            //[2009.11.28.토][완료!!!]
            unsigned char __fastcall Dlg_ComPortNum(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall Dlg_ValueBtn_Caption(int  pValue);

        //}

        //[동작홤수들]
        //{
            void __fastcall _EVENT_CloseButton_Click(void);


            //[2018.03.06.화][완료!!!]
            void __fastcall _EVENT_Click_did_Btn(void);

            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Down_sv_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_sv_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_pwm_CheckBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_ad_Btn(void);

            //[2018.03.06.화][완료!!!]
            void __fastcall _EVENT_Click_value_Btn(void);

            //[2009.11.26.목][처리중!!!]
            void __fastcall _EVENT_Scroll_value_ScrollH(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemDeg_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemSpd_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemSpd_Btn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemPrd_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemPrd_Btn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemZero0_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemZero0_Btn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemZero180_RadioBtn(void);

            //[2009.11.29.일][완료!!!]
            void __fastcall _EVENT_Click_itemZero180_Btn(void);



            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Click_cntReset_BmpBtn(void);

            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Click_cntStart_BmpBtn(void);

            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Click_cntStop_BmpBtn(void);

            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Click_cntFix_Btn(void);

            //[2009.11.26.목][완료!!!]
            void __fastcall _EVENT_Click_cntFormat_Btn(void);



            //[2009.11.27.금][완료!!!]
            void __fastcall _EVENT_Click_com0_RadioBtn(void);

            //[2009.11.27.금][완료!!!]
            void __fastcall _EVENT_Click_com1_RadioBtn(void);

        //}

        //[G.M.RC.BASiC 제어용]
        //{
            //[맷돌<gmrcbasic_set.gprj> 상의 배치]
            //{
                //[2009.11.24.화][추가!!!]{-----------------------------------------------------
                //맷돌의 [전역변수] 시작 위치인 @DATA 위치부터 순서대로 배치되 있다.
                //각각은 전부 [포인터] 로 8 바이트씩의 크기를 갖는다.
                //이 주소를 맷돌안의 <gmrcbasic_set.gprj> 가 main() 처음에 목록으로 이 포인터에
                //각 변수의 주소를 할당해 주므로 이 주소를 가지고 <IDE> 상에서 직접 맷돌안의
                //[전역변수] 에 접근할수 있다.
                //즉, [전역변수] 로 직접 <IDE> 와 <맷돌> 간의 통신을 수행하는 것이다.
                //자세한 내용은 <gmrcbasic_set.gprj> 설계묶음을 참고한다.
                //}-----------------------------------------------------------------------------

                //[설명]{----------------------------------------------------------------------------
                //<IDE> 에서 직접 G.M.RC.BASiC 에 접근하는 것이 아니라 맷돌에 연결된 G.M.RC.BASiC 을
                //<맷돌> 을 [통신중계기] 로 사용하여 접근하는 것이다.
                //이를 위하여 이런 [중계기] 역활을 하는 <gmrcbasic_set.gprj> 이 먼저 맷돌에 설치되
                //있어야 한다.
                //
                //[전역변수] 에 <IDE> 상에서 직접 접근하기 위하여 반드시 @DATA 를 알아야 한다.
                //VMOS 상의 절대주소값이므로 [직렬버스:V] 로 직접 접근한다.
                //}----------------------------------------------------------------------------------

                //[@DATA 값]
                //{
                    //[2009.11.27.금][추가!!!]{---------------------------------------------------------
                    //[@DATA] 값을 가진다.
                    //이것은 실제로 위의 위치에 해당하는 변수에 바로 접근하는데 필요하다.
                    //처음 <gmrcbasic_set.gprj> 이 설치되고 이 대화상자가 보인후 바로 읽어 들어야 한다.
                    //}---------------------------------------------------------------------------------

                    DTU8  _regDATA;

                //}

                //[주소 목록]
                //{
                    //[2009.11.27.금][추가!!!]{-------------------------------------------------------
                    //@DATA 위치부터 순서대로 8바이트 단위로 해당 변수의 [VMOS:절대주소] 가 위치한다.
                    //}-------------------------------------------------------------------------------

                    //[@DATA + 8*0] 위치.
                    DTU8  _tableComPortNum_1;       //unsigned char   *주소_포트번호;

                    //[@DATA + 8*1] 위치.
                    DTU8  _tableEventRxCountExe_1;  //bool            *주소_이벤트발생수신개수설정요청;

                    //[@DATA + 8*2] 위치.
                    DTU8  _tableEventRxCount_2;     //unsigned short  *주소_이벤트발생수신개수;


                    //[@DATA + 8*3] 위치.
                    DTU8  _tableTxExe_1;            //bool            *주소_전송처리요청;

                    //[@DATA + 8*4] 위치.
                    DTU8  _tableTxSize_2;           //unsigned short  *주소_전송크기;

                    //[@DATA + 8*5] 위치.
                    DTU8  _tableTxBuf_x;            //unsigned char   *주소_전송저장소;


                    //[@DATA + 8*6] 위치.
                    DTU8  _tableRxExe_1;            //bool            *주소_수신처리요청;

                    //[@DATA + 8*7] 위치.
                    DTU8  _tableRxSize_2;           //unsigned short  *주소_수신크기;

                    //[@DATA + 8*8] 위치.
                    DTU8  _tableRxBuf_x;            //unsigned char   *주소_수신저장소;

                //}    

                //[2009.11.27.금][완료!!!]
                bool __fastcall Mtdl_VarAdrTable_Read(void);

                //[2009.11.28.토][완료!!!]
                bool __fastcall Mtdl_ComPortNum_Set(unsigned char  pComPortNum);

                //[2009.11.28.토][완료!!!]
                bool __fastcall Mtdl_EventRxCount_Set(unsigned short  pEventRxCount);     

                //[2009.11.28.토][완료!!!]
                bool __fastcall Mtdl_Txd(//전송할 자료.
                                         unsigned char   *pStream,
                                         //실제 유효자료 크기.
                                         unsigned short   pSize,
                                         //직렬버스상 크기(2^지수 표현).
                                         //항상 pSize 보다 큰 크기여야 한다.
                                         unsigned int     pCBSize);

                //[2009.11.28.토][완료!!!]
                bool __fastcall Mtdl_Rxd(//수신된 자료.
                                         unsigned char   *rStream,
                                         //실제 유효자료 크기.
                                         unsigned short  *rSize,
                                         //직렬버스상 크기(2^지수 표현).
                                         //항상 pSize 보다 큰 크기여야 한다.
                                         unsigned int     pCBSize);

            //}

            //[기본 제어]
            //{ 
                bool __fastcall GMRCBASiC_Ack(void);

            //}

            //[쓰기 관련]
            //{
                //[2009.11.25.수][완료!!!][각도]
                bool __fastcall GMRCBASiC_MSG_DegSet(unsigned char  pDid,
                                                     unsigned char  pSid,
                                                     unsigned char  pAccel,
                                                     unsigned char  pDegree);

                //[2009.11.25.수][완료!!!][속도]
                bool __fastcall GMRCBASiC_MSG_SpdSet(unsigned char  pDid,
                                                     unsigned char  pSid,
                                                     unsigned char  pSpeed);

                //[2009.11.25.수][완료!!!][영점용 듀티]
                bool __fastcall GMRCBASiC_MSG_TickSet(unsigned char   pDid,
                                                      unsigned char   pSid,
                                                      unsigned char   pAccel,
                                                      unsigned short  pTick);

                //[2009.11.25.수][완료!!!][PWM ON/OFF]
                bool __fastcall GMRCBASiC_MSG_PwmSet(unsigned char  pDid,
                                                     unsigned char  pPwm);

                //[2009.11.25.수][완료!!!][A/D]
                bool __fastcall GMRCBASiC_MSG_AdSet(unsigned char  pDid,
                                                    unsigned char  pAD);

                //[2009.11.25.수][완료!!!][주기]
                bool __fastcall GMRCBASiC_MSG_PeriodSet(unsigned char  pDid,
                                                        unsigned char  pPeriod);

                //[2009.11.25.수][완료!!!][영점0도]
                bool __fastcall GMRCBASiC_MSG_Pos0TickSet(unsigned char   pDid,
                                                          unsigned char   pSid,
                                                          unsigned short  pTick);

                //[2009.11.25.수][완료!!!][영점180도]
                bool __fastcall GMRCBASiC_MSG_Pos180TickSet(unsigned char   pDid,
                                                            unsigned char   pSid,
                                                            unsigned short  pTick);

            //}

            //[읽기 관련]
            //{
                //[2009.11.29.일][완료!!!][속도]
                bool __fastcall GMRCBASiC_MSG_SpdRead(unsigned char   pDid,
                                                      unsigned char   pSid,
                                                      unsigned char  *rSpeed);

                //[2009.11.29.일][완료!!!][각도]
                bool __fastcall GMRCBASiC_MSG_DegRead(unsigned char   pDid,
                                                      unsigned char   pSid,
                                                      unsigned char  *rDegree);

                //[2009.11.29.일][완료!!!][PWM ON/OFF]
                bool __fastcall GMRCBASiC_MSG_PwmRead(unsigned char   pDid,
                                                      unsigned char  *rPwm);

                //[2009.11.29.일][완료!!!][A/D]
                bool __fastcall GMRCBASiC_MSG_AdRead(unsigned char   pDid,
                                                     unsigned char  *rAD);

                //[2009.11.29.일][완료!!!][주기]
                bool __fastcall GMRCBASiC_MSG_PeriodRead(unsigned char   pDid,
                                                         unsigned char  *rPeriod);

                //[2009.11.29.일][완료!!!][영점0도]
                bool __fastcall GMRCBASiC_MSG_Pos0TickRead(unsigned char    pDid,
                                                           unsigned char    pSid,
                                                           unsigned short  *rTick);

                //[2009.11.29.일][완료!!!][영점180도]
                bool __fastcall GMRCBASiC_MSG_Pos180TickRead(unsigned char    pDid,
                                                             unsigned char    pSid,
                                                             unsigned short  *rTick);

            //}

            //[제어기 제어]
            //{
                //[2009.11.25.수][완료!!!][초기값 고정]
                bool __fastcall GMRCBASiC_MSG_Save(unsigned char  pDid);

                //[2009.11.25.수][완료!!!][전체 PWM 켜기]
                bool __fastcall GMRCBASiC_MSG_PwmStart(unsigned char  pDid);

                //[2009.11.25.수][완료!!!][전체 PWM 끄기]
                bool __fastcall GMRCBASiC_MSG_PwmStop(unsigned char  pDid);

                //[2009.11.25.수][완료!!!][제어기 재기동]
                bool __fastcall GMRCBASiC_MSG_CtrlReset(unsigned char  pDid);

                //[2009.11.25.수][완료!!!][공장 초기화]
                bool __fastcall GMRCBASiC_MSG_EepromInit(unsigned char  pDid);

            //}

        //}


};
//---------------------------------------------------------------------------
extern PACKAGE Tgmrcbasic_DialogBox_Form *gmrcbasic_DialogBox_Form;
//---------------------------------------------------------------------------
#endif
