shjung 2 rokov pred
rodič
commit
3596712cd4
55 zmenil súbory, kde vykonal 868 pridanie a 250 odobranie
  1. 1 0
      src/main/java/com/its/vms/domain/VmsConstants.java
  2. 0 36
      src/main/java/com/its/vms/domain/VmsDownload.java
  3. 60 0
      src/main/java/com/its/vms/domain/VmsDownloadData.java
  4. 39 0
      src/main/java/com/its/vms/domain/VmsDownloadFile.java
  5. 19 0
      src/main/java/com/its/vms/domain/VmsDownloadForm.java
  6. 4 4
      src/main/java/com/its/vms/domain/VmsForm.java
  7. 8 3
      src/main/java/com/its/vms/domain/VmsFormObject.java
  8. 2 2
      src/main/java/com/its/vms/domain/VmsSchedule.java
  9. 0 44
      src/main/java/com/its/vms/domain/enums/eVmsFormObjectData.java
  10. 207 12
      src/main/java/com/its/vms/dto/TbVmsCtlrDto.java
  11. 2 3
      src/main/java/com/its/vms/process/DbmsDataProcess.java
  12. 0 1
      src/main/java/com/its/vms/service/VmsCtlrService.java
  13. 12 7
      src/main/java/com/its/vms/service/VmsManageService.java
  14. 3 2
      src/main/java/com/its/vms/xnettcp/vms/VmsTcpCommServerInitializer.java
  15. 1 1
      src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDleStuffingDecoder.java
  16. 4 8
      src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerIdleStateHandler.java
  17. 1 1
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java
  18. 4 18
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendData.java
  19. 23 19
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendDataProcess.java
  20. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResBlank.java
  21. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDataDownload.java
  22. 2 2
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDataUpload.java
  23. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayDefaultForm.java
  24. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayFormId.java
  25. 6 5
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayModuleStatus.java
  26. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadForm.java
  27. 6 6
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadFormSchedule.java
  28. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResFormDataDisplay.java
  29. 11 12
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResParameter.java
  30. 6 5
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResPowerModuleStatus.java
  31. 16 5
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatus.java
  32. 4 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatusControl.java
  33. 2 2
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStopImage.java
  34. 4 5
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadCurrentDisplayForm.java
  35. 3 4
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadScheduleForm.java
  36. 3 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameHead.java
  37. 2 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFramePacket.java
  38. 1 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsProtocolConst.java
  39. 41 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormDataDto.java
  40. 42 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormDto.java
  41. 29 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObj.java
  42. 34 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjBitmap.java
  43. 32 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjBitmapId.java
  44. 41 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjText.java
  45. 2 3
      src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java
  46. 108 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadForm.java
  47. 9 3
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadFormSchedule.java
  48. 1 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqFormDataDisplay.java
  49. 1 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqStatusControl.java
  50. 1 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqUploadScheduleForm.java
  51. 10 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFrameHead.java
  52. 13 2
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFramePacket.java
  53. 3 2
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFrameTail.java
  54. 9 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/std/VmsStdFrameHead.java
  55. 12 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/std/VmsStdFramePacket.java

+ 1 - 0
src/main/java/com/its/vms/domain/VmsConstants.java

@@ -28,6 +28,7 @@ public class VmsConstants {
 
     public static int VMS_MIN_DOWNLOAD_FORMS = 10;      // 한국도로공사 프로토콜 최대 폼 갯수
     public static int VMS_MAX_DOWNLOAD_FORMS = 20;
+    public static int VMS_MAX_DOWNLOAD_FILES = 10;
 
     public static int VMS_MAX_EVEHICLE = 10;
     public static int VMS_MAX_CNGS_FORM = 5;

+ 0 - 36
src/main/java/com/its/vms/domain/VmsDownload.java

@@ -1,36 +0,0 @@
-package com.its.vms.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *  DTO Class
- */
-@Data
-public class VmsDownload implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public VmsDownload() {
-        this.units = new ArrayList<>();
-    }
-
-    private boolean isEnable;             	/* 활성화 여부 */
-    private int     saveFlag;               /* 다운로드정보 저장 여부 */
-    //TDateTime   dTimer;                 /* timer for download */
-    private int     count;                  /* 정보 갯수 */
-
-    List<VmsDownloadInfo> units;
-
-    @Data
-    public class VmsDownloadInfo {
-        private String regDate;           	/* 등록일시 */
-        private String fileType;          	/* 다운로드 파일유형 */
-        private String fileId;            	/* 다운로드 파일 ID */
-        private String sendStartDate;     	/* 전송시작시각 */
-        private String sendEndDate;       	/* 전송완료시각 */
-        private int    sendStep;            /* 전송진행단계 */
-    }
-}

+ 60 - 0
src/main/java/com/its/vms/domain/VmsDownloadData.java

@@ -0,0 +1,60 @@
+package com.its.vms.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *  다운로드 할 데이터의 정보를 저장할 객체
+ */
+@Data
+public class VmsDownloadData implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private boolean isDefault;
+    private int maxSchedule;
+    private int downloadCnt;
+    private VmsDownloadDataInfo[] units;
+
+    public VmsDownloadData() {
+        this.units = new VmsDownloadDataInfo[VmsConstants.VMS_MAX_DOWNLOAD_FORMS];
+        for (int ii = 0; ii <VmsConstants.VMS_MAX_DOWNLOAD_FORMS; ii++) {
+            this.units[ii] = new VmsDownloadDataInfo();
+        }
+        init();
+    }
+
+    public void init() {
+        this.isDefault = false;
+        this.maxSchedule = 0;
+        this.downloadCnt = 0;
+        for (int ii = 0; ii < VmsConstants.VMS_MAX_DOWNLOAD_FORMS; ii++) {
+            this.units[ii].init();
+        }
+    }
+
+    @Data
+    public static class VmsDownloadDataInfo implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        private Integer vmsFormId;
+        private boolean isDownload;
+        private int formIdx;
+        private int bitmapId;
+        private int formNo;
+        private int displaySec;
+        private int displayType;
+        private int bkClr;
+
+        public void init() {
+            this.vmsFormId = 0;
+            this.isDownload = false;
+            this.formIdx = 0;
+            this.bitmapId = 0;
+            this.formNo = 0;
+            this.displaySec = 0;
+            this.displayType = 0;
+            this.bkClr = 0;
+        }
+    }
+}

+ 39 - 0
src/main/java/com/its/vms/domain/VmsDownloadFile.java

@@ -0,0 +1,39 @@
+package com.its.vms.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *  제어기로 다운로드 할 파일 정보 관리 객체
+ */
+@Data
+public class VmsDownloadFile implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private boolean enable;             	/* 활성화 여부 */
+    private boolean saveFlag;               /* 다운로드정보 저장 여부 */
+    private Long    dTimer;                 /* timer for download */
+    private int     count;                  /* 정보 갯수 */
+
+    private VmsDownloadFileInfo[] units;
+
+    public VmsDownloadFile() {
+        this.units = new VmsDownloadFileInfo[VmsConstants.VMS_MAX_DOWNLOAD_FILES];
+        for (int ii = 0; ii < VmsConstants.VMS_MAX_DOWNLOAD_FILES; ii++) {
+            this.units[ii] = new VmsDownloadFileInfo();
+        }
+    }
+
+    @Data
+    public static class VmsDownloadFileInfo implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        private String regDate;           	/* 등록일시 */
+        private String fileType;          	/* 다운로드 파일유형 */
+        private String fileId;            	/* 다운로드 파일 ID */
+        private String sendStartDate;     	/* 전송시작시각 */
+        private String sendEndDate;       	/* 전송완료시각 */
+        private int    sendStep;            /* 전송진행단계 */
+    }
+}

+ 19 - 0
src/main/java/com/its/vms/domain/VmsDownloadForm.java

@@ -0,0 +1,19 @@
+package com.its.vms.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *  다운로드 할 폼이 제어기에 이미 다운로드 되었는지를 확인하기 위한 정보를 담을 객체
+ */
+@Data
+public class VmsDownloadForm implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer vmsFormId;          // 다운로드 한 폼 ID
+    private Long downloadTime;          // 다운로드 한 식가
+    private String updtDt;            // 폼이 업데이트 된 시각
+    private boolean alreadyDownload;    // 이전에 다운로드 되었는지 여부
+
+}

+ 4 - 4
src/main/java/com/its/vms/domain/VmsForm.java

