| | |
| | | import com.zy.acs.manager.manager.service.AgvService; |
| | | import com.zy.acs.manager.manager.service.CodeService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.time.StopWatch; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.DependsOn; |
| | | import org.springframework.core.io.ClassPathResource; |
| | | import org.springframework.core.io.Resource; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.PreDestroy; |
| | | import java.io.*; |
| | | import java.io.BufferedReader; |
| | | import java.io.File; |
| | | import java.io.InputStream; |
| | | import java.io.InputStreamReader; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.StandardCopyOption; |
| | | import java.util.List; |
| | |
| | | */ |
| | | @Slf4j |
| | | @Component |
| | | @DependsOn("mapDataDispatcher") |
| | | public class AvoidWaveCalculator { |
| | | |
| | | private static final ReentrantLock lock = new ReentrantLock(Boolean.TRUE); |
| | |
| | | public void execute() { |
| | | this.singleThreadExecutor = Executors.newSingleThreadExecutor(); |
| | | this.singleThreadExecutor.execute(() -> { |
| | | |
| | | try { Thread.sleep(200); } catch (InterruptedException ignore) {} |
| | | try { Thread.sleep(500); } catch (InterruptedException ignore) {} |
| | | |
| | | this.calcDynamicNodeWhenBoot(); |
| | | |
| | | // while (!Thread.currentThread().isInterrupted()) { |
| | | // |
| | | // this.calcWaveScope(); |
| | | // |
| | | // try { Thread.sleep(500); } catch (InterruptedException ignore) {} |
| | | // } |
| | | |
| | | }); |
| | | } |
| | | |
| | |
| | | Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV; |
| | | boolean lockAcquired = false; |
| | | |
| | | StopWatch stopWatch = new StopWatch(); |
| | | stopWatch.start(); |
| | | long startTime = System.currentTimeMillis(); |
| | | |
| | | try { |
| | | if (!(lockAcquired = lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) { |
| | |
| | | lock.unlock(); |
| | | } |
| | | |
| | | stopWatch.stop(); |
| | | if (stopWatch.getTime() > 0) { |
| | | if (stopWatch.getTime() > 50) { |
| | | log.info("滤波函数花费时间为:{}毫秒......", stopWatch.getTime()); |
| | | } |
| | | long during = System.currentTimeMillis() - startTime; |
| | | if (during > 50) { |
| | | log.info("滤波函数花费时间为:{}毫秒......", during); |
| | | } |
| | | } |
| | | } |
| | |
| | | throw new RuntimeException(e); |
| | | } |
| | | return scriptFile; |
| | | } |
| | | |
| | | public void syncWaveBySingleVeh(String agvNo, String codeData) { |
| | | if (Cools.isEmpty(agvNo, codeData)) { |
| | | return; |
| | | } |
| | | |
| | | boolean lockAcquired = false; |
| | | Integer lev = MapDataDispatcher.MAP_DEFAULT_LEV; |
| | | |
| | | try { |
| | | if (!(lockAcquired = lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) { |
| | | log.warn("AvoidWaveCalculator syncWaveBySingleVeh fail, cause can not acquire lock ..."); |
| | | return; |
| | | } |
| | | |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | AgvModel agvModel = agvModelService.getByAgvNo(agvNo); |
| | | Double avoidDistance = MapDataUtils.getVehicleWaveSafeDistance(agvModel.getDiameter(), MapDataConstant.MAX_DISTANCE_BETWEEN_ADJACENT_AGV_FACTOR); |
| | | |
| | | String[][] waveMatrix = mapDataDispatcher.getWaveMatrix(lev); |
| | | |
| | | List<NavigateNode> includeList = mapService.getWaveScopeByCode(lev, codeData, avoidDistance); |
| | | |
| | | for (NavigateNode navigateNode : includeList) { |
| | | String waveNode = waveMatrix[navigateNode.getX()][navigateNode.getY()]; |
| | | waveMatrix[navigateNode.getX()][navigateNode.getY()] = MapDataUtils.generateWaveNode(waveNode, agv.getUuid()); |
| | | } |
| | | |
| | | mapDataDispatcher.setWaveMatrix(lev, waveMatrix); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("AvoidWaveCalculator.syncWaveBySingleVeh fail", e); |
| | | } finally { |
| | | |
| | | if (lockAcquired) { |
| | | lock.unlock(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void calcDynamicNodeWhenBoot() { |