shjung 1 年之前
父節點
當前提交
b76bba5f17

+ 1 - 1
conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Wed Nov 01 17:08:30 KST 2023
+#Mon Nov 06 16:59:41 KST 2023
 packet-info=1001
 packet-dump=1001
 system-debug=false

+ 79 - 23
src/main/java/com/its/vms/api/controller/VmsControlController.java

@@ -23,10 +23,21 @@ public class VmsControlController {
 
     private final VmsControlService service;
 
+    @ApiOperation(value = "VMS 제어기 전광판 ON/OFF 제어", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/power/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlPower(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("ctlrNmbr") Long ctlrNmbr,
+            @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsControlPanlOnOfReq req,
+            HttpServletRequest request) {
+        return this.service.controlPanlOnOff(ctlrNmbr, req);
+    }
+
     @ApiOperation(value = "VMS 제어기 리셋", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/reset/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlReset(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlResetReq req,
@@ -34,21 +45,43 @@ public class VmsControlController {
         return this.service.controlReset(ctlrNmbr, req);
     }
 
-    @ApiOperation(value = "VMS 제어기 전광판 ON/OFF 제어", response = VmsControlDto.VmsControlRes.class)
-    @PostMapping(value = "/power/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
-    public VmsControlDto.VmsControlRes controlPower(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+    @ApiOperation(value = "VMS 통신재시도 횟수 설정", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/comm-retry-count/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlCommRetryCount(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
-            @RequestBody @Valid final VmsControlDto.VmsControlPanlOnOfReq req,
+            @RequestBody @Valid final VmsControlDto.VmsControlRetryCountReq req,
             HttpServletRequest request) {
-        return this.service.controlPanlOnOff(ctlrNmbr, req);
+        return this.service.controlCommRetryCount(ctlrNmbr, req);
+    }
+
+    @ApiOperation(value = "VMS 제어기 시간동기", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/time-sync/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlTimeSync(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("ctlrNmbr") Long ctlrNmbr,
+            @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsControlTimeSyncReq req,
+            HttpServletRequest request) {
+        return this.service.controlTimeSync(ctlrNmbr, req);
+    }
+
+    @ApiOperation(value = "VMS 점멸시간 주기 설정", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/blink-cycle/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlBlinkCycle(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("ctlrNmbr") Long ctlrNmbr,
+            @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsControlBlinkCycleReq req,
+            HttpServletRequest request) {
+        return this.service.controlBlinkCycle(ctlrNmbr, req);
     }
 
     @ApiOperation(value = "VMS 제어기 밝기 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/bright/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlBright(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlBrightReq req,
@@ -59,17 +92,18 @@ public class VmsControlController {
     @ApiOperation(value = "VMS 제어기 함체 FAN 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/fan/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlFan(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlFanReq req,
             HttpServletRequest request) {
         return this.service.controlFan(ctlrNmbr, req);
     }
+
     @ApiOperation(value = "VMS 제어기 표출부 FAN 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/fan2/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlFan2(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlFanReq req,
@@ -80,7 +114,7 @@ public class VmsControlController {
     @ApiOperation(value = "VMS 제어기 함체 HEATER 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/heater/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlHeater(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlHeaterReq req,
@@ -88,28 +122,50 @@ public class VmsControlController {
         return this.service.controlHeater(ctlrNmbr, req);
     }
 
-    @ApiOperation(value = "VMS 제어기 동작온도 설정", response = VmsControlDto.VmsControlRes.class)
-    @PostMapping(value = "/run-temp/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
-    public VmsControlDto.VmsControlRes controlRunTemp(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+    @ApiOperation(value = "VMS 화면 배색 제어", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/screen-rgb/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlScreenRgb(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
-            @RequestBody @Valid final VmsControlDto.VmsControlRunTempReq req,
+            @RequestBody @Valid final VmsControlDto.VmsControlRGBReq req,
             HttpServletRequest request) {
-        return this.service.controlRunTemp(ctlrNmbr, req);
+        return this.service.controlScreenRgb(ctlrNmbr, req);
     }
 
-    @ApiOperation(value = "VMS 제어기 시간동기", response = VmsControlDto.VmsControlRes.class)
-    @PostMapping(value = "/time-sync/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
-    public VmsControlDto.VmsControlRes controlTimeSync(
-            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "10005", required = true)
+    @ApiOperation(value = "VMS 장애 모듈비율 제어", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/err-modl-rate/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlErrModlRate(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
             @PathVariable("ctlrNmbr") Long ctlrNmbr,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
-            @RequestBody @Valid final VmsControlDto.VmsControlTimeSyncReq req,
+            @RequestBody @Valid final VmsControlDto.VmsControlErrModlRateReq req,
             HttpServletRequest request) {
-        return this.service.controlTimeSync(ctlrNmbr, req);
+        return this.service.controlErrModlRate(ctlrNmbr, req);
+    }
+
+    @ApiOperation(value = "VMS 디폴트 시나리오 동작 시간", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/def-scnr-seconds/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlRunDefScnrSeconds(
+            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("ctlrNmbr") Long ctlrNmbr,
+            @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsControlDefScnrRunReq req,
+            HttpServletRequest request) {
+        return this.service.controlRunDefScnrSeconds(ctlrNmbr, req);
     }
 
+//    @ApiOperation(value = "VMS 제어기 동작온도 설정", response = VmsControlDto.VmsControlRes.class)
+//    @PostMapping(value = "/run-temp/{ctlrNmbr}", produces = {"application/json; charset=utf8"})
+//    public VmsControlDto.VmsControlRes controlRunTemp(
+//            @ApiParam(name = "ctlrNmbr", value = "제어기번호", example = "1001", required = true)
+//            @PathVariable("ctlrNmbr") Long ctlrNmbr,
+//            @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
+//            @RequestBody @Valid final VmsControlDto.VmsControlRunTempReq req,
+//            HttpServletRequest request) {
+//        return this.service.controlRunTemp(ctlrNmbr, req);
+//    }
+
     @ApiOperation(value = "VMS File 업로드", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/file-upload/{symbLibNmbr}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes fileUpload(

+ 138 - 15
src/main/java/com/its/vms/api/dto/VmsControlDto.java

@@ -20,6 +20,32 @@ import java.io.Serializable;
 public class VmsControlDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
+
+    @ApiModel("VmsControlPanlOnOfReq(VMS 전광판 On/Off 제어)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsControlPanlOnOfReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        @NotEmpty
+        @Size(min=1)
+        private String userId;
+
+        @ApiModelProperty("전광판 OnOff(0: 전원꺼짐, 1: 전원켜짐)")
+        @JsonProperty("on_off")
+        @PositiveOrZero
+        private int onOff;
+
+        @Builder
+        public VmsControlPanlOnOfReq(String user_id, int on_off) {
+            this.userId = user_id;
+            this.onOff = on_off;
+        }
+    }
+
     @ApiModel("VmsControlResetReq(VMS 제어기 리셋)")
     @Getter
     @Setter
@@ -39,6 +65,31 @@ public class VmsControlDto implements Serializable {
         }
     }
 
+    @ApiModel("VmsControlRetryCountReq(VMS 통신 재시도 횟수)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsControlRetryCountReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        @NotEmpty
+        @Size(min=1)
+        private String userId;
+
+        @ApiModelProperty("통신재시도횟수(1~9, 초기값: 3회)")
+        @JsonProperty("count")
+        @PositiveOrZero
+        private int count;
+
+        @Builder
+        public VmsControlRetryCountReq(String user_id, int count) {
+            this.userId = user_id;
+            this.count = count;
+        }
+    }
+
     @ApiModel("VmsControlTimeSyncReq(VMS 제어기 시간동기)")
     @Getter
     @Setter
@@ -58,12 +109,12 @@ public class VmsControlDto implements Serializable {
         }
     }
 
-    @ApiModel("VmsControlPanlOnOfReq(VMS 전광판 On/Off 제어)")
+    @ApiModel("VmsControlBlinkCycleReq(VMS 점멸시간 주기)")
     @Getter
     @Setter
     @ToString
     @NoArgsConstructor//(access = AccessLevel.PROTECTED)
-    public static class VmsControlPanlOnOfReq {
+    public static class VmsControlBlinkCycleReq {
 
         @ApiModelProperty("로그인 사용자 ID")
         @JsonProperty("user_id")
@@ -71,17 +122,15 @@ public class VmsControlDto implements Serializable {
         @Size(min=1)
         private String userId;
 
-        @ApiModelProperty("전광판 OnOff(0: 전원꺼짐, 1: 전원켜짐)")
-        @JsonProperty("on_off")
-        //@NotEmpty
-        //private eVmsReqBoardPower onOff;
+        @ApiModelProperty("점멸시간 주기(1/10초 단위, 0~255)")
+        @JsonProperty("cycle")
         @PositiveOrZero
-        private int onOff;
+        private int cycle;
 
         @Builder
-        public VmsControlPanlOnOfReq(String user_id, int on_off) {
+        public VmsControlBlinkCycleReq(String user_id, int cycle) {
             this.userId = user_id;
-            this.onOff = on_off;
+            this.cycle = cycle;
         }
     }
 
@@ -100,14 +149,12 @@ public class VmsControlDto implements Serializable {
 
         @ApiModelProperty("밝기 제어 구분(0: 주간, 1: 야간, 2: 자동, 3: 수동)")
         @JsonProperty("type")
-        //@NotEmpty
-        //private eVmsReqBrightControl type;
         @PositiveOrZero
         private int type;
 
         @ApiModelProperty("제어값")
         @JsonProperty("value")
-        @NotEmpty
+        @PositiveOrZero
         private int value;
 
         @Builder
@@ -133,8 +180,6 @@ public class VmsControlDto implements Serializable {
 
         @ApiModelProperty("Fan 제어 구분(0: 꺼짐, 1: 켜짐, 2: 자동)")
         @JsonProperty("type")
-        //@ApiModelProperty(dataType = "string", allowableValues = "vms_req_fan_off, vms_req_fan_on, vms_req_fan_auto", value = "Fan 제어 구분")
-        //private eVmsReqFanControl type;
         @PositiveOrZero
         private int type;
 
@@ -166,7 +211,6 @@ public class VmsControlDto implements Serializable {
 
         @ApiModelProperty("Heater 제어 구분(0: 꺼짐, 1: 켜짐, 2: 자동)")
         @JsonProperty("type")
-        //private eVmsReqHeaterControl type;
         @PositiveOrZero
         private int type;
 
@@ -182,6 +226,81 @@ public class VmsControlDto implements Serializable {
         }
     }
 
+    @ApiModel("VmsControlRGBReq(VMS 화면 배색 제어)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsControlRGBReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        @NotEmpty
+        @Size(min=1)
+        private String userId;
+
+        @ApiModelProperty("화면 배색 제어(1:red, 2:green, 3:amber)")
+        @JsonProperty("control")
+        @PositiveOrZero
+        private int control;
+
+        @Builder
+        public VmsControlRGBReq(String user_id, int control) {
+            this.userId = user_id;
+            this.control = control;
+        }
+    }
+
+    @ApiModel("VmsControlErrModlRateReq(VMS 장애 모듈비율(%))")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsControlErrModlRateReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        @NotEmpty
+        @Size(min=1)
+        private String userId;
+
+        @ApiModelProperty("VMS 장애 모듈비율(%, 0 ~ 100)")
+        @JsonProperty("rate")
+        @PositiveOrZero
+        private int rate;
+
+        @Builder
+        public VmsControlErrModlRateReq(String user_id, int rate) {
+            this.userId = user_id;
+            this.rate = rate;
+        }
+    }
+
+    @ApiModel("VmsControlDefScnrRunReq(VMS 디폴트 시나리오 동작 시간)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class VmsControlDefScnrRunReq {
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        @NotEmpty
+        @Size(min=1)
+        private String userId;
+
+        @ApiModelProperty("VMS 디폴트 시나리오 동작 시간(초단위, 기본값: 300)")
+        @JsonProperty("seconds")
+        @PositiveOrZero
+        private int seconds;
+
+        @Builder
+        public VmsControlDefScnrRunReq(String user_id, int seconds) {
+            this.userId = user_id;
+            this.seconds = seconds;
+        }
+    }
+
     @ApiModel("VmsControlRunTempReq(VMS 제어기 동작온도 설정)")
     @Getter
     @Setter
@@ -197,10 +316,12 @@ public class VmsControlDto implements Serializable {
 
         @ApiModelProperty("FAN 동작온도값")
         @JsonProperty("fan_run_temp")
+        @PositiveOrZero
         private int fanRunTemp;
 
         @ApiModelProperty("HEATER 동작온도값")
         @JsonProperty("heater_run_temp")
+        @PositiveOrZero
         private int heaterRunTemp;
 
         @Builder
@@ -224,10 +345,12 @@ public class VmsControlDto implements Serializable {
 
         @ApiModelProperty("Fan 동작 기준온도")
         @JsonProperty("fan_run_tmpr")
+        @PositiveOrZero
         private Integer fanRunTmpr;
 
         @ApiModelProperty("Heater 동작 기준온도")
         @JsonProperty("hetr_run_tmpr")
+        @PositiveOrZero
         private Integer hetrRunTmpr;
 
         @ApiModelProperty("ON 시각")

+ 91 - 0
src/main/java/com/its/vms/api/service/VmsControlService.java

@@ -319,6 +319,96 @@ public class VmsControlService {
         return statusControlReq(req.getUserId(), command, controlHeater);
     }
 
+    /**
+     * 통신 재시도 횟수
+     * @param vmsCtlrNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlCommRetryCount(Long vmsCtlrNmbr, VmsControlDto.VmsControlRetryCountReq req) {
+        log.warn("VmsControlService.controlCommRetryCount: VMS {}, {}.", vmsCtlrNmbr, req);
+        eVmsStatusControl command = eVmsStatusControl.CONTROL_RETRY_COUNT;
+        TbVmsCtlrDto vmsObj = this.repoService.getCtlrMap(vmsCtlrNmbr);
+        if (vmsObj == null) {
+            return unknownControlNmbr(command, req.getUserId(), vmsCtlrNmbr);
+        }
+        VmsReqStatusControl control = new VmsReqStatusControl(vmsObj);
+        control.controlRetryCount((byte)(req.getCount() & 0xFF));
+        return statusControlReq(req.getUserId(), command, control);
+    }
+
+    /**
+     * 점멸시간 주기
+     * @param vmsCtlrNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlBlinkCycle(Long vmsCtlrNmbr, VmsControlDto.VmsControlBlinkCycleReq req) {
+        log.warn("VmsControlService.controlBlinkCycle: VMS {}, {}.", vmsCtlrNmbr, req);
+        eVmsStatusControl command = eVmsStatusControl.CONTROL_BLINK_CYCLE;
+        TbVmsCtlrDto vmsObj = this.repoService.getCtlrMap(vmsCtlrNmbr);
+        if (vmsObj == null) {
+            return unknownControlNmbr(command, req.getUserId(), vmsCtlrNmbr);
+        }
+        VmsReqStatusControl control = new VmsReqStatusControl(vmsObj);
+        control.controlBlinkCycle((byte)(req.getCycle() & 0xFF));
+        return statusControlReq(req.getUserId(), command, control);
+    }
+
+    /**
+     * 화면 배색 제어
+     * @param vmsCtlrNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlScreenRgb(Long vmsCtlrNmbr, VmsControlDto.VmsControlRGBReq req) {
+        log.warn("VmsControlService.controlScreenRgb: VMS {}, {}.", vmsCtlrNmbr, req);
+        eVmsStatusControl command = eVmsStatusControl.CONTROL_SCREEN_COLOR;
+        TbVmsCtlrDto vmsObj = this.repoService.getCtlrMap(vmsCtlrNmbr);
+        if (vmsObj == null) {
+            return unknownControlNmbr(command, req.getUserId(), vmsCtlrNmbr);
+        }
+        VmsReqStatusControl control = new VmsReqStatusControl(vmsObj);
+        control.controlScreenColor((byte)(req.getControl() & 0xFF));
+        return statusControlReq(req.getUserId(), command, control);
+    }
+
+    /**
+     * 장애 모듈비율(%)
+     * @param vmsCtlrNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlErrModlRate(Long vmsCtlrNmbr, VmsControlDto.VmsControlErrModlRateReq req) {
+        log.warn("VmsControlService.controlErrModlRate: VMS {}, {}.", vmsCtlrNmbr, req);
+        eVmsStatusControl command = eVmsStatusControl.CONTROL_MODULE_ERROR_RATIO;
+        TbVmsCtlrDto vmsObj = this.repoService.getCtlrMap(vmsCtlrNmbr);
+        if (vmsObj == null) {
+            return unknownControlNmbr(command, req.getUserId(), vmsCtlrNmbr);
+        }
+        VmsReqStatusControl control = new VmsReqStatusControl(vmsObj);
+        control.controlModuleErrorRatio((byte)(req.getRate() & 0xFF));
+        return statusControlReq(req.getUserId(), command, control);
+    }
+
+    /**
+     * 디폴트 시나리오 동작 시간
+     * @param vmsCtlrNmbr
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlRunDefScnrSeconds(Long vmsCtlrNmbr, VmsControlDto.VmsControlDefScnrRunReq req) {
+        log.warn("VmsControlService.controlRunDefScnrSeconds: VMS {}, {}.", vmsCtlrNmbr, req);
+        eVmsStatusControl command = eVmsStatusControl.CONTROL_DEFAULT_SCENARIO_RUN_TIME;
+        TbVmsCtlrDto vmsObj = this.repoService.getCtlrMap(vmsCtlrNmbr);
+        if (vmsObj == null) {
+            return unknownControlNmbr(command, req.getUserId(), vmsCtlrNmbr);
+        }
+        VmsReqStatusControl control = new VmsReqStatusControl(vmsObj);
+        control.controlDefaultScenarioRunTime((short)(req.getSeconds() & 0xFFFF));
+        return statusControlReq(req.getUserId(), command, control);
+    }
+
     /**
      * 파일 업로드(동영상 파일)
      * @param symbLibNmbr
@@ -347,4 +437,5 @@ public class VmsControlService {
         }
         return result;
     }
+
 }

+ 13 - 10
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -644,6 +644,8 @@ public class TbVmsCtlrDto implements Serializable {
         }
         formData.calFormCount();
 
+        log.info("downloadDefaultForm: VMS {}, Schedule Form {} EA.", this.vmsCtlrNmbr, formCnt);
+
         VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(this, formData);
         return sendData(downloadForm, 1);
     }
@@ -664,6 +666,7 @@ public class TbVmsCtlrDto implements Serializable {
         log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, Download Count {} EA.", this.vmsCtlrNmbr, formCnt, downloadCnt);
         if (downloadCnt >= formCnt) {
             // 폼정보를 모두 다운로드 했기때문에 폼파일을 다운로드 해야 한다.
+            log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, All Forms Download OK.", this.vmsCtlrNmbr, formCnt);
             this.downloadData.setDownloadCnt(0); // 폼이미지파일을 다운로드해야 하기때문에 다운로드 인덱스를 다시 0으로 리셋
             return downloadFile();
         }
@@ -688,7 +691,10 @@ public class TbVmsCtlrDto implements Serializable {
         if (pForm.isObjectDownload()) {
             // 모든 객체를 추가해 줘야 한다.
             if (pForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_video.getValue()) {
-                //formDisplaySec = 0;
+                log.info("downloadAutoFixForm: VMS {}, Video Form {} seconds.", this.vmsCtlrNmbr, formDisplaySec);
+            }
+            else if (pForm.getVmsFormTypeCd() == eVmsFormType.eFormTp_stream.getValue()) {
+                log.info("downloadAutoFixForm: VMS {}, Stream Form {} seconds.", this.vmsCtlrNmbr, formDisplaySec);
             }
             else {
                 formDisplaySec = Math.max(formDisplaySec, 3);
@@ -740,10 +746,8 @@ public class TbVmsCtlrDto implements Serializable {
 
         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, formBitmapId);
-        }
+        log.info("downloadAutoFixForm: VMS {}, Schedule Form {} EA, Download Count {} EA, VmsFormId {}, FormId {}, BitmapId {}.",
+                this.vmsCtlrNmbr, formCnt, downloadCnt, pForm.getVmsFormId(), formId, formBitmapId);
 
         VmsReqDownloadForm downloadForm = new VmsReqDownloadForm(this, formData);
         return sendData(downloadForm, 1);
@@ -793,15 +797,14 @@ public class TbVmsCtlrDto implements Serializable {
                 continue;
             }
 
-            if (debug.isDebug()) {
-                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(this, saveLoc, fileName, pForm.getImageData());
+
+            log.info("downloadFile: VMS {}, Idx {}, VmsFormId {}, FormId {}, BitmapId {}, formIdx {}, DownloadFormID: {}",
+                    this.vmsCtlrNmbr, ii, pForm.getVmsFormId(), formId, bitmapId, formIdx, this.downloadFormId);
+
             return sendData(dataDownload, 1);
         }
 

+ 2 - 2
src/main/java/com/its/vms/ui/MainUI.java

@@ -311,8 +311,8 @@ public class MainUI {
         CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
         this.selObj = tableModel.getControllerInfo(row);
         if (this.selObj != null) {
-            //this.selObj.downloadForm();
-            //this.selObj.downloadAutoFixForm();
+            this.selObj.downloadForm();
+            this.selObj.downloadAutoFixForm();
 
             txtId.setText(this.selObj.getCtlrId());
             txtName.setText(this.selObj.getName());

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

@@ -51,7 +51,7 @@ public class VmsTcpCommServerInitializer extends ChannelInitializer<Channel> {
                     TimeUnit.SECONDS);
 
             ChannelPipeline pipeline = channel.pipeline();
-            if (vmsObj.getDebug().isDump()) {
+            if (vmsObj.getDebug().isDebug() && vmsObj.getDebug().isDump()) {
                 pipeline.addLast(new LoggingHandler(LogLevel.INFO));
             }
             pipeline.addLast("vmsTcpIdleStateHandler", tcpIdleStateHandler);

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

@@ -61,7 +61,6 @@ public class TcpServerRecvDataProcess {
     }
 
     public void process(TcpServerRecvData data) {
-        try {
             ChannelHandlerContext ctx = data.getCtx();
             TbVmsCtlrDto vmsObj = data.getObj();
             VmsResFramePacket resFramePacket = (VmsResFramePacket)data.getData();
@@ -84,6 +83,7 @@ public class TcpServerRecvDataProcess {
             VmsResponse response = null;
             eVmsOpCode opCode = eVmsOpCode.getValue((packet.getOpCode() & 0xFF));
             log.info("{}, {}", opCodeValue, opCode);
+        try {
             /**
              * 제어기 명령 타임아웃 타스크 제거
              */
@@ -156,7 +156,7 @@ public class TcpServerRecvDataProcess {
             MDC.remove(vmsObj.getLogKey());
             MDC.clear();
         } catch (Exception e) {
-            log.error("TcpServerRecvDataProcess.process: Exception: {}", e.toString());
+            log.error("TcpServerRecvDataProcess.process: Exception: {}, {}", opCode, e.toString());
         }
     }
 

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

@@ -127,7 +127,7 @@ public class TcpServerSendDataProcess {
                         break;
                 }
             } catch (Exception e) {
-                log.error("TcpServerReqDataProcess.process: VMS {}, Exception: {}", this.vmsObj.getVmsCtlrNmbr(), e.toString());
+                log.error("TcpServerReqDataProcess.process: VMS {}, OpCode {}, Exception: {}", this.vmsObj.getVmsCtlrNmbr(), data.getOpCode(), e.toString());
             }
         }
         if (!result) {

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

@@ -23,6 +23,8 @@ public class VmsResParameter implements VmsResponse {
     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   dispFanRunMode; // 표출부 Fan 동작모드                 1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
+    private int   dispFanRunTemp; // 표출부 Fan 의 동작개시온도          1 Byte  온도( 0x00 ~0x03f )
     private int   brightMode;     // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
     private int   brightCurr;     // 화면의 밝기 - 현재 휘도값, 0~100
     private int   brightWeek;     // 화면의 밝기 - 주간 휘도값, 0~100
@@ -57,6 +59,8 @@ public class VmsResParameter implements VmsResponse {
         this.fanRunTemp = byteBuffer.get() & 0xFF;
         this.heaterRunMode = byteBuffer.get() & 0xFF;
         this.heaterRunTemp = byteBuffer.get() & 0xFF;
+        this.dispFanRunMode = byteBuffer.get() & 0xFF;
+        this.dispFanRunTemp = byteBuffer.get() & 0xFF;
         this.brightMode = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
         this.brightCurr = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 현재 휘도값, 0~100
         if (body.length > 17) {
@@ -110,18 +114,20 @@ public class VmsResParameter implements VmsResponse {
     public String toString() {
         StringBuilder data = new StringBuilder();
         data.append(String.format("RESPONSE-%s. VMS %d", eVmsOpCode.OP_VMS_PARAMETER_REQ, this.vmsObj.getVmsCtlrNmbr()));
-        data.append(System.getProperty("line.separator")).append(String.format(" PANL_PWER_MODE(%02X)", this.powerCtrlMode));
-        data.append(System.getProperty("line.separator")).append(String.format("       FAN_MODE(%02X)", this.fanRunMode));
-        data.append(System.getProperty("line.separator")).append(String.format("   FAN_RUN_TMPR(%d)", this.fanRunTemp));
-        data.append(System.getProperty("line.separator")).append(String.format("      HETR_MODE(%02X)", this.heaterRunMode));
-        data.append(System.getProperty("line.separator")).append(String.format("  HETR_RUN_TMPR(%d)", this.heaterRunTemp));
-        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_MODE(%02X)", this.brightMode));
-        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_CURR(%d)", this.brightCurr));
-        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_WEEK(%d)", this.brightWeek));
-        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_NGHT(%d)", this.brightNght));
-        data.append(System.getProperty("line.separator")).append(String.format("     BLINK_TIME(%d)", this.blinkTime));
-        data.append(System.getProperty("line.separator")).append(String.format("  SCN_TURN_TIME(%d)", this.scnTurnTime));
-        data.append(System.getProperty("line.separator")).append(String.format("     LOCAL_TIME(%04d%02d%02d%02d%02d%02d)", this.year+2000, this.mon, this.day, this.hour, this.min, this.sec));
+        data.append(System.getProperty("line.separator")).append(String.format("   PANL_PWER_MODE(%02X)", this.powerCtrlMode));
+        data.append(System.getProperty("line.separator")).append(String.format("         FAN_MODE(%02X)", this.fanRunMode));
+        data.append(System.getProperty("line.separator")).append(String.format("     FAN_RUN_TMPR(%d)", this.fanRunTemp));
+        data.append(System.getProperty("line.separator")).append(String.format("        HETR_MODE(%02X)", this.heaterRunMode));
+        data.append(System.getProperty("line.separator")).append(String.format("    HETR_RUN_TMPR(%d)", this.heaterRunTemp));
+        data.append(System.getProperty("line.separator")).append(String.format("    DISP_FAN_MODE(%02X)", this.dispFanRunMode));
+        data.append(System.getProperty("line.separator")).append(String.format("DISP_FAN_RUN_TMPR(%d)", this.dispFanRunTemp));
+        data.append(System.getProperty("line.separator")).append(String.format("        BRGH_MODE(%02X)", this.brightMode));
+        data.append(System.getProperty("line.separator")).append(String.format("        BRGH_CURR(%d)", this.brightCurr));
+        data.append(System.getProperty("line.separator")).append(String.format("        BRGH_WEEK(%d)", this.brightWeek));
+        data.append(System.getProperty("line.separator")).append(String.format("        BRGH_NGHT(%d)", this.brightNght));
+        data.append(System.getProperty("line.separator")).append(String.format("       BLINK_TIME(%d)", this.blinkTime));
+        data.append(System.getProperty("line.separator")).append(String.format("    SCN_TURN_TIME(%d)", this.scnTurnTime));
+        data.append(System.getProperty("line.separator")).append(String.format("       LOCAL_TIME(%04d%02d%02d%02d%02d%02d)", this.year+2000, this.mon, this.day, this.hour, this.min, this.sec));
         return data.toString();
     }
 

+ 17 - 1
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatus.java

@@ -104,23 +104,39 @@ public class VmsResStatus implements VmsResponse {
         data.append(System.getProperty("line.separator"));
 
         data.append(String.format("표출 폼 번호(0x%02X), ", this.formNo)); //표출 폼 번호, 현재 표출중인 폼 번호 : 0~9999
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("재실행 여부(0x%02X), ", this.reboot)); //재실행 여부, 0x00: 정상, 0x01: 재실행
-
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("제어기 - 온도(%d), ", this.cboxTmpr));       //온도		1	N	127 ~ -127, -128 : Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("제어기 - 습도(%d), ", this.cboxHum));        //습도		1	N	0 ~ 100, 101: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("제어기 - Door 상태(0x%02X), ", this.cboxDoor));       //Door 상태		1	N	0x00: Open, 0x01: Close, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("제어기 - Fan 동작 상태(0x%02X), ", this.cboxFan));        //Fan 동작 상태		1	N	0x00: On, 0x01: Off, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("제어기 - Heater 동작 상태(0x%02X), ", this.cboxHetr));       //Heater 동작 상태		1	N	0x00: On, 0x01: Off, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 온도(%d), ", this.tmpr));           //온도		1	N	127 ~ -127, -128 : Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 습도(%d), ", this.hum));            //습도		1	N	0 ~ 100, 101: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - Door 상태(0x%02X), ", this.door));           //Door 상태		1	N	0x00: Open, 0x01: Close, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - Fan 동작 상태(0x%02X), ", this.fan));            //Fan 동작 상태		1	N	0x00: On, 0x01: Off, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 전원 ON/OFF 상태(0x%02X), ", this.power));          //전원 ON/OFF 상태		1	N	0x00: On, 0x01: Off, 0x09: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 휘도 모드(%d), ", this.brghMode));       //화면의 밝기	휘도 모드	1	N	0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 현재 휘도값(%d), ", this.brghCurr));       //현재 휘도값	1	N	0~100
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 주간 휘도값(%d), ", this.brghWeek));       //주간 휘도값	1	N	0~100
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 야간 휘도값(%d), ", this.brghNght));       //야간 휘도값	1	N	0~100
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - 전원공급장치 상태(0x%02X), ", this.powerSupply));    //전원공급장치 상태		1	N	0x00: 정상, 0x01: 에러, 0x02: Unknown
+        data.append(System.getProperty("line.separator"));
         data.append(String.format("표출부 - LED 모듈 상태(0x%02X), ", this.ledModl));        //LED 모듈 상태		1	N	0x00: 정상, 0x01: 불량, 0x02: Unknown
         return data.toString();
     }

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

@@ -47,6 +47,7 @@ public class VmsReqDownloadForm extends VmsReqFramePacket {
         for (int ii = 0; ii < formData.getFormCnt(); ii++) {
             bodySize += 6;  // 폼데이터 헤더 크기
             VmsFormDto formDto = formData.getFormList().get(ii);
+            formDto.setObjCnt(formDto.getObjList().size());
             for (int jj = 0; jj < formDto.getObjCnt(); jj++) {
                 bodySize += 9;  // 오브젝트 데이터 헤더 크기
                 VmsFormObj formObj = formDto.getObjList().get(jj);

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

@@ -141,12 +141,18 @@ public class VmsReqStatusControl extends VmsReqFramePacket {
         this.framePacket.setBody(this.body);
         log.info("VmsReqStatusControl.controlModuleErrorRatio: VMS {}, {}", this.vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", this.body[1]));
     }
-    public void controlDefaultScenarioRunTime(byte seconds) {
-        this.body = new byte[2];
-        this.body[0] = (byte) eVmsStatusControl.CONTROL_DEFAULT_SCENARIO_RUN_TIME.getByteValue();
-        this.body[1] = (byte)(seconds & 0xFF);
+    public void controlDefaultScenarioRunTime(short seconds) {
+//        ByteBuffer buffer = ByteBuffer.allocate(3);
+//        buffer.order(ByteOrder.BIG_ENDIAN);
+//        buffer.put(eVmsStatusControl.CONTROL_DEFAULT_SCENARIO_RUN_TIME.getByteValue());
+//        buffer.putShort(seconds);
+
+        this.body = new byte[3];
+        this.body[0] = eVmsStatusControl.CONTROL_DEFAULT_SCENARIO_RUN_TIME.getByteValue();
+        this.body[1] = (byte)((seconds >> 8) & 0xFF);
+        this.body[2] = (byte)((seconds     ) & 0xFF);
         this.framePacket.setBody(this.body);
-        log.info("VmsReqStatusControl.controlDefaultScenarioRunTime: VMS {}, {}", this.vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", this.body[1]));
+        log.info("VmsReqStatusControl.controlDefaultScenarioRunTime: VMS {}, {}, {}", this.vmsObj.getVmsCtlrNmbr(), String.format("0x%02X", this.body[0]), seconds);
     }
 
     @Override