diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java index 6e6033f..454f10b 100644 --- a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java @@ -69,23 +69,23 @@ mqttClient.pub(enums.getReqName(), JSON.toJSONString(messageDTO)); } // 订阅返回值消息 - client.subscribe(enums.getRepName(), 1, (topic, message) -> { - String data = new String(message.getPayload()); - System.out.println(data); - if (StrUtil.isNotEmpty(data)) { - System.out.println(data); - if (data.startsWith("\"")) { - data = data.substring(1); + if (StrUtil.isNotEmpty(enums.getRepName())) { + client.subscribe(enums.getRepName(), 1, (topic, message) -> { + String data = new String(message.getPayload()); + if (StrUtil.isNotEmpty(data)) { + if (data.startsWith("\"")) { + data = data.substring(1); + } + if (data.endsWith("\"")) { + data = data.substring(0, data.length() - 1); + } + data = data.replaceAll("\\\\", ""); + maps.put("result", MsgUtils.convertMessage(data, enums)); + } else { + throw new ServiceException(500, enums.getRemarks() + "指令异常"); } - if (data.endsWith("\"")) { - data = data.substring(0, data.length() - 1); - } - data = data.replaceAll("\\\\", ""); - maps.put("result", MsgUtils.convertMessage(data, enums)); - } else { - throw new ServiceException(500, enums.getRemarks() + "指令异常"); - } - }); + }); + } int i = 0; if (enums.isWaitReply()) { do { diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java index 6e6033f..454f10b 100644 --- a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java @@ -69,23 +69,23 @@ mqttClient.pub(enums.getReqName(), JSON.toJSONString(messageDTO)); } // 订阅返回值消息 - client.subscribe(enums.getRepName(), 1, (topic, message) -> { - String data = new String(message.getPayload()); - System.out.println(data); - if (StrUtil.isNotEmpty(data)) { - System.out.println(data); - if (data.startsWith("\"")) { - data = data.substring(1); + if (StrUtil.isNotEmpty(enums.getRepName())) { + client.subscribe(enums.getRepName(), 1, (topic, message) -> { + String data = new String(message.getPayload()); + if (StrUtil.isNotEmpty(data)) { + if (data.startsWith("\"")) { + data = data.substring(1); + } + if (data.endsWith("\"")) { + data = data.substring(0, data.length() - 1); + } + data = data.replaceAll("\\\\", ""); + maps.put("result", MsgUtils.convertMessage(data, enums)); + } else { + throw new ServiceException(500, enums.getRemarks() + "指令异常"); } - if (data.endsWith("\"")) { - data = data.substring(0, data.length() - 1); - } - data = data.replaceAll("\\\\", ""); - maps.put("result", MsgUtils.convertMessage(data, enums)); - } else { - throw new ServiceException(500, enums.getRemarks() + "指令异常"); - } - }); + }); + } int i = 0; if (enums.isWaitReply()) { do { diff --git a/casic-web/src/main/build/bin/start.bat b/casic-web/src/main/build/bin/start.bat index 1db4e88..2864d32 100644 --- a/casic-web/src/main/build/bin/start.bat +++ b/casic-web/src/main/build/bin/start.bat @@ -1,4 +1,4 @@ @echo off title ${project.build.finalName} -java -jar ./lib/${project.build.finalName}.jar +java -jar ./lib/casic-web-2.0.0.jar @pause diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java index 6e6033f..454f10b 100644 --- a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java @@ -69,23 +69,23 @@ mqttClient.pub(enums.getReqName(), JSON.toJSONString(messageDTO)); } // 订阅返回值消息 - client.subscribe(enums.getRepName(), 1, (topic, message) -> { - String data = new String(message.getPayload()); - System.out.println(data); - if (StrUtil.isNotEmpty(data)) { - System.out.println(data); - if (data.startsWith("\"")) { - data = data.substring(1); + if (StrUtil.isNotEmpty(enums.getRepName())) { + client.subscribe(enums.getRepName(), 1, (topic, message) -> { + String data = new String(message.getPayload()); + if (StrUtil.isNotEmpty(data)) { + if (data.startsWith("\"")) { + data = data.substring(1); + } + if (data.endsWith("\"")) { + data = data.substring(0, data.length() - 1); + } + data = data.replaceAll("\\\\", ""); + maps.put("result", MsgUtils.convertMessage(data, enums)); + } else { + throw new ServiceException(500, enums.getRemarks() + "指令异常"); } - if (data.endsWith("\"")) { - data = data.substring(0, data.length() - 1); - } - data = data.replaceAll("\\\\", ""); - maps.put("result", MsgUtils.convertMessage(data, enums)); - } else { - throw new ServiceException(500, enums.getRemarks() + "指令异常"); - } - }); + }); + } int i = 0; if (enums.isWaitReply()) { do { diff --git a/casic-web/src/main/build/bin/start.bat b/casic-web/src/main/build/bin/start.bat index 1db4e88..2864d32 100644 --- a/casic-web/src/main/build/bin/start.bat +++ b/casic-web/src/main/build/bin/start.bat @@ -1,4 +1,4 @@ @echo off title ${project.build.finalName} -java -jar ./lib/${project.build.finalName}.jar +java -jar ./lib/casic-web-2.0.0.jar @pause diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..cc68ae7 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.config.HikLibConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java index 6e6033f..454f10b 100644 --- a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java @@ -69,23 +69,23 @@ mqttClient.pub(enums.getReqName(), JSON.toJSONString(messageDTO)); } // 订阅返回值消息 - client.subscribe(enums.getRepName(), 1, (topic, message) -> { - String data = new String(message.getPayload()); - System.out.println(data); - if (StrUtil.isNotEmpty(data)) { - System.out.println(data); - if (data.startsWith("\"")) { - data = data.substring(1); + if (StrUtil.isNotEmpty(enums.getRepName())) { + client.subscribe(enums.getRepName(), 1, (topic, message) -> { + String data = new String(message.getPayload()); + if (StrUtil.isNotEmpty(data)) { + if (data.startsWith("\"")) { + data = data.substring(1); + } + if (data.endsWith("\"")) { + data = data.substring(0, data.length() - 1); + } + data = data.replaceAll("\\\\", ""); + maps.put("result", MsgUtils.convertMessage(data, enums)); + } else { + throw new ServiceException(500, enums.getRemarks() + "指令异常"); } - if (data.endsWith("\"")) { - data = data.substring(0, data.length() - 1); - } - data = data.replaceAll("\\\\", ""); - maps.put("result", MsgUtils.convertMessage(data, enums)); - } else { - throw new ServiceException(500, enums.getRemarks() + "指令异常"); - } - }); + }); + } int i = 0; if (enums.isWaitReply()) { do { diff --git a/casic-web/src/main/build/bin/start.bat b/casic-web/src/main/build/bin/start.bat index 1db4e88..2864d32 100644 --- a/casic-web/src/main/build/bin/start.bat +++ b/casic-web/src/main/build/bin/start.bat @@ -1,4 +1,4 @@ @echo off title ${project.build.finalName} -java -jar ./lib/${project.build.finalName}.jar +java -jar ./lib/casic-web-2.0.0.jar @pause diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..cc68ae7 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.config.HikLibConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java b/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java deleted file mode 100644 index 6b4598d..0000000 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HiLibProperty.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.missiles.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@Data -public class HiLibProperty { - @Value("${casic.hiklib:-1}") - private String hikLibPath; -} diff --git a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java index e3fee91..9362007 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java +++ b/casic-ptz/src/main/java/com/casic/missiles/config/HikLibConfig.java @@ -17,9 +17,10 @@ @Configuration public class HikLibConfig { - @Value("${casic.hiklib:-1}") + @Value("${casic.hikSdk:-1}") private String hikLibPath; - + public static String hikSdk; + public static String hikPlay; private static HCNetSDK hcNetSDK; @Bean @@ -37,6 +38,14 @@ hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath, HCNetSDK.class); return hcNetSDK; } -} - - + @Value("${casic.hikSdk:-1}") + public void setHikSdk(String hikSdk) { + System.out.println("load path:"+hikSdk); + HikLibConfig.hikSdk = hikSdk; + } + @Value("${casic.hikPlay:-1}") + public void setHikPlay(String hikPlay) { + System.out.println("load path:"+hikPlay); + HikLibConfig.hikPlay = hikPlay; + } +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java index 70e6a4c..e140e0d 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/HCNetSDK.java @@ -16,6 +16,7 @@ package com.casic.missiles.modular.ptz.service; +import com.casic.missiles.config.HikLibConfig; import com.sun.jna.*; import com.sun.jna.examples.win32.GDI32.RECT; import com.sun.jna.examples.win32.W32API; @@ -25,17 +26,17 @@ import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.ShortByReference; import com.sun.jna.win32.StdCallLibrary; +import org.springframework.context.annotation.DependsOn; import java.io.File; //SDK接口说明,HCNetSDK.dll public interface HCNetSDK extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; - +// String dllPath = Thread.currentThread().getContextClassLoader().getResource(HikLibConfig.hikSdk).getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"HCNetSDK.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\HCNetSDK.dll"; - HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); + HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HikLibConfig.hikSdk,HCNetSDK.class); /***宏定义***/ //常量 @@ -3174,12 +3175,12 @@ interface PlayCtrl extends StdCallLibrary { - String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); - String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; +// String dllPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); +// String path = dllPath.substring(1).replace("/", File.separator)+"config"+File.separator+"hiklib"+File.separator+"PlayCtrl.dll"; //String path = "D:\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\CH-HCNetSDKV6.1.6.3_build20200925_Win64\\Demo示例\\4- Java 开发示例\\1-ClientDemo\\ClientDemo-NetBeansPro\\lib\\PlayCtrl.dll"; - PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(path, PlayCtrl.class); + PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(HikLibConfig.hikPlay, PlayCtrl.class); public static final int STREAME_REALTIME = 0; public static final int STREAME_FILE = 1; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java index 821dd6a..7d36807 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/service/impl/HCNetServiceImpl.java @@ -18,16 +18,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - +@ConditionalOnBean(HCNetSDK.class) @Service public class HCNetServiceImpl implements IHCNetService { private static final Logger logger = LoggerFactory.getLogger(HCNetServiceImpl.class); - @Lazy + private static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE; private HCNetSDK.FSerialDataCallBack fSerialDataCallBack = new SerialDataCallBack(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index c9d7cc2..f74aee2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -75,7 +75,11 @@ robotInfoService.updateSpeed(robotInfo); return ResponseDataDTO.success(); } - + @ApiOperation(value = "软件急停") + @GetMapping(value = "/softwareStop") + public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { + return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + } @ApiOperation(value = "循迹列表读取") @GetMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index f39a436..c66d009 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -23,73 +23,73 @@ /** * 主键 */ - @ApiModelProperty(value = "主键", dataType = "Long") + @ApiModelProperty(value = "主键" , dataType = "Long") @TableField("id") private Long id; /** * 创建时间 */ - @ApiModelProperty(value = "创建时间", dataType = "Date") + @ApiModelProperty(value = "创建时间" , dataType = "Date") @TableField("create_time") private Date createTime; /** * 修改时间 */ - @ApiModelProperty(value = "修改时间", dataType = "Date") + @ApiModelProperty(value = "修改时间" , dataType = "Date") @TableField("update_time") private Date updateTime; /** * 设置线速度 */ - @ApiModelProperty(value = "设置线速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置线速度" , dataType = "BigDecimal") @TableField("conf_v") private BigDecimal confV; /** * 设置角速度 */ - @ApiModelProperty(value = "设置角速度", dataType = "BigDecimal") + @ApiModelProperty(value = "设置角速度" , dataType = "BigDecimal") @TableField("conf_w") private BigDecimal confW; /** * 机器人名称 */ - @ApiModelProperty(value = "机器人名称", dataType = "String") + @ApiModelProperty(value = "机器人名称" , dataType = "String") @TableField("robot_name") private String robotName; /** * 机器人IP */ - @ApiModelProperty(value = "机器人mqtt", dataType = "Long") + @ApiModelProperty(value = "机器人mqtt" , dataType = "Long") @TableField("robot_url") private String robotUrl; - @ApiModelProperty(value = "机器人IP", dataType = "Long") + @ApiModelProperty(value = "机器人IP" , dataType = "Long") @TableField("robot_ip") private String robotIp; /** * 机器人端口 */ - @ApiModelProperty(value = "机器人端口", dataType = "Long") + @ApiModelProperty(value = "机器人端口" , dataType = "Long") @TableField("robot_port") private Long robotPort; /** * 机器人用户名 */ - @ApiModelProperty(value = "机器人用户名", dataType = "String") + @ApiModelProperty(value = "机器人用户名" , dataType = "String") @TableField("robot_admin") private String robotAdmin; /** * 密码 */ - @ApiModelProperty(value = "密码", dataType = "String") + @ApiModelProperty(value = "密码" , dataType = "String") @TableField("robot_password") private String robotPassword; @@ -104,18 +104,26 @@ @TableField(exist = false) private RouteInfo currRoute; - @ApiModelProperty(value = "pcd下载地址", dataType = "String") + @ApiModelProperty(value = "pcd下载地址" , dataType = "String") @TableField("pcd_download") private String pcdDownload; - @ApiModelProperty(value = "启动监听消息", dataType = "String") + @ApiModelProperty(value = "启动监听消息" , dataType = "String") @TableField("default_topic") private String defaultTopic; - @ApiModelProperty(value = "告警阈值配置", dataType = "String") + @ApiModelProperty(value = "告警阈值配置" , dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; + @ApiModelProperty(value = "电压上限" , dataType = "Integer") + @TableField("voltage_max") + private Integer voltageMax; + + @ApiModelProperty(value = "电压下限" , dataType = "Integer") + @TableField("voltage_min") + private Integer voltageMin; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java index ca6e51b..ce7725d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotStatusInfo.java @@ -257,6 +257,22 @@ @ApiModelProperty(value = "电压", dataType = "Integer") private BigDecimal voltage; + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)", dataType = "Integer") + @TableField("soft") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发", dataType = "Integer") + @TableField("sonic") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发", dataType = "Integer") + @TableField("collision") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发", dataType = "Integer") + @TableField("button") + private Integer button; + @Override public String toString() { return "RobotStatusInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index 36cc951..e2af8b9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -29,6 +29,8 @@ }), CTRL_NAV("/ctrl_nav", "/ctrl_nav_response", "启动或关闭导航功能", true, new TypeReference>() { }), + SOFTWARE_STOP("/software_stop", "", "软件急停", false, new TypeReference>() { + }), TRACK_RECORD("/track_record", "/track_record_response", "启动或关闭轨迹录制功能", true, new TypeReference>() { }), START_TRACK("/start_track", "/start_track_response", "启动或关闭循迹功能", true, new TypeReference>() { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index e1f1fa1..5aaf056 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -4,10 +4,21 @@ * 指令推送消息定义 */ public enum InstructStatusMsgEnums { - PROCESS_MESSAGE("process_message", "建图进度推送消息"), - POSE_MESSAGE("pose_message", "实时定位推送消息"), - ALARM_RECORD("alarm_record", "告警推送消息"), - ROBOT_STATUS("robot_status", "机器人状态消息"); + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.ProcessMessageMsgHandler + */ + PROCESS_MESSAGE("process_message" , "建图进度推送消息"), + /** + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ + POSE_MESSAGE("pose_message" , "实时定位推送消息"), + ALARM_RECORD("alarm_record" , "告警推送消息"), + /** + * 机器人状态消息推送(30s) + * + * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler + */ + ROBOT_STATUS("robot_status" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java index bcace6a..b5f46d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/ChangPcdCmdHandler.java @@ -10,6 +10,9 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Component; +/** + * 转换栅格地图 + */ @Component("CHANGE_PCD") public class ChangPcdCmdHandler extends AbstractCmdHandler { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java new file mode 100644 index 0000000..11e1e4f --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/SoftwareStopCmdHandler.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.opt.handler.cmd; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; +import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.SoftwareStopRequest; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Component; + +/** + * 转换栅格地图 + */ +@Component("SOFTWARE_STOP") +public class SoftwareStopCmdHandler extends AbstractCmdHandler { + + protected SoftwareStopCmdHandler(IRobotRouteOptService optService, IRobotInfoService service) { + super(optService, service); + } + + /** + * 发送命令 + * + * @param request 消息请求体 + * @param enums 指令集 + * @return + */ + @Override + public ResponseDataDTO senderCmd(SoftwareStopRequest request, InstructCodeEnums enums) { + MessageRequestDTO messageDTO = new MessageRequestDTO(); + messageDTO.setMsg(request); + if (StrUtil.isEmpty(request.getSn())) { + request.setSn(request.getRobotId() + ""); + } + ResponseDataDTO res = optService.robotCmd(getRobotInfo(), enums, messageDTO); + return res; + } + + /** + * 结果集调用 + * + * @param request 消息请求体 + * @param response 响应体 + * @return + */ + @Override + public ResponseDataDTO afterInvoke(SoftwareStopRequest request, ResponseDataDTO response) { + return response; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 059a60f..1cf0e55 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -22,7 +22,6 @@ @Override public void process(String robotId, String topic, MqttMessage message) { - log.info("主键:{},实时位置topic:{},消息内容:{}" , robotId, topic, message.toString()); robotTrajectoryInfoService.savePoseMessage(robotId, message); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 1455961..a184866 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -21,7 +21,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put("index" , 0); } public SensorStatusMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -31,10 +31,9 @@ @Override public void process(String robotId, String topic, MqttMessage message) { Integer val = index.get("index") + 1; - index.put("index", val); + index.put("index" , val); if (val > 30) { - log.info("主键:{},传感器状态topic:{},消息内容:{}", robotId, topic, message.toString()); - index.put("index", 0); + index.put("index" , 0); statusInfoService.saveSensorStatus(robotId, message); RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java new file mode 100644 index 0000000..6fdec61 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 急停状态上报 + */ +@Slf4j +@Component("/stop_state_response") +public class StopStateMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------急停状态信息反馈:{}", message); + statusInfoService.saveStopState(robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java new file mode 100644 index 0000000..11735d6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.opt.handler.msg; + +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 电压信息反馈 + */ +@Slf4j +@Component("/get_voltage_response") +public class VoltageResponseMsgHandler extends AbstractSocketHandler { + private final IRobotStatusInfoService statusInfoService; + private static Map index = new ConcurrentHashMap<>(); + + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { + this.statusInfoService = statusInfoService; + } + + @Override + public void process(String robotId, String topic, MqttMessage message) { + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); +// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index 11c4cc6..2cc7e3f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -118,7 +118,7 @@ @Override public ResponseDataDTO execCmdHandler(R request, InstructCodeEnums enums, IBaseCmdHandler cmdHandler) { cmdHandler.initHandler((BaseRobotCmdDTO) request); - ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request, InstructCodeEnums.TRACK_LIST); + ResponseDataDTO result = (ResponseDataDTO) cmdHandler.senderCmd((BaseRobotCmdDTO) request,enums); result = (ResponseDataDTO) cmdHandler.afterInvoke((BaseRobotCmdDTO) request, result); return result; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java new file mode 100644 index 0000000..93dc3f3 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SoftwareStopRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.robot.opt.instruct.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 软件急停 + */ +@Data +public class SoftwareStopRequest extends BaseRobotCmdDTO { + @ApiModelProperty(value = "sn编码(可不填 默认机器ID)", dataType = "String") + private String sn; + + @ApiModelProperty(value = "下发状态 0:不急停 1:急停", dataType = "Integer") + private Integer control; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java deleted file mode 100644 index d749c12..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/SpeedResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.casic.missiles.modular.robot.opt.instruct.dto; - -import lombok.Data; - -/** - * 速度响应DTO - */ -@Data -public class SpeedResponseDTO { - private SpeedDTO speed; -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java new file mode 100644 index 0000000..bd8851c --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/SpeedResponseDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedDTO; +import lombok.Data; + +/** + * 速度响应DTO + */ +@Data +public class SpeedResponseDTO { + private SpeedDTO speed; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java new file mode 100644 index 0000000..eb514bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/StopStateResponseDTO.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 电压信息返回 + */ +@Data +public class StopStateResponseDTO { + @ApiModelProperty(value = "软件急停(0:无触发 1:触发)" , dataType = "Integer") + private Integer soft; + + @ApiModelProperty(value = "二进制第x位 第X个超声, 0:无触发 1:触发" , dataType = "Integer") + private Integer sonic; + + @ApiModelProperty(value = "二进制第0位 前触边 第1位后触边,0:无触发 1:触发" , dataType = "Integer") + private Integer collision; + + @ApiModelProperty(value = "急停按钮急停 0:无触发 1:触发" , dataType = "Integer") + private Integer button; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java new file mode 100644 index 0000000..70b4e2e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageResponseDTO.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import com.alibaba.fastjson.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 电压信息返回 + */ +@Data +public class VoltageResponseDTO { + + @ApiModelProperty(value = "电池1电压,电池2电压(单位0.01v)" , dataType = "Integer") + private List voltage; + + @ApiModelProperty(value = "电池1电流,电池2电流(单位0.1A)" , dataType = "Integer") + private List current; + + @ApiModelProperty(value = "电池1状态,电池2状态" , dataType = "Integer") + private List state; + + @ApiModelProperty(value = "充电状态 0:未充电 1:充电" , dataType = "Integer") + @JSONField(name = "charging_state") + private Integer chargingState; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java index 1f725a5..6ab9802 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotStatusInfoService.java @@ -80,4 +80,19 @@ * @param message 速度响应 */ void saveSpeed(String robotId, MqttMessage message); + + /** + * 急停状态信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveStopState(String robotId, MqttMessage message); + /** + * 电压信息保存 + * + * @param robotId 机器ID + * @param message 消息体 + */ + void saveVoltageResponseMessage(String robotId, MqttMessage message); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 6d3c2af..609a4af 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,27 +1,36 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.dto.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.List; @@ -37,16 +46,18 @@ @Service public class RobotStatusInfoServiceImpl extends ServiceImpl implements IRobotStatusInfoService { private final AbstractDictService dictService; + private final IRobotInfoService robotInfoService; - public RobotStatusInfoServiceImpl(AbstractDictService dictService) { + public RobotStatusInfoServiceImpl(AbstractDictService dictService, @Lazy IRobotInfoService robotInfoService) { this.dictService = dictService; + this.robotInfoService = robotInfoService; } @Override public void updateConnStatus(String robotId, Integer status) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("conn_status", status); - query.eq("robot_id", robotId); + query.set("conn_status" , status); + query.eq("robot_id" , robotId); update(query); } @@ -60,29 +71,29 @@ } private void wrapInfo(RobotStatusInfo statusInfo) { - statusInfo.setDiscernTypeName(getDictName("discernType", statusInfo.getDiscernType())); + statusInfo.setDiscernTypeName(getDictName("discernType" , statusInfo.getDiscernType())); //暂停状态 - statusInfo.setAppNavPauseName(getDictName("appNavPause", statusInfo.getAppNavPause())); + statusInfo.setAppNavPauseName(getDictName("appNavPause" , statusInfo.getAppNavPause())); //开启状态 - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - String statusName = getDictName("trackStatus", statusInfo.getNavigationStatus()); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + String statusName = getDictName("trackStatus" , statusInfo.getNavigationStatus()); statusInfo.setNavigationStatusName(statusName); - statusInfo.setDataRecordName(getDictName("trackStatus", statusInfo.getDataRecord())); - statusInfo.setTrackStatusName(getDictName("trackStatus", statusInfo.getTrackStatus())); - statusInfo.setTrackName(getDictName("trackStatus", statusInfo.getTrack())); - statusInfo.setInsStatusName(getDictName("trackStatus", statusInfo.getInsStatus())); - statusInfo.setAppStopNavtrackName(getDictName("trackStatus", statusInfo.getAppStopNavtrack())); - statusInfo.setTrackRecordName(getDictName("trackStatus", statusInfo.getTrackRecord())); + statusInfo.setDataRecordName(getDictName("trackStatus" , statusInfo.getDataRecord())); + statusInfo.setTrackStatusName(getDictName("trackStatus" , statusInfo.getTrackStatus())); + statusInfo.setTrackName(getDictName("trackStatus" , statusInfo.getTrack())); + statusInfo.setInsStatusName(getDictName("trackStatus" , statusInfo.getInsStatus())); + statusInfo.setAppStopNavtrackName(getDictName("trackStatus" , statusInfo.getAppStopNavtrack())); + statusInfo.setTrackRecordName(getDictName("trackStatus" , statusInfo.getTrackRecord())); //收到状态 - statusInfo.setLidarMsgName(getDictName("lidarMsg", statusInfo.getLidarMsg())); - statusInfo.setImuMsgName(getDictName("lidarMsg", statusInfo.getImuMsg())); - statusInfo.setChargeMsgName(getDictName("lidarMsg", statusInfo.getChargeMsg())); - statusInfo.setGpsMsgName(getDictName("lidarMsg", statusInfo.getGpsMsg())); + statusInfo.setLidarMsgName(getDictName("lidarMsg" , statusInfo.getLidarMsg())); + statusInfo.setImuMsgName(getDictName("lidarMsg" , statusInfo.getImuMsg())); + statusInfo.setChargeMsgName(getDictName("lidarMsg" , statusInfo.getChargeMsg())); + statusInfo.setGpsMsgName(getDictName("lidarMsg" , statusInfo.getGpsMsg())); //连接状态 - statusInfo.setConnStatusName(getDictName("connStatus", statusInfo.getConnStatus())); + statusInfo.setConnStatusName(getDictName("connStatus" , statusInfo.getConnStatus())); } @@ -114,11 +125,11 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); SensorStatusDTO msg = responseDTO.getMsg(); - query.set("lidar_msg", msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); - query.set("imu_msg", msg.getImuMsg() == null ? 0 : msg.getImuMsg()); - query.set("charge_msg", msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); - query.set("gps_msg", msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); - query.eq("robot_id", robotId); + query.set("lidar_msg" , msg.getLidarMsg() == null ? 0 : msg.getLidarMsg()); + query.set("imu_msg" , msg.getImuMsg() == null ? 0 : msg.getImuMsg()); + query.set("charge_msg" , msg.getChargeMsg() == null ? 0 : msg.getChargeMsg()); + query.set("gps_msg" , msg.getGpsMsg() == null ? 0 : msg.getGpsMsg()); + query.eq("robot_id" , robotId); update(query); } } @@ -137,8 +148,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); - query.set("process_message", msg.getP()); - query.eq("robot_id", robotId); + query.set("process_message" , msg.getP()); + query.eq("robot_id" , robotId); update(query); } } @@ -157,8 +168,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_nav_pause" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -171,8 +182,8 @@ if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); + query.set("app_stop_navtrack" , msg.getResult()); + query.eq("robot_id" , robotId); update(query); } } @@ -180,16 +191,16 @@ @Override public void updateCurrTask(String robotId, Long currRouteId, Long currTaskId) { UpdateWrapper query = new UpdateWrapper<>(); - query.set("curr_route_id", currRouteId); - query.set("curr_task_id", currTaskId); - query.eq("robot_id", robotId); + query.set("curr_route_id" , currRouteId); + query.set("curr_task_id" , currTaskId); + query.eq("robot_id" , robotId); update(query); } @Override public RobotStatusInfo getStatusByRobotId(String robotId) { QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id", robotId); + query.eq("robot_id" , robotId); return getOne(query); } @@ -199,12 +210,65 @@ RobotResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO != null && responseDTO.getMsg() != null) { - log.info("速度信息保存:{}", responseDTO.getMsg()); + log.info("速度信息保存:{}" , responseDTO.getMsg()); UpdateWrapper query = new UpdateWrapper<>(); - query.set("robot_v", responseDTO.getMsg().getSpeed().getV()); - query.set("robot_w", responseDTO.getMsg().getSpeed().getW()); - query.eq("robot_id", robotId); + query.set("robot_v" , responseDTO.getMsg().getSpeed().getV()); + query.set("robot_w" , responseDTO.getMsg().getSpeed().getW()); + query.eq("robot_id" , robotId); update(query); } } + + @Override + public void saveStopState(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + if (responseDTO != null && responseDTO.getMsg() != null) { + log.info("急停状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); + query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); + query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); + query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + @Transactional + @Override + public void saveVoltageResponseMessage(String robotId, MqttMessage message) { + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); + //电压下限 45V 电压上限 58.8V 估算电量 + if (responseDTO != null && responseDTO.getMsg() != null) { + RobotInfo info = robotInfoService.getById(robotId); + log.info("电压状态保存:{}" , responseDTO.getMsg()); + LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); + if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { + Integer v = responseDTO.getMsg().getVoltage().get(0); + query.set(RobotStatusInfo::getVoltage, v); + //计算电量 + Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()),2, BigDecimal.ROUND_HALF_UP).doubleValue(); + query.set(RobotStatusInfo::getElectricityQuantity, quantity*100); + query.eq(RobotStatusInfo::getRobotId, robotId); + update(query); + } + } + + } + + private RobotResponseDTO parseJson(MqttMessage message, TypeReference> cls) { + String json = new String(message.getPayload()); + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\" , ""); + log.info(json); + RobotResponseDTO responseDTO = JSON.parseObject(json, cls); + return responseDTO; + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java index 6e6033f..454f10b 100644 --- a/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/mqtt/MsgUtils.java @@ -69,23 +69,23 @@ mqttClient.pub(enums.getReqName(), JSON.toJSONString(messageDTO)); } // 订阅返回值消息 - client.subscribe(enums.getRepName(), 1, (topic, message) -> { - String data = new String(message.getPayload()); - System.out.println(data); - if (StrUtil.isNotEmpty(data)) { - System.out.println(data); - if (data.startsWith("\"")) { - data = data.substring(1); + if (StrUtil.isNotEmpty(enums.getRepName())) { + client.subscribe(enums.getRepName(), 1, (topic, message) -> { + String data = new String(message.getPayload()); + if (StrUtil.isNotEmpty(data)) { + if (data.startsWith("\"")) { + data = data.substring(1); + } + if (data.endsWith("\"")) { + data = data.substring(0, data.length() - 1); + } + data = data.replaceAll("\\\\", ""); + maps.put("result", MsgUtils.convertMessage(data, enums)); + } else { + throw new ServiceException(500, enums.getRemarks() + "指令异常"); } - if (data.endsWith("\"")) { - data = data.substring(0, data.length() - 1); - } - data = data.replaceAll("\\\\", ""); - maps.put("result", MsgUtils.convertMessage(data, enums)); - } else { - throw new ServiceException(500, enums.getRemarks() + "指令异常"); - } - }); + }); + } int i = 0; if (enums.isWaitReply()) { do { diff --git a/casic-web/src/main/build/bin/start.bat b/casic-web/src/main/build/bin/start.bat index 1db4e88..2864d32 100644 --- a/casic-web/src/main/build/bin/start.bat +++ b/casic-web/src/main/build/bin/start.bat @@ -1,4 +1,4 @@ @echo off title ${project.build.finalName} -java -jar ./lib/${project.build.finalName}.jar +java -jar ./lib/casic-web-2.0.0.jar @pause diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 739eb99..cc68ae7 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.config.HikLibConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index c2372d1..348d4f3 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -37,7 +37,8 @@ session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 no-login-urls: /user/login,/kaptcha,/config/baseConfig - hiklib: D:\code\robot\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll + hikSdk: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll + hikPlay: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\PlayCtrl.dll config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\