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

#ifndef PacketHandllingFH
#define PacketHandllingFH
//---------------------------------------------------------------------------
#include "VmsProtocolF.h"

//---------------------------------------------------------------------------
#pragma pack(push, 1)
//---------------------------------------------------------------------------

/*
*****************************************************************************
*  프로토콜 수신 OP Code
****************************************************************************/
typedef enum _e_vms_recv_packet
{
    e_rpkt_MIN                = 0x00,
    e_rpkt_VMS_ID_RES         = 0xFF,        // client -> server
    e_rpkt_NOTIFY_STTS        = 0x01,        // client -> server
    e_rpkt_DNLD_SCENARIO_RES  = 0x02,        // client -> server
    e_rpkt_CTRL_RESET_RES     = 0x03,        // client -> server
    e_rpkt_DNLD_FILE_RES      = 0x04,        // client -> server
    e_rpkt_PARAMETER_RES      = 0x05,        // client -> server
    e_rpkt_CTRL_LED_POWER_RES = 0x06,        // client -> server
    e_rpkt_CTRL_FAN_POWER_RES = 0x07,        // client -> server
    e_rpkt_CTRL_BRGH_RES      = 0x08,        // client -> server
    e_rpkt_CTRL_CONFIG_RES    = 0x09,        // client -> server
    e_rpkt_CTRL_TIME_RES      = 0x10,        // client -> server
    e_rpkt_MAX                = 0xFF+1,
} e_vms_recv_packet;

/*
*****************************************************************************
*  프로토콜 define
****************************************************************************/
#define MAX_PACKET_SIZE         4096

#define MAX_VMS_ID              10      /* '00000100001' */
#define MAX_DISP_TIME           12      /* YYYYMMDDHHMI */
#define MAX_SYS_TIME            14      /* YYYYMMDDHHMISS */
#define MAX_FILE_NAME           60

#define MAX_SCENARIO            INT_VMS_MAX_FORM
#define MAX_DNLD_FILE           INT_VMS_MAX_FORM

/*
*****************************************************************************
*  프로토콜 OP 코드 정의
****************************************************************************/
#define VMS_STX                 0x02        // Start of TeXt
#define VMS_ETX                 0x03        // End of TeXt

#define VMS_NULL                0x00

#define VMS_ID_REQ              0xFF        // server -> client
#define VMS_ID_RES              0xFF        // client -> server

#define NOTIFY_STTS             0x01        // client -> server
#define NOTIFY_STTS_ACK         0x01        // server -> client

#define DNLD_SCENARIO_REQ       0x02        // server -> client
#define DNLD_SCENARIO_RES       0x02        // client -> server

#define CTRL_RESET_REQ          0x03        // server -> client
#define CTRL_RESET_RES          0x03        // client -> server

#define DNLD_FILE_REQ           0x04        // server -> client
#define DNLD_FILE_RES           0x04        // client -> server

#define PARAMETER_REQ           0x05        // server -> client
#define PARAMETER_RES           0x05        // client -> server

#define CTRL_LED_POWER_REQ      0x06        // server -> client
#define CTRL_LED_POWER_RES      0x06        // client -> server

#define CTRL_FAN_POWER_REQ      0x07        // server -> client
#define CTRL_FAN_POWER_RES      0x07        // client -> server

#define CTRL_BRGH_REQ           0x08        // server -> client
#define CTRL_BRGH_RES           0x08        // client -> server

#define CTRL_CONFIG_REQ         0x09        // server -> client
#define CTRL_CONFIG_RES         0x09        // client -> server

#define CTRL_TIME_REQ           0x10        // server -> client
#define CTRL_TIME_RES           0x10        // client -> server

typedef struct _st_head
{
    _st_head()
    {
        Stx    = VMS_STX;
        OpCode = VMS_NULL;
        Length = 0;
    }
    BYTE Stx;
    BYTE OpCode;
    char vmsid[MAX_VMS_ID];
    WORD Length;
} st_head;

