shjung 2 rokov pred
rodič
commit
e4b086fc7e
39 zmenil súbory, kde vykonal 489 pridanie a 1576 odobranie
  1. 1 1
      app-install/conf/debug.properties
  2. 23 0
      app-install/logs/packet/vms-packet.log
  3. 0 0
      app-install/logs/vms-center-comm.log
  4. 26 0
      app-install/logs/vms-comm-server.err.log
  5. 131 0
      app-install/logs/vms-comm-server.log
  6. 18 0
      app-install/logs/vms-schedule.log
  7. 23 0
      app-install/logs/vms-session.log
  8. 0 0
      app-install/logs/vms-sql.log
  9. 0 0
      app-install/logs/vms-statistics.log
  10. 17 0
      src/main/java/com/its/app/utils/SysUtils.java
  11. 0 185
      src/main/java/com/its/vms/api/dto/CctvControlDto.java
  12. 0 144
      src/main/java/com/its/vms/api/dto/CctvParamControlDto.java
  13. 0 144
      src/main/java/com/its/vms/api/dto/CctvPresetControlDto.java
  14. 0 88
      src/main/java/com/its/vms/api/dto/CctvPtzControlDto.java
  15. 0 76
      src/main/java/com/its/vms/api/dto/CctvStatusDto.java
  16. 0 157
      src/main/java/com/its/vms/api/dto/CctvVarCharControlDto.java
  17. 0 79
      src/main/java/com/its/vms/api/dto/TbCctvCtlrSttsDto.java
  18. 1 1
      src/main/java/com/its/vms/domain/VmsCtlrStatus.java
  19. 1 1
      src/main/java/com/its/vms/domain/VmsDebug.java
  20. 1 1
      src/main/java/com/its/vms/domain/VmsEvehicle.java
  21. 1 1
      src/main/java/com/its/vms/domain/VmsEvent.java
  22. 3 1
      src/main/java/com/its/vms/domain/VmsForm.java
  23. 1 0
      src/main/java/com/its/vms/domain/VmsFormManager.java
  24. 11 3
      src/main/java/com/its/vms/domain/VmsFormObject.java
  25. 1 1
      src/main/java/com/its/vms/domain/VmsLuminance.java
  26. 1 1
      src/main/java/com/its/vms/domain/VmsModule.java
  27. 1 1
      src/main/java/com/its/vms/domain/VmsSchedule.java
  28. 105 31
      src/main/java/com/its/vms/dto/TbVmsCtlrDto.java
  29. 0 657
      src/main/java/com/its/vms/dto/TbVmsCtlrDtoBack.java
  30. 1 0
      src/main/java/com/its/vms/dto/TbVmsScheduleDto.java
  31. 2 0
      src/main/java/com/its/vms/entity/TbVmsSchedule.java
  32. 7 0
      src/main/java/com/its/vms/service/VmsManageService.java
  33. 23 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadCurrentDisplayForm.java
  34. 34 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjStream.java
  35. 34 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsFormObjVideo.java
  36. 5 3
      src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsFormObjectKind.java
  37. 2 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java
  38. 14 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/impl/VmsReqDownloadForm.java
  39. 1 0
      src/main/resources/mybatis/mapper/VmsManageMapper.xml

+ 1 - 1
app-install/conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Tue Sep 12 17:14:57 KST 2023
+#Wed Oct 11 09:37:48 KST 2023
 packet-info=1001
 packet-dump=1001
 system-debug=true

+ 23 - 0
app-install/logs/packet/vms-packet.log

@@ -0,0 +1,23 @@
+[2023-10-11 09:35:12.471] [INFO ] TcpServerRecvDataProcess.run: Start.
+[2023-10-11 09:35:12.478] [INFO ] TcpServerRecvDataProcess.Task: 0
+[2023-10-11 09:35:12.480] [INFO ] TcpServerRecvDataProcess.Task: 1
+[2023-10-11 09:35:12.481] [INFO ] TcpServerRecvDataProcess.Task: 2
+[2023-10-11 09:35:12.482] [INFO ] TcpServerRecvDataProcess.Task: 3
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 4
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 5
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 6
+[2023-10-11 09:35:12.484] [INFO ] TcpServerRecvDataProcess.Task: 7
+[2023-10-11 09:35:12.485] [INFO ] TcpServerRecvDataProcess.run: ..End.
+[2023-10-11 09:35:14.310] [INFO ] TcpServerReqDataProcess[1001].run: Start.
+[2023-10-11 09:35:14.313] [INFO ] TcpServerReqDataProcess[1002].run: Start.
+[2023-10-11 09:35:14.314] [INFO ] TcpServerReqDataProcess[1003].run: Start.
+[2023-10-11 09:35:14.316] [INFO ] TcpServerReqDataProcess[1004].run: Start.
+[2023-10-11 09:35:17.167] [INFO ] 서버가 윈도우 NIO 모드에서 실행됩니다.
+[2023-10-11 09:35:17.328] [INFO ] *********************************************************************************
+[2023-10-11 09:35:17.329] [INFO ] **                    VMS Communication Server Information                    **
+[2023-10-11 09:35:17.329] [INFO ] **     bindAddress: 0.0.0.0
+[2023-10-11 09:35:17.330] [INFO ] **      listenPort: 30200
+[2023-10-11 09:35:17.330] [INFO ] **         backlog: 64
+[2023-10-11 09:35:17.331] [INFO ] **   acceptThreads: 16
+[2023-10-11 09:35:17.331] [INFO ] **   workerThreads: 16
+[2023-10-11 09:35:17.331] [INFO ] *********************************************************************************

+ 0 - 0
app-install/logs/vms-center-comm.log


+ 26 - 0
app-install/logs/vms-comm-server.err.log

@@ -0,0 +1,26 @@
+[2023-10-11 09:35:14.882] [                          main] [ERROR]         com.its.vms.service.VmsFormService.lambda$loadVmsFormObjectInfo$5 115740 
+VmsFormService.loadVmsFormObjectInfo: VMF Form Object Symbol Library not Found 10000, 0.
+[2023-10-11 09:35:16.474] [                          main] [ERROR]         com.its.vms.service.VmsFormService.lambda$loadVmsFormObjectInfo$5 115740 
+VmsFormService.loadVmsFormObjectInfo: VMF Form Object Symbol Library not Found 10000, 0.
+[2023-10-11 09:35:16.598] [                          main] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1001), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:16.605] [                          main] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1002), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:16.607] [                          main] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1003), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:16.610] [                          main] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1004), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:30.510] [                  scheduling-1] [ERROR]         com.its.vms.service.VmsFormService.lambda$loadVmsFormObjectInfo$5 115740 
+VmsFormService.loadVmsFormObjectInfo: VMF Form Object Symbol Library not Found 10000, 0.
+[2023-10-11 09:35:30.536] [                  scheduling-1] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1001), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:30.538] [                  scheduling-1] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1002), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:30.539] [                  scheduling-1] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1003), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:30.540] [                  scheduling-1] [ERROR]         c.its.vms.service.VmsManageService.lambda$makeVmsProvideForm$44 115740 
+VmsManageService.makeVmsProvideForm: No Traffic: VMS(1004), FormId(10002), Req 2, Set 0.
+[2023-10-11 09:35:31.993] [                   dbms-pool-4] [ERROR]        com.its.vms.process.DbmsDataProcess.process              115740 
+DbmsJobProcess.process: Exception: org.apache.ibatis.exceptions.PersistenceException: 
+### Error flushing statements.  Cause: org.apache.ibatis.executor.BatchExecutorException: com.its.vms.dao.mapper.VmsManageMapper.batchInsertVmsDsplPrst (batch index #1) failed. Cause: java.sql.BatchUpdateException: JDBC-10007:UNIQUE constraint violation ('ADITS'.'PK_VMS_DSPL_HS').
+### Cause: org.apache.ibatis.executor.BatchExecutorException: com.its.vms.dao.mapper.VmsManageMapper.batchInsertVmsDsplPrst (batch index #1) failed. Cause: java.sql.BatchUpdateException: JDBC-10007:UNIQUE constraint violation ('ADITS'.'PK_VMS_DSPL_HS').

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 131 - 0
app-install/logs/vms-comm-server.log


+ 18 - 0
app-install/logs/vms-schedule.log

@@ -0,0 +1,18 @@
+[2023-10-11 09:35:30.004] [INFO ] scheduleVmsFormDownload..: start. scheduling-1
+[2023-10-11 09:35:30.889] [INFO ] scheduleVmsFormDownload..: ..end. 885 ms. scheduling-1
+[2023-10-11 09:36:05.015] [INFO ] scheduleUnitSystStts: start. scheduling-1
+[2023-10-11 09:36:05.024] [INFO ] scheduleUnitSystStts: ..end. 9 ms. scheduling-1
+[2023-10-11 09:36:08.001] [INFO ] scheduleVmsStatusRequest: start. scheduling-1
+[2023-10-11 09:36:08.002] [INFO ] scheduleVmsStatusRequest: ..end. 1 ms. scheduling-1
+[2023-10-11 09:36:15.008] [INFO ] scheduleEsbVmsShortMsg: start. scheduling-1
+[2023-10-11 09:36:15.016] [INFO ] scheduleEsbVmsShortMsg: ..end. 8 ms. scheduling-1
+[2023-10-11 09:36:15.016] [INFO ] scheduleVmsOnOffControl: start. scheduling-1
+[2023-10-11 09:36:15.025] [INFO ] scheduleVmsOnOffControl: ..end. 9 ms. scheduling-1
+[2023-10-11 09:37:05.009] [INFO ] scheduleUnitSystStts: start. scheduling-1
+[2023-10-11 09:37:05.019] [INFO ] scheduleUnitSystStts: ..end. 10 ms. scheduling-1
+[2023-10-11 09:37:08.009] [INFO ] scheduleVmsStatusRequest: start. scheduling-1
+[2023-10-11 09:37:08.009] [INFO ] scheduleVmsStatusRequest: ..end. 0 ms. scheduling-1
+[2023-10-11 09:37:15.015] [INFO ] scheduleVmsOnOffControl: start. scheduling-1
+[2023-10-11 09:37:15.027] [INFO ] scheduleVmsOnOffControl: ..end. 12 ms. scheduling-1
+[2023-10-11 09:37:15.028] [INFO ] scheduleEsbVmsShortMsg: start. scheduling-1
+[2023-10-11 09:37:15.032] [INFO ] scheduleEsbVmsShortMsg: ..end. 4 ms. scheduling-1