@@ -9,7 +9,7 @@ import com.its.vms.service.VmsFontService;
 import com.its.vms.service.VmsFormService;
 import com.its.vms.service.VmsIfscService;
 import com.its.vms.service.VmsSymbService;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -297,7 +297,7 @@ public class VmsForm implements Serializable {
                 case 413: //@오존등급이미지
                     objType = vms_obj_bitmap;
                     sTmp = String.format("%02X%04X%04X%02X%04X%04X%s|",
-                            pFormObj.getIsBlinking(),
+                            pFormObj.getBlinking(),
                             pFormObj.getPosX(),
                             pFormObj.getPosY(),
                             pFormObj.getBkColor(),
@@ -315,7 +315,7 @@ public class VmsForm implements Serializable {
                 case 47: //4단,소통정보이미지4
                     objType = vms_obj_draw;
                     sTmp = String.format("%02X%04X%04X%02X%04X%04X%s+",
-                            pFormObj.getIsBlinking(),
+                            pFormObj.getBlinking(),
                             pFormObj.getPosX(),
                             pFormObj.getPosY(),
                             pFormObj.getBkColor(),
@@ -362,7 +362,7 @@ public class VmsForm implements Serializable {
                     msgText.append(" ");
 
                     sTmp = String.format("%02X%04X%04X%02X%02X%02X%02X%02X%02X%s|",
-                            pFormObj.getIsBlinking(),
+                            pFormObj.getBlinking(),
                             pFormObj.getPosX(),
                             pFormObj.getPosY(),
                             pFormObj.getBkColor(),

+ 8 - 3
src/main/java/com/its/vms/domain/VmsFormObject.java

@@ -4,6 +4,7 @@ import com.its.vms.domain.enums.eVmsTextAlign;
 import com.its.vms.dto.TbVmsFormObjectDto;
 import com.its.vms.service.VmsFontService;
 import com.its.vms.service.VmsFormService;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -24,10 +25,10 @@ public class VmsFormObject implements Serializable {
 
     private Integer vmsFormId;
     private Integer vmsFormObjectId;
-    private int    objectKind;      // 객체종류
+    private eVmsFormObjectKind objectKind;      // 객체종류
     private int    objectType;      // 객체타입
     private int    objectSize;      // 객체크기
-    private int    isBlinking;      // 점멸 여부
+    private int    blinking;        // 점멸 여부
     private int    posX;            // 위치 X
     private int    posY;            // 위치 Y
     private int    dsplWidth;       // 객체넓이
@@ -50,12 +51,15 @@ public class VmsFormObject implements Serializable {
     private String  trfcFillCd;
 
     private byte[] imageData;
+    private Color  fontClr;
 
     public VmsFormObject(Integer vmsFormId, Integer vmsFormObjectId) {
+        this.objectKind = eVmsFormObjectKind.OBJECT_TEXT;
         this.vmsFormId = vmsFormId;
         this.vmsFormObjectId = vmsFormObjectId;
         this.ifscId = 0L;
         this.imageData = null;
+        this.fontClr = Color.BLACK;
     }
 
     public void setFormObjectInfo(String fontName, TbVmsFormObjectDto obj) {
@@ -72,7 +76,7 @@ public class VmsFormObject implements Serializable {
         this.dsplWidth = obj.getVmsDsplWidth();             // NUMBER(5)	Y	0		VMS 표출 넓이
         this.textWidth  = obj.getVmsDsplWidth();            // NUMBER(5)	Y	0		VMS 표출 넓이
         this.dsplHeight = obj.getVmsDsplHeight();           // NUMBER(5)	Y	0		VMS 표출 높이
-        this.isBlinking = obj.getVmsDsplBlinking();         // NUMBER(1)	Y	0		VMS 표출 점멸 여부(0:지속, 1:점멸)
+        this.blinking = obj.getVmsDsplBlinking();         // NUMBER(1)	Y	0		VMS 표출 점멸 여부(0:지속, 1:점멸)
         this.bkColor    = obj.getVmsDsplBkColor();          // NUMBER(1)	Y	0		VMS 표출 배경색상코드
         this.objectSize = obj.getVmsDsplSize();             // NUMBER(7)	Y	0		VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
         this.textData   = obj.getVmsDsplTxt();
@@ -195,6 +199,7 @@ public class VmsFormObject implements Serializable {
                 g2d.drawString(this.textData, this.posX, this.posY + fm.getAscent());
                 break;
         }
+        this.fontClr = fontService.getFontColor(this.fontColor);
     }
 
 }

+ 2 - 2
src/main/java/com/its/vms/domain/VmsSchedule.java

@@ -14,12 +14,12 @@ import java.util.List;
 public class VmsSchedule implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    List<TbVmsScheduleDto> units;
+
     public VmsSchedule() {
         this.units = new ArrayList<>();
     }
 
-    List<TbVmsScheduleDto> units;
-
     public void add(TbVmsScheduleDto data) {
         this.units.add(data);
     }

+ 0 - 44
src/main/java/com/its/vms/domain/enums/eVmsFormObjectData.java

@@ -1,44 +0,0 @@
-package com.its.vms.domain.enums;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum eVmsFormObjectData {
-
-    TEXT_OBJECT_DATA       ( 0, "0.문자열"),
-    GRAPHIC_OBJECT_DATA    ( 1, "1.이미지"),
-    GRAPHIC_ID_OBJECT_DATA ( 2, "2.이미지 ID");
-
-    private final int value;
-    private final String string;
-
-    private static final Map<Integer, eVmsFormObjectData> map;
-    static {
-        map = new HashMap<>();
-        for (eVmsFormObjectData e : values()) {
-            map.put(e.value, e);
-        }
-    }
-
-    public static eVmsFormObjectData getValue(int value) {
-        return map.get(value);
-    }
-    public static eVmsFormObjectData getValue(byte value) {
-        int intValue = (value & 0x0F);
-        return map.get(intValue);
-    }
-
-    eVmsFormObjectData(int value, String string) {
-        this.value  = value;
-        this.string = string;
-    }
-
-    public int getValue() {
-        return this.value;
-    }
-
-    @Override
-    public String toString() {
-        return this.string;
-    }
-}

+ 207 - 12
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -1,16 +1,22 @@
 package com.its.vms.dto;
 
+import com.its.app.AppUtils;
 import com.its.app.utils.SysUtils;
 import com.its.vms.domain.*;
+import com.its.vms.domain.enums.eVmsFormType;
 import com.its.vms.entity.TbVmsCtlr;
 import com.its.vms.entity.TbVmsCtlrStts;
 import com.its.vms.entity.TbVmsCtrlHs;
+import com.its.vms.service.VmsFormService;
 import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
 import com.its.vms.xnettcp.vms.process.TcpServerSendDataProcess;
-import com.its.vms.domain.VmsFrameSequence;
+import com.its.vms.xnettcp.vms.protocol.dto.*;
 import com.its.vms.xnettcp.vms.protocol.enums.eControlCommand;
 import com.its.vms.xnettcp.vms.protocol.enums.eControlDeviceId;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsImageType;
+import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDownloadForm;
 import com.its.vms.xnettcp.vms.task.VmsTimeoutTask;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
@@ -22,7 +28,10 @@ import java.io.Serializable;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
@@ -107,22 +116,25 @@ public class TbVmsCtlrDto implements Serializable {
     private VmsModule module;
     private VmsLuminance luminance;
     private VmsControlMode controlMode;
-    private VmsDownload download;
+    private byte txtOpCode;
 
     private TbVmsCtlrStts     stts;
     private int 			  netState;
     private boolean           isDupCon;
     private boolean           isDupLogin;
     private String 		      dstIpAddr;
-    private Channel           channel;
-    private Channel           dupChannel;
+    private Channel           channel = null;
+    private Channel           dupChannel = null;
     private InetSocketAddress cliReq;
     private long              syncTime;
     private VmsFrameSequence  seq;
 
+    private VmsDownloadFile downloadFile;           // 제어기로 다운로드할 파일정보(TB_VMS_DOWNLOAD)
+    private VmsDownloadData downloadData;
+    private ConcurrentHashMap<Integer, VmsDownloadForm> downloadFormMap = null;
+
     private ConcurrentHashMap<Long, TbVmsRltnIfscDto> rltnIfscMap = null;
 
-    //private ConcurrentHashMap<Long, C2CAuthenticatedMessage> registeredCommands = null;
     private ConcurrentHashMap<Long, Timer> registeredCommandsTimer = null;
     private ConcurrentHashMap<Long, TbVmsCtrlHs> userCommands = null;
 
@@ -136,6 +148,10 @@ public class TbVmsCtlrDto implements Serializable {
     public void init() {
         this.stts = new TbVmsCtlrStts(this.vmsCtlrNmbr);
         this.seq  = new VmsFrameSequence();
+
+        this.downloadData = new VmsDownloadData();
+        this.downloadFormMap = new ConcurrentHashMap<>();
+
         this.registeredCommandsTimer = new ConcurrentHashMap<>();
         this.userCommands = new ConcurrentHashMap<>();
         this.rltnIfscMap = new ConcurrentHashMap<>();
@@ -149,7 +165,7 @@ public class TbVmsCtlrDto implements Serializable {
         this.module = new VmsModule();
         this.luminance = new VmsLuminance();
         this.controlMode = new VmsControlMode();
-        this.download = new VmsDownload();
+        this.downloadFile = new VmsDownloadFile();
 
         this.connectCount = 0;
         this.connectTm = "-";
@@ -163,17 +179,40 @@ public class TbVmsCtlrDto implements Serializable {
         this.evehIngForm = false;
         this.evehEndForm = false;
 
+        initDownloadFileInfo();
+        initDownloadFormDataInfo();
         initNet();
 
         this.dataProcess = new TcpServerSendDataProcess(this);
         this.dataProcess.run();
     }
 
+    /**
+     * 파일 다운로드 정보 초기화
+     */
+    public void initDownloadFileInfo() {
+        this.downloadFile.setEnable(false);
+        this.downloadFile.setSaveFlag(true);
+        this.downloadFile.setDTimer(System.currentTimeMillis());
+        this.downloadFile.setCount(0);
+    }
+
+    /**
+     * 폼 파일 다운로드 정보를 초기화
+     * @return
+     */
+    public void initDownloadFormDataInfo() {
+        this.downloadData.init();
+        this.downloadFormMap.forEach((formId, obj) -> {
+            obj.setAlreadyDownload(false);
+        });
+    }
+
     public short getSeqNext() {
         return this.seq.nextValue();
     }
-    public void addRequestData(TcpServerSendData data) {
-        this.dataProcess.add(data);
+    public boolean addRequestData(TcpServerSendData data) {
+        return this.dataProcess.add(data);
     }
 
     public synchronized void connected(ChannelHandlerContext ctx) {
@@ -187,10 +226,8 @@ public class TbVmsCtlrDto implements Serializable {
 
     public synchronized void disconnected() {
         this.netState = NET.CLOSED;
-        //this.registeredCommands.clear();
         this.registeredCommandsTimer.clear();
         this.channel = null;
-        this.stts.initError();
         this.disConnectTm = SysUtils.getSysTimeStr();
         this.stts.initError();
     }
@@ -262,7 +299,7 @@ public class TbVmsCtlrDto implements Serializable {
      */
     public boolean sendData(ByteBuffer sendBuffer, int delayMilliSeconds, String packetDesc) {
         boolean result = false;
-        log.info("~REQUEST-{}. VMS {}", packetDesc, this.vmsCtlrNmbr);
+        log.info("~REQUEST-{}. VMS {}, {} Bytes.", packetDesc, this.vmsCtlrNmbr, sendBuffer.capacity());
         if (this.channel != null) {
             ChannelFuture f = this.channel.writeAndFlush(sendBuffer);
             f.awaitUninterruptibly();
@@ -447,4 +484,162 @@ public class TbVmsCtlrDto implements Serializable {
                 .protocolVer(this.protocolVer)
                 .build();
     }
+
+    /**
+     * 스케쥴 다운로드 초기화 작업을 수행한다.
+     * @param isSchedule
+     * @return
+     */
+    public boolean downloadScheduleForm(boolean isSchedule) {
+        VmsFormService formService = (VmsFormService) AppUtils.getBean(VmsFormService.class);
+        this.controlMode.setSchedule(isSchedule);
+        this.txtOpCode = (byte)0x00;
+        this.downloadData.init();
+
+        int forms = 0;
+        int formCnt = this.formManager.count();
+        if (formCnt == 0) {
+            log.info("downloadScheduleForm: VMS {}, Form Data Not Found.", this.vmsCtlrNmbr);
+            return true;
+        }
+        if (formCnt > this.maxPhaseNum) {
+            log.error("downloadScheduleForm: VMS {}, Form Count Over: {}/{} EA.", this.vmsCtlrNmbr, formCnt, this.maxPhaseNum);
+            formCnt = this.maxPhaseNum;
+        }
+
+        VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
+        for (int ii = 0; ii < formCnt; ii++) {
+            VmsForm pForm = this.formManager.getItem(ii);
+            if (!pForm.isSuccess()) {
+                log.error("VMS {}, SEQ {}, SUCCESS {}", this.vmsCtlrNmbr, ii, pForm.isSuccess());
+                continue;
+            }
+            Integer vmsFormId = pForm.getVmsFormId();
+            TbVmsFormDto vmsForm = formService.find(vmsFormId);
+            if (vmsForm == null) {
+                log.error("VMS {}, SEQ {}, FORM ID {} Not Found.", this.vmsCtlrNmbr, ii, vmsFormId);
+                continue;
+            }
+
+            units[forms].setVmsFormId(vmsFormId);
+            units[forms].setDownload(true);
+            units[forms].setFormIdx(ii);
+            units[forms].setBitmapId(forms + 1000);
+            units[forms].setFormNo(9000 + forms);
+            units[forms].setDisplaySec(pForm.getDsplHh());
+            units[forms].setDisplayType(pForm.getVmsFormDsplMthdCd());
+            units[forms].setBkClr(pForm.getVmsFormColrCd());
+
+            VmsDownloadForm downloadForm = this.downloadFormMap.get(vmsFormId);
+            units[forms].setBitmapId((vmsFormId % 1000) + 1000);
+            // 홍보폼이면서 신규폼이 아니면서 이전 다운로드 목록이 존재하는 경우에 다운로드 여부를 체크한다.
+            if (vmsForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue() && !vmsForm.isNewForm() && downloadForm != null) {
+                if (downloadForm.isAlreadyDownload()) {
+                    // 이미 이전에 다운로드를 했기때문에 이번에는 제어기로 다운로드를 하지 않는다.
+                    units[forms].setDownload(false);
+                }
+            }
+
+            // 이전에 다운로드한 정보가 존재하면
+            if (downloadForm != null) {
+                if (!vmsForm.getUpdtDt().equals(downloadForm.getUpdtDt())) {
+                    // 업데이트시각이 다르기때문에 신규폼으로 판단한다.
+                    downloadForm.setAlreadyDownload(false);
+                    downloadForm.setUpdtDt(vmsForm.getUpdtDt());
+                    units[forms].setDownload(true);
+                }
+            }
+            else {
+                downloadForm = new VmsDownloadForm();
+                downloadForm.setVmsFormId(vmsFormId);
+                downloadForm.setAlreadyDownload(false);
+                downloadForm.setUpdtDt(vmsForm.getUpdtDt());
+                this.downloadFormMap.put(vmsFormId, downloadForm);
+            }
+            forms++;
+        }
+
+        for (int ii = 0; ii < forms; ii++) {
+            log.info("VMS {}, Form schedule({}), VMS_FORM_ID: {}, FormIdx: {}, FormId: {}, BitmapId: {}, IsDownload: {}",
+                    this.vmsCtlrNmbr, ii, units[ii].getVmsFormId(), units[ii].getFormIdx(), units[ii].getFormNo(), units[ii].getBitmapId(), units[ii].isDownload());
+        }
+
+        this.downloadData.setMaxSchedule(forms);
+        this.downloadData.setDownloadCnt(0);
+        this.downloadData.setDefault("B".equals(this.operMode));
+        if (this.downloadData.isDefault()) {
+            // 기본모드인 경우
+            // 폼 ID "FID0000" 에 여러개의 폼을 다운로드 해야함.
+            //e_vms_download_form          = 0x9A,//    Download Form                           송신    Form download                               센터 → VMS
+            //e_vms_file_download          = 0x82,//    데이터 다운로드                         송신    INI, CFG , Bitmap , Data파일송신            센터 → VMS
+            //e_vms_download_schedule_form = 0x96,//    Display Schedule Form                   송신    계획된 Form 표출 요구                       센터 → VMS
+            //e_vms_blank                  = 0x9E,//    Blank                                   송신    schedule 표출                               센터 → VMS
+            downloadDefaultSchedule();
+        }
+        else {
+            // 스케쥴 모드인 경우(A:자동, F:고정)
+            //e_vms_download_form          = 0x9A,//    Download Form                           송신    Form download                               센터 → VMS
+            //e_vms_file_download          = 0x82,//    데이터 다운로드                         송신    INI, CFG , Bitmap , Data파일송신            센터 → VMS
+            //e_vms_download_schedule_form = 0x96,//    Display Schedule Form                   송신    계획된 Form 표출 요구                       센터 → VMS
+            //e_vms_blank                  = 0x9E,//    Blank                                   송신    schedule 표출                               센터 → VMS
+            downloadDefaultSchedule();
+        }
+
+        return true;
+    }
+
+    public boolean downloadDefaultSchedule() {
+        // Download Form  (기본폼은 하나의 폼에 여러폼을 다운로드한다.)
+        int formCnt = this.downloadData.getMaxSchedule();
+        if (formCnt <= 0) {
+            log.info("VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
+            return true;
+        }
+
+        formCnt = 1;
+        VmsFormDataDto formData = new VmsFormDataDto(0, formCnt);
+        VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
+        for (int ii = 0; ii < formCnt; ii++) {
+            VmsForm pForm = this.formManager.getItem(units[ii].getFormIdx());
+            List<VmsFormObject> objects = pForm.getObjects();
+            VmsFormDto formDto = formData.addForm(units[ii].getVmsFormId(), units[ii].getDisplaySec(), units[ii].getDisplayType(), units[ii].getBkClr(), objects.size());
+            for (int jj = 0; jj < objects.size(); jj++) {
+                VmsFormObject object = objects.get(jj);
+
+                int objSize = object.getObjectSize();
+                int blinking = object.getBlinking();
+                int posX = object.getPosX();
+                int posY = object.getPosY();
+                int bkClr = object.getBkColor();
+
+                VmsFormObj formObjDto;
+                if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
+                    int clrR = object.getFontClr().getRed();
+                    int clrG = object.getFontClr().getGreen();
+                    int clrB = object.getFontClr().getBlue();
+                    formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, object.getFontSize(), object.getFontNameCd(), object.getFontBold(), object.getTextData());
+                }
+                else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
+                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+                }
+                else {
+                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+                    //formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), object.getImageData());
+                }
+                formObjDto.calSize();
+                formDto.addObject(formObjDto);
+            }
+            formDto.calObjCount();
+        }
+        formData.calFormCount();
+
+        VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(this, formData);
+        return sendData(downloadForm.getByteBuffer(), 10, downloadForm.getOpCodeDesc());
+    }
+
+    public boolean downloadAutoFixSchedule() {
+        // Download Form  (기본폼은 하나의 폼에 하나의 폼만 다운로드한다.)
+        return true;
+    }
+
 }

+ 2 - 3
src/main/java/com/its/vms/process/DbmsDataProcess.java

@@ -14,7 +14,6 @@ import com.its.vms.entity.TbVmsCtlrStts;
 import com.its.vms.entity.TbVmsCtrlHs;
 import com.its.vms.entity.TbVmsDsplPrst;
 import com.its.vms.service.AppRepositoryService;
-import com.its.vms.xnettcp.vms.process.TcpServerSendData;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -123,8 +122,8 @@ public class DbmsDataProcess {
                             TbVmsDsplPrst dsplPrst = vmsForm.toDsplPrstEntity(vmsObj, ii+1, dsplDt, "N");
                             dsplPrstList.add(dsplPrst);
                             if (vmsObj.getNetState() != NET.CLOSED) {
-                                TcpServerSendData reqData = new TcpServerSendData(TcpServerSendData.DATA_REQ_FORM_DOWNLOAD, null);
-                                vmsObj.addRequestData(reqData);
+                                //TcpServerSendData reqData = new TcpServerSendData(TcpServerSendData.DATA_REQ_FORM_DOWNLOAD, null);
+                                //vmsObj.addRequestData(reqData);
                             }
                             else {
                                 dsplPrstHsList.add(dsplPrst);

+ 0 - 1
src/main/java/com/its/vms/service/VmsCtlrService.java

@@ -54,7 +54,6 @@ public class VmsCtlrService {
             for (TbVmsCtlr dto : infoList) {
                 log.info("VmsCtlrService.loadCtlrInfo: {}", dto);
                 TbVmsCtlrDto vmsObj = dto.toDto();
-                //TbVmsCtlrDto oldObj = this.repoService.getCtrlMap(vmsObj.getCtlrNmbr());
                 if (vmsObj.getCtlrId().trim().equals("")) {
                     log.error("VmsCtlrService.loadCtlrInfo: Controller Ip Address Error: {}", vmsObj);
                     continue;

+ 12 - 7
src/main/java/com/its/vms/service/VmsManageService.java

@@ -5,7 +5,10 @@ import com.its.app.utils.FloodFill;
 import com.its.app.utils.ItsUtils;
 import com.its.vms.config.ApplicationConfig;
 import com.its.vms.dao.mapper.VmsManageMapper;
-import com.its.vms.domain.*;
+import com.its.vms.domain.VmsConstants;
+import com.its.vms.domain.VmsForm;
+import com.its.vms.domain.VmsFormObject;
+import com.its.vms.domain.VmsSchedule;
 import com.its.vms.domain.enums.*;
 import com.its.vms.dto.*;
 import com.its.vms.entity.TbVmsIncd;
@@ -17,8 +20,10 @@ import com.its.vms.process.DbmsDataProcess;
 import com.its.vms.process.DbmsDataType;
 import com.its.vms.xnettcp.vms.process.TcpServerRecvDataProcess;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.dto.VmsReqControlDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -107,7 +112,7 @@ public class VmsManageService {
                 byte[] command = new byte[1];
                 command[0] = controlOnOff;
                 VmsReqControlDto control = new VmsReqControlDto(eVmsReqControl.vms_req_control_signboard, command);
-                TcpServerSendData reqData = new TcpServerSendData(TcpServerSendData.DATA_REQ_CONTROL, control);
+                TcpServerSendData reqData = new TcpServerSendData(eVmsOpCode.OP_VMS_STATUS_CONTROL, control);
                 vmsCtlr.addRequestData(reqData);
                 //TODO: 요청패킷 처리하는 곳에서 네트워크 상태에 따라 메모리 정보 셋팅
             }
@@ -965,13 +970,13 @@ public class VmsManageService {
                         case 407: //@미세먼지등급 이미지
                         case 408: //@초미세먼지등급 이미지
                         case 413: //@오존등급이미지
-                            formObj.setObjectKind(eVmsFormObjectData.GRAPHIC_ID_OBJECT_DATA.getValue());
+                            formObj.setObjectKind(eVmsFormObjectKind.OBJECT_BITMAP_ID);
                             break;
                         case  3: //소통정보배경이미지
-                            formObj.setObjectKind(eVmsFormObjectData.GRAPHIC_OBJECT_DATA.getValue());
+                            formObj.setObjectKind(eVmsFormObjectKind.OBJECT_BITMAP);
                             break;
                         default:
-                            formObj.setObjectKind(eVmsFormObjectData.TEXT_OBJECT_DATA.getValue());
+                            formObj.setObjectKind(eVmsFormObjectKind.OBJECT_TEXT);
                             break;
                     }
 
@@ -1003,7 +1008,7 @@ public class VmsManageService {
                         }
                     }
 
-                    if (formObj.getObjectKind() != eVmsFormObjectData.TEXT_OBJECT_DATA.getValue()) {
+                    if (formObj.getObjectKind() != eVmsFormObjectKind.OBJECT_TEXT) {
                         if (obj.getVmsFormObjectTypeCd() == 200 || obj.getVmsFormObjectTypeCd() == 300) {
                             // 200:동영상이미지, 300:스트리밍영상이미지
                             TbVmsSymbLibDto symb = this.symbService.find(formObj.getImageId());

+ 3 - 2
src/main/java/com/its/vms/xnettcp/vms/VmsTcpCommServerInitializer.java

@@ -12,6 +12,8 @@ import com.its.vms.xnettcp.vms.handler.VmsServerPacketInboundHandler;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
+import io.netty.handler.logging.LogLevel;
+import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.timeout.IdleStateHandler;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -31,7 +33,6 @@ public class VmsTcpCommServerInitializer extends ChannelInitializer<Channel> {
     @Override
     protected void initChannel(Channel channel) throws Exception {
         String ipAddress  = NettyUtils.getRemoteIpAddress(channel);
-        //TbVmsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         TbVmsCtlrDto obj = this.repoService.getIpAddrMap(ipAddress);
         if (obj == null) {
             log.error("VmsTcpCommServerInitializer.----initChannel: {}, Unknown ip address. will be closed.", ipAddress);
@@ -46,7 +47,7 @@ public class VmsTcpCommServerInitializer extends ChannelInitializer<Channel> {
                     TimeUnit.SECONDS);
 
             ChannelPipeline pipeline = channel.pipeline();
-            //pipeline.addLast(new LoggingHandler(LogLevel.INFO));
+            pipeline.addLast(new LoggingHandler(LogLevel.INFO));
             pipeline.addLast("vmsTcpIdleStateHandler", tcpIdleStateHandler);
             pipeline.addLast("vmsServerIdleStateHandler", new VmsServerIdleStateHandler(obj, this.dbmsDataProcess));   // packet idle state handler, event handler
             if (obj.getProtocolVer() == 0) {

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDleStuffingDecoder.java

@@ -4,7 +4,7 @@ import com.its.vms.config.CommunicationConfig;
 import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.service.AppRepositoryService;
 import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.impl.VmsResFramePacket;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.Channel;

+ 4 - 8
src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerIdleStateHandler.java

@@ -2,13 +2,14 @@ package com.its.vms.xnettcp.vms.handler;
 
 import com.its.app.AppUtils;
 import com.its.app.utils.NettyUtils;
-import com.its.vms.entity.TbVmsCtlrStts;
 import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.entity.TbVmsCtlrStts;
 import com.its.vms.process.DbmsData;
 import com.its.vms.process.DbmsDataProcess;
 import com.its.vms.process.DbmsDataType;
 import com.its.vms.service.AppRepositoryService;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelDuplexHandler;
 import io.netty.channel.ChannelFuture;
@@ -80,8 +81,8 @@ public class VmsServerIdleStateHandler extends ChannelDuplexHandler {
 
         this.vmsObj.connected(ctx);
         TbVmsCtlrStts stts = this.vmsObj.getStts().clone();
-        this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_STTS, false, stts));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_CONNECTED, null));
+        this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_STTS, false, stts)); // 제어기 접속 상태 업데이트
+        this.vmsObj.addRequestData(new TcpServerSendData(eVmsOpCode.OP_VMS_STATUS_REQ, null));    // 최초 접속시 제어기 상태정보 요청
 
         MDC.remove(this.vmsObj.getLogKey());
         MDC.clear();
@@ -116,7 +117,6 @@ public class VmsServerIdleStateHandler extends ChannelDuplexHandler {
         MDC.put("id", this.vmsObj.getLogKey());
         log.error("VmsServerIdleStateHandler.--exceptionCaught: {}, {}, Exception: {}", ipAddress, ctx.channel().toString(), cause);
         VmsServerIdleStateHandler.disconnectChannel(this.vmsObj, ctx.channel());
-        //super.exceptionCaught(ctx, cause);
         MDC.remove(this.vmsObj.getLogKey());
         MDC.clear();
     }
@@ -125,7 +125,6 @@ public class VmsServerIdleStateHandler extends ChannelDuplexHandler {
         // 로그인 하지 않은 또는 비정상 접속 네트워크 세션 종료(로그인 처리를 수행하지 않은 세션에 대한 종료)
         String ipAddress = NettyUtils.getRemoteIpAddress(channel);
         if (AObj == null) {
-            //AObj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
             AppRepositoryService repoService = (AppRepositoryService) AppUtils.getBean(AppRepositoryService.class);
             AObj = repoService.getIpAddrMap(ipAddress);
         }
@@ -134,9 +133,6 @@ public class VmsServerIdleStateHandler extends ChannelDuplexHandler {
         }
         try {
             log.error("VmsServerIdleStateHandler.disconnectChannel: {}, {}", ipAddress, channel.toString());
-            //if (!channel.isActive()) {
-            //    log.error("VmsServerIdleStateHandler.disconnectChannel: {}, channel already closed.", ipAddress);
-            //}
 
             channel.flush();
             ChannelFuture f = channel.disconnect().awaitUninterruptibly();  // channelInactive event fire

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java

@@ -104,7 +104,7 @@ public class TcpServerRecvDataProcess {
                 case OP_VMS_DISPLAY_FORM_ID:
                     response = new VmsResDisplayFormId(vmsObj, packet);
                     break;
-                case OP_VMS_UPLOAD_SCHEDULE_FORM:
+                case OP_VMS_UPLOAD_FORM_SCHEDULE:
                     response = new VmsResUploadScheduleForm(vmsObj, packet);
                 default:
                     log.warn("TcpServerRecvDataProcess.process: Unknown Op Code Packet: VMS {}, {}", vmsObj.getVmsCtlrNmbr(), packet.getOpCode());

+ 4 - 18
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendData.java

@@ -1,34 +1,20 @@
 package com.its.vms.xnettcp.vms.process;
 
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.Getter;
 import lombok.Setter;
 
 @Getter
 @Setter
 public class TcpServerSendData {
-    public static final int DATA_CONNECTED = 0;
-    public static final int DATA_DISCONNECTED = 1;
-    public static final int DATA_REQ_DEVICE_ID = 2;
-    public static final int DATA_REQ_STATUS = 3;
-    public static final int DATA_REQ_POWER_MODULE_STATUS = 4;
-    public static final int DATA_REQ_DISPLAY_MODULE_STATUS = 5;
-    public static final int DATA_REQ_PARAMETER = 6;
-    public static final int DATA_REQ_STOP_IMAGE = 7;
-    public static final int DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM = 8;
-    public static final int DATA_REQ_DISPLAY_DEFAULT_FORM = 9;
-    public static final int DATA_REQ_BLANK = 10;
-    public static final int DATA_REQ_DISPLAY_FORM_ID = 11;
-    public static final int DATA_REQ_UPLOAD_SCHEDULE_FROM = 12;
-    public static final int DATA_REQ_CONTROL = 28;
-    public static final int DATA_REQ_FORM_DOWNLOAD = 29;
 
     private long requestTime;
-    private int command;
+    private eVmsOpCode opCode;
     private Object data;
 
-    public TcpServerSendData(int command, Object data) {
+    public TcpServerSendData(eVmsOpCode opCode, Object data) {
         this.requestTime = System.currentTimeMillis();
-        this.command = command;
+        this.opCode = opCode;
         this.data = data;
     }
 

+ 23 - 19
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendDataProcess.java

@@ -45,58 +45,58 @@ public class TcpServerSendDataProcess {
 
         boolean isConnected = (this.vmsObj.getNetState() > NET.CLOSED && this.vmsObj.getChannel() != null);
         boolean isRequested = false;
-        log.info("TcpServerReqDataProcess.process: VMS {}, command({}), connected({}), Elapsed: {} ms.", this.vmsObj.getVmsCtlrNmbr(), data.getCommand(), isConnected, data.elapsed());
+        log.info("TcpServerReqDataProcess.process: VMS {}, command({}), connected({}), Elapsed: {} ms.", this.vmsObj.getVmsCtlrNmbr(), data.getOpCode(), isConnected, data.elapsed());
 
         boolean result = true;
         if (isConnected) {
             try {
-                switch (data.getCommand()) {
-                    case TcpServerSendData.DATA_CONNECTED:
+                switch (data.getOpCode()) {
+                    case OP_VMS_STATUS_REQ:
                         VmsReqStatus reqStatus = new VmsReqStatus(this.vmsObj);
                         result = this.vmsObj.sendData(reqStatus.getByteBuffer(), 10, reqStatus.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_DEVICE_ID:
-                        // 디바이스 인증요청에 대한 응답
-                        // 디바이스 정보가 일치 하지 않으면 네트워크 연결을 종료한다.
-                        break;
-                    case TcpServerSendData.DATA_REQ_POWER_MODULE_STATUS:
+                    case OP_VMS_POWER_MODULE_STATUS_REQ:
                         VmsReqPowerModuleStatus reqPowerModuleStatus = new VmsReqPowerModuleStatus(this.vmsObj);
                         result = this.vmsObj.sendData(reqPowerModuleStatus.getByteBuffer(), 10, reqPowerModuleStatus.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_DISPLAY_MODULE_STATUS:
+                    case OP_VMS_DISPLAY_MODULE_STATUS_REQ:
                         VmsReqDisplayModuleStatus reqDisplayModuleStatus = new VmsReqDisplayModuleStatus(this.vmsObj);
                         result = this.vmsObj.sendData(reqDisplayModuleStatus.getByteBuffer(), 10, reqDisplayModuleStatus.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_PARAMETER:
+                    case OP_VMS_PARAMETER_REQ:
                         VmsReqParameter reqParameter = new VmsReqParameter(this.vmsObj);
                         result = this.vmsObj.sendData(reqParameter.getByteBuffer(), 10, reqParameter.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_STOP_IMAGE:
+//                    case OP_VMS_DOWNLOAD_FORM_SCHEDULE:
+//                        VmsJobDownloadScheduleFrom downloadScheduleFrom = new VmsJobDownloadScheduleFrom(this.vmsObj, (boolean) data.getData());
+//                        result = downloadScheduleFrom.process();
+//                        break;
+                    case OP_VMS_STOP_IMAGE_REQ:
                         VmsReqStopImage reqStopImage = new VmsReqStopImage(this.vmsObj, (Integer)data.getData());
                         result = this.vmsObj.sendData(reqStopImage.getByteBuffer(), 10, reqStopImage.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM:
+                    case OP_VMS_UPLOAD_CURRENT_DISPLAY_FORM:
                         VmsReqUploadCurrentDisplayForm reqUploadCurrentDisplayForm = new VmsReqUploadCurrentDisplayForm(this.vmsObj);
                         result = this.vmsObj.sendData(reqUploadCurrentDisplayForm.getByteBuffer(), 10, reqUploadCurrentDisplayForm.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_DISPLAY_DEFAULT_FORM:
+                    case OP_VMS_DISPLAY_DEFAULT_FORM:
                         VmsReqDisplayDefaultForm reqDisplayDefaultForm = new VmsReqDisplayDefaultForm(this.vmsObj);
                         result = this.vmsObj.sendData(reqDisplayDefaultForm.getByteBuffer(), 10, reqDisplayDefaultForm.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_BLANK:
+                    case OP_VMS_BLANK:
                         VmsReqBlank reqBlank = new VmsReqBlank(this.vmsObj);
                         result = this.vmsObj.sendData(reqBlank.getByteBuffer(), 10, reqBlank.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_DISPLAY_FORM_ID:
+                    case OP_VMS_DISPLAY_FORM_ID:
                         VmsReqDisplayFromId reqDisplayFormId = new VmsReqDisplayFromId(this.vmsObj, (Integer)data.getData());
                         result = this.vmsObj.sendData(reqDisplayFormId.getByteBuffer(), 10, reqDisplayFormId.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_REQ_UPLOAD_SCHEDULE_FROM:
+                    case OP_VMS_UPLOAD_FORM_SCHEDULE:
                         VmsReqUploadScheduleForm reqUploadScheduleFrom = new VmsReqUploadScheduleForm(this.vmsObj);
                         result = this.vmsObj.sendData(reqUploadScheduleFrom.getByteBuffer(), 10, reqUploadScheduleFrom.getOpCodeDesc());
                         break;
 
-                    case TcpServerSendData.DATA_REQ_CONTROL:
+                    case OP_VMS_STATUS_CONTROL:
                         VmsReqControlDto control = (VmsReqControlDto) data.getData();
                         byte[] command = control.getCommand();
                         // TODO: 전송성공하면
@@ -119,7 +119,7 @@ public class TcpServerSendDataProcess {
             }
         }
         if (!result) {
-            log.info("TcpServerReqDataProcess.process: VMS {}, request failed. command({}), connected({}), Requested({}).", this.vmsObj.getVmsCtlrNmbr(), data.getCommand(), isConnected, isRequested);
+            log.info("TcpServerReqDataProcess.process: VMS {}, request failed. command({}), connected({}), Requested({}).", this.vmsObj.getVmsCtlrNmbr(), data.getOpCode(), isConnected, isRequested);
         }
         //log.info("TcpServerReqDataProcess.process: VMS {}, command({}), connected({}), Requested({}).", this.vmsObj.getVmsCtlrNmbr(), data.getCommand(), isConnected, isRequested);
 
@@ -127,17 +127,21 @@ public class TcpServerSendDataProcess {
         MDC.clear();
     }
 
-    public void add(TcpServerSendData data) {
+    public boolean add(TcpServerSendData data) {
+        boolean result = true;
         try {
             //offer => full -> return
             //add   => full -> wait
             //큐가 차더라도 바로 리턴함.
             if (!this.reqCommandBlockingQueue.offer(data)) {
                 log.error("TcpServerReqDataProcess[{}].add: QueueFull: {}", this.vmsObj.getVmsCtlrNmbr(), this.reqCommandBlockingQueue.size());
+                result = false;
             }
         } catch (Exception e) {
             log.error("TcpServerReqDataProcess[{}].add: QueueError: {}", this.vmsObj.getVmsCtlrNmbr(), e.getMessage());
+            result = false;
         }
+        return result;
     }
 
 }

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResBlank.java

@@ -4,7 +4,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
@@ -27,9 +27,9 @@ public class VmsResBlank implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResBlank.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResBlank.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResBlank.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResBlank.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResBlank implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResBlank.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResBlank.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDataDownload.java

@@ -6,7 +6,7 @@ import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -27,9 +27,9 @@ public class VmsResDataDownload implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDataDownload.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDataDownload.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResDataDownload.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDataDownload.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResDataDownload implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResDataDownload.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResDataDownload.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDataUpload.java

@@ -27,9 +27,9 @@ public class VmsResDataUpload implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDataUpload.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDataUpload.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 6) {
-            log.error("VmsResDataUpload.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDataUpload.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayDefaultForm.java

@@ -4,7 +4,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
@@ -27,9 +27,9 @@ public class VmsResDisplayDefaultForm implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDisplayDefaultForm.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDisplayDefaultForm.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResDisplayDefaultForm.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDisplayDefaultForm.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResDisplayDefaultForm implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResDisplayDefaultForm.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResDisplayDefaultForm.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayFormId.java

@@ -4,7 +4,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
@@ -27,9 +27,9 @@ public class VmsResDisplayFormId implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDisplayFormId.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDisplayFormId.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResDisplayFormId.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDisplayFormId.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResDisplayFormId implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResDisplayFormId.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResDisplayFormId.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 6 - 5
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDisplayModuleStatus.java

@@ -24,16 +24,17 @@ public class VmsResDisplayModuleStatus implements VmsResponse {
     @Override
     public boolean process() {
 
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_PARAMETER, null));
+        // 제어기 파라미터 정보 요청
+        this.vmsObj.addRequestData(new TcpServerSendData(eVmsOpCode.OP_VMS_PARAMETER_REQ, null));
 
         this.x = 0;
         this.y = 0;
         this.stts = "";
 
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDisplayModuleStatus.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDisplayModuleStatus.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 2) {
-            log.error("VmsResDisplayModuleStatus.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDisplayModuleStatus.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -43,11 +44,11 @@ public class VmsResDisplayModuleStatus implements VmsResponse {
         this.x = byteBuffer.get(0) & 0xFF;
         this.y = byteBuffer.get(1) & 0xFF;
         if (this.x <= 0 || this.y <= 0) {
-            log.error("VmsResDisplayModuleStatus.process: Module Count Error {}/{}.", this.x, this.y);
+            log.error("VmsResDisplayModuleStatus.process: VMS {}, Module Count Error {}/{}.", this.vmsObj.getVmsCtlrNmbr(), this.x, this.y);
             return false;
         }
         if (body.length < ((this.x * this.y) + 2)) {
-            log.error("VmsResDisplayModuleStatus.process: Module Count and Body Length Error {}/{}, {}.", this.x, this.y, body.length);
+            log.error("VmsResDisplayModuleStatus.process: VMS {}, Module Count and Body Length Error {}/{}, {}.", this.vmsObj.getVmsCtlrNmbr(), this.x, this.y, body.length);
             return false;
         }
 

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadForm.java

@@ -6,7 +6,7 @@ import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -27,9 +27,9 @@ public class VmsResDownloadForm implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDownloadForm.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDownloadForm.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResDownloadForm.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDownloadForm.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResDownloadForm implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResDownloadForm.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResDownloadForm.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 6 - 6
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadScheduleForm.java → src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResDownloadFormSchedule.java

@@ -6,7 +6,7 @@ import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -14,7 +14,7 @@ import java.nio.ByteBuffer;
 
 @Slf4j
 @RequiredArgsConstructor
-public class VmsResDownloadScheduleForm implements VmsResponse {
+public class VmsResDownloadFormSchedule implements VmsResponse {
 
     private final TbVmsCtlrDto vmsObj;
     private final VmsFramePacket resFramePacket;
@@ -27,9 +27,9 @@ public class VmsResDownloadScheduleForm implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResDownloadScheduleForm.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResDownloadFormSchedule.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResDownloadScheduleForm.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResDownloadFormSchedule.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResDownloadScheduleForm implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResDownloadScheduleForm.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResDownloadFormSchedule.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }
@@ -57,7 +57,7 @@ public class VmsResDownloadScheduleForm implements VmsResponse {
 
     public String toString() {
         StringBuilder data = new StringBuilder();
-        data.append(String.format("RESPONSE-%s. VMS %d", eVmsOpCode.OP_VMS_DOWNLOAD_SCHEDULE_FORM, this.vmsObj.getVmsCtlrNmbr()));
+        data.append(String.format("RESPONSE-%s. VMS %d", eVmsOpCode.OP_VMS_DOWNLOAD_FORM_SCHEDULE, this.vmsObj.getVmsCtlrNmbr()));
         data.append(System.getProperty("line.separator"));
         data.append(String.format("Download Schedule Form: %s, ", this.success));
         data.append(String.format("NAK: %s", this.error));

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResFormDataDisplay.java

@@ -6,7 +6,7 @@ import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -27,9 +27,9 @@ public class VmsResFormDataDisplay implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResFormDataDisplay.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResFormDataDisplay.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResFormDataDisplay.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResFormDataDisplay.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResFormDataDisplay implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResFormDataDisplay.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResFormDataDisplay.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 11 - 12
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResParameter.java

@@ -1,11 +1,11 @@
 package com.its.vms.xnettcp.vms.process.response.impl;
 
+import com.its.vms.domain.NET;
 import com.its.vms.dto.TbVmsCtlrDto;
-import com.its.vms.xnettcp.vms.process.TcpServerSendData;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
-import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -42,18 +42,10 @@ public class VmsResParameter implements VmsResponse {
     @Override
     public boolean process() {
 
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_STOP_IMAGE, 0xFF));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM, null));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_DISPLAY_DEFAULT_FORM, null));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_BLANK, null));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_DISPLAY_FORM_ID, 9000));
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_UPLOAD_SCHEDULE_FROM, null));
-
-
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResParameter.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResParameter.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 17) {
-            log.error("VmsResParameter.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResParameter.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -87,6 +79,13 @@ public class VmsResParameter implements VmsResponse {
 
         log.info("{}", toString());
 
+        if (this.vmsObj.getNetState() == NET.LOGIN_REQ) {
+            // 최초 접속후, 상태정보->파워모듈상태->표출모듈상태->파라미터정보 조회 완료후
+            // 네트워크 로그인 상태로 설정하고 스케쥴을 다운로드 하도록 한다.
+            this.vmsObj.setNetState(NET.LOGINED);
+            this.vmsObj.downloadScheduleForm(false);
+        }
+
         return true;
     }
 

+ 6 - 5
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResPowerModuleStatus.java

@@ -23,15 +23,16 @@ public class VmsResPowerModuleStatus implements VmsResponse {
     @Override
     public boolean process() {
 
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_DISPLAY_MODULE_STATUS, null));
+        // 제어기 표출모듈상태 요청
+        this.vmsObj.addRequestData(new TcpServerSendData(eVmsOpCode.OP_VMS_DISPLAY_MODULE_STATUS_REQ, null));
 
         this.moduleCnt = 0;
         this.stts = "";
 
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResPowerModuleStatus.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResPowerModuleStatus.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 2) {
-            log.error("VmsResPowerModuleStatus.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResPowerModuleStatus.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -40,11 +41,11 @@ public class VmsResPowerModuleStatus implements VmsResponse {
         byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
         this.moduleCnt = byteBuffer.get(0) & 0xFF;
         if (this.moduleCnt <= 0) {
-            log.error("VmsResPowerModuleStatus.process: Module Count Error {}.", this.moduleCnt);
+            log.error("VmsResPowerModuleStatus.process: VMS {}, Module Count Error {}.", this.vmsObj.getVmsCtlrNmbr(), this.moduleCnt);
             return false;
         }
         if (body.length < this.moduleCnt + 2) {
-            log.error("VmsResPowerModuleStatus.process: Module Count and Body Length Error {}, {}.", this.moduleCnt, body.length);
+            log.error("VmsResPowerModuleStatus.process: VMS {}, Module Count and Body Length Error {}, {}.", this.vmsObj.getVmsCtlrNmbr(), this.moduleCnt, body.length);
             return false;
         }
 

+ 16 - 5
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatus.java

@@ -1,11 +1,12 @@
 package com.its.vms.xnettcp.vms.process.response.impl;
 
+import com.its.vms.domain.NET;
 import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
-import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
@@ -38,12 +39,21 @@ public class VmsResStatus implements VmsResponse {
     @Override
     public boolean process() {
 
-        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_POWER_MODULE_STATUS, null));
+        // 상태정보 최초 수신시
+        if (this.vmsObj.getNetState() == NET.LOGIN_REQ) {
+            if (this.vmsObj.getVmsCtlrNmbr() != this.resFramePacket.getHead().getControllerNo() &&
+                this.vmsObj.getCtlrLocalNo() != this.resFramePacket.getHead().getControllerNo()) {
+                log.error("VmsResStatus.process: Controller Number Error: VMS {}, NMBR {}, LOCAL {}, RECV {} ",
+                        this.vmsObj.getVmsCtlrNmbr(), this.vmsObj.getVmsCtlrNmbr(), this.vmsObj.getCtlrLocalNo(), this.resFramePacket.getHead().getControllerNo());
+                return false;
+            }
+            this.vmsObj.initDownloadFormDataInfo(); // 다운로드 할 폼의 정보를 초기화.
+        }
 
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResStatus.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResStatus.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 14) {
-            log.error("VmsResStatus.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResStatus.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -85,7 +95,8 @@ public class VmsResStatus implements VmsResponse {
 
         log.info("{}", toString());
 
-        return true;
+        // 제어기 전원모듈상태 요청
+        return this.vmsObj.addRequestData(new TcpServerSendData(eVmsOpCode.OP_VMS_POWER_MODULE_STATUS_REQ, null));
     }
 
     public String toString() {

+ 4 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatusControl.java

@@ -4,7 +4,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.RequiredArgsConstructor;
@@ -27,9 +27,9 @@ public class VmsResStatusControl implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResStatusControl.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResStatusControl.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 1) {
-            log.error("VmsResStatusControl.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResStatusControl.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
@@ -42,7 +42,7 @@ public class VmsResStatusControl implements VmsResponse {
                 byte errorCode = byteBuffer.get();
                 this.error = eVmsErrorCode.getValue(errorCode & 0xFF);
                 if (this.error == null) {
-                    log.error("VmsResStatusControl.process: Unknown error code: {} ", String.format("%02X", errorCode & 0xFF));
+                    log.error("VmsResStatusControl.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("%02X", errorCode & 0xFF));
                     this.error = eVmsErrorCode.ERROR_UNKNOWN;
                 }
             }

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStopImage.java

@@ -26,9 +26,9 @@ public class VmsResStopImage implements VmsResponse {
     @Override
     public boolean process() {
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResStopImage.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResStopImage.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 21) {
-            log.error("VmsResStopImage.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResStopImage.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
         ByteBuffer byteBuffer = ByteBuffer.wrap(body);

+ 4 - 5
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadCurrentDisplayForm.java

@@ -5,7 +5,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.response.VmsResponse;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsErrorCode;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
@@ -30,12 +30,11 @@ public class VmsResUploadCurrentDisplayForm implements VmsResponse {
          * ACK/NAK 확인
          */
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResUploadCurrentDisplayForm.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResUploadCurrentDisplayForm.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 2) {
-            log.error("VmsResUploadCurrentDisplayForm.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResUploadCurrentDisplayForm.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
-        //log.info("Current Display Form: {}", SysUtils.byteArrayToHex(body));
 
         byte result = body[0];
         if (result == VmsProtocolConst.VMS_ACK) {
@@ -45,7 +44,7 @@ public class VmsResUploadCurrentDisplayForm implements VmsResponse {
             this.success = false;
             this.error = eVmsErrorCode.getValue(result & 0xFF);
             if (this.error == null) {
-                log.error("VmsResUploadCurrentDisplayForm.process: Unknown error code: {} ", String.format("0x%02X", result & 0xFF));
+                log.error("VmsResUploadCurrentDisplayForm.process: VMS {}, Unknown error code: {} ", this.vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", result & 0xFF));
                 this.error = eVmsErrorCode.ERROR_UNKNOWN;
             }
             this.content = "NONE";

+ 3 - 4
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadScheduleForm.java

@@ -23,13 +23,12 @@ public class VmsResUploadScheduleForm implements VmsResponse {
     public boolean process() {
 
         byte[] body = this.resFramePacket.getBody();
-        log.info("VmsResUploadScheduleForm.process: body length: {} ", body != null ? body.length : 0);
+        log.info("VmsResUploadScheduleForm.process: VMS {}, body length: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
         if (body == null || body.length < 30) {
-            log.error("VmsResUploadScheduleForm.process: body length error: {} ", body != null ? body.length : 0);
+            log.error("VmsResUploadScheduleForm.process: VMS {}, body length error: {} ", this.vmsObj.getVmsCtlrNmbr(), body != null ? body.length : 0);
             return false;
         }
 
-        // Byte.toUnsignedInt(
         ByteBuffer byteBuffer = ByteBuffer.wrap(body);
         byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
 
@@ -50,7 +49,7 @@ public class VmsResUploadScheduleForm implements VmsResponse {
 
     public String toString() {
         StringBuilder data = new StringBuilder();
-        data.append(String.format("RESPONSE-%s. VMS %d", eVmsOpCode.OP_VMS_UPLOAD_SCHEDULE_FORM, this.vmsObj.getVmsCtlrNmbr()));
+        data.append(String.format("RESPONSE-%s. VMS %d", eVmsOpCode.OP_VMS_UPLOAD_FORM_SCHEDULE, this.vmsObj.getVmsCtlrNmbr()));
         data.append(System.getProperty("line.separator"));
         data.append(String.format("Schedule %d EA.", this.scheduleCount));
         data.append(this.schedule);

+ 3 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameHead.java

@@ -2,4 +2,7 @@ package com.its.vms.xnettcp.vms.protocol;
 
 public interface VmsFrameHead {
 
+    int getGroupNo();
+    int getControllerNo();
+
 }

+ 2 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFramePacket.java

@@ -8,6 +8,8 @@ public interface VmsFramePacket {
     String getOpCodeDesc();
     int getOpCode();
     void setBody(byte[] body);
+    VmsFrameHead getHead();
     byte[] getBody();
+    VmsFrameTail getTail();
 
 }

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsProtocolConst.java → src/main/java/com/its/vms/xnettcp/vms/protocol/VmsProtocolConst.java

@@ -1,4 +1,4 @@
-package com.its.vms.xnettcp.vms.protocol.impl;
+package com.its.vms.xnettcp.vms.protocol;
 
 public class VmsProtocolConst {
 

+ 41 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormDataDto.java

@@ -0,0 +1,41 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class VmsFormDataDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private int formId;     // 폼 ID        2 Byte
+    private int formCnt;    // 전체 폼 수   2 Byte
+
+    private List<VmsFormDto> formList;
+
+    public VmsFormDataDto(int formId, int formCnt) {
+        this.formId = formId;
+        this.formCnt = formCnt;
+        this.formList = new ArrayList<>();
+    }
+
+    /**
+     * 새로운 폼 정보를 추가
+     * @param formNo
+     * @param dispSec
+     * @param dispType
+     * @param bkClr
+     * @return
+     */
+    public VmsFormDto addForm(int formNo, int dispSec, int dispType, int bkClr, int objCnt) {
+        VmsFormDto form = new VmsFormDto(formNo, dispSec, dispType, bkClr, objCnt);
+        this.formList.add(form);
+        return form;
+    }
+
+    public void calFormCount() {
+        this.formCnt = this.formList.size();
+    }
+}

+ 42 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormDto.java

@@ -0,0 +1,42 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class VmsFormDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private int formNo;     // 폼 번호, 폼 표출 일련번호,            2 N
+    private int dispSec;    // 표출시간, 폼의 표출시간을 지정,       1 N, 0x00 이면 계속 표출
+    private int dispType;   // 표출유형, 폼의 표출유형을 지정,       1 N, 폼 표출유형(별첨)
+    private int bkClr;      // 배경 색상, 폼의 배경색을 지정,        1 N, 폼 배경색상(별첨-배경색상)
+    private int objCnt;     // 오브젝트 수, 표출할 오브젝트 전체 수, 1 N
+
+    private List<VmsFormObj> objList; // 폼 목록
+
+    public VmsFormDto(int formNo, int dispSec, int dispType, int bkClr, int objCnt) {
+        this.formNo = formNo;
+        this.dispSec = dispSec;
+        this.dispType = dispType;
+        this.bkClr = bkClr;
+        this.objCnt = objCnt;
+        this.objList = new ArrayList<>();
+    }
+
+    /**
+     * 폼에 객체를 추가한다.
+     * @param formObj
+     * @return
+     */
+    public void addObject(VmsFormObj formObj) {
+        this.objList.add(formObj);
+    }
+
+    public void calObjCount() {
+        this.objCnt = this.objList.size();
+    }
+}

+ 29 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObj.java

@@ -0,0 +1,29 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import lombok.Data;
+
+@Data
+public abstract class VmsFormObj {
+
+    private int objType;
+    private int objSize;
+    private int blinking;
+    private int posX;
+    private int posY;
+    private int txtBkClr;
+
+    public VmsFormObj(int objType, int objSize, int blinking, int posX, int posY, int txtBkClr) {
+        this.objType = objType;
+        this.objSize = objSize;
+        this.blinking = blinking;
+        this.posX = posX;
+        this.posY = posY;
+        this.txtBkClr = txtBkClr;
+    }
+
+    public abstract void calSize();
+
+    protected void setSize(int objSize) {
+        this.objSize = objSize;
+    }
+}

+ 34 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjBitmap.java

@@ -0,0 +1,34 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Bitmap Object
+ */
+@Getter
+@Setter
+public class VmsFormObjBitmap extends VmsFormObj {
+    private int width;      // 2
+    private int height;     // 2
+    private int type;       // 1
+    private int reserved;   // 1
+    private byte[] image;   // n
+
+    public VmsFormObjBitmap(int objSize, int blinking, int posX, int posY, int bkClr, int width, int height, int type, byte[] image) {
+        super(eVmsFormObjectKind.OBJECT_BITMAP.getValue(), objSize, blinking, posX, posY, bkClr);
+
+        this.width = width;
+        this.height = height;
+        this.type = type;
+        this.reserved = 0;
+        this.image = image;
+    }
+
+    @Override
+    public void calSize() {
+        setSize(6 + this.image.length);
+    }
+
+}

+ 32 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjBitmapId.java

@@ -0,0 +1,32 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Bitmap ID Object
+ */
+@Getter
+@Setter
+public class VmsFormObjBitmapId extends VmsFormObj {
+
+    private int width;      // 2
+    private int height;     // 2
+    private int type;       // 1
+    private int bitmapId;   // 2
+
+    public VmsFormObjBitmapId(int objSize, int blinking, int posX, int posY, int bkClr, int width, int height, int type, int bitmapId) {
+        super(eVmsFormObjectKind.OBJECT_BITMAP_ID.getValue(), objSize, blinking, posX, posY, bkClr);
+
+        this.width = width;
+        this.height = height;
+        this.type = type;
+        this.bitmapId = bitmapId;
+    }
+
+    @Override
+    public void calSize() {
+        setSize(7);
+    }
+}

+ 41 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjText.java

@@ -0,0 +1,41 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * TEXT Object
+ */
+@Getter
+@Setter
+public class VmsFormObjText extends VmsFormObj {
+
+    private int clrR;       // 1
+    private int clrG;       // 1
+    private int clrB;       // 1
+    private int fontSize;   // 1
+    private int fontKind;   // 1
+    private int fontBold;   // 1
+    private int reserved;   // 1
+    private String text;    // n
+
+    public VmsFormObjText(int objSize, int blinking, int posX, int posY, int bkClr, int clrR, int clrG, int clrB, int fontSize, int fontKind, int fontBold, String text) {
+        super(eVmsFormObjectKind.OBJECT_TEXT.getValue(), objSize, blinking, posX, posY, bkClr);
+
+        this.clrR = clrR;
+        this.clrG = clrG;
+        this.clrB = clrB;
+        this.fontSize = fontSize;
+        this.fontKind = fontKind;
+        this.fontBold = fontBold;
+        this.reserved = 0;
+        this.text = text;
+    }
+
+    @Override
+    public void calSize() {
+        byte[] textArr = this.text.getBytes();
+        setSize(7 + textArr.length);
+    }
+}

+ 2 - 3
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java

@@ -5,7 +5,6 @@ import java.util.Map;
 
 public enum eVmsOpCode {
 
-    OP_VMS_DEVICE_AUTH                  (0xFF, "0xFF.장비 인증"),               // DEVICE 인증 요청,                          VMS→SERVER
     OP_VMS_FORM_DATA_DISPLAY            (0x80, "0x80.폼 데이터 표출"),          // 표출할 폼 데이터                           SERVER→VMS
     OP_VMS_DATA_DOWNLOAD                (0x82, "0x82.데이터 다운로드"),         // INI, CFG , Bitmap , Data 파일              SERVER→VMS
     OP_VMS_DATA_UPLOAD                  (0x84, "0x84.데이터 업로드"),           // INI, CFG , Bitmap , Data 파일 업로드 요구, SERVER→VMS
@@ -17,10 +16,10 @@ public enum eVmsOpCode {
     OP_VMS_STOP_IMAGE_REQ               (0x90, "0x90.VMS 정지영상 요구"),       // 현재 표출되는 이미지 송신 요구,            SERVER→VMS
     OP_VMS_PIXEL_IMAGE_REQ              (0x92, "0x92.VMS Pixel Image 요구"),    // VMS LED Pixel 상태요구                     SERVER→VMS
     OP_VMS_UPLOAD_CURRENT_DISPLAY_FORM  (0x94, "0x94.현재 표출폼 Upload"),      // Local 에서 표출 중인 폼 Upload 요구,       SERVER→VMS
-    OP_VMS_DOWNLOAD_SCHEDULE_FORM       (0x96, "0x96.Download Schedule"),       // 계획된 Form Schedule 을 download,          SERVER→VMS
+    OP_VMS_DOWNLOAD_FORM_SCHEDULE       (0x96, "0x96.Download Schedule"),       // 계획된 Form Schedule 을 download,          SERVER→VMS
     OP_VMS_DISPLAY_DEFAULT_FORM         (0x98, "0x98.Display Default Form"),    // 디폴트 Form 표출 요구,                     SERVER→VMS
     OP_VMS_DOWNLOAD_FORM                (0x9A, "0x9A.Download Form"),           // Form download,                             SERVER→VMS
-    OP_VMS_UPLOAD_SCHEDULE_FORM         (0x9C, "0x9C.Upload Schedule Form"),    // 스케줄 메시지 업로드 요구,                 SERVER→VMS
+    OP_VMS_UPLOAD_FORM_SCHEDULE         (0x9C, "0x9C.Upload Schedule Form"),    // 스케줄 메시지 업로드 요구,                 SERVER→VMS
     OP_VMS_BLANK                        (0x9E, "0x9E.Blank"),                   // schedule 표출,                             SERVER→VMS
     OP_VMS_DISPLAY_FORM_ID              (0xA0, "0xA0.Display Form ID");         // 수신, 통신 session 유효 확인 요청,         SERVER←VMS
 

+ 108 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadForm.java

@@ -0,0 +1,108 @@
+package com.its.vms.xnettcp.vms.protocol.impl;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsReqFramePacket;
+import com.its.vms.xnettcp.vms.protocol.dto.*;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Download Schedule Form 요청
+ */
+@Slf4j
+public class VmsReqDownloadForm implements VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqDownloadForm(TbVmsCtlrDto vmsObj, VmsFormDataDto formData) {
+
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_DOWNLOAD_FORM.getValue());
+        }
+
+        makeBody(formData);
+    }
+
+    public void makeBody(VmsFormDataDto formData) {
+        int bodySize = 0;
+        bodySize += 4;  // 다운로드 폼 헤더 크기
+        for (int ii = 0; ii < formData.getFormCnt(); ii++) {
+            bodySize += 6;  // 폼데이터 헤더 크기
+            for (int jj = 0; jj < formData.getFormList().get(ii).getObjCnt(); jj++) {
+                bodySize += 9;  // 오브젝트 데이터 헤더 크기
+                bodySize += formData.getFormList().get(ii).getObjList().get(jj).getObjSize(); // 오브젝트 데이터 크기
+            }
+        }
+        log.info("VmsReqDownloadForm.makeBody: bodySize {}", bodySize);
+        ByteBuffer byteBuffer = ByteBuffer.allocate(bodySize);
+        byteBuffer.order(ByteOrder.BIG_ENDIAN);
+
+        byteBuffer.putShort((short)(formData.getFormId() & 0xFFFF));    // 폼 ID
+        byteBuffer.putShort((short)(formData.getFormCnt() & 0xFFFF));   // 전체 폼의 수
+        for (int ii = 0; ii < formData.getFormCnt(); ii++) {
+            VmsFormDto form = formData.getFormList().get(ii);
+            byteBuffer.putShort((short)(form.getFormNo() & 0xFFFF));    // 폼 번호
+            byteBuffer.put((byte)(form.getDispSec() & 0xFF));           // 폼 표출시간
+            byteBuffer.put((byte)(form.getDispType() & 0xFF));          // 폼의 표출유형
+            byteBuffer.put((byte)(form.getBkClr() & 0xFF));             // 폼 배경색
+            byteBuffer.put((byte)(form.getObjCnt() & 0xFF));            // 표출할 오브젝트 전체 수
+
+            for (int jj = 0; jj < formData.getFormList().get(ii).getObjCnt(); jj++) {
+                VmsFormObj obj = form.getObjList().get(jj);
+
+                byteBuffer.put((byte)(obj.getObjType() & 0xFF));            // 오브젝트 종류
+                byteBuffer.putShort((short)(obj.getObjSize() & 0xFFFF));    // 오브젝트 데이터 크기
+                byteBuffer.put((byte)(obj.getBlinking() & 0xFF));           // 점멸여부
+                byteBuffer.putShort((short)(obj.getPosX() & 0xFFFF));       // 좌표 X
+                byteBuffer.putShort((short)(obj.getPosY() & 0xFFFF));       // 좌표 Y
+                byteBuffer.put((byte)(obj.getTxtBkClr() & 0xFF));           // 문자열 배경색 지정
+
+                if (obj.getObjType() == eVmsFormObjectKind.OBJECT_TEXT.getValue()) {
+                    VmsFormObjText txtObj = (VmsFormObjText)obj;
+                    byteBuffer.put((byte)(txtObj.getClrR() & 0xFF));            // 사용 폰트 색상(R)
+                    byteBuffer.put((byte)(txtObj.getClrG() & 0xFF));            // 사용 폰트 색상(G)
+                    byteBuffer.put((byte)(txtObj.getClrB() & 0xFF));            // 사용 폰트 색상(B)
+                    byteBuffer.put((byte)(txtObj.getFontSize() & 0xFF));        // 폰트 크기
+                    byteBuffer.put((byte)(txtObj.getFontKind() & 0xFF));        // 폰트 종류
+                    byteBuffer.put((byte)(txtObj.getFontBold() & 0xFF));        // 폰트 굵기
+                    byteBuffer.put((byte)(txtObj.getReserved() & 0xFF));        // 기타, Reserved, 0x00
+                    byteBuffer.put(txtObj.getText().getBytes());
+                }
+                else if (obj.getObjType() == eVmsFormObjectKind.OBJECT_BITMAP_ID.getValue()) {
+                    VmsFormObjBitmapId idObj = (VmsFormObjBitmapId)obj;
+                    byteBuffer.putShort((short)(idObj.getWidth() & 0xFFFF));    // 비트맵 표시 Width
+                    byteBuffer.putShort((short)(idObj.getHeight() & 0xFFFF));   // 비트맵 표시 Height
+                    byteBuffer.put((byte)(idObj.getType() & 0xFF));             // 그림파일 타입
+                    byteBuffer.putShort((short)(idObj.getBitmapId() & 0xFFFF)); // 표출할 비트맵 ID
+                }
+                else {
+                    VmsFormObjBitmap bmpObj = (VmsFormObjBitmap)obj;
+                    byteBuffer.putShort((short)(bmpObj.getWidth() & 0xFFFF));   // 비트맵 표시 Width
+                    byteBuffer.putShort((short)(bmpObj.getHeight() & 0xFFFF));  // 비트맵 표시 Height
+                    byteBuffer.put((byte)(bmpObj.getType() & 0xFF));            // 그림파일 타입
+                    byteBuffer.put((byte)(bmpObj.getReserved() & 0xFF));        // 기타, Reserved, 0x00
+                    byteBuffer.put(bmpObj.getImage());                          // 표출할 비트맵 데이터
+                }
+            }
+        }
+
+        this.framePacket.setBody(byteBuffer.array());
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+
+}

+ 9 - 3
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadScheduleForm.java → src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadFormSchedule.java

@@ -3,6 +3,7 @@ package com.its.vms.xnettcp.vms.protocol.impl;
 import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
 import com.its.vms.xnettcp.vms.protocol.VmsReqFramePacket;
+import com.its.vms.xnettcp.vms.protocol.dto.VmsFormDataDto;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.dle.VmsDleFramePacket;
 import lombok.extern.slf4j.Slf4j;
@@ -13,15 +14,20 @@ import java.nio.ByteBuffer;
  * Download Schedule Form 요청
  */
 @Slf4j
-public class VmsReqDownloadScheduleForm implements VmsReqFramePacket {
+public class VmsReqDownloadFormSchedule implements VmsReqFramePacket {
 
     private VmsFramePacket framePacket;
 
+    private VmsFormDataDto formData;
     private byte[] body;
-    public VmsReqDownloadScheduleForm(TbVmsCtlrDto vmsObj, byte[] schedule) {
+    public VmsReqDownloadFormSchedule(TbVmsCtlrDto vmsObj, VmsFormDataDto formData) {
         if (vmsObj.getProtocolVer() == 0) {
-            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STOP_IMAGE_REQ.getValue());
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_DOWNLOAD_FORM_SCHEDULE.getValue());
         }
+        this.formData = formData;
+    }
+
+    public void setBody(byte[] schedule) {
         this.body = new byte[schedule.length];
         System.arraycopy(schedule, 0, this.body, 0, this.body.length);
         this.framePacket.setBody(this.body);

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqFormDataDisplay.java

@@ -20,7 +20,7 @@ public class VmsReqFormDataDisplay implements VmsReqFramePacket {
     private byte[] body;
     public VmsReqFormDataDisplay(TbVmsCtlrDto vmsObj, byte[] schedule) {
         if (vmsObj.getProtocolVer() == 0) {
-            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STOP_IMAGE_REQ.getValue());
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_FORM_DATA_DISPLAY.getValue());
         }
         this.body = new byte[schedule.length];
         System.arraycopy(schedule, 0, this.body, 0, this.body.length);

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqStatusControl.java

@@ -23,7 +23,7 @@ public class VmsReqStatusControl implements VmsReqFramePacket {
     private byte[] body;
     public VmsReqStatusControl(TbVmsCtlrDto vmsObj) {
         if (vmsObj.getProtocolVer() == 0) {
-            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STOP_IMAGE_REQ.getValue());
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STATUS_CONTROL.getValue());
         }
     }
 

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqUploadScheduleForm.java

@@ -17,7 +17,7 @@ public class VmsReqUploadScheduleForm implements VmsReqFramePacket {
 
     public VmsReqUploadScheduleForm(TbVmsCtlrDto vmsObj) {
         if (vmsObj.getProtocolVer() == 0) {
-            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_UPLOAD_SCHEDULE_FORM.getValue());
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_UPLOAD_FORM_SCHEDULE.getValue());
         }
     }
 

+ 10 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFrameHead.java

@@ -2,7 +2,7 @@ package com.its.vms.xnettcp.vms.protocol.impl.dle;
 
 import com.google.common.primitives.Bytes;
 import com.its.vms.xnettcp.vms.protocol.VmsFrameHead;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -78,4 +78,13 @@ public class VmsDleFrameHead implements VmsFrameHead {
         return Bytes.toArray(list);
     }
 
+    @Override
+    public int getGroupNo() {
+        return this.group;
+    }
+
+    @Override
+    public int getControllerNo() {
+        return this.controller;
+    }
 }

+ 13 - 2
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFramePacket.java

@@ -1,9 +1,11 @@
 package com.its.vms.xnettcp.vms.protocol.impl.dle;
 
 import com.google.common.primitives.Bytes;
+import com.its.vms.xnettcp.vms.protocol.VmsFrameHead;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFrameTail;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.extern.slf4j.Slf4j;
 
 import java.nio.ByteBuffer;
@@ -86,6 +88,11 @@ public class VmsDleFramePacket implements VmsFramePacket {
         this.body = body;
     }
 
+    @Override
+    public VmsFrameHead getHead() {
+        return this.head;
+    }
+
     /**
      * 요청 패킷을 ByteBuffer 로 변경하여 리턴
      * @return
@@ -115,6 +122,11 @@ public class VmsDleFramePacket implements VmsFramePacket {
         return this.body;
     }
 
+    @Override
+    public VmsFrameTail getTail() {
+        return this.tail;
+    }
+
     private ByteBuffer getDleBuffer() {
         List<Byte> list = new ArrayList<Byte>();
         int bodySize = 0;
@@ -158,7 +170,6 @@ public class VmsDleFramePacket implements VmsFramePacket {
         list.add((byte)((this.tail.getCrc() & 0xFF00) >> 8));
         list.add((byte)((this.tail.getCrc() & 0x00FF)     ));
 
-
         byte[] arr = Bytes.toArray(list);
         ByteBuffer byteBuffer = ByteBuffer.allocate(arr.length);
         byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);

+ 3 - 2
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/dle/VmsDleFrameTail.java

@@ -1,7 +1,8 @@
 package com.its.vms.xnettcp.vms.protocol.impl.dle;
 
 import com.google.common.primitives.Bytes;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsFrameTail;
+import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -11,7 +12,7 @@ import java.util.List;
 
 @Slf4j
 @Data
-public class VmsDleFrameTail {
+public class VmsDleFrameTail implements VmsFrameTail {
 
     public static final int TAIL_SIZE = 4;
     private int opCodePos = 4;

+ 9 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/std/VmsStdFrameHead.java

@@ -69,4 +69,13 @@ public class VmsStdFrameHead implements VmsFrameHead {
         return Bytes.toArray(list);
     }
 
+    @Override
+    public int getGroupNo() {
+        return this.group;
+    }
+
+    @Override
+    public int getControllerNo() {
+        return this.controller;
+    }
 }

+ 12 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/impl/std/VmsStdFramePacket.java

@@ -1,6 +1,8 @@
 package com.its.vms.xnettcp.vms.protocol.impl.std;
 
+import com.its.vms.xnettcp.vms.protocol.VmsFrameHead;
 import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFrameTail;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.extern.slf4j.Slf4j;
 
@@ -40,6 +42,11 @@ public class VmsStdFramePacket implements VmsFramePacket {
         this.body = body;
     }
 
+    @Override
+    public VmsFrameHead getHead() {
+        return this.head;
+    }
+
     /**
      * 요청 패킷을 ByteBuffer 로 변경하여 리턴
      * @return
@@ -68,6 +75,11 @@ public class VmsStdFramePacket implements VmsFramePacket {
         return this.body;
     }
 
+    @Override
+    public VmsFrameTail getTail() {
+        return null;
+    }
+
     public ByteBuffer getBuffer() {
         int bodySize = 0;
         if (this.body != null) {