typedef struct _st_simple_req
{
    _st_simple_req()
    {
        Stx    = VMS_STX;
        OpCode = VMS_NULL;
        Length = 0;
        Etx    = VMS_ETX;
    }
    BYTE Stx;
    BYTE OpCode;
    char vmsid[MAX_VMS_ID];
    WORD Length;
    BYTE Etx;
} st_simple_req;


/*
*  VMS ID 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_vms_id_req
{
    _st_vms_id_req()
    {
        Stx    = VMS_STX;
        OpCode = VMS_ID_REQ;
        Length = 0;
        Etx    = VMS_ETX;
    }
    BYTE Stx;
    BYTE OpCode;
    WORD Length;
    BYTE Etx;
} st_vms_id_req;

typedef struct _st_vms_id_res : public st_head
{
    _st_vms_id_res()
    {
        Length = 1;
        OpCode = (BYTE)e_rpkt_VMS_ID_RES;
        Ack    = 0x00;
        Etx    = VMS_ETX;
    }

    BYTE Ack;    // 0x00 : 정상
                 // 0x31 : 데이터크기 불일치
                 // 0x32 : CRC16 에러
                 // 0x33 : 정의되지 않은 OP_CODE
                 // 0x34 : 기타
    BYTE Etx;
} st_vms_id_res;

#define ACK_NORMAL      0x00    // 0x00 : 정상
#define ACK_ERR_SIZE    0x31    // 0x31 : 데이터크기 불일치
#define ACK_ERR_CRD     0x32    // 0x32 : CRC16 에러
#define ACK_ERR_OPCODE  0x33    // 0x33 : 정의되지 않은 OP_CODE
#define ACK_ERR_ETC     0x34    // 0x34 : 기타

typedef struct _st_ack
{
    _st_ack()
    {
        Stx    = VMS_STX;
        OpCode = VMS_NULL;
        Length = 1;
        Ack    = ACK_NORMAL;
        Etx    = VMS_ETX;
    }
    BYTE Stx;
    BYTE OpCode;
    char vmsid[MAX_VMS_ID];
    WORD Length;
    BYTE Ack;    // 0x00 : 정상
                 // 0x31 : 데이터크기 불일치
                 // 0x32 : CRC16 에러
                 // 0x33 : 정의되지 않은 OP_CODE
                 // 0x34 : 기타
    BYTE Etx;
} st_ack;

/*
*  상태정보 수신 통보/응답 (client -> server)
****************************************************************************/
typedef struct _st_stts
{
    char time[MAX_SYS_TIME];  // 현재 제어기 시간

    BYTE led;    // 0x00 : 작동안함
                 // 0x01 : 작동중
                 // 0x02 : 알수없음

    BYTE door;   // 0x00 : 닫힘
                 // 0x01 : 열림
                 // 0x02 : 알수없음

    BYTE fan;    // 0x00 : 작동안함
                 // 0x01 : 작동중
                 // 0x02 : 알수없음

    BYTE hetr;   // 0x00 : 작동안함
                 // 0x01 : 작동중
                 // 0x02 : 알수없음

    BYTE tmpr;   // 온도값( 0x00~0x3f)
    BYTE brgh;   // 현재의 휘도값(0x00~0x3f)

    BYTE comm;   // 0x00 : 정상
                 // 0x01 : 비정상
} st_stts;

typedef struct _st_notify_stts : public st_head
{
    _st_notify_stts()
    {
        Length = sizeof(st_stts);
    }
    st_stts stts;
    BYTE    Etx;
} st_notify_stts;

typedef struct _st_notify_stts_ack : public st_head
{
    _st_notify_stts_ack()
    {
        OpCode = NOTIFY_STTS_ACK;
        Length = 1;
        Ack    = 0x00;
        Etx    = VMS_ETX;
    }
    BYTE Ack;    // 0x00 : 정상
                 // 0x31 : 데이터크기 불일치
                 // 0x32 : CRC16 에러
                 // 0x33 : 정의되지 않은 OP_CODE
                 // 0x34 : 기타
    BYTE Etx;
} st_notify_stts_ack;