+ 23 - 0
app-install/logs/vms-session.log

@@ -0,0 +1,23 @@
+[2023-10-11 09:35:12.471] [INFO ] TcpServerRecvDataProcess.run: Start.
+[2023-10-11 09:35:12.478] [INFO ] TcpServerRecvDataProcess.Task: 0
+[2023-10-11 09:35:12.480] [INFO ] TcpServerRecvDataProcess.Task: 1
+[2023-10-11 09:35:12.481] [INFO ] TcpServerRecvDataProcess.Task: 2
+[2023-10-11 09:35:12.482] [INFO ] TcpServerRecvDataProcess.Task: 3
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 4
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 5
+[2023-10-11 09:35:12.483] [INFO ] TcpServerRecvDataProcess.Task: 6
+[2023-10-11 09:35:12.484] [INFO ] TcpServerRecvDataProcess.Task: 7
+[2023-10-11 09:35:12.485] [INFO ] TcpServerRecvDataProcess.run: ..End.
+[2023-10-11 09:35:14.310] [INFO ] TcpServerReqDataProcess[1001].run: Start.
+[2023-10-11 09:35:14.313] [INFO ] TcpServerReqDataProcess[1002].run: Start.
+[2023-10-11 09:35:14.314] [INFO ] TcpServerReqDataProcess[1003].run: Start.
+[2023-10-11 09:35:14.316] [INFO ] TcpServerReqDataProcess[1004].run: Start.
+[2023-10-11 09:35:17.167] [INFO ] 서버가 윈도우 NIO 모드에서 실행됩니다.
+[2023-10-11 09:35:17.328] [INFO ] *********************************************************************************
+[2023-10-11 09:35:17.329] [INFO ] **                    VMS Communication Server Information                    **
+[2023-10-11 09:35:17.329] [INFO ] **     bindAddress: 0.0.0.0
+[2023-10-11 09:35:17.330] [INFO ] **      listenPort: 30200
+[2023-10-11 09:35:17.330] [INFO ] **         backlog: 64
+[2023-10-11 09:35:17.331] [INFO ] **   acceptThreads: 16
+[2023-10-11 09:35:17.331] [INFO ] **   workerThreads: 16
+[2023-10-11 09:35:17.331] [INFO ] *********************************************************************************

+ 0 - 0
app-install/logs/vms-sql.log


+ 0 - 0
app-install/logs/vms-statistics.log


+ 17 - 0
src/main/java/com/its/app/utils/SysUtils.java

@@ -3,6 +3,7 @@ package com.its.app.utils;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -106,6 +107,22 @@ public final class SysUtils
 			return text.getBytes();
 		}
 	}
