|
46 | 46 | import java.util.ArrayList; |
47 | 47 | import java.util.Date; |
48 | 48 | import java.util.LinkedHashMap; |
| 49 | +import java.util.List; |
49 | 50 |
|
50 | 51 | import javax.swing.ImageIcon; |
51 | 52 | import javax.swing.JCheckBoxMenuItem; |
|
75 | 76 | import pt.lsts.neptus.types.coord.LocationType; |
76 | 77 | import pt.lsts.neptus.types.map.PlanUtil; |
77 | 78 | import pt.lsts.neptus.types.mission.plan.PlanType; |
| 79 | +import pt.lsts.neptus.util.AngleUtils; |
78 | 80 | import pt.lsts.neptus.util.ImageUtils; |
79 | 81 | import pt.lsts.neptus.util.conf.DoubleMinMaxValidator; |
80 | 82 | import pt.lsts.neptus.util.conf.GeneralPreferences; |
@@ -212,6 +214,8 @@ public void on(PlanControlState pcs) { |
212 | 214 | planStates.put(pcs.getSourceName(), pcs); |
213 | 215 | } |
214 | 216 | } |
| 217 | + |
| 218 | + |
215 | 219 | } |
216 | 220 |
|
217 | 221 | @Subscribe |
@@ -311,8 +315,40 @@ public void sendUpdatesToRipples() { |
311 | 315 | if (lastSendTime != null && System.currentTimeMillis() - lastSendTime.getTime() < pollInterval.toMillis()) { |
312 | 316 | return; |
313 | 317 | } |
| 318 | + Date prevSentTime = lastSendTime; |
314 | 319 | lastSendTime = new Date(); |
315 | 320 |
|
| 321 | + try { |
| 322 | + // Let us see if we have plan data to send but no position data |
| 323 | + List<String> missingSystemsPositions = new ArrayList<>(); |
| 324 | + for (String sysName : planStates.keySet()) { |
| 325 | + PlanControlState pstate = planStates.get(sysName); |
| 326 | + if (pstate.getTimestampMillis() < prevSentTime.getTime()) |
| 327 | + continue; |
| 328 | + if (!assetStates.containsKey(sysName)) { |
| 329 | + missingSystemsPositions.add(sysName); |
| 330 | + } |
| 331 | + } |
| 332 | + |
| 333 | + // update asset states with the latest plan data |
| 334 | + assetStates.forEach((sysName, assetState) -> { |
| 335 | + RipplesAssetState newAssetState = fillAssetState(sysName, assetState); |
| 336 | + if (newAssetState == null) |
| 337 | + return; |
| 338 | + assetStates.replace(sysName, newAssetState); |
| 339 | + }); |
| 340 | + |
| 341 | + // Add the missing ones if planinfo later than the asset state |
| 342 | + for (String sysName : missingSystemsPositions) { |
| 343 | + RipplesAssetState newAssetState = fillAssetState(sysName, null); |
| 344 | + if (newAssetState != null) { |
| 345 | + assetStates.put(sysName, newAssetState); |
| 346 | + } |
| 347 | + } |
| 348 | + } catch (Exception e) { |
| 349 | + NeptusLog.pub().warn("Error checking for plan data: " + e.getMessage()); |
| 350 | + } |
| 351 | + |
316 | 352 | try { |
317 | 353 | System.out.println("Sending updates to Ripples"); |
318 | 354 | ArrayList<RipplesAsset> payload = new ArrayList<>(); |
@@ -351,6 +387,21 @@ public void sendUpdatesToRipples() { |
351 | 387 | } |
352 | 388 | } |
353 | 389 |
|
| 390 | + private static RipplesAssetState fillAssetState(String sysName, RipplesAssetState assetState) { |
| 391 | + ImcSystem sys = ImcSystemsHolder.getSystemWithName(sysName); |
| 392 | + if (sys == null) |
| 393 | + return null; |
| 394 | + |
| 395 | + LocationType loc = sys.getLocation().getNewAbsoluteLatLonDepth(); |
| 396 | + long locTimeMillis = sys.getLocationTimeMillis(); |
| 397 | + double headingDegress = sys.getYawDegrees(); |
| 398 | + if (loc == null || assetState != null && assetState.getTimestamp() > locTimeMillis / 1000.0) |
| 399 | + return null; |
| 400 | + |
| 401 | + return new RipplesAssetState((int) (locTimeMillis / 1000.0), loc.getLatitudeDegs(), |
| 402 | + loc.getLongitudeDegs(), AngleUtils.nomalizeAngleDegrees360(headingDegress), -1); |
| 403 | + } |
| 404 | + |
354 | 405 | private String sendPost(String data) throws Exception { |
355 | 406 | if (this.connected) { |
356 | 407 | String ripplesPostUrl = GeneralPreferences.ripplesUrl + "/assets"; |
|
0 commit comments