Browse Source

dev control

shjung 2 years ago
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;
 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 com.its.cctv.api.service.CctvControlService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -25,13 +22,13 @@ public class CctvControlController {
 
 
     private final CctvControlService service;
     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)
     @ApiOperation(value = "CCTV 환경 파라미터 조회", response = CctvParamControlDto.CctvParamValueRes.class)
     @GetMapping(value = "/param-qry/{id}", produces = {"application/json; charset=utf8"})
     @GetMapping(value = "/param-qry/{id}", produces = {"application/json; charset=utf8"})
@@ -59,7 +56,7 @@ public class CctvControlController {
         return this.service.requestStatus(id);
         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"})
     @GetMapping(value = "/preset-value/{id}", produces = {"application/json; charset=utf8"})
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(
             @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
             @ApiParam(name = "id", value = "제어기번호", example = "1001", required = true)
@@ -87,4 +84,24 @@ public class CctvControlController {
         return this.service.controlPreset(id, req);
         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;
 package com.its.cctv.api.service;
 
 
 import com.its.app.utils.ByteUtils;
 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.domain.NET;
 import com.its.cctv.entity.TbCctvCtlr;
 import com.its.cctv.entity.TbCctvCtlr;
 import com.its.cctv.global.AppRepository;
 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.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import lombok.Setter;
@@ -181,7 +175,13 @@ public class CctvControlService {
         }
         }
         return result;
         return result;
     }
     }
-    
+
+    /**
+     * CCTV 파라미터정보 설정
+     * @param id
+     * @param req
+     * @return
+     */
     public CctvParamControlDto.CctvParamControlRes controlParam(Long id, CctvParamControlDto.CctvParamControlReq req) {
     public CctvParamControlDto.CctvParamControlRes controlParam(Long id, CctvParamControlDto.CctvParamControlReq req) {
         log.info("controlParam: {}", id);
         log.info("controlParam: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -205,6 +205,11 @@ public class CctvControlService {
         return result;
         return result;
     }
     }
 
 
+    /**
+     * CCTV 파라미터 정보 조회
+     * @param id
+     * @return
+     */
     public CctvParamControlDto.CctvParamValueRes requestParam(Long id) {
     public CctvParamControlDto.CctvParamValueRes requestParam(Long id) {
         log.info("requestParam: {}", id);
         log.info("requestParam: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -240,6 +245,11 @@ public class CctvControlService {
         return result;
         return result;
     }
     }
 
 
+    /**
+     * CCTV 프리셋 현재위치정보 요청
+     * @param id
+     * @return
+     */
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(Long id) {
     public CctvPresetControlDto.CctvPresetValueRes requestPresetValue(Long id) {
         log.info("requestPresetValue: {}", id);
         log.info("requestPresetValue: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -277,6 +287,11 @@ public class CctvControlService {
         return result;
         return result;
     }
     }
 
 
+    /**
+     * Object Notify TEST
+     * @param id
+     * @return
+     */
     public CctvStatusDto.CctvStatusNotifyDtoRes notifyStatus(Long id) {
     public CctvStatusDto.CctvStatusNotifyDtoRes notifyStatus(Long id) {
         log.info("notifyStatus: {}", id);
         log.info("notifyStatus: {}", id);
         TbCctvCtlr cctv = this.requireOne(id);
         TbCctvCtlr cctv = this.requireOne(id);
@@ -299,4 +314,72 @@ public class CctvControlService {
         return result;
         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);
         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 sizeCh1, short xCh1, short yCh1,
                          byte sizeCh2, short xCh2, short yCh2,
                          byte sizeCh2, short xCh2, short yCh2,
                          String textCh1, String textCh2) {
                          String textCh1, String textCh2) {
@@ -24,8 +24,14 @@ public class CctvReqCharVar extends CctvReqFramePacket {
         // y: 0~720
         // y: 0~720
         // text: Max: 16char(kor),32char(eng)
         // text: Max: 16char(kor),32char(eng)
 
 
+        if (sectorNo > (byte)0x06) {
+            return false;
+        }
         byte[] textCh1Arr = textCh1.getBytes();   // Max: 16char(kor),32char(eng)
         byte[] textCh1Arr = textCh1.getBytes();   // Max: 16char(kor),32char(eng)
         byte[] textCh2Arr = textCh2.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;
         int bufferSize = 17+textCh1Arr.length+textCh2Arr.length;
         this.body = new byte[bufferSize];
         this.body = new byte[bufferSize];
@@ -48,5 +54,6 @@ public class CctvReqCharVar extends CctvReqFramePacket {
         buffer.put(textCh2Arr);                 // CH2 Character
         buffer.put(textCh2Arr);                 // CH2 Character
 
 
         buffer.get(this.body, 0, this.body.length);
         buffer.get(this.body, 0, this.body.length);
+        return true;
     }
     }
 }
 }