shjung 2 жил өмнө
parent
commit
b47c537671

+ 29 - 12
src/main/java/com/its/cctv/api/controller/CctvControlController.java

@@ -1,9 +1,6 @@
 package com.its.cctv.api.controller;
 
-import com.its.cctv.api.dto.CctvParamControlDto;
-import com.its.cctv.api.dto.CctvPresetControlDto;
-import com.its.cctv.api.dto.CctvPtzControlDto;
-import com.its.cctv.api.dto.CctvStatusDto;
+import com.its.cctv.api.dto.*;
 import com.its.cctv.api.service.CctvControlService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -25,13 +22,13 @@ public class CctvControlController {
 
     private final CctvControlService service;
 
-    @ApiOperation(value = "TEST", response = CctvStatusDto.CctvStatusNotifyDtoRes.class)
-    @GetMapping(value = "/status/notify/{id}", produces = {"application/json; charset=utf8"})
-    public CctvStatusDto.CctvStatusNotifyDtoRes notifyStatus(
-            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
-            @PathVariable("id") Long id) {
-        return this.service.notifyStatus(id);
-    }
+//    @ApiOperation(value = "TEST", response = CctvStatusDto.CctvStatusNotifyDtoRes.class)
+//    @GetMapping(value = "/status/notify/{id}", produces = {"application/json; charset=utf8"})
+//    public CctvStatusDto.CctvStatusNotifyDtoRes notifyStatus(
+//            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+//            @PathVariable("id") Long id) {
+//        return this.service.notifyStatus(id);
+//    }
 
     @ApiOperation(value = "CCTV 환경 파라미터 조회", response = CctvParamControlDto.CctvParamValueRes.class)
     @GetMapping(value = "/param-qry/{id}", produces = {"application/json; charset=utf8"})
@@ -59,7 +56,7 @@ public class CctvControlController {
         return this.service.requestStatus(id);
     }
 
-    @ApiOperation(value = "CCTV PTZ 제어", response = CctvPresetControlDto.CctvPresetValueRes.class)
+    @ApiOperation(value = "CCTV 현재위치정보 조회", response = CctvPresetControlDto.CctvPresetValueRes.class)
     @GetMapping(value = "/preset-value/{id}", produces = {"application/json; charset=utf8"})
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(
             @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
@@ -87,4 +84,24 @@ public class CctvControlController {
         return this.service.controlPreset(id, req);
     }
 
+    @ApiOperation(value = "CCTV 가변 문자 설정", response = CctvVarCharControlDto.CctvVarCharControlRes.class)
+    @PostMapping(value = "/char-fix/{id}", produces = {"application/json; charset=utf8"})
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharSet(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV 가변문자 설정 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
+            @RequestBody @Valid final CctvVarCharControlDto.CctvVarCharControlSetReq req) {
+        return this.service.controlVarCharSet(id, req);
+    }
+
+    @ApiOperation(value = "CCTV 가변 문자 설정", response = CctvVarCharControlDto.CctvVarCharControlRes.class)
+    @PostMapping(value = "/char-fix/{id}", produces = {"application/json; charset=utf8"})
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharDel(
+            @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "CCTV 가변문자 삭제 정보", example = "[preset, call, 1, 0, 0, ADMIN]", required = true)
+            @RequestBody @Valid final CctvVarCharControlDto.CctvVarCharControlDelReq req) {
+        return this.service.controlVarCharDel(id, req);
+    }
+
 }

+ 153 - 0
src/main/java/com/its/cctv/api/dto/CctvVarCharControlDto.java

