Author: fdesbois Date: 2012-09-04 18:04:41 +0200 (Tue, 04 Sep 2012) New Revision: 515 Url: http://forge.codelutin.com/repositories/revision/sammoa/515 Log: refs #1197 : use lastTransect reference to save audio Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 12:48:41 UTC (rev 514) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/BaseFlightController.java 2012-09-04 16:04:41 UTC (rev 515) @@ -237,9 +237,9 @@ startTime = timeLog.log(startTime, "start()", "Commited"); // Fire events after commit - fireRouteAdded(previousRoute, currentRoute); - fireNextTransectChanged(nextTransect); - fireStateChanged(state); + onRouteAdded(previousRoute, currentRoute); + onNextTransectChanged(nextTransect); + onStateChanged(state); timeLog.log(startTime, "start()", "Fired"); @@ -265,7 +265,7 @@ this.nextTransect = nextTransect; // Fire transect changed - fireNextTransectChanged(nextTransect); + onNextTransectChanged(nextTransect); timeLog.log(startTime, "setNextTransect()", "Fired"); } @@ -279,7 +279,7 @@ setCurrentRoute(currentRoute, false); } - private void setCurrentRoute(Route currentRoute, boolean fireChanges) { + private void setCurrentRoute(Route newCurrentRoute, boolean fireChanges) { long startTime = TimeLog.getTime(); @@ -287,9 +287,11 @@ "The controller must be initialized before calling any action"); if (logger.isInfoEnabled()) { - logger.info("Set currentRoute : {}", Routes.toString(currentRoute)); + logger.info("Set currentRoute : {}", Routes.toString(newCurrentRoute)); } + currentRoute = newCurrentRoute; + if (currentRoute == null) { if (flight.getEndDate() == null) { @@ -298,39 +300,46 @@ } else { state = FlightState.ENDED; } - this.currentRoute = null; } else { + // Use previous not deleted route if (currentRoute.isDeleted()) { - this.currentRoute = service.getPreviousRoute(currentRoute); - } else { - this.currentRoute = currentRoute; + currentRoute = service.getPreviousRoute(newCurrentRoute); } - if (this.currentRoute.getRouteType() == RouteType.LEG) { - state = FlightState.ON_EFFORT; + // Update state, lastTransect and nextTransect depends on routeType + switch (currentRoute.getRouteType()) { - } else { - state = FlightState.OFF_EFFORT; - } + case LEG: + state = FlightState.ON_EFFORT; + lastTransect = service.getPreviousTransect(currentRoute); + nextTransect = flight.getNextTransectFlightFrom(lastTransect); + break; - lastTransect = service.getPreviousTransect(this.currentRoute); + case CIRCLE_BACK: + state = FlightState.OFF_EFFORT; + lastTransect = service.getPreviousTransect(currentRoute); + nextTransect = lastTransect; + break; - // Selection of the nextTransect, keep the last one for circleBack - if (this.currentRoute.getRouteType() == RouteType.CIRCLE_BACK) { - nextTransect = lastTransect; + case TRANSIT: + state = FlightState.OFF_EFFORT; + lastTransect = null; + nextTransect = flight.getNextTransectFlightFrom( + service.getPreviousTransect(currentRoute)); + break; - } else { - nextTransect = flight.getNextTransectFlightFrom(lastTransect); + default: } } if (fireChanges) { - fireStateChanged(state); - fireNextTransectChanged(nextTransect); - fireCurrentRouteChanged(this.currentRoute); + onStateChanged(state); + onLastTransectChanged(lastTransect); + onNextTransectChanged(nextTransect); + onCurrentRouteChanged(currentRoute); } timeLog.log(startTime, "setCurrentRoute()"); @@ -378,9 +387,10 @@ startTime = timeLog.log(startTime, "begin()", "Commited"); // Fire events after commit - fireRouteAdded(previousRoute, currentRoute); - fireNextTransectChanged(nextTransect); - fireStateChanged(state); + onRouteAdded(previousRoute, currentRoute); + onLastTransectChanged(lastTransect); + onNextTransectChanged(nextTransect); + onStateChanged(state); timeLog.log(startTime, "begin()", "Fired"); @@ -431,9 +441,9 @@ startTime = timeLog.log(startTime, "circleBack()", "Commited"); // Fire events after commit - fireRouteAdded(previousRoute, currentRoute); - fireNextTransectChanged(nextTransect); - fireStateChanged(state); + onRouteAdded(previousRoute, currentRoute); + onNextTransectChanged(nextTransect); + onStateChanged(state); timeLog.log(startTime, "circleBack()", "Fired"); @@ -475,7 +485,7 @@ startTime = timeLog.log(startTime, "add()", "Commited"); // Fire events after commit - fireRouteAdded(previousRoute, currentRoute); + onRouteAdded(previousRoute, currentRoute); timeLog.log(startTime, "add()", "Fired"); @@ -541,7 +551,7 @@ startTime = timeLog.log(startTime, "observation()", "Commited"); - fireObservationAdded(observation, geoPoint); + onObservationAdded(observation, geoPoint); timeLog.log(startTime, "observation()", "Fired"); @@ -571,6 +581,8 @@ Date currentDate = geoPoint.getRecordTime(); + lastTransect = null; + // Create new TRANSIT route if (logger.isInfoEnabled()) { logger.info(String.format("Create TRANSIT [END] at %1$tH:%1$tM:%1$tS.%1$tL", currentDate)); @@ -583,9 +595,10 @@ transaction.commitTransaction(); // Fire events after commit - fireRouteAdded(previousRoute, currentRoute); - fireNextTransectChanged(nextTransect); - fireStateChanged(state); + onRouteAdded(previousRoute, currentRoute); + onLastTransectChanged(lastTransect); + onNextTransectChanged(nextTransect); + onStateChanged(state); } catch (TopiaException e) { throw new TopiaRuntimeException(e); @@ -634,9 +647,9 @@ startTime = timeLog.log(startTime, "stop()", "Commited"); // Fire events after commit - fireCurrentRouteChanged(currentRoute); - fireNextTransectChanged(nextTransect); - fireStateChanged(state); + onCurrentRouteChanged(currentRoute); + onNextTransectChanged(nextTransect); + onStateChanged(state); timeLog.log(startTime, "stop()", "Fired"); @@ -724,20 +737,20 @@ return deviceManagerProvider; } - protected void fireObservationAdded(Observation observation, GeoPoint location) { + protected void onObservationAdded(Observation observation, GeoPoint location) { ObservationEvent event = new ObservationEvent(this, observation, location); for (FlightControllerListener listener : listeners) { listener.onObservationAdded(event); } } - protected void fireStateChanged(FlightState state) { + protected void onStateChanged(FlightState state) { for (FlightControllerListener listener : listeners) { listener.onStateChanged(state); } } - protected void fireRouteAdded(Route previousRoute, Route newRoute) { + protected void onRouteAdded(Route previousRoute, Route newRoute) { Preconditions.checkNotNull(newRoute); RouteEvent event = new RouteEvent(this, newRoute, true, previousRoute); for (FlightControllerListener listener : listeners) { @@ -745,17 +758,21 @@ } } - protected void fireCurrentRouteChanged(Route route) { + protected void onCurrentRouteChanged(Route route) { RouteEvent event = new RouteEvent(this, route, false, null); for (FlightControllerListener listener : listeners) { listener.onCurrentRouteChanged(event); } } - protected void fireNextTransectChanged(TransectFlight nextTransect) { + protected void onNextTransectChanged(TransectFlight nextTransect) { for (FlightControllerListener listener : listeners) { listener.onNextTransectChanged(nextTransect); } } + protected void onLastTransectChanged(TransectFlight lastTransect) { + // no fire by default + } + } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 12:48:41 UTC (rev 514) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerOnBoard.java 2012-09-04 16:04:41 UTC (rev 515) @@ -32,7 +32,6 @@ import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.GeoPoint; import fr.ulr.sammoa.persistence.GeoPoints; -import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.RouteType; import fr.ulr.sammoa.persistence.SammoaDAOHelper; import fr.ulr.sammoa.persistence.TransectFlight; @@ -46,7 +45,7 @@ * * @author fdesbois <florian.desbois@codelutin.com> */ -public class FlightControllerOnBoard extends BaseFlightController implements GpsLocationListener, FlightControllerListener { +public class FlightControllerOnBoard extends BaseFlightController implements GpsLocationListener { protected GpsHandler gpsHandler; @@ -74,8 +73,6 @@ super.init(flight); - addFlightControllerListener(this); - initCurrentRoute(service.getLastUnfinishedRoute(flight)); if (isRunning()) { @@ -84,11 +81,13 @@ audioRecorder.start(); - // Restart recording audio if onEffort or circleBack + // Restart recording audio if onEffort or circleBack (recovery mode) if (state == FlightState.ON_EFFORT - || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) { + || currentRoute.getRouteType() == RouteType.CIRCLE_BACK) { - saveAudio(3); + File audioFile = flightStorage.getAudioFile( + lastTransect, audioRecorder.getOutputType().getExtension()); + audioRecorder.record(audioFile, 3); } } } @@ -133,45 +132,17 @@ } @Override - public void onCurrentRouteChanged(RouteEvent event) { - if (event.isNew()) { + protected void onLastTransectChanged(TransectFlight lastTransect) { - Route newRoute = event.getRoute(); + if (lastTransect == null) { + audioRecorder.stopRecord(3); - if (RouteType.LEG == newRoute.getRouteType() - || RouteType.CIRCLE_BACK == newRoute.getRouteType()) { - - saveAudio(3); - - } else { - - // Stop recording after 2 minutes (120 seconds) - audioRecorder.stopRecord(120); - } + } else { + File audioFile = flightStorage.getAudioFile( + lastTransect, audioRecorder.getOutputType().getExtension()); + audioRecorder.record(audioFile, 3); } - } - @Override - public void onNextTransectChanged(TransectFlight nextTransect) { - // nothing to do + super.onLastTransectChanged(lastTransect); } - - @Override - public void onStateChanged(FlightState state) { - // nothing to do - } - - @Override - public void onObservationAdded(ObservationEvent event) { - // nothing to do - } - - protected void saveAudio(long delaySeconds) { - - String extension = audioRecorder.getOutputType().getExtension(); - - File audioFile = flightStorage.getAudioFile(currentRoute, extension); - - audioRecorder.record(audioFile, delaySeconds); - } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 12:48:41 UTC (rev 514) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerValidation.java 2012-09-04 16:04:41 UTC (rev 515) @@ -23,6 +23,7 @@ * #L% */ +import com.google.common.base.Objects; import com.google.common.base.Preconditions; import fr.ulr.sammoa.application.device.DeviceManager; import fr.ulr.sammoa.application.device.audio.AudioReader; @@ -49,8 +50,7 @@ * * @author fdesbois <florian.desbois@codelutin.com> */ -public class FlightControllerValidation extends BaseFlightController -implements FlightControllerListener { +public class FlightControllerValidation extends BaseFlightController { private static final Logger logger = LoggerFactory.getLogger(FlightControllerValidation.class); @@ -73,8 +73,6 @@ super.init(flight); - addFlightControllerListener(this); - initCurrentRoute(null); geoPoints = service.getFlightGeoPoints(flight); @@ -101,33 +99,10 @@ DateTime newTime; if (position > 0) { - newTime = previousTime.plus(position); } else { - newTime = new DateTime(previousTime); - -// // Arbitrary add 1 second for the newTime -// newTime = DateUtils.addMilliseconds(previousTime, 1000); -// -// // Ensure that newTime is before nextRoute time -// Route nextRoute = Routes.findNext(routes, currentRoute); -// if (nextRoute != null) { -// -// logger.debug(String.format("Next route %1$s at %2$tH:%2$tM:%2$tS.%2$tL", -// nextRoute.getRouteType(), -// nextRoute.getBeginTime()) -// ); -// -// // If greater or equals than the nextRoute, we use the middle -// // time between previous and next route -// if (newTime.after(nextRoute.getBeginTime()) -// || newTime.equals(nextRoute.getBeginTime())) { -// -// newTime = Routes.getMiddleTime(currentRoute, nextRoute); -// } -// } } if (logger.isDebugEnabled()) { @@ -147,12 +122,6 @@ result.setSpeed(location.getSpeed()); result.setAltitude(location.getAltitude()); -// // Ensure captureDelay of the new recording time -// long locationSeconds = DateUtils.getFragmentInSeconds(location.getRecordTime(), Calendar.MINUTE); -// long newSeconds = DateUtils.getFragmentInSeconds(newTime, Calendar.MINUTE); -// int captureDelay = (int) newSeconds - (int) locationSeconds; -// result.setCaptureDelay(captureDelay); - int captureDelay = Dates .toInterval(locationTime, newTime) .toDuration() @@ -176,49 +145,40 @@ return result; } + @Override - public void onCurrentRouteChanged(RouteEvent event) { - if (event.isNew()) { - if (logger.isDebugEnabled()) { - logger.debug("Add route {} to cache", Routes.toString(event.getRoute())); - } - routes.add(event.getRoute()); + protected void onRouteAdded(Route previousRoute, Route newRoute) { - } else { + if (logger.isDebugEnabled()) { + logger.debug("Add route {} to cache", Routes.toString(newRoute)); + } + routes.add(newRoute); + // Ensure previous, it could be different from argument because + // the audio time could overflow on more than one route + previousRoute = Routes.findPrevious(routes, newRoute); + + super.onRouteAdded(previousRoute, newRoute); + } + + @Override + protected void onLastTransectChanged(TransectFlight transectFlight) { + + // Only change audio if lastTransect isn't the same + if (!Objects.equal(lastTransect, transectFlight)) { + audioReader.unload(); - if (currentRoute != null) { + if (transectFlight != null) { File file = flightStorage.getAudioFile( - currentRoute, audioReader.getOutputType().getExtension()); + transectFlight, audioReader.getOutputType().getExtension()); if (file.exists()) { audioReader.load(file); } } } - } - @Override - public void onNextTransectChanged(TransectFlight nextTransect) { - // nothing to do + super.onLastTransectChanged(transectFlight); } - - @Override - public void onStateChanged(FlightState state) { - // nothing to do - } - - @Override - public void onObservationAdded(ObservationEvent event) { - // nothing to do - } - - @Override - protected void fireRouteAdded(Route previousRoute, Route newRoute) { - - // Ensure previous, it could be different from argument because - // the audio time could overflow on more than one route - super.fireRouteAdded(Routes.findPrevious(routes, newRoute), newRoute); - } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-09-04 12:48:41 UTC (rev 514) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-09-04 16:04:41 UTC (rev 515) @@ -29,7 +29,7 @@ import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.Region; -import fr.ulr.sammoa.persistence.Route; +import fr.ulr.sammoa.persistence.TransectFlight; import org.apache.commons.lang3.builder.ToStringBuilder; import org.nuiton.util.decorator.Decorator; @@ -54,9 +54,9 @@ return SammoaDirectories.getAudioDirectory(getDirectory()); } - public File getAudioFile(Route route, String ext) { + public File getAudioFile(TransectFlight transectFlight, String ext) { - String fileName = route.getTopiaId() + "." + ext; + String fileName = transectFlight.getTopiaId() + "." + ext; return new File(getAudioDirectory(), fileName); }