+	public static byte[] stringToByteArray(String data) {
+		//return data.getBytes();
+		return data.getBytes(StandardCharsets.UTF_8);
+	}
+	public static void copyStringToByteArray(byte[] dest, int length, String data) {
+		//byte[] byteData = data.getBytes();
+		byte[] byteData = data.getBytes(StandardCharsets.UTF_8);
+		int size = dest.length;
+		int ii;
+		for (ii = 0; ii < byteData.length && ii < size; ii++) {
+			dest[ii] = byteData[ii];
+		}
+		for (int jj = ii; jj < size; jj++) {
+			dest[jj] = 0x00;
+		}
+	}
 
 	public static String byteArrayToString(byte[] data) {
 		StringBuilder sb = new StringBuilder(data.length);

+ 0 - 185
src/main/java/com/its/vms/api/dto/CctvControlDto.java

@@ -1,185 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import javax.validation.constraints.Positive;
-import javax.validation.constraints.PositiveOrZero;
-import java.io.Serializable;
-
-/**
- * CCTV 제어기 제어정보 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvControlDto(CCTV 제어 정보")
-public class CctvControlDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvControlPtzReq(CCTV PTZ 제어 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlPtzReq {
-
-        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right)")
-        @JsonProperty("command")
-        private String command;
-
-        @ApiModelProperty("제어 명령 제어(start, stop)")
-        @JsonProperty("action")
-        private String action;
-
-        @ApiModelProperty("제어속도(0~63)")
-        @JsonProperty("speed")
-        @PositiveOrZero
-        private Integer speed;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvControlPtzReq(String command, String action, Integer speed, String user_id) {
-            this.command = command;
-            this.action = action;
-            this.speed = speed;
-            this.userId = user_id;
-        }
-    }
-    @ApiModel("CctvControlPresetReq(CCTV Preset 제어 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlPresetReq {
-
-        @ApiModelProperty("제어 명령(preset-default)")
-        @JsonProperty("command")
-        private String command;
-
-        @ApiModelProperty("제어 명령 제어(call, save, delete)")
-        @JsonProperty("action")
-        private String action;
-
-        @ApiModelProperty("프리셋 번호(1~255)")
-        @JsonProperty("no")
-        @Positive
-        private Integer no;
-
-        @ApiModelProperty("속도(0~63), save only")
-        @JsonProperty("speed")
-        @PositiveOrZero
-        private Integer speed;
-
-        @ApiModelProperty("프리셋 타임(0~60 sec), save only")
-        @JsonProperty("time")
-        @PositiveOrZero
-        private Integer time;
-
-        @ApiModelProperty("프리셋 명(영문명만, 20 byte) save only, not use.")
-        @JsonProperty("name")
-        private String name;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvControlPresetReq(String command, String action, Integer no, Integer speed, Integer time, String userId) {
-            this.command = command;
-            this.action = action;
-            this.no = no;
-            this.speed = speed;
-            this.time = time;
-            this.userId = userId;
-        }
-    }
-
-    @ApiModel("CctvControlResetReq(CCTV 제어기 리셋)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlResetReq {
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @ApiModelProperty("RESET 유형(0: SW, 1: HW")
-        @JsonProperty("reset_type")
-        private Integer resetType;
-
-        @Builder
-        public CctvControlResetReq(String user_id, Integer reset_type) {
-            this.userId = user_id;
-            this.resetType = reset_type;
-        }
-    }
-
-    @ApiModel("CctvControlResetRes(CCTV 제어기 리셋 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlResetRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvControlResetRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
-
-    @ApiModel("CctvControlRes(CCTV Control 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlRes {
-
-        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right), 프리셋제어(call, save, delete)")
-        @JsonProperty("command")
-        private String command;
-
-        @ApiModelProperty("제어 명령 제어(start, stop), 프리셋제어(call, save, delete)")
-        @JsonProperty("action")
-        private String action;
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvControlRes(String command, String action, Integer error, String message) {
-            this.command = command;
-            this.action = action;
-            this.error = error;
-            this.message = message;
-        }
-    }
-}

+ 0 - 144
src/main/java/com/its/vms/api/dto/CctvParamControlDto.java

@@ -1,144 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import javax.validation.constraints.PositiveOrZero;
-import java.io.Serializable;
-
-/**
- * CCTV 제어기 프리셋제어 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvParamControlDto(CCTV 파라미터설정 정보")
-public class CctvParamControlDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvParamControlReq(CCTV 파라미터설정 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvParamControlReq {
-
-        @ApiModelProperty("FAN ON 설정 온도")
-        @JsonProperty("fan_on_tmpr")
-        @PositiveOrZero
-        private Integer fanOnTmpr;
-
-        @ApiModelProperty("FAN OFF 설정 온도")
-        @JsonProperty("fan_off_tmpr")
-        @PositiveOrZero
-        private Integer fanOffTmpr;
-
-        @ApiModelProperty("Heater ON 설정 온도")
-        @JsonProperty("hetr_on_tmpr")
-        @PositiveOrZero
-        private Integer hetrOnTmpr;
-
-        @ApiModelProperty("Heater OFF 설정 온도")
-        @JsonProperty("hetr_off_tmpr")
-        @PositiveOrZero
-        private Integer hetrOffTmpr;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvParamControlReq(Integer fan_on_tmpr, Integer fan_off_tmpr, Integer hetr_on_tmpr, Integer hetr_off_tmpr, String user_id) {
-            this.fanOnTmpr = fan_on_tmpr;
-            this.fanOffTmpr = fan_off_tmpr;
-            this.hetrOnTmpr = hetr_on_tmpr;
-            this.hetrOffTmpr = hetr_off_tmpr;
-            this.userId = user_id;
-        }
-    }
-
-    @ApiModel("CctvParamControlRes(CCTV 파라미터설정 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvParamControlRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvParamControlRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
-
-    @ApiModel("CctvParamValueRes(CCTV 파라미터설정 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvParamValueRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        @ApiModelProperty("FAN ON 설정 온도")
-        @JsonProperty("fan_on_tmpr")
-        @PositiveOrZero
-        private Integer fanOnTmpr;
-
-        @ApiModelProperty("FAN OFF 설정 온도")
-        @JsonProperty("fan_off_tmpr")
-        @PositiveOrZero
-        private Integer fanOffTmpr;
-
-        @ApiModelProperty("Heater ON 설정 온도")
-        @JsonProperty("hetr_on_tmpr")
-        @PositiveOrZero
-        private Integer hetrOnTmpr;
-
-        @ApiModelProperty("Heater OFF 설정 온도")
-        @JsonProperty("hetr_off_tmpr")
-        @PositiveOrZero
-        private Integer hetrOffTmpr;
-
-        public CctvParamValueRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-            this.fanOnTmpr = 0;
-            this.fanOffTmpr = 0;
-            this.hetrOnTmpr = 0;
-            this.hetrOffTmpr = 0;
-        }
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-
-        public void setValue(Integer fanOnTmpr, Integer fanOffTmpr, Integer hetrOnTmpr, Integer hetrOffTmpr) {
-            this.fanOnTmpr = fanOnTmpr;
-            this.fanOffTmpr = fanOffTmpr;
-            this.hetrOnTmpr = hetrOnTmpr;
-            this.hetrOffTmpr = hetrOffTmpr;
-        }
-    }
-
-}

+ 0 - 144
src/main/java/com/its/vms/api/dto/CctvPresetControlDto.java

@@ -1,144 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import javax.validation.constraints.PositiveOrZero;
-import java.io.Serializable;
-
-/**
- * CCTV 제어기 프리셋제어 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvPresetControlDto(CCTV 프리셋제어 정보")
-public class CctvPresetControlDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvPresetControlReq(CCTV 프리셋제어 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvPresetControlReq {
-
-        @ApiModelProperty("Pan Preset Value")
-        @JsonProperty("pan")
-        @PositiveOrZero
-        private Integer pan;
-
-        @ApiModelProperty("Tilt Preset Value")
-        @JsonProperty("tilt")
-        @PositiveOrZero
-        private Integer tilt;
-
-        @ApiModelProperty("Zoom Preset Value")
-        @JsonProperty("zoom")
-        @PositiveOrZero
-        private Integer zoom;
-
-        @ApiModelProperty("Focus Preset Value")
-        @JsonProperty("focus")
-        @PositiveOrZero
-        private Integer focus;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvPresetControlReq(Integer pan, Integer tilt, Integer zoom, Integer focus, String user_id) {
-            this.pan = pan;
-            this.tilt = tilt;
-            this.zoom = zoom;
-            this.focus = focus;
-            this.userId = user_id;
-        }
-    }
-
-    @ApiModel("CctvPresetControlRes(CCTV 프리셋제어 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvPresetControlRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvPresetControlRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
-
-    @ApiModel("CctvPresetValueRes(CCTV 프리셋 상태 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvPresetValueRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        @ApiModelProperty("Pan Preset Value")
-        @JsonProperty("pan")
-        @PositiveOrZero
-        private Short pan;
-
-        @ApiModelProperty("Tilt Preset Value")
-        @JsonProperty("tilt")
-        @PositiveOrZero
-        private Short tilt;
-
-        @ApiModelProperty("Zoom Preset Value")
-        @JsonProperty("zoom")
-        @PositiveOrZero
-        private Short zoom;
-
-        @ApiModelProperty("Focus Preset Value")
-        @JsonProperty("focus")
-        @PositiveOrZero
-        private Short focus;
-
-        public CctvPresetValueRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-            this.pan = 0;
-            this.tilt = 0;
-            this.zoom = 0;
-            this.focus = 0;
-        }
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-
-        public void setValue(Short pan, Short tilt, Short zoom, Short focus) {
-            this.pan = pan;
-            this.tilt = tilt;
-            this.zoom = zoom;
-            this.focus = focus;
-        }
-    }
-
-}

+ 0 - 88
src/main/java/com/its/vms/api/dto/CctvPtzControlDto.java

@@ -1,88 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import javax.validation.constraints.PositiveOrZero;
-import java.io.Serializable;
-
-/**
- * CCTV 제어기 제어정보 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvControlDto(CCTV 제어 정보")
-public class CctvPtzControlDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvControlPtzReq(CCTV PTZ 제어 정보)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvControlPtzReq {
-
-        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right)")
-        @JsonProperty("command")
-        private String command;
-
-        @ApiModelProperty("제어 명령 제어(start, stop)")
-        @JsonProperty("action")
-        private String action;
-
-        @ApiModelProperty("제어속도(0~63)")
-        @JsonProperty("speed")
-        @PositiveOrZero
-        private Integer speed;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvControlPtzReq(String command, String action, Integer speed, String user_id) {
-            this.command = command;
-            this.action = action;
-            this.speed = speed;
-            this.userId = user_id;
-        }
-    }
-
-    @ApiModel("CctvControlRes(CCTV Control 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvPtzControlRes {
-
-        @ApiModelProperty("제어 명령(tilt-up, tilt-down, pan-left, pan-right, zoom-in, zoom-out, focus-in, focus-out, up-left, up-right, down-left, down-right), 프리셋제어(call, save, delete)")
-        @JsonProperty("command")
-        private String command;
-
-        @ApiModelProperty("제어 명령 제어(start, stop), 프리셋제어(call, save, delete)")
-        @JsonProperty("action")
-        private String action;
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvPtzControlRes(String command, String action, Integer error, String message) {
-            this.command = command;
-            this.action = action;
-            this.error = error;
-            this.message = message;
-        }
-    }
-}

+ 0 - 76
src/main/java/com/its/vms/api/dto/CctvStatusDto.java

@@ -1,76 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import java.io.Serializable;
-
-/**
- * CCTV 제어기 상태 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvStatusDto(CCTV 상태 정보")
-public class CctvStatusDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvStatusDtoRes(CCTV 상태 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvStatusDtoRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        private TbCctvCtlrSttsDto stts;
-
-        public void setResult(Integer error, String message, TbCctvCtlrSttsDto stts) {
-            this.error = error;
-            this.message = message;
-            this.stts = stts;
-        }
-
-        @Builder
-        public CctvStatusDtoRes(Integer error, String message, TbCctvCtlrSttsDto stts) {
-            this.error = error;
-            this.message = message;
-            this.stts = stts;
-        }
-    }
-
-    @ApiModel("CctvStatusNotifyDtoRes(CCTV 상태 Notify 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvStatusNotifyDtoRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-
-        @Builder
-        public CctvStatusNotifyDtoRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
-}

+ 0 - 157
src/main/java/com/its/vms/api/dto/CctvVarCharControlDto.java

@@ -1,157 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.*;
-
-import javax.validation.constraints.PositiveOrZero;
-import javax.validation.constraints.Size;
-import java.io.Serializable;
-
-/**
- * CCTV 가변 문자 설정 DTO Class
- */
-@Data
-@Builder
-@ApiModel("CctvVarCharControlDto(CCTV 가변 문자 설정 정보")
-public class CctvVarCharControlDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModel("CctvVarCharControlSetReq(CCTV 가변 문자 설정)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvVarCharControlSetReq {
-
-        @ApiModelProperty("Sector No. 0~6")
-        @JsonProperty("sector_no")
-        @PositiveOrZero
-        private Integer sectorNo;
-
-        @ApiModelProperty("Start Pan Value 0~1024")
-        @JsonProperty("start_pan")
-        @PositiveOrZero
-        private Short startPan;
-
-        @ApiModelProperty("End Pan Value 0~1024")
-        @JsonProperty("end_pan")
-        @PositiveOrZero
-        private Short endPan;
-
-        @ApiModelProperty("CH1 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
-        @JsonProperty("ch1_char_size")
-        @PositiveOrZero
-        private Short ch1CharSize;
-
-        @ApiModelProperty("CH1 Character X Position Value 0~1280")
-        @JsonProperty("ch1_pos_x")
-        @PositiveOrZero
-        private Short ch1PosX;
-
-        @ApiModelProperty("CH1 Character Y Position Value 0~720")
-        @JsonProperty("ch1_pos_y")
-        @PositiveOrZero
-        private Short ch1PosY;
-
-        @ApiModelProperty("CH2 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
-        @JsonProperty("ch2_char_size")
-        @PositiveOrZero
-        private Short ch2CharSize;
-
-        @ApiModelProperty("CH2 Character X Position Value 0~1280")
-        @JsonProperty("ch2_pos_x")
-        @PositiveOrZero
-        private Short ch2PosX;
-
-        @ApiModelProperty("CH2 Character Y Position Value 0~720")
-        @JsonProperty("ch2_pos_y")
-        @PositiveOrZero
-        private Short ch2PosY;
-
-        @ApiModelProperty("CH1 Character, Max: 16char(kor),32char(eng)")
-        @JsonProperty("ch1_char")
-        @Size(min=1, max=32)
-        private String ch1Char;
-
-        @ApiModelProperty("CH2 Character, Max: 16char(kor),32char(eng)")
-        @JsonProperty("ch2_char")
-        @Size(min=1, max=32)
-        private String ch2Char;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvVarCharControlSetReq(Integer sector_no, Short start_pan, Short end_pan,
-                                        Short ch1_char_size, Short ch1_pos_x, Short ch1_pos_y,
-                                        Short ch2_char_size, Short ch2_pos_x, Short ch2_pos_y,
-                                        String ch1_char, String ch2_char,
-                                        String user_id) {
-            this.sectorNo = sector_no;
-            this.startPan = start_pan;
-            this.endPan = end_pan;
-            this.ch1CharSize = ch1_char_size;
-            this.ch1PosX = ch1_pos_x;
-            this.ch1PosY = ch1_pos_y;
-            this.ch2CharSize = ch2_char_size;
-            this.ch2PosX = ch2_pos_x;
-            this.ch2PosY = ch2_pos_y;
-            this.ch1Char = ch1_char;
-            this.ch2Char = ch2_char;
-            this.userId = user_id;
-        }
-    }
-
-    @ApiModel("CctvVarCharControlDelReq(CCTV 가변 문자 지우기)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvVarCharControlDelReq {
-
-        @ApiModelProperty("Sector No. 0~6")
-        @JsonProperty("sector_no")
-        @PositiveOrZero
-        private Integer sectorNo;
-
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
-
-        @Builder
-        public CctvVarCharControlDelReq(Integer sector_no, String user_id) {
-            this.sectorNo = sector_no;
-            this.userId = user_id;
-        }
-    }
-
-    @ApiModel("CctvVarCharControlRes(CCTV 가변 문자 설정 응답)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class CctvVarCharControlRes {
-
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
-
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
-
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public CctvVarCharControlRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
-
-}

+ 0 - 79
src/main/java/com/its/vms/api/dto/TbCctvCtlrSttsDto.java

@@ -1,79 +0,0 @@
-package com.its.vms.api.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * CCTV 상태 DTO Class
- */
-@Data
-@Builder
-@ApiModel("TbCctvCtlrSttsDto(CCTV 상태)")
-public class TbCctvCtlrSttsDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty("CCTV 관리 번호")  // N NUMBER(10)
-    @JsonProperty("cctv_ctlr_nmbr")
-    private Long cctvCtlrNmbr;
-
-    @ApiModelProperty("갱신 일시")  // Y VARCHAR2(14)
-    @JsonProperty("updt_dt")
-    private String updtDt;
-
-    @ApiModelProperty("통신 상태 코드")  // Y VARCHAR2(7)
-    @JsonProperty("cmnc_stts_cd")
-    private String cmncSttsCd;
-
-    @ApiModelProperty("함체 문 상태 코드('CDS')-앞문/뒷문상태가 모두닫힌경우 닫힘")  // Y VARCHAR2(7)
-    @JsonProperty("cbox_door_stts_cd")
-    private String cboxDoorSttsCd;
-
-    @ApiModelProperty("앞문 상태 코드('CDS')")  // Y VARCHAR2(7)
-    @JsonProperty("front_door_stts_cd")
-    private String frontDoorSttsCd;
-
-    @ApiModelProperty("뒷문 상태 코드('CDS')")  // Y VARCHAR2(7)
-    @JsonProperty("back_door_stts_cd")
-    private String backDoorSttsCd;
-
-    @ApiModelProperty("팬 상태 코드('PAS')")  // Y VARCHAR2(7)
-    @JsonProperty("fan_stts_cd")
-    private String fanSttsCd;
-
-    @ApiModelProperty("히터 상태 코드('HTS')")  // Y VARCHAR2(7)
-    @JsonProperty("hetr_stts_cd")
-    private String hetrSttsCd;
-
-    @ApiModelProperty("Video Input 여부('VDI')")  // Y VARCHAR2(7)
-    @JsonProperty("video_input")
-    private String videoInput;
-
-    @ApiModelProperty("함체 온도")  // Y NUMBER(3)
-    @JsonProperty("cbox_tmpr")
-    private Integer cboxTmpr;
-
-    @ApiModelProperty("함체 습도")  // Y NUMBER(3)
-    @JsonProperty("cbox_hmdt")
-    private Integer cboxHmdt;
-
-    @ApiModelProperty("PAN")  // Y NUMBER(6)
-    @JsonProperty("pan")
-    private Integer pan;
-
-    @ApiModelProperty("TILT")  // Y NUMBER(6)
-    @JsonProperty("tilt")
-    private Integer tilt;
-
-    @ApiModelProperty("확대/축소범위")  // Y NUMBER(6)
-    @JsonProperty("zoom")
-    private Integer zoom;
-
-    @ApiModelProperty("FOCUS")  // Y NUMBER(6)
-    @JsonProperty("focus")
-    private Integer focus;
-}

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

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsCtlrStatus implements Serializable {

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

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsDebug implements Serializable {

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

@@ -8,7 +8,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsEvehicle implements Serializable {

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

@@ -8,7 +8,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsEvent implements Serializable {

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

@@ -26,7 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Slf4j
 @Data
@@ -73,6 +73,7 @@ public class VmsForm implements Serializable {
     private String vmsDsplMsgData;
     private String vmsDsplMsgTxt;
     private int dnldFormNo;
+    private boolean isObjectDownload;
 
     public VmsForm(Integer vmsFormId) {
         this.vmsFormId = vmsFormId;
@@ -91,6 +92,7 @@ public class VmsForm implements Serializable {
         this.imageData  = null;
         this.vmsDsplMsgData = "";
         this.vmsDsplMsgTxt = "";
+        this.isObjectDownload = false;
     }
 
     public void clear() {

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

@@ -62,6 +62,7 @@ public class VmsFormManager implements Serializable {
         }
         this.objectCount++;
         form.setDnldFormNo(dnldFormNo);
+        form.setObjectDownload(false);
         return form;
     }
 

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

@@ -17,7 +17,7 @@ import java.io.IOException;
 import java.io.Serializable;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Slf4j
 @Data
@@ -80,10 +80,10 @@ public class VmsFormObject implements Serializable {
         this.textAlign  = obj.getVmsFontAlign();            // NUMBER(1)	Y	0		VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
         this.posX       = obj.getVmsDsplXcrdn();            // NUMBER(5)	Y			VMS 표출 X좌표
         this.posY       = obj.getVmsDsplYcrdn();            // NUMBER(5)	Y			VMS 표출 Y좌표
-        this.dsplWidth = obj.getVmsDsplWidth();             // NUMBER(5)	Y	0		VMS 표출 넓이
+        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.blinking = 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();
@@ -99,6 +99,14 @@ public class VmsFormObject implements Serializable {
             // 소통정보배경 이미지
             this.objectKind = eVmsFormObjectKind.OBJECT_BITMAP;
         }
+        else if (obj.getVmsFormObjectTypeCd() == 201) {
+            // 동영상 파일
+            this.objectKind = eVmsFormObjectKind.OBJECT_VIDEO_FILE;
+        }
+        else if (obj.getVmsFormObjectTypeCd() == 301) {
+            // 스트리밍 주소
+            this.objectKind = eVmsFormObjectKind.OBJECT_STREAM_URL;
+        }
         else {
             this.objectKind = eVmsFormObjectKind.OBJECT_TEXT;
         }

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

@@ -5,7 +5,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsLuminance implements Serializable {

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

@@ -6,7 +6,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsModule implements Serializable {

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

@@ -8,7 +8,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- *  DTO Class
+ *  Domain Class
  */
 @Data
 public class VmsSchedule implements Serializable {

+ 105 - 31
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -19,11 +19,9 @@ 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.xnettcp.vms.protocol.VmsReqFramePacket;
-import com.its.vms.xnettcp.vms.protocol.dto.VmsFormDataDto;
-import com.its.vms.xnettcp.vms.protocol.dto.VmsFormDto;
-import com.its.vms.xnettcp.vms.protocol.dto.VmsFormObj;
-import com.its.vms.xnettcp.vms.protocol.dto.VmsFormObjBitmapId;
+import com.its.vms.xnettcp.vms.protocol.dto.*;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsFileSaveLocation;
+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.enums.eVmsOpCode;
 import com.its.vms.xnettcp.vms.protocol.impl.*;
@@ -37,6 +35,7 @@ import java.io.Serializable;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
+import java.util.List;
 import java.util.Map;
 import java.util.Timer;
 import java.util.concurrent.ConcurrentHashMap;
@@ -584,18 +583,55 @@ public class TbVmsCtlrDto implements Serializable {
         VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
         for (int ii = 0; ii < formCnt; ii++) {
             VmsForm pForm = this.formManager.getItem(units[ii].getFormIdx());
-
-            int bitmapId = units[ii].getBitmapId();
-            int objSize = 1;
-            int blinking = pForm.getVmsFormDsplMthdCd();
-            int posX = 0;
-            int posY = 0;
-            int bkClr = units[ii].getBkClr();
-
-            VmsFormDto formDto = formData.addForm(units[ii].getVmsFormId(), units[ii].getDisplaySec(), units[ii].getDisplayType(), units[ii].getBkClr(), objSize);
-            VmsFormObj formObjDto= new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, this.vmsWidth, this.vmsHeight, eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), bitmapId);
-            formObjDto.calSize();
-            formDto.addObject(formObjDto);
+            int formBitmapId = units[ii].getBitmapId();
+            int formBlinking = pForm.getVmsFormDsplMthdCd();
+            int formBkClr = units[ii].getBkClr();
+            int formDisplayType = units[ii].getDisplayType();
+            int formDisplaySec = units[ii].getDisplaySec();
+            Integer vmsFormId = units[ii].getVmsFormId();
+
+            if (pForm.isObjectDownload()) {
+                // TODO: 모든 객체를 추가해 줘야 한다.
+                List<VmsFormObject> objects = pForm.getObjects();
+                VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, objects.size());
+                for (int jj = 0; jj < objects.size(); jj++) {
+                    VmsFormObject formObj = objects.get(jj);
+                    int objSize = formObj.getObjectSize();
+                    int blinking = formObj.getBlinking();
+                    int posX = formObj.getPosX();
+                    int posY = formObj.getPosY();
+                    int bkClr = formObj.getBkColor();
+
+                    VmsFormObj formObjDto = null;
+                    if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
+                        int clrR = formObj.getFontClr().getRed();
+                        int clrG = formObj.getFontClr().getGreen();
+                        int clrB = formObj.getFontClr().getBlue();
+                        formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), formObj.getFontNameCd(), formObj.getFontBold(), formObj.getTextData());
+                    }
+                    else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
+                        formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
+                    }
+                    else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_VIDEO_FILE) {
+                        formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                    }
+                    else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_STREAM_URL) {
+                        formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                    }
+                    else {
+                        formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
+                    }
+                    formObjDto.calSize();
+                    formDto.addObject(formObjDto);
+                }
+            }
+            else {
+                // 이미지를 통째로 다운로드 한다.
+                VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, 1);
+                VmsFormObj formObjDto = new VmsFormObjBitmapId(1, formBlinking, 0, 0, formBkClr, this.vmsWidth, this.vmsHeight, eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formBitmapId);
+                formObjDto.calSize();
+                formDto.addObject(formObjDto);
+            }
         }
         formData.calFormCount();
 
@@ -626,31 +662,69 @@ public class TbVmsCtlrDto implements Serializable {
         // 폼아이디는 제어기가 최초에 접속했을때 한번만 내려보내기 때문에
         // 폼아이디를 여기서 설정해 주어야 한다.
         VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
-        int formId   = units[downloadCnt].getFormNo();
-        int downloadFormCnt = 1;
-        int displaySec = 1;//units[downloadCnt].getDisplaySec();
-        int displayType = units[downloadCnt].getDisplayType();
-        int bitmapId = units[downloadCnt].getBitmapId();
         int formIdx  = units[downloadCnt].getFormIdx();
         VmsForm pForm = this.formManager.getItem(formIdx);
-        int objSize = 1;
-        int blinking = pForm.getVmsFormDsplMthdCd();
-        int posX = 0;
-        int posY = 0;
-        int bkClr = units[downloadCnt].getBkClr();
 
+        int formBitmapId = units[downloadCnt].getBitmapId();
+        int formBlinking = pForm.getVmsFormDsplMthdCd();
+        int formBkClr = units[downloadCnt].getBkClr();
+        int formDisplayType = units[downloadCnt].getDisplayType();
+        int formDisplaySec = units[downloadCnt].getDisplaySec();
+        Integer vmsFormId = units[downloadCnt].getVmsFormId();
+
+        int formId = units[downloadCnt].getFormNo();
+        int downloadFormCnt = 1;
+        int displaySec = 1;//units[downloadCnt].getDisplaySec();
+        int displayType = units[downloadCnt].getDisplayType();
         VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
-        VmsFormDto formDto = formData.addForm(formId, displaySec, displayType, bkClr, objSize);
-        VmsFormObj formObjDto= new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, this.vmsWidth, this.vmsHeight, eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), bitmapId);
-        formObjDto.calSize();
-        formDto.addObject(formObjDto);
+
+        if (pForm.isObjectDownload()) {
+            List<VmsFormObject> objects = pForm.getObjects();
+            VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, objects.size());
+            for (int jj = 0; jj < objects.size(); jj++) {
+                VmsFormObject formObj = objects.get(jj);
+                int objSize = formObj.getObjectSize();
+                int blinking = formObj.getBlinking();
+                int posX = formObj.getPosX();
+                int posY = formObj.getPosY();
+                int bkClr = formObj.getBkColor();
+
+                VmsFormObj formObjDto;
+                if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
+                    int clrR = formObj.getFontClr().getRed();
+                    int clrG = formObj.getFontClr().getGreen();
+                    int clrB = formObj.getFontClr().getBlue();
+                    formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), formObj.getFontNameCd(), formObj.getFontBold(), formObj.getTextData());
+                }
+                else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
+                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[downloadCnt].getBitmapId());
+                }
+                else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_VIDEO_FILE) {
+                    formObjDto = new VmsFormObjVideo(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                }
+                else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_STREAM_URL) {
+                    formObjDto = new VmsFormObjStream(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), "");
+                }
+                else {
+                    formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
+                }
+                formObjDto.calSize();
+                formDto.addObject(formObjDto);
+            }
+        }
+        else {
+            VmsFormDto formDto = formData.addForm(vmsFormId, formDisplaySec, formDisplayType, formBkClr, 1);
+            VmsFormObj formObjDto = new VmsFormObjBitmapId(1, formBlinking, 0, 0, formBkClr, this.vmsWidth, this.vmsHeight, eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formBitmapId);
+            formObjDto.calSize();
+            formDto.addObject(formObjDto);
+        }
         formData.calFormCount();
 
         this.downloadData.setDownloadCnt(downloadCnt+1);
 
         if (debug.isDebug()) {
             log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, Download Count {} EA, VmsFormId {}, FormId {}, BitmapId {}.",
-                    this.vmsCtlrNmbr, formCnt, downloadCnt + 1, pForm.getVmsFormId(), formId, bitmapId);
+                    this.vmsCtlrNmbr, formCnt, downloadCnt + 1, pForm.getVmsFormId(), formId, formBitmapId);
         }
 
 //        VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);