/*
*  시나리오 다운로드 요청/응답 (server -> client)
****************************************************************************/
#define P_FILE_TYPE_IMAGE       0x01
#define P_FILE_TYPE_VIDEO       0x02
#define P_FILE_TYPE_STREAM      0x03
#define P_FILE_TYPE_TRAFFIC     0x04
#define P_FILE_TYPE_TEXT        0x05

typedef struct _st_scenario
{
    BYTE    seq;                        // 시나리오 순번
    BYTE    type;                       // 0x01 : 이미지 (JPG)
                                        // 0x02 : 동영상 (AVI)
                                        // 0x03 : URL(스트리밍)
                                        // 0x04 : 소통 이미지
                                        // 0x05 : 표출문구 이미지
    BYTE    dispEffect;                 // 표출타입이 이미지일 경우에만 효출효과가 적용된다.
                                        // 0x00 : Static (기본)
                                        // 0x01 : Blink

    char    fileName[MAX_FILE_NAME];    // 파일명
                                        // ※ 표출 타입별 FTP 폴더 개설

    BYTE    dispTm;                     // 표출문구 표출시각('03' : 3초)
    char    dispStrTm[MAX_DISP_TIME];   // 표출시작시간(0000 00 00 0000)
    char    dispEndTm[MAX_DISP_TIME];   // 표출종료시각(999912312359)
    BYTE    dnldFlag;                   // 파일다운로드 여부 D : 다운로드
                                        //                   C : 비교후 다운로드(없을경우)
} st_scenario;

typedef struct _st_dnld_scenario_req : public st_head
{
    _st_dnld_scenario_req()
    {
        OpCode = DNLD_SCENARIO_REQ;
    }
    BYTE    type;
    BYTE    cnt;     // 해당 VMS의 전체시나리오 수
    st_scenario scenario[MAX_SCENARIO+1];
} st_dnld_scenario_req;

typedef st_ack  st_dnld_scenario_res;


/*
*  파일 다운로드 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_dnld_file
{
    BYTE    type;                       // 표출타입 0x01 : 이미지 (JPG)
                                        //          0x02 : 동영상 (AVI)
    char    fileName[MAX_FILE_NAME];    // 파일명
                                        // ※ VMS ID 및 표출 타입별 FTP 폴더 개설
} st_dnld_file;

typedef struct _st_dnld_file_req : public st_head
{
    _st_dnld_file_req()
    {
        OpCode = DNLD_FILE_REQ;
    }
    char cnt[2];     // 전송 파일수
    union
    {
        st_dnld_file file[MAX_DNLD_FILE];
        char         data[sizeof(st_dnld_file)*MAX_DNLD_FILE+1];
    } U;
} st_dnld_file_req;

typedef st_ack  st_dnld_file_res;

/*
*  파라미터값 요청/응답 (server -> client)
****************************************************************************/
typedef st_simple_req st_parameter_req;

typedef struct _st_parameter
{
    BYTE    led;        // 0x00 : 꺼짐
                        // 0x01 : 켜짐
                        // 0x02 : 자동
                        // 0x09 : 알수없음

    BYTE    fan;        // 0x00 : 꺼짐
                        // 0x01 : 켜짐
                        // 0x02 : 자동
                        // 0x09 : 알수없음

    BYTE    fanTmpr;    // Fan 동작온도(0x00~0x3f)

    BYTE    hetr;       // 0x00 : 꺼짐
                        // 0x01 : 켜짐
                        // 0x02 : 자동
                        // 0x09 : 알수없음

    BYTE    hetrTmpr;   // Heater 동작온도(0x00~0x3f)

    BYTE    brgh;       // 0x00 : 주간
                        // 0x01 : 야간
                        // 0x02 : 자동
                        // 0x09 : 수동

    BYTE    brghVal;   // 현재휘도값 (0 ~ 100)
    BYTE    brghDay;   // 주간 휘도값(0 ~ 100)
    BYTE    brghNight; // 야간 휘도값(0 ~ 100)

    char    time[MAX_SYS_TIME];  // 현재 제어기 시간
} st_parameter;

typedef struct _st_parameter_res : public st_head
{
    _st_parameter_res()
    {
    }
    BYTE            Ack;
    st_parameter    para;
    BYTE            Etx;
} st_parameter_res;

/*
*  LED 전원제어 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_ctrl_led_power_req : public st_head
{
    _st_ctrl_led_power_req()
    {
        OpCode = CTRL_LED_POWER_REQ;
        Etx    = VMS_ETX;
        Length = 1;
    }
    BYTE cmd;    // LED 전원 ON/OFF 제어 정보 ON  - 1
                 //                           OFF - 0
    BYTE Etx;
} st_ctrl_led_power_req;

typedef st_ack  st_ctrl_led_power_res;

/*
*  FAN 전원제어 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_ctrl_fan_power_req : public st_head
{
    _st_ctrl_fan_power_req()
    {
        OpCode = CTRL_FAN_POWER_REQ;
        Etx    = VMS_ETX;
        Length = 1;
    }
    BYTE cmd;    // FAN 전원 ON/OFF 제어 정보 ON  - 1
                    //                           OFF - 0
    BYTE Etx;
} st_ctrl_fan_power_req;

typedef st_ack  st_ctrl_fan_power_res;

/*
*  휘도 제어 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_brgh
{
    BYTE    brgh;       // 0x00 : 주간
                        // 0x01 : 야간
                        // 0x02 : 자동
                        // 0x09 : 수동

    byte    brghVal;   // 현재휘도값 (0 ~ 100)
    byte    brghDay;   // 주간 휘도값(0 ~ 100)
    byte    brghNight; // 야간 휘도값(0 ~ 100)
} st_brgh;

typedef struct _st_ctrl_brgh_req : public st_head
{
    _st_ctrl_brgh_req()
    {
        OpCode = CTRL_BRGH_REQ;
        Length = sizeof(st_brgh);
        Etx    = VMS_ETX;
    }
    st_brgh set;
    BYTE    Etx;
} st_ctrl_brgh_req;

typedef st_ack  st_ctrl_brgh_res;

/*
*  환경정보 설정 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_cfg
{
    BYTE    fanTmpr;        // Fan 동작온도(0x00~0x3f)
    BYTE    hetrTmpr;       // Heater 동작온도(0x00~0x3f)
    char    dispOnTm[4];    // 전광판 가동 시작시간(0900)
    char    dispOffTm[4];   // 전광판 가동 종료시간(2400)
} st_cfg;

typedef struct _st_ctrl_cfg_req : public st_head
{
    _st_ctrl_cfg_req()
    {
        OpCode = CTRL_CONFIG_REQ;
        Length = sizeof(st_cfg);
        Etx    = VMS_ETX;
    }
    st_cfg  set;
    BYTE    Etx;
} st_ctrl_cfg_req;

typedef st_ack  st_ctrl_cfg_res;

/*
*  시간 설정 요청/응답 (server -> client)
****************************************************************************/
typedef struct _st_time
{
    char    time[MAX_SYS_TIME];  // 현재시간 정보(YYYYMMDDHHMISS)
} st_time;

typedef struct _st_ctrl_time_req : public st_head
{
    _st_ctrl_time_req()
    {
        OpCode = CTRL_TIME_REQ;
        Length = sizeof(st_time);
        Etx    = VMS_ETX;
    }
    st_time set;
    BYTE    Etx;
} st_ctrl_time_req;

typedef st_ack  st_ctrl_time_res;

/*
*  제어기 리셋
****************************************************************************/
typedef struct _st_reset_req : public st_head
{
    _st_reset_req()
    {
        OpCode = CTRL_TIME_REQ;
        Length = 1;
        Etx    = VMS_ETX;
    }
    BYTE type;  //0x00 : 프로세스 리셋 0x01 : 제어기 리셋
    BYTE Etx;
} st_reset_req;

typedef st_ack  st_reset_res;


//---------------------------------------------------------------------------
#pragma pack(pop)
//---------------------------------------------------------------------------

#endif
