root 2 anni fa
parent
commit
d0ff19a894

+ 2 - 0
api-common/src/main/java/api/common/pojo/po/model/VehiclePO.java

@@ -2,10 +2,12 @@ package api.common.pojo.po.model;
 
 import api.common.pojo.common.CommonPO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 import java.util.List;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
 public class VehiclePO extends CommonPO {
     private String id;  //主键id

+ 12 - 12
simulation-resource-server/src/main/java/com/css/simulation/resource/model/controller/ConfigCtrl.java

@@ -52,7 +52,7 @@ public class ConfigCtrl {
     @RequestMapping("/saveConfig")
     public ResponseBodyVO<ConfigPO> saveConfig(@RequestBody ConfigVO configVO) {
         if (ObjectUtil.isNull(configVO)) {
-            return new ResponseBodyVO(false, 500, "参数必传!", null);
+            return new ResponseBodyVO<>(false, 500, "参数必传!", null);
         }
         //端口重复校验
         Map<String, List<ConfigSensorVO>> configSensors = configVO.getConfigSensors();
@@ -61,14 +61,14 @@ public class ConfigCtrl {
             if (ObjectUtil.isNotNull(configSensorVOS)) {
                 long count = configSensorVOS.stream().mapToInt(ConfigSensorVO::getSensorPort).distinct().count();
                 if (configSensorVOS.size() != count) {
-                    return new ResponseBodyVO(false, 500, "端口重复!", null);
+                    return new ResponseBodyVO<>(false, 500, "端口重复!", null);
                 }
             }
         }
-        ResponseBodyVO<ConfigPO> response = new ResponseBodyVO<ConfigPO>(ResponseBodyVO.Response.SUCCESS);
+        ResponseBodyVO<ConfigPO> response = new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
         ConfigPO po = configService.saveConfig(configVO);
         if (ObjectUtil.isNull(po.getId())) {
-            return new ResponseBodyVO(false, 500, "配置名称重复!", null);
+            return new ResponseBodyVO<>(false, 500, "配置名称重复!", null);
         }
         response.setInfo(po);
         return response;
@@ -80,7 +80,7 @@ public class ConfigCtrl {
     @RequestMapping("/saveAnotherConfig")
     public ResponseBodyVO<ConfigPO> saveAnotherConfig(@RequestBody ConfigVO configVO) {
         if (ObjectUtil.isNull(configVO)) {
-            return new ResponseBodyVO(false, 500, "参数必传!", null);
+            return new ResponseBodyVO<>(false, 500, "参数必传!", null);
         }
         //端口重复校验
         Map<String, List<ConfigSensorVO>> configSensors = configVO.getConfigSensors();
@@ -89,14 +89,14 @@ public class ConfigCtrl {
             if (ObjectUtil.isNotNull(configSensorVOS)) {
                 long count = configSensorVOS.stream().mapToInt(ConfigSensorVO::getSensorPort).distinct().count();
                 if (configSensorVOS.size() != count) {
-                    return new ResponseBodyVO(false, 500, "端口重复!", null);
+                    return new ResponseBodyVO<>(false, 500, "端口重复!", null);
                 }
             }
         }
         ResponseBodyVO<ConfigPO> response = new ResponseBodyVO<ConfigPO>(ResponseBodyVO.Response.SUCCESS);
         ConfigPO po = configService.saveAnotherConfig(configVO);
         if (ObjectUtil.isNull(po.getId())) {
-            return new ResponseBodyVO(false, 500, "配置名称重复!", null);
+            return new ResponseBodyVO<>(false, 500, "配置名称重复!", null);
         }
         response.setInfo(po);
         return response;
@@ -109,12 +109,12 @@ public class ConfigCtrl {
     @PreAuthorize("@AuthorityCheck.admin()")
     public ResponseBodyVO<ConfigPO> shareConfigByInfo(@RequestBody ConfigVO configVO) {
         if (ObjectUtil.isNull(configVO)) {
-            return new ResponseBodyVO(false, 500, "参数必传!", null);
+            return new ResponseBodyVO<>(false, 500, "参数必传!", null);
         }
         ResponseBodyVO<ConfigPO> response = new ResponseBodyVO<ConfigPO>(ResponseBodyVO.Response.SUCCESS);
         ConfigPO po = configService.shareConfigByInfo(configVO);
         if (ObjectUtil.isNull(po.getId())) {
-            return new ResponseBodyVO(false, 500, "配置名称重复!", null);
+            return new ResponseBodyVO<>(false, 500, "配置名称重复!", null);
         }
         response.setInfo(po);
         return response;
@@ -142,12 +142,12 @@ public class ConfigCtrl {
      * 删除
      */
     @RequestMapping("/delConfigById")
-    public ResponseBodyVO delConfigById(@RequestBody ConfigVO configVO) {
+    public ResponseBodyVO<String> delConfigById(@RequestBody ConfigVO configVO) {
         int i = configService.delConfigById(configVO);
         if (i > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
         } else {
-            return new ResponseBodyVO(false, 500, "删除失败!", null);
+            return new ResponseBodyVO<>(false, 500, "删除失败!", null);
         }
     }
 }

+ 32 - 6
simulation-resource-server/src/main/java/com/css/simulation/resource/model/service/VehicleService.java

@@ -83,9 +83,15 @@ public class VehicleService {
         if ("2".equals(parameterType)) {
             VehicleUtil.listToJson(vehiclePO);
             String par = FileUtil.read(parTemplate);
-            log.info("saveVehicle() par文件内容为:" + vehiclePO);
-            log.info("saveVehicle() 车辆模型对象为:" + vehiclePO);
-            List<String> gearRatio = vehiclePO.getGearRatio();
+            log.info("par文件内容为:" + par);
+            log.info("车辆模型对象为:" + vehiclePO);
+            final String gearRatioJson = vehiclePO.getGearRatioJson();
+            final List<String> gearRatio;
+            if (CollectionUtil.isNotEmpty(vehiclePO.getGearRatio())) {
+                gearRatio = vehiclePO.getGearRatio();
+            } else {
+                gearRatio = JsonUtil.jsonToList(gearRatioJson, String.class);
+            }
             StringBuilder gearRatioString = new StringBuilder();
             for (int i = 0; i < gearRatio.size(); i++) {
                 if (i == 0) {
@@ -99,7 +105,14 @@ public class VehicleService {
                 gearRatioString.append("R_GEAR_TR ").append(gearRatio.get(i)).append(System.lineSeparator());
                 gearRatioString.append("*R_GEAR_TR(").append(i - 1).append(") ").append(gearRatio.get(i)).append(System.lineSeparator());
             }
-            List<String> inertia = vehiclePO.getInertia();
+
+            final String inertiaJson = vehiclePO.getInertiaJson();
+            final List<String> inertia;
+            if (CollectionUtil.isNotEmpty(vehiclePO.getInertia())) {
+                inertia = vehiclePO.getInertia();
+            } else {
+                inertia = JsonUtil.jsonToList(inertiaJson, String.class);
+            }
             StringBuilder inertiaString = new StringBuilder();
             for (int i = 0; i < inertia.size(); i++) {
                 if (i == 0) {
@@ -114,7 +127,14 @@ public class VehicleService {
                 inertiaString.append("ITR ").append(inertia.get(i)).append(System.lineSeparator());
                 inertiaString.append("*ITR(").append(i - 1).append(") ").append(inertia.get(i)).append(System.lineSeparator());
             }
-            List<String> driving = vehiclePO.getDriving();
+
+            final String drivingJson = vehiclePO.getDrivingJson();
+            final List<String> driving;
+            if (CollectionUtil.isNotEmpty(vehiclePO.getDriving())) {
+                driving = vehiclePO.getDriving();
+            } else {
+                driving = JsonUtil.jsonToList(drivingJson, String.class);
+            }
             StringBuilder drivingString = new StringBuilder();
             for (int i = 0; i < driving.size(); i++) {
                 if (i == 0) {
@@ -128,7 +148,13 @@ public class VehicleService {
                 drivingString.append("R_EFF_TR_F ").append(driving.get(i)).append(System.lineSeparator());
                 drivingString.append("*R_EFF_TR_F(").append(i - 1).append(") ").append(driving.get(i)).append(System.lineSeparator());
             }
-            List<String> coasting = vehiclePO.getDriving();
+            final String coastingJson = vehiclePO.getCoastingJson();
+            final List<String> coasting;
+            if (CollectionUtil.isNotEmpty(vehiclePO.getCoasting())) {
+                coasting = vehiclePO.getCoasting();
+            } else {
+                coasting = JsonUtil.jsonToList(coastingJson, String.class);
+            }
             StringBuilder coastingString = new StringBuilder();
             for (int i = 0; i < coasting.size(); i++) {
                 if (i == 0) {

+ 7 - 6
simulation-resource-video/src/main/java/com/css/simulation/resource/video/configuration/init/CustomApplicationRunner.java

@@ -1,22 +1,23 @@
 package com.css.simulation.resource.video.configuration.init;
 
-import api.common.util.LinuxUtil;
+import com.css.simulation.resource.video.configuration.redis.CustomRedisClient;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+
 @Component
 @Slf4j
 public class CustomApplicationRunner implements ApplicationRunner {
-    @Value("${scheduler.Xvfb-command}")
-    private String XvfbCommand;
+    @Resource
+    private CustomRedisClient customRedisClient;
 
 
     @Override
     public void run(ApplicationArguments args) {
-        log.info("启动 Xvfb。");
-        LinuxUtil.execute(XvfbCommand);
+        log.info("初始化屏幕号。");
+        customRedisClient.set("screen-number", "0");
     }
 }

+ 6 - 2
simulation-resource-video/src/main/java/com/css/simulation/resource/video/configuration/redis/CustomRedisClient.java

@@ -45,8 +45,12 @@ public class CustomRedisClient {
     /**
      * 加值
      */
-    public void increment(String key, long number) {
-        stringRedisTemplate.opsForValue().increment(key, number);
+    public long increment(String key, long number) {
+        final Long increment = stringRedisTemplate.opsForValue().increment(key, number);
+        if (increment == null) {
+            throw new RuntimeException("key " + key + " 增量计数报错。");
+        }
+        return increment;
     }
 
     /**

+ 12 - 6
simulation-resource-video/src/main/java/com/css/simulation/resource/video/service/VideoService.java

@@ -57,6 +57,8 @@ public class VideoService {
     //* -------------------------------- Comment --------------------------------
     @Value("${scheduler.linux-path.temp}")
     private String linuxTempPath;
+    @Value("${scheduler.xvfb-command}")
+    private String xvfbCommand;
     @Value("${scheduler.esmini-command}")
     private String esminiCommand;
     @Value("${scheduler.python-command}")
@@ -76,7 +78,6 @@ public class VideoService {
         final Set<String> cpuNodeParallelismKeys = customRedisClient.keys("cpu-node*");
         // 获取本地 hostname
         final String hostName = OsUtil.getHostName();
-        int parallelism = 0;
         String cpuNodeParallelismKey = "cpu-node:simulation003:parallelism";
         for (String tempCpuNodeParallelismKey : cpuNodeParallelismKeys) {
             if (tempCpuNodeParallelismKey.contains(hostName)) {
@@ -109,29 +110,34 @@ public class VideoService {
             String pictureDirectoryPath = rootDirectoryPathOfLinux + "picture";
             FileUtil.createDirectory(pictureDirectoryPath);
             String esminiCommandTemp = esminiCommand + " " + xoscPath + " " + pictureDirectoryPath + "/screenshot " + StringUtil.doubleToString(Double.parseDouble(maxSimulationTime), 2);
+            // 获取屏幕号创建新的虚拟屏幕
+            final long newScreenNum = customRedisClient.increment("screen-number", 1);
+            log.info("获取新的屏幕号:" + newScreenNum);
+            final String xvfbCommand2 = xvfbCommand.replaceAll("screenNum", newScreenNum + "");
+            LinuxUtil.execute(xvfbCommand2);
             LinuxUtil.execute(esminiCommandTemp);
             log.info("删除 esmini 进程。");
             LinuxUtil.kill(esminiCommandTemp);
             int num = 14;
             for (int i = 0; i < num; i++) {
                 String remove = "rm -f " + pictureDirectoryPath + "/screenshot_0000" + i + ".tga";
-                log.info("删除图片:" + remove);
                 LinuxUtil.execute(remove);
             }
             log.info("生成视频。");
             String videoTargetPathOfLinux = rootDirectoryPathOfLinux + "video/" + videoName;
             FileUtil.createParentDirectory(videoTargetPathOfLinux);
             String videoTargetPathOfMinio = rootDirectoryPathOfMinio + videoName;
-            String execute = LinuxUtil.execute("ffmpeg -f image2 -framerate 30 -start_number " + num
+            LinuxUtil.execute("ffmpeg -f image2 -framerate 30 -start_number " + num
                     + " -i " + pictureDirectoryPath + "/screenshot_%05d.tga"
                     + " -c:v libx264 -vf format=yuv420p -crf 20 " + videoTargetPathOfLinux);
-            //6 将视频上传到 minio
-            MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux, bucketName, videoTargetPathOfMinio);
-            log.info("上传成功:" + videoTargetPathOfMinio);
             //删除生成的临时文件
             String removeAll = "rm -rf " + pictureDirectoryPath;
             log.info("删除全部图片==" + removeAll);
             LinuxUtil.execute(removeAll);
+            //6 将视频上传到 minio
+            MinioUtil.uploadFromFile(minioClient, videoTargetPathOfLinux, bucketName, videoTargetPathOfMinio);
+            log.info("上传成功:" + videoTargetPathOfMinio);
+            LinuxUtil.kill(xvfbCommand2);
             //* -------------------------------- 删除临时文件 --------------------------------
 //        FileUtil.rm(xodrPathOfLinux);
 //        FileUtil.rm(osgbPathOfLinux);