+ 0 - 657
src/main/java/com/its/vms/dto/TbVmsCtlrDtoBack.java

@@ -1,657 +0,0 @@
-package com.its.vms.dto;
-
-import com.its.app.AppUtils;
-import com.its.vms.config.ApplicationConfig;
-import com.its.vms.domain.*;
-import com.its.vms.domain.enums.eVmsFormType;
-import com.its.vms.domain.task.VmsCommandTimeoutTask;
-import com.its.vms.entity.TbVmsCtlrStts;
-import com.its.vms.entity.TbVmsCtrlHs;
-import com.its.vms.entity.VmsCtlrParam;
-import com.its.vms.process.DbmsData;
-import com.its.vms.process.DbmsDataProcess;
-import com.its.vms.process.DbmsDataType;
-import com.its.vms.service.VmsFormService;
-import com.its.vms.xnettcp.vms.protocol.VmsReqFramePacket;
-import com.its.vms.xnettcp.vms.protocol.dto.*;
-import com.its.vms.xnettcp.vms.protocol.enums.eVmsFileSaveLocation;
-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.VmsReqBlank;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDataDownload;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDownloadForm;
-import com.its.vms.xnettcp.vms.protocol.impl.VmsReqDownloadFormSchedule;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import lombok.*;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.Serializable;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import java.util.Timer;
-import java.util.concurrent.ConcurrentHashMap;
-
-@Slf4j
-@Getter
-@Setter
-@ToString
-@Builder
-@NoArgsConstructor//(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
-public class TbVmsCtlrDtoBack implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private int  index;
-    private Long vmsCtlrNmbr;
-    private Long groupNo;
-    private Integer ctlrLocalNo;
-    private String ctlrId;
-    private String name;
-    private String ctlrIp;
-    private String ctlrPort;
-    private String usagTypeCd;
-    private String frmTypeCd;
-    private String typeCd;
-    private String modlTypeCd;
-    private String operMode;
-    private Integer cmncfailSlotNmbr;
-    private Integer pwerFailSlotNmbr;
-    private String cmtrinfrCnctYn;
-    private String wthrinfrCnctYn;
-    private String envrinfrCnctYn;
-    private Integer maxPhaseNum;
-    private String istlLctnNm;
-    private String istlLctnAddr;
-    private String trfcStrgUseYn;
-    private Long locIfscId;
-
-    private Integer defPhseChngCycl;    // 기본메시지주기
-    private String panlOnTime;          // 전광판 ON TIME
-    private String panlOffTime;         // 전광판 OFF TIME
-    private Integer panlPwerMode;        // 전광판 전원 모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer fanMode;            // FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer fanRunTmpr;          // 팬 동작 온도
-    private Integer hetrMode;           // 히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
-    private Integer hetrRunTmpr;         // 히터 동작 온도
-    private Integer brghMode;           // 휘도 모드(0x00:주간,0x01:야간,0x02:자동,0x09:수동)
-    private Integer brghCurrStep;       // 휘도 현재 단계(0~100)
-    private Integer brghWeekStep;       // 휘도 주간 단계(0~100)
-    private Integer brghNghtStep;       // 휘도 야간 단계(0~100)
-    private Integer modlErrRate;        // VMS 모듈 오류 율
-    private Integer cmncFailRate;       // VMS 통신 오류 기본 값
-
-    private Integer protocolVer;
-    private String delYn;
-
-    private int vmsWidth;
-    private int vmsHeight;
-    private int modlRowNum;
-    private int modlColNum;
-    private int powrRowNum;
-    private int powrColNum;
-
-    private String localFormDir;
-    private String ftpFormDir;
-    private boolean ftpDownload;
-    private boolean symbolDownload;
-
-    private int maxCngstForm;        // 정체폼 생성 최대 갯수
-    private int cngstForms;
-    private boolean existCngsForm;
-    private boolean provide;
-    private boolean evehIngForm;
-    private boolean evehEndForm;
-
-    private VmsFormManager formManager;
-
-    /**
-     * VMS 메시지 생성 메모리
-     */
-    private VmsEvehicle evechile;
-    private VmsSchedule schedule;   // 스케쥴 정보
-    private VmsEvent incident;      // 돌발정보
-    private VmsEvent event;         // 공사행사정보
-
-    private VmsModule module;
-    private VmsLuminance luminance;
-    private VmsControlMode controlMode;
-    private byte txtOpCode;
-
-    private TbVmsCtlrStts     stts;
-    private int 			  netState;
-    private boolean           isDupCon;
-    private boolean           isDupLogin;
-    private String 		      dstIpAddr;
-    private Channel           channel = null;
-    private Channel           dupChannel = null;
-    private InetSocketAddress cliReq;
-    private long              syncTime;
-    private VmsFrameSequence  seq;
-
-    private Integer downloadFormId;
-    private VmsDownloadFile downloadFile;           // 제어기로 다운로드할 파일정보(TB_VMS_DOWNLOAD)
-    private VmsDownloadData downloadData;           // 제어기로 다운로드할 파일 데이터
-    private ConcurrentHashMap<Integer, VmsDownloadForm> downloadFormMap = null;
-    private ConcurrentHashMap<Integer, TbVmsSymbLibDnldDto> dnldSymbMap = null;
-    private ConcurrentHashMap<Integer, VmsScheduleSymbDto> reqDnldSymbMap;
-    Integer dnldSymbLibNmbr;
-
-    private ConcurrentHashMap<Long, TbVmsRltnIfscDto> rltnIfscMap = null;   // VMS 에 설정된 VMS 정보제공구간 목록
-
-    private ConcurrentHashMap<Short, Timer> registeredCommandTimer = null;
-    private ConcurrentHashMap<Short, VmsCommandTimeoutTask> registeredCommand = null;
-
-    private ConcurrentHashMap<Long, TbVmsCtrlHs> userCommands = null;
-
-    private int connectCount;
-    private String connectTm;
-    private String disConnectTm;
-    private long lastRecvTime;
-
-    /**
-     * Channel Send Data
-     * @param packet
-     * @param retryCnt
-     * @return
-     */
-    public synchronized boolean sendData(VmsReqFramePacket packet, int retryCnt) {
-        boolean result = false;
-
-        ByteBuffer sendBuffer = packet.getByteBuffer();
-        String packetDesc = packet.getOpCodeDesc();
-
-        log.info("~REQUEST-{}. VMS {}, {} Bytes.", packetDesc, this.vmsCtlrNmbr, sendBuffer.capacity());
-        if (this.channel != null) {
-            ChannelFuture f = this.channel.writeAndFlush(sendBuffer);
-            f.awaitUninterruptibly();
-            if (f.isDone() || f.isSuccess()) {
-                result = true;
-            } else {
-                log.error("~REQUEST-{}. VMS {}, sendData Failed. {} Bytes.", packetDesc, this.vmsCtlrNmbr, sendBuffer.array().length);
-            }
-        } else {
-            log.error("~REQUEST-{}. VMS {}, sendData Failed. Not Connected. {} Bytes.", packetDesc, this.vmsCtlrNmbr, sendBuffer.array().length);
-        }
-        if (result) {
-            //VmsCommandTimeoutTask cmdTimeoutTask = new VmsCommandTimeoutTask(this, packet, retryCnt);
-            //addRegisteredCommandsTimer(cmdTimeoutTask);
-        }
-        return result;
-    }
-
-    /**
-     * 제어기에 메시지를 표출하기 위한 작업.
-     * 1. 제어기에 표출할 폼 정보를 다운로드 한다. - downloadForm
-     * 2. 파일 다운로드(이미지, 심볼) - downloadFile
-     * 3. 폼 스케쥴 다운로드 - downloadFormSchedule
-     * 4. Blank - downloadBlank
-     * @return
-     */
-    public boolean downloadForm() {
-        VmsFormService formService = (VmsFormService) AppUtils.getBean(VmsFormService.class);
-        this.txtOpCode = (byte)0x00;
-        this.downloadData.init();
-
-        int forms = 0;
-        int formCnt = this.formManager.count();
-        if (formCnt == 0) {
-            log.info("downloadForm: VMS {}, Form Data Not Found.", this.vmsCtlrNmbr);
-            return true;
-        }
-        if (formCnt > this.maxPhaseNum) {
-            log.error("downloadForm: 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("downloadForm: VMS {}, SEQ {}, SUCCESS {}", this.vmsCtlrNmbr, ii, pForm.isSuccess());
-                continue;
-            }
-            Integer vmsFormId = pForm.getVmsFormId();
-            TbVmsFormDto vmsForm = formService.find(vmsFormId);
-            if (vmsForm == null) {
-                log.error("downloadForm: 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].setBitmapId(pForm.getDnldFormNo());
-            units[forms].setFormNo(9000 + forms);
-            units[forms].setDisplaySec(pForm.getDsplHh());
-            units[forms].setDisplayType(pForm.getVmsFormDsplMthdCd());
-            units[forms].setBkClr(pForm.getVmsFormColrCd());
-
-            if (vmsForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue()) {
-                // 다운로드 할 폼이 홍보폼이면 여러번 다운로드 하지 않도록 메모리에서 관리하자.
-                VmsDownloadForm downloadForm = this.downloadFormMap.get(vmsFormId);
-                if (downloadForm != null) {
-                    // 이전에 다운로드한 폼 정보가 존재하면
-                    if (!vmsForm.getUpdtDt().equals(downloadForm.getUpdtDt())) {
-                        // 업데이트시각이 다르기때문에 신규폼으로 판단한다.
-                        downloadForm.setAlreadyDownload(false);
-                        downloadForm.setUpdtDt(vmsForm.getUpdtDt());
-                        units[forms].setDownload(true); // 현재 스케쥴폼으로 다운로드 플래그 설정
-                    }
-                    if (downloadForm.isAlreadyDownload()) {
-                        // 이미 이전에 다운로드를 했기때문에 이번에는 제어기로 다운로드를 하지 않는다.
-                        units[forms].setDownload(false);
-                    }
-                }
-                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("downloadForm: 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
-            downloadDefaultForm();
-        }
-        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
-            downloadAutoFixForm();
-        }
-        return true;
-    }
-
-    /**
-     * 기본 스케쥴의 폼 정보는 하나의 폼 패킷에 다운로드 해야 여러 폼을 표출할 수 있다.
-     * 제어기에서 FID0000 인 폼이 기본 표출폼 이기 때문이다.
-     * @return
-     */
-    public boolean downloadDefaultForm() {
-        // Download Form  (기본폼은 하나의 폼에 여러폼을 다운로드한다.)
-        int formCnt = this.downloadData.getMaxSchedule();
-        if (formCnt <= 0) {
-            log.info("downloadDefaultForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
-            return true;
-        }
-
-        log.info("downloadDefaultForm: VMS {}, Form {} EA.", this.vmsCtlrNmbr, formCnt);
-        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 formObj = objects.get(jj);
-
-                int objSize = formObj.getObjectSize();
-                int blinking = formObj.getBlinking();
-                int posX = formObj.getPosX();
-                int posY = formObj.getPosY();
-                int bkClr = formObj.getBkColor();
-
-                VmsFormObj formObjDto;
-                if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
-                    int clrR = formObj.getFontClr().getRed();
-                    int clrG = formObj.getFontClr().getGreen();
-                    int clrB = formObj.getFontClr().getBlue();
-                    formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), formObj.getFontNameCd(), formObj.getFontBold(), formObj.getTextData());
-                }
-                else if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_BITMAP_ID) {
-                    formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.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, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
-                }
-                formObjDto.calSize();
-                formDto.addObject(formObjDto);
-            }
-            formDto.calObjCount();
-        }
-        formData.calFormCount();
-
-        VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(null/*this*/, formData);
-        return sendData(downloadForm, 1);
-    }
-
-    /**
-     * 자동 및 고정 스케쥴인 경우 폼정보 하나를 하나의 패킷으로 전송한다.
-     * @return
-     */
-    public boolean downloadAutoFixForm() {
-        // Download Form  (패킷하나에 하나의 폼 정보를 다운로드한다.)
-        ApplicationConfig config = (ApplicationConfig)AppUtils.getBean(ApplicationConfig.class);
-        int formCnt = this.downloadData.getMaxSchedule();
-        if (formCnt <= 0) {
-            log.info("downloadAutoFixForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
-            return true;
-        }
-        int downloadCnt = this.downloadData.getDownloadCnt();
-        log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, Download Count {} EA.", this.vmsCtlrNmbr, formCnt, downloadCnt);
-        if (downloadCnt >= formCnt) {
-            // 폼정보를 모두 다운로드 했기때문에 폼파일을 다운로드 해야 한다.
-            this.downloadData.setDownloadCnt(0); // 폼이미지파일을 다운로드해야 하기때문에 다운로드 인덱스를 다시 0으로 리셋
-            return downloadFile();
-        }
-
-        // 폼아이디는 제어기가 최초에 접속했을때 한번만 내려보내기 때문에
-        // 폼아이디를 여기서 설정해 주어야 한다.
-        VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
-        int formId   = units[downloadCnt].getFormNo();
-        int downloadFormCnt = 1;
-        int displaySec = 1;//units[downloadCnt].getDisplaySec();
-        int displayType = units[downloadCnt].getDisplayType();
-        int bitmapId = units[downloadCnt].getBitmapId();
-        int formIdx  = units[downloadCnt].getFormIdx();
-        VmsForm pForm = this.formManager.getItem(formIdx);
-        int objSize = 1;
-        int blinking = pForm.getVmsFormDsplMthdCd();
-        int posX = 0;
-        int posY = 0;
-        int bkClr = units[downloadCnt].getBkClr();
-
-        VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
-        VmsFormDto formDto = formData.addForm(formId, displaySec, displayType, bkClr, objSize);
-        VmsFormObj formObjDto= new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, this.vmsWidth, this.vmsHeight, eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), bitmapId);
-        formObjDto.calSize();
-        formDto.addObject(formObjDto);
-        formData.calFormCount();
-
-        this.downloadData.setDownloadCnt(downloadCnt+1);
-
-        log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, Download Count {} EA, VmsFormId {}, FormId {}, BitmapId {}.",
-                this.vmsCtlrNmbr, formCnt, downloadCnt+1, pForm.getVmsFormId(), formId, bitmapId);
-
-//        VmsFormDataDto formData = new VmsFormDataDto(formId, downloadFormCnt);
-//        int ii = downloadCnt;
-//        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 formObj = objects.get(jj);
-//
-//            int objSize = formObj.getObjectSize();
-//            int blinking = formObj.getBlinking();
-//            int posX = formObj.getPosX();
-//            int posY = formObj.getPosY();
-//            int bkClr = formObj.getBkColor();
-//
-//            String fileName = String.format("C:\\DRIVE_E\\ANDONG_VMS_FTP\\FORM\\%d_%d_%d-%d-%d-%d-%d.bmp", this.vmsCtlrNmbr, ii, jj, posX, posY, formObj.getDsplWidth(), formObj.getDsplHeight());
-//
-//            VmsFormObj formObjDto;
-//            if (objects.get(jj).getObjectKind() == eVmsFormObjectKind.OBJECT_TEXT) {
-//                int clrR = formObj.getFontClr().getRed();
-//                int clrG = formObj.getFontClr().getGreen();
-//                int clrB = formObj.getFontClr().getBlue();
-//                int fontNameCd = formObj.getFontNameCd();
-//                formObjDto = new VmsFormObjText(objSize, blinking, posX, posY, bkClr, clrR, clrG, clrB, formObj.getFontSize(), fontNameCd, formObj.getFontBold(), formObj.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());
-//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
-//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
-//            }
-//            else {
-//                //formObjDto = new VmsFormObjBitmapId(objSize, blinking, posX, posY, bkClr, object.getDsplWidth(), object.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), units[ii].getBitmapId());
-//                ItsUtils.saveByteArrayToFile(fileName, formObj.getImageData());
-//                formObjDto = new VmsFormObjBitmap(objSize, blinking, posX, posY, bkClr, formObj.getDsplWidth(), formObj.getDsplHeight(), eVmsImageType.VMS_IMAGE_TYPE_BMP.getValue(), formObj.getImageData());
-//            }
-//            formObjDto.calSize();
-//            formDto.addObject(formObjDto);
-//        }
-//        formDto.calObjCount();
-//        formData.calFormCount();
-
-        VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(null/*this*/, formData);
-        return sendData(downloadForm, 1);
-    }
-
-    /**
-     * 폼 이미지 및 기타 폼에 표출할 심볼 이미지가 다운로드 완료가 된후에 스케쥴 정보를 표출하도록 한다.
-     * @return
-     */
-    public boolean downloadFile() {
-        int formCnt = this.downloadData.getMaxSchedule();
-        if (formCnt <= 0) {
-            log.info("downloadFile: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
-            return true;
-        }
-
-        int downloadCnt = this.downloadData.getDownloadCnt();
-        log.info("downloadFile: VMS {}, Schedule Form {} EA, Download Count {} EA.", this.vmsCtlrNmbr, formCnt, downloadCnt);
-        if (downloadCnt >= formCnt) {
-            // 폼파일이(폼이미지파일) 모두 다운로드 되었으므로 스케쥴 정보를 다운로드 한다.
-            return downloadFormSchedule();  // Display Schedule Form
-        }
-
-        this.downloadFormId = 0;
-        ApplicationConfig config = (ApplicationConfig)AppUtils.getBean(ApplicationConfig.class);
-        VmsDownloadData.VmsDownloadDataInfo[] units = this.downloadData.getUnits();
-        for (int ii = downloadCnt; ii < formCnt; ii++) {
-            this.downloadData.setDownloadCnt(downloadCnt+1);
-
-            int vmsFormId = units[ii].getVmsFormId();
-            int formId    = units[ii].getFormNo();
-            int bitmapId  = units[ii].getBitmapId();
-            int formIdx   = units[ii].getFormIdx();
-            VmsForm pForm = this.formManager.getItem(formIdx);
-
-            if (pForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_hongbo.getValue()) {
-                // 홈보폼인 경우 다운로드 폼 ID를 저장해 놓는다.
-                this.downloadFormId = vmsFormId;
-            }
-
-            if (config.isCheckNewForm() && !units[ii].isDownload()) {
-                // 이미 다운로드 했기 때문에 다시 다운로드 하지 않는다.
-                log.info("downloadFile: VMS {}, IDX {}, VmsFormId {}, FormId {}, BitmapId {}, formIdx {}, DownloadFormID: {}, already download...",
-                        this.vmsCtlrNmbr, ii, vmsFormId, formId, bitmapId, formIdx, this.downloadFormId);
-                this.downloadFormId = 0;
-                continue;
-            }
-
-            log.info("downloadFile: VMS {}, Idx {}, VmsFormId {}, FormId {}, BitmapId {}, formIdx {}, DownloadFormID: {}",
-                    this.vmsCtlrNmbr, ii, pForm.getVmsFormId(), formId, bitmapId, formIdx, this.downloadFormId);
-
-            String fileName = String.format("BID%04d.BMP", bitmapId);
-            eVmsFileSaveLocation saveLoc = eVmsFileSaveLocation.LOC_DOWNLOAD_PROG_IMAGE;
-
-            VmsReqDataDownload dataDownload = new VmsReqDataDownload(null/*this*/, saveLoc, fileName, pForm.getImageData());
-            return sendData(dataDownload, 1);
-        }
-
-        // 폼이미지 정보가 모두 다운로드 되었으므로 스케쥴 정보를 다운로드 한다.
-        return downloadFormSchedule();  // Display Schedule Form
-    }
-
-    /**
-     * 제어기에 표출할 폼의 스케쥴 정보를 다운로드 한다.
-     * @return
-     */
-    public boolean downloadFormSchedule() {
-        // 도로공사 표준에 최대 10개의 스케쥴을 사용하도록 되어 있음.
-        int maxSchedule = VmsConstants.VMS_MIN_DOWNLOAD_FORMS;
-        int formCnt = this.downloadData.getMaxSchedule();
-        if (formCnt <= 0) {
-            log.info("downloadScheduleForm: VMS {}, Download Schedule Form Count Zero. {} EA.", this.vmsCtlrNmbr, formCnt);
-            return true;
-        }
-
-        short[] formId = new short[maxSchedule];
-        byte[] dispSec = new byte[maxSchedule];
-        for (int ii = 0; ii < maxSchedule; ii++) {
-            formId[ii] = 0;
-            dispSec[ii] = 0;
-        }
-
-        log.info("downloadFormSchedule: VMS {}, Schedule {} EA, Default Schedule {}.", this.vmsCtlrNmbr, formCnt, this.downloadData.isDefault());
-        if (this.downloadData.isDefault()) {
-            formId[0] = (short)VmsConstants.DEFAULT_FORM_ID;
-            dispSec[0] = 4;
-            log.info("downloadFormSchedule: VMS {}, Schedule {} EA, Default Schedule {}.", this.vmsCtlrNmbr, formCnt, this.downloadData.isDefault());
-        }
-        else {
-            for (int ii = 0; ii < formCnt && ii < maxSchedule; ii++) {
-                formId[ii] = (short) this.downloadData.getUnits()[ii].getFormNo();
-                dispSec[ii] = (byte)(this.downloadData.getUnits()[ii].getDisplaySec() & 0xFF);
-                log.info("downloadFormSchedule: VMS {}, Schedule {} EA, Idx {}, FormId {}, DisplayTm {}.", this.vmsCtlrNmbr, formCnt, ii+1, formId[ii], dispSec[ii]);
-            }
-        }
-
-        VmsReqDownloadFormSchedule downloadFormSchedule = new VmsReqDownloadFormSchedule(null/*this*/, formId, dispSec);
-        return sendData(downloadFormSchedule, 1);
-    }
-
-    /**
-     * 스케쥴을 표출하도록 Blank 명령을 전송한다.
-     * @return
-     */
-    public boolean downloadBlank() {
-        log.info("downloadBlank: VMS {}.", this.vmsCtlrNmbr);
-        VmsReqBlank reqBlank = new VmsReqBlank(null);//this);
-        return sendData(reqBlank, 1);
-    }
-
-    /**
-     * 제어기로 심벌라이브러리를 다운로드한다.
-     * @return
-     */
-    public boolean downloadSymbLib() {
-        this.dnldSymbLibNmbr = 0;
-        if (this.reqDnldSymbMap.size() == 0) {
-            return false;
-        }
-
-        VmsScheduleSymbDto dnldSymb = null;
-        for (Map.Entry<Integer, VmsScheduleSymbDto> e : this.reqDnldSymbMap.entrySet()) {
-            dnldSymb = e.getValue();
-            break;
-        }
-
-        if (dnldSymb != null) {
-            this.dnldSymbLibNmbr = dnldSymb.getDnldSymbLibNmbr();
-            String fileName = String.format("BID%04d.BMP", this.dnldSymbLibNmbr);
-            eVmsFileSaveLocation saveLoc = eVmsFileSaveLocation.LOC_DOWNLOAD_PROG_IMAGE;
-
-            VmsReqDataDownload dataDownload = new VmsReqDataDownload(null/*this*/, saveLoc, fileName, dnldSymb.getImageData());
-            sendData(dataDownload, 1);
-            return true;
-        }
-        return false;
-    }
-/*
-    private int   powerCtrlMode;  // 전원제어 모드                1 Byte  0x00 : 꺼짐, 0x01 : 켜짐,
-    private int   fanRunMode;     // Fan 동작모드                 1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
-    private int   fanRunTemp;     // Fan 의 동작개시온도          1 Byte  온도( 0x00 ~0x03f )
-    private int   heaterRunMode;  // Heater 의 동작모드           1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
-    private int   heaterRunTemp;  // Heater 의 동작개시온도       1 Byte  온도(0x00 ~ 0x3f )
-    private int   brightMode; // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
-    private int   brightCurr; // 화면의 밝기 - 현재 휘도값, 0~100
-    private int   brightWeek; // 화면의 밝기 - 주간 휘도값, 0~100
-    private int   brightNght; // 화면의 밝기 - 야간 휘도값, 0~100
-    private int   blinkTime;      // 깜빡이는 시간주기            1 Byte  문자 비트맵의 깜빡이는 시간주기 0x00 ~ 0x1e( 0.1 ~3.0 )
-    private short scnTurnTime;    // 디폴트 시나리오로 전환시간   2 Byte  디폴트 시나리오로 전환될 때까지 기다리는 시간, 단위 : 초
-    private int   modlErrRate;    // 장애 모듈비율(%)             1 Byte  에러난 픽셀의 백분율 (0~100: 초기값:10%)
-*/
-    public void updateParameter(int powerCtrlMode, int fanRunMode, int fanRunTemp, int heaterRunMode, int heaterRunTemp,
-                                int brightMode, int brightCurr, int brightWeek, int brightNght, int blinkTime, short scnTurnTime, int modlErrRate) {
-        boolean isDifferent = false;
-
-        if (powerCtrlMode != this.panlPwerMode) {
-            isDifferent = true;
-            this.panlPwerMode = powerCtrlMode;
-        }
-        if (fanRunMode != this.fanMode) {
-            isDifferent = true;
-            this.fanMode = fanRunMode;
-        }
-        if (fanRunTemp != this.fanRunTmpr) {
-            isDifferent = true;
-            this.fanRunTmpr = fanRunTemp;
-        }
-        if (heaterRunMode != this.hetrMode) {
-            isDifferent = true;
-            this.hetrMode = heaterRunMode;
-        }
-        if (heaterRunTemp != this.hetrRunTmpr) {
-            isDifferent = true;
-            this.hetrRunTmpr = heaterRunTemp;
-        }
-
-        if (brightMode != this.brghMode) {
-            isDifferent = true;
-            this.brghMode = brightMode;
-        }
-        if (brightCurr != this.brghCurrStep) {
-            isDifferent = true;
-            this.brghCurrStep = brightCurr;
-        }
-        if (brightWeek != this.brghWeekStep) {
-            isDifferent = true;
-            this.brghWeekStep = brightWeek;
-        }
-        if (brightNght != this.brghNghtStep) {
-            isDifferent = true;
-            this.brghNghtStep = brightNght;
-        }
-
-        if (scnTurnTime != this.defPhseChngCycl) {
-            isDifferent = true;
-            this.defPhseChngCycl = (int)scnTurnTime;
-        }
-        if (modlErrRate != this.modlErrRate) {
-            isDifferent = true;
-            this.modlErrRate = modlErrRate;
-        }
-
-        if (isDifferent) {
-            DbmsDataProcess dbmsDataProcess = (DbmsDataProcess) AppUtils.getBean(DbmsDataProcess.class);
-            dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_PARAMETER, false, toParamEntity()));
-        }
-    }
-
-    public VmsCtlrParam toParamEntity() {
-        return VmsCtlrParam.builder()
-                .vmsCtlrNmbr(this.vmsCtlrNmbr)
-                .panlPwerMode(this.panlPwerMode)
-                .fanMode(this.fanMode)
-                .fanRunTmpr(this.fanRunTmpr)
-                .hetrMode(this.hetrMode)
-                .hetrRunTmpr(this.hetrRunTmpr)
-                .brghMode(this.brghMode)
-                .brghCurrStep(this.brghCurrStep)
-                .brghWeekStep(this.brghWeekStep)
-                .brghNghtStep(this.brghNghtStep)
-                .modlErrRate(this.modlErrRate)
-                .cmncFailRate(this.cmncFailRate)
-                .build();
-    }
-
-}
-