@@ -0,0 +1,153 @@
+package com.its.cctv.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("sectorNo")
+        @PositiveOrZero
+        private Integer sectorNo;
+
+        @ApiModelProperty("Start Pan Value 0~1024")
+        @JsonProperty("startPan")
+        @PositiveOrZero
+        private Short startPan;
+
+        @ApiModelProperty("End Pan Value 0~1024")
+        @JsonProperty("endPan")
+        @PositiveOrZero
+        private Short endPan;
+
+        @ApiModelProperty("CH1 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
+        @JsonProperty("ch1CharSize")
+        @PositiveOrZero
+        private Short ch1CharSize;
+
+        @ApiModelProperty("CH1 Character X Position Value 0~1280")
+        @JsonProperty("ch1PosX")
+        @PositiveOrZero
+        private Short ch1PosX;
+
+        @ApiModelProperty("CH1 Character Y Position Value 0~720")
+        @JsonProperty("ch1PosX")
+        @PositiveOrZero
+        private Short ch1PosY;
+
+        @ApiModelProperty("CH2 Character Size(Small: 0x02, Middle:0x03, Large:0x04)")
+        @JsonProperty("ch1CharSize")
+        @PositiveOrZero
+        private Short ch2CharSize;
+
+        @ApiModelProperty("CH2 Character X Position Value 0~1280")
+        @JsonProperty("ch2PosX")
+        @PositiveOrZero
+        private Short ch2PosX;
+
+        @ApiModelProperty("CH2 Character Y Position Value 0~720")
+        @JsonProperty("ch2PosX")
+        @PositiveOrZero
+        private Short ch2PosY;
+
+        @ApiModelProperty("CH1 Character, Max: 16char(kor),32char(eng)")
+        @JsonProperty("ch1Char")
+        @Size(min=1, max=32)
+        private String ch1Char;
+
+        @ApiModelProperty("CH2 Character, Max: 16char(kor),32char(eng)")
+        @JsonProperty("ch2Char")
+        @Size(min=1, max=32)
+        private String ch2Char;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvVarCharControlSetReq(Integer sectorNo, Short startPan, Short endPan, Short ch1CharSize, Short ch1PosX, Short ch1PosY, Short ch2CharSize, Short ch2PosX, Short ch2PosY, String ch1Char, String ch2Char, String userId) {
+            this.sectorNo = sectorNo;
+            this.startPan = startPan;
+            this.endPan = endPan;
+            this.ch1CharSize = ch1CharSize;
+            this.ch1PosX = ch1PosX;
+            this.ch1PosY = ch1PosY;
+            this.ch2CharSize = ch2CharSize;
+            this.ch2PosX = ch2PosX;
+            this.ch2PosY = ch2PosY;
+            this.ch1Char = ch1Char;
+            this.ch2Char = ch2Char;
+            this.userId = userId;
+        }
+    }
+
+    @ApiModel("CctvVarCharControlDelReq(CCTV 가변 문자 지우기)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class CctvVarCharControlDelReq {
+
+        @ApiModelProperty("Sector No. 0~6")
+        @JsonProperty("sectorNo")
+        @PositiveOrZero
+        private Integer sectorNo;
+
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
+
+        @Builder
+        public CctvVarCharControlDelReq(Integer sectorNo, String userId) {
+            this.sectorNo = sectorNo;
+            this.userId = userId;
+        }
+    }
+
+    @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;
+        }
+    }
+
+}

+ 92 - 9
src/main/java/com/its/cctv/api/service/CctvControlService.java

@@ -1,17 +1,11 @@
 package com.its.cctv.api.service;
 
 import com.its.app.utils.ByteUtils;
-import com.its.cctv.api.dto.CctvParamControlDto;
-import com.its.cctv.api.dto.CctvPresetControlDto;
-import com.its.cctv.api.dto.CctvPtzControlDto;
-import com.its.cctv.api.dto.CctvStatusDto;
+import com.its.cctv.api.dto.*;
 import com.its.cctv.domain.NET;
 import com.its.cctv.entity.TbCctvCtlr;
 import com.its.cctv.global.AppRepository;
-import com.its.cctv.xnettcp.cctv.protocol.CctvReqParamSet;
-import com.its.cctv.xnettcp.cctv.protocol.CctvReqPresetMove;
-import com.its.cctv.xnettcp.cctv.protocol.CctvReqPresetQry;
-import com.its.cctv.xnettcp.cctv.protocol.CctvReqPtzCtrl;
+import com.its.cctv.xnettcp.cctv.protocol.*;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
@@ -181,7 +175,13 @@ public class CctvControlService {
         }
         return result;
     }
-    
+
+    /**
+     * CCTV 파라미터정보 설정
+     * @param id
+     * @param req
+     * @return
+     */
     public CctvParamControlDto.CctvParamControlRes controlParam(Long id, CctvParamControlDto.CctvParamControlReq req) {
         log.info("controlParam: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -205,6 +205,11 @@ public class CctvControlService {
         return result;
     }
 
+    /**
+     * CCTV 파라미터 정보 조회
+     * @param id
+     * @return
+     */
     public CctvParamControlDto.CctvParamValueRes requestParam(Long id) {
         log.info("requestParam: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -240,6 +245,11 @@ public class CctvControlService {
         return result;
     }
 
+    /**
+     * CCTV 프리셋 현재위치정보 요청
+     * @param id
+     * @return
+     */
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(Long id) {
         log.info("requestPresetValue: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -277,6 +287,11 @@ public class CctvControlService {
         return result;
     }
 
+    /**
+     * Object Notify TEST
+     * @param id
+     * @return
+     */
     public CctvStatusDto.CctvStatusNotifyDtoRes notifyStatus(Long id) {
         log.info("notifyStatus: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -299,4 +314,72 @@ public class CctvControlService {
         return result;
     }
 
+    /**
+     * CCTV 가변문자 설정
+     * @param id
+     * @param req
+     * @return
+     */
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharSet(Long id, CctvVarCharControlDto.CctvVarCharControlSetReq req) {
+        log.info("controlVarCharSet: {}", id);
+        TbCctvCtlr cctv = this.requireOne(id);
+        if (cctv == null) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(1, "CCTV 제어기 정보를 찾을 수 없습니다.");
+        }
+        if (cctv.getNetState() != NET.LOGINED) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(2, "CCTV 통신연결이 되어 있지 않습니다.");
+        }
+
+        CctvVarCharControlDto.CctvVarCharControlRes result = new CctvVarCharControlDto.CctvVarCharControlRes(0, "success");
+        CctvReqCharVar pkt = new CctvReqCharVar(cctv.getAddress());
+        if (!pkt.setValue(
+                req.getSectorNo().byteValue(),
+                req.getStartPan(), req.getEndPan(),
+                req.getCh1CharSize().byteValue(), req.getCh1PosX(), req.getCh2PosY(),
+                req.getCh2CharSize().byteValue(), req.getCh2PosX(), req.getCh2PosY(),
+                req.getCh1Char(), req.getCh2Char()
+                )) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(3, "CCTV 가변문자 설정값에 오류가 있습니다.");
+        }
+
+        ByteBuffer sendBuffer = pkt.getByteBuffer();
+        if (cctv.sendData(sendBuffer, 0, "cctv_CharVarSet")) {
+            log.info("CHAR-VAR-SET send success.");
+        } else {
+            result.setResult(4, "CCTV CHAR-VAR-SET 명령 전송이 실패하였습니다.");
+            log.error("CHAR-VAR-SET send failed.");
+        }
+        return result;
+    }
+
+    /**
+     * CCTV 가변문자 삭제
+     * @param id
+     * @param req
+     * @return
+     */
+    public CctvVarCharControlDto.CctvVarCharControlRes controlVarCharDel(Long id, CctvVarCharControlDto.CctvVarCharControlDelReq req) {
+        log.info("controlVarCharDel: {}", id);
+        TbCctvCtlr cctv = this.requireOne(id);
+        if (cctv == null) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(1, "CCTV 제어기 정보를 찾을 수 없습니다.");
+        }
+        if (cctv.getNetState() != NET.LOGINED) {
+            return new CctvVarCharControlDto.CctvVarCharControlRes(2, "CCTV 통신연결이 되어 있지 않습니다.");
+        }
+
+        CctvVarCharControlDto.CctvVarCharControlRes result = new CctvVarCharControlDto.CctvVarCharControlRes(0, "success");
+        CctvReqCharDel pkt = new CctvReqCharDel(cctv.getAddress());
+        pkt.setValue(req.getSectorNo().byteValue());
+
+        ByteBuffer sendBuffer = pkt.getByteBuffer();
+        if (cctv.sendData(sendBuffer, 0, "cctv_CharVarDel")) {
+            log.info("CHAR-VAR-DEL send success.");
+        } else {
+            result.setResult(4, "CCTV CHAR-VAR-DEL 명령 전송이 실패하였습니다.");
+            log.error("CHAR-VAR-DEL send failed.");
+        }
+        return result;
+    }
+
 }

+ 8 - 1
src/main/java/com/its/cctv/xnettcp/cctv/protocol/CctvReqCharVar.java

@@ -11,7 +11,7 @@ public class CctvReqCharVar extends CctvReqFramePacket {
         super(groupNo, CctvProtocol.cctv_CharVarSet);
     }
 
-    public void setValue(byte sectorNo, short panStart, short panEnd,
+    public boolean setValue(byte sectorNo, short panStart, short panEnd,
                          byte sizeCh1, short xCh1, short yCh1,
                          byte sizeCh2, short xCh2, short yCh2,
                          String textCh1, String textCh2) {
@@ -24,8 +24,14 @@ public class CctvReqCharVar extends CctvReqFramePacket {
         // y: 0~720
         // text: Max: 16char(kor),32char(eng)
 
+        if (sectorNo > (byte)0x06) {
+            return false;
+        }
         byte[] textCh1Arr = textCh1.getBytes();   // Max: 16char(kor),32char(eng)
         byte[] textCh2Arr = textCh2.getBytes();   // Max: 16char(kor),32char(eng)
+        if (textCh1Arr.length > 32 || textCh2Arr.length > 32) {
+            return false;
+        }
 
         int bufferSize = 17+textCh1Arr.length+textCh2Arr.length;
         this.body = new byte[bufferSize];
@@ -48,5 +54,6 @@ public class CctvReqCharVar extends CctvReqFramePacket {
         buffer.put(textCh2Arr);                 // CH2 Character
 
         buffer.get(this.body, 0, this.body.length);
+        return true;
     }
 }