+ 1 - 0
src/main/java/com/its/vms/dto/TbVmsScheduleDto.java

@@ -35,6 +35,7 @@ public class TbVmsScheduleDto implements Serializable {
     private Long fourImgIfscId;
     private Long symbLibNmbr;
     private String strmAddr;
+    private String strmHttpAddr;
     private String useYn;
     private boolean dsplCngsYn;
     private Integer vmsFormTypeCd;

+ 2 - 0
src/main/java/com/its/vms/entity/TbVmsSchedule.java

@@ -37,6 +37,7 @@ public class TbVmsSchedule implements Serializable {
     private Long fourImgIfscId;
     private Long symbLibNmbr;
     private String strmAddr;
+    private String strmHttpAddr;
     private String useYn;
     private String dsplCngsYn;
     private Integer vmsFormTypeCd;
@@ -62,6 +63,7 @@ public class TbVmsSchedule implements Serializable {
                 .fourImgIfscId(this.fourImgIfscId)
                 .symbLibNmbr(this.symbLibNmbr)
                 .strmAddr(this.strmAddr)
+                .strmHttpAddr(this.strmHttpAddr)
                 .useYn(this.useYn)
                 .dsplCngsYn("Y".equals(this.dsplCngsYn))
                 .vmsFormTypeCd(this.vmsFormTypeCd)

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

@@ -903,10 +903,17 @@ public class VmsManageService {
 
                     VmsFormObject formObj = form.addFormObject(obj.getVmsFormObjectId());
                     formObj.setFormObjectInfo(this.fontService.getFontName(obj.getVmsFontNameCd()), obj);
+                    if (formObj.getBlinking() == 1) {
+                        // 객체 Blinking 정보가 다운로드 될때 폼정보로 다운로드 되지 않기 때문에
+                        // Blinking 하기 위해서는 객체로 다운로드 하여야 한다.
+                        form.setObjectDownload(true);
+                        form.setVmsFormDsplDrctCd(1);
+                    }
 
                     if (obj.getVmsFormObjectTypeCd() == 201 || obj.getVmsFormObjectTypeCd() == 301) {
                         // 201:동영상명칭, 301:스트리밍영상주소
                         formObj.setTextData(schedule.getStrmAddr());
+                        form.setObjectDownload(true);
                     }
 
                     if (obj.getVmsFormObjectTypeCd() == 200 || obj.getVmsFormObjectTypeCd() == 300) {

+ 23 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResUploadCurrentDisplayForm.java

@@ -65,6 +65,7 @@ public class VmsResUploadCurrentDisplayForm implements VmsResponse {
         StringBuilder data = new StringBuilder();
         byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
 
+        byte temp;
         try {
             short formId = byteBuffer.getShort();
             short totalForms = byteBuffer.getShort();
@@ -143,6 +144,28 @@ public class VmsResUploadCurrentDisplayForm implements VmsResponse {
                             data.append(String.format("        넓이: %d, 높이: %d, Bitmap 유형: 0x%02X, Bitmap ID: BIT%04d.BMP",
                                     width, height, bitmapType & 0xFF, bitmapId));
                             break;
+                        case OBJECT_VIDEO_FILE:
+                            width = byteBuffer.getShort();
+                            height = byteBuffer.getShort();
+                            temp = byteBuffer.get();
+                            byte[] videoFileName = new byte[20];
+                            byteBuffer.get(videoFileName);
+                            String strVideoFileName = SysUtils.byteArrayToString(videoFileName);
+
+                            data.append(String.format("        넓이: %d, 높이: %d, VideoFileName: %s",
+                                    width, height, strVideoFileName));
+                            break;
+                        case OBJECT_STREAM_URL:
+                            width = byteBuffer.getShort();
+                            height = byteBuffer.getShort();
+                            temp = byteBuffer.get();
+                            byte[] streamUrl = new byte[120];
+                            byteBuffer.get(streamUrl);
+                            String strStreamUrl = SysUtils.byteArrayToString(streamUrl);
+
+                            data.append(String.format("        넓이: %d, 높이: %d, StreamUrl: %s",
+                                    width, height, strStreamUrl));
+                            break;
                         default:
                             data.append(String.format("알수없는 오브젝트 종류: 0x%02X", objKind));
                             return;

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

@@ -0,0 +1,34 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import com.its.app.utils.SysUtils;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Video Object
+ */
+@Getter
+@Setter
+public class VmsFormObjStream extends VmsFormObj {
+
+    private int width;          // 2
+    private int height;         // 2
+    private int reserved;       // 1
+    private byte[] streamUrl;   // 120
+
+    public VmsFormObjStream(int objSize, int blinking, int posX, int posY, int bkClr, int width, int height, String streamUrl) {
+        super(eVmsFormObjectKind.OBJECT_STREAM_URL.getValue(), objSize, blinking, posX, posY, bkClr);
+
+        this.width = width;
+        this.height = height;
+        this.reserved = 0;
+        this.streamUrl = new byte[120];
+        SysUtils.copyStringToByteArray(this.streamUrl, this.streamUrl.length, streamUrl);
+    }
+
+    @Override
+    public void calSize() {
+        setSize(125);
+    }
+}

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

@@ -0,0 +1,34 @@
+package com.its.vms.xnettcp.vms.protocol.dto;
+
+import com.its.app.utils.SysUtils;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsFormObjectKind;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Video Object
+ */
+@Getter
+@Setter
+public class VmsFormObjVideo extends VmsFormObj {
+
+    private int width;          // 2
+    private int height;         // 2
+    private int reserved;       // 1
+    private byte[] fileName;    // 20
+
+    public VmsFormObjVideo(int objSize, int blinking, int posX, int posY, int bkClr, int width, int height, String fileName) {
+        super(eVmsFormObjectKind.OBJECT_VIDEO_FILE.getValue(), objSize, blinking, posX, posY, bkClr);
+
+        this.width = width;
+        this.height = height;
+        this.reserved = 0;
+        this.fileName = new byte[20];
+        SysUtils.copyStringToByteArray(this.fileName, this.fileName.length, fileName);
+    }
+
+    @Override
+    public void calSize() {
+        setSize(25);
+    }
+}

+ 5 - 3
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsFormObjectKind.java

@@ -5,9 +5,11 @@ import java.util.Map;
 
 public enum eVmsFormObjectKind {
 
-    OBJECT_TEXT      ( 0x00, "0x00.문자열"),
-    OBJECT_BITMAP    ( 0x01, "0x01.Bitmap"),
-    OBJECT_BITMAP_ID ( 0x02, "0x02.Bitmap ID");
+    OBJECT_TEXT       ( 0x00, "0x00.문자열"),
+    OBJECT_BITMAP     ( 0x01, "0x01.Bitmap"),
+    OBJECT_BITMAP_ID  ( 0x02, "0x02.Bitmap ID"),
+    OBJECT_VIDEO_FILE ( 0x03, "0x03.Video File"),
+    OBJECT_STREAM_URL ( 0x04, "0x04.Stream Url");
 
     private final int value;
     private final String string;

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

@@ -21,6 +21,8 @@ public enum eVmsOpCode {
     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
+    OP_VMS_FTP_DOWNLOAD_REQ             (0xA1, "0xA1.Download Ftp Req."),       // 송신, 파일 FTP 다운로드 개시 요청,         SERVER→VMS
+    OP_VMS_FTP_DOWNLOAD_RES             (0xA2, "0xA2.Download Ftp Res."),       // 수신, 파일 FTP 다운로드 완료 통보,         SERVER←VMS
     OP_VMS_LOCAL_USER_COMMAND           (0xFE, "0xFE.Local User Command");      // 서버 프로그램 내에서 사용할 내부 명령      SERVER←SERVER
 
     private final int value;

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

@@ -96,6 +96,20 @@ public class VmsReqDownloadForm extends VmsReqFramePacket {
                     byteBuffer.put((byte)(idObj.getType() & 0xFF));             // 그림파일 타입
                     byteBuffer.putShort((short)(idObj.getBitmapId() & 0xFFFF)); // 표출할 비트맵 ID
                 }
+                else if (obj.getObjType() == eVmsFormObjectKind.OBJECT_VIDEO_FILE.getValue()) {
+                    VmsFormObjVideo videoObj = (VmsFormObjVideo)obj;
+                    byteBuffer.putShort((short)(videoObj.getWidth() & 0xFFFF));     // 표출 동영상 Width
+                    byteBuffer.putShort((short)(videoObj.getHeight() & 0xFFFF));    // 표출 동영상 Height
+                    byteBuffer.put((byte)(videoObj.getReserved() & 0xFF));          // Reserved, 0x00
+                    byteBuffer.put(videoObj.getFileName());                         // 확장자를 포함한 파일이름
+                }
+                else if (obj.getObjType() == eVmsFormObjectKind.OBJECT_STREAM_URL.getValue()) {
+                    VmsFormObjStream streamObj = (VmsFormObjStream)obj;
+                    byteBuffer.putShort((short)(streamObj.getWidth() & 0xFFFF));     // 표출 스트리밍영상 Width
+                    byteBuffer.putShort((short)(streamObj.getHeight() & 0xFFFF));    // 표출 스트리밍영상 Height
+                    byteBuffer.put((byte)(streamObj.getReserved() & 0xFF));          // Reserved, 0x00
+                    byteBuffer.put(streamObj.getStreamUrl());                        // 표출할 스트리밍 주소
+                }
                 else {
                     VmsFormObjBitmap bmpObj = (VmsFormObjBitmap)obj;
                     byteBuffer.putShort((short)(bmpObj.getWidth() & 0xFFFF));   // 비트맵 표시 Width

+ 1 - 0
src/main/resources/mybatis/mapper/VmsManageMapper.xml

@@ -117,6 +117,7 @@
                nvl(four_img_ifsc_id, 0) AS fourImgIfscId,
                nvl(symb_lib_nmbr, 0)    AS symbLibNmbr,
                strm_addr                AS strmAddr,
+               strm_http_addr           AS strmHttpAddr,
                use_yn                   AS useYn,
                dspl_cngs_yn             AS dsplCngsYn,
                vms_form_type_cd         AS vmsFormTypeCd,

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov