Sammoa-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- 446 discussions
r395 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application/map sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 14:56:49 +0200 (Fri, 10 Aug 2012)
New Revision: 395
Url: http://forge.codelutin.com/repositories/revision/sammoa/395
Log:
refs #1203: Export SHP (fix Observations export)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-10 12:28:10 UTC (rev 394)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-10 12:56:49 UTC (rev 395)
@@ -202,6 +202,7 @@
// to keep current effort group identifier
String effortGroup = null;
+ Route previousRoute = null;
for (Route route : routes) {
if (logger.isTraceEnabled()) {
@@ -229,7 +230,7 @@
// add route data
fillRouteRecord(flight,
- route,
+ previousRoute,
effortGroup,
LegStatus.END,
record);
@@ -277,7 +278,11 @@
}
// add route data
- fillRouteRecord(flight, route, effortGroup, legStatus, record);
+ fillRouteRecord(flight,
+ route,
+ effortGroup,
+ legStatus,
+ record);
// add geoPoint data and flush
@@ -286,6 +291,9 @@
builder,
graphicList);
}
+
+ // keep current route as previousroute
+ previousRoute = route;
}
}
@@ -445,8 +453,10 @@
// use flight end date
routeEndTime = flight.getEndDate();
}
- Preconditions.checkState(routeEndTime.after(beginTime),
- String.format("Route debut de route %s - fin de route %s", beginTime, routeEndTime));
+ if (routeEndTime != null) {
+ Preconditions.checkState(routeEndTime.after(beginTime),
+ String.format("Route debut de route %s - fin de route %s", beginTime, routeEndTime));
+ }
PeriodDates routePeriod =
new PeriodDates(beginTime, routeEndTime);
@@ -518,8 +528,8 @@
record.put("CALVES", observation.getCalves());
record.put("PHOTO", observation.isPhoto());
record.put("OBSERVER", observation.getObserverPosition().getObserver().getInitials());
- record.put("SIDE", observation.getObserverPosition().getPosition().getName());
- record.put("STATUS", observation.getObservationStatus().getName());
+ record.put("SIDE", observation.getObserverPosition().getPosition());
+ record.put("STATUS", observation.getObservationStatus());
record.put("COMMENT", observation.getComment());
GeoPoint geoPoint = geoPointIterator.next();
@@ -693,15 +703,19 @@
fillRouteTypeRecord(flight, route, effortGroup, record);
if (legStatus != null) {
- record.put("STATUS", LegStatus.END);
+ record.put("STATUS", legStatus);
}
record.put("COMMENT", route.getComment());
record.put("SEA_STATE", route.getSeaState());
record.put("SWELL", route.getSwell());
record.put("TURBIDITY", route.getTurbidity());
record.put("SKY_GLINT", route.getSkyGlint());
- record.put("GLARE_FROM", route.getGlareFrom());
- record.put("GLARE_TO", route.getGlareTo());
+ if (route.getGlareFrom() != null) {
+ record.put("GLARE_FROM", String.valueOf(route.getGlareFrom()));
+ }
+ if (route.getGlareTo() != null) {
+ record.put("GLARE_TO", String.valueOf(route.getGlareTo()));
+ }
record.put("GLARE_SEVERITY", route.getGlareSeverity());
record.put("GLARE_UNDER", route.isGlareUnder());
record.put("CLOUD_COVER", route.getCloudCover());
@@ -731,7 +745,7 @@
String effortGroup,
Map<String, Object> record) {
- record.put("ROUTE_TYPE", route.getRouteType().getName());
+ record.put("ROUTE_TYPE", route.getRouteType());
if (Routes.isRouteLeg(route)) {
fillLegRouteRecord(route, effortGroup, record);
}
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-10 12:28:10 UTC (rev 394)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-10 12:56:49 UTC (rev 395)
@@ -97,13 +97,26 @@
List<Observation> result = Lists.newArrayList();
Iterator<Observation> itr = observations.iterator();
- while (itr.hasNext()) {
- Observation observation = itr.next();
- Date observationTime = observation.getObservationTime();
- if (periodDate.between(observationTime)) {
- itr.remove();
- result.add(observation);
+ if (periodDate.getThruDate() == null) {
+ Date fromDate = periodDate.getFromDate();
+ // no up bound
+ while (itr.hasNext()) {
+ Observation observation = itr.next();
+ Date observationTime = observation.getObservationTime();
+ if (fromDate.before(observationTime)) {
+ itr.remove();
+ result.add(observation);
+ }
}
+ } else {
+ while (itr.hasNext()) {
+ Observation observation = itr.next();
+ Date observationTime = observation.getObservationTime();
+ if (periodDate.between(observationTime)) {
+ itr.remove();
+ result.add(observation);
+ }
+ }
}
return result;
}
1
0
r394 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 14:28:10 +0200 (Fri, 10 Aug 2012)
New Revision: 394
Url: http://forge.codelutin.com/repositories/revision/sammoa/394
Log:
improve dbf table model (more check on cleanValue)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java 2012-08-10 12:26:41 UTC (rev 393)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/DbfTableModelBuilder.java 2012-08-10 12:28:10 UTC (rev 394)
@@ -5,6 +5,8 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -19,6 +21,10 @@
*/
public class DbfTableModelBuilder {
+ /** Logger. */
+ private static final Logger logger =
+ LoggerFactory.getLogger(DbfTableModelBuilder.class);
+
public static final int DEFAULT_STRING_LENGTH = 64;
public static final int DEFAULT_INTEGER_LENGTH = 8;
@@ -88,7 +94,7 @@
}
public DbfTableModelBuilder booleanColumn(String name) {
- return dbfColumn(newBooleanColumn( name ));
+ return dbfColumn(newBooleanColumn(name));
}
public DbfTableModelBuilder integerColumn(String name) {
@@ -119,13 +125,13 @@
model.setDecimalCount(i, (byte) columnModel.getDecimalCount());
}
columnMap = Maps.uniqueIndex(columns,
- new Function<DbfColumnModel, String>() {
+ new Function<DbfColumnModel, String>() {
- @Override
- public String apply(DbfColumnModel input) {
- return input.getName();
- }
- });
+ @Override
+ public String apply(DbfColumnModel input) {
+ return input.getName();
+ }
+ });
return this;
}
@@ -163,8 +169,7 @@
if (value instanceof Integer) {
result = Double.valueOf(String.valueOf(value));
}
- }
- else if (DbfTableModel.TYPE_TIMESTAMP == type) {
+ } else if (DbfTableModel.TYPE_TIMESTAMP == type) {
// FIX for Date : no format is done
if (value instanceof Date) {
@@ -172,8 +177,7 @@
result = DbfTimestampConverter.toString(date);
}
- }
- else if (DbfTableModel.TYPE_DATE == type) {
+ } else if (DbfTableModel.TYPE_DATE == type) {
// FIX for Date : no format is done
if (value instanceof Date) {
@@ -181,9 +185,21 @@
result = DATE_FORMAT.format(date);
}
- }else if (DbfTableModel.TYPE_LOGICAL == type) {
- result = ( (Boolean) value ) ? "T" : "F";
+ } else if (DbfTableModel.TYPE_LOGICAL == type) {
+ result = ((Boolean) value) ? "T" : "F";
+ } else if (value instanceof Enum) {
+ result = ((Enum) value).name();
+ } else if (value instanceof Character) {
+ result = String.valueOf(value);
}
+
+ if (result != null &&
+ !(result instanceof String) &&
+ !(result instanceof Double)) {
+ if (logger.isWarnEnabled()) {
+ logger.warn("Incompatible data value {} (type {})", result, type);
+ }
+ }
return result;
}
1
0
r393 - trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 14:26:41 +0200 (Fri, 10 Aug 2012)
New Revision: 393
Url: http://forge.codelutin.com/repositories/revision/sammoa/393
Log:
remove generated enumeration if not needed
Removed:
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
Deleted: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java 2012-08-10 12:26:18 UTC (rev 392)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/ObservationStatus.java 2012-08-10 12:26:41 UTC (rev 393)
@@ -1,13 +0,0 @@
-package fr.ulr.sammoa.persistence;
-
-
-public enum ObservationStatus {
- RECAPTURE,
- NEW,
- NO_RECAPTURE,
- CIRCLE_BACK;
-
- public String getName() {
- return name();
- }
-} //ObservationStatus
Deleted: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java 2012-08-10 12:26:18 UTC (rev 392)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Position.java 2012-08-10 12:26:41 UTC (rev 393)
@@ -1,14 +0,0 @@
-package fr.ulr.sammoa.persistence;
-
-public enum Position {
- NAVIGATOR,
- FRONT_LEFT,
- FRONT_RIGHT,
- BACK_LEFT,
- BACK_RIGHT,
- CO_NAVIGATOR;
-
- public String getName() {
- return name();
- }
-} //Position
1
0
r392 - trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 14:26:18 +0200 (Fri, 10 Aug 2012)
New Revision: 392
Url: http://forge.codelutin.com/repositories/revision/sammoa/392
Log:
Action in Swing are serializables (add serialVersionUID)
Modified:
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CenterObservationAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CloseAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/LeftObservationAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/RightObservationAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/AddAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -39,6 +39,8 @@
*/
public class AddAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public AddAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/action-add.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.add.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/BeginAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -40,6 +40,8 @@
*/
public class BeginAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public BeginAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/playback_play.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.begin.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CenterObservationAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CenterObservationAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CenterObservationAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -37,6 +37,8 @@
*/
public class CenterObservationAction extends ObservationAction {
+ private static final long serialVersionUID = 1L;
+
public CenterObservationAction(SammoaUIContext context) {
super(_("sammoa.observation.observations.center"), context, Position.NAVIGATOR);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.center.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -43,6 +43,8 @@
*/
public class CircleBackAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public static final String CLIENT_PROPERTY_OBSERVATION = "observation";
protected static final ImageIcon CIRCLE_BACK_ICON = Resource.getIcon("/icons/undo.png");
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CloseAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CloseAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CloseAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -2,8 +2,8 @@
/*
* #%L
* SAMMOA :: UI Swing
- * $Id:$
- * $HeadURL:$
+ * $Id$
+ * $HeadURL$
* %%
* Copyright (C) 2012 UMS 3462, Code Lutin
* %%
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/EndAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -39,6 +39,8 @@
*/
public class EndAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public EndAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/playback_stop.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.end.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/LeftObservationAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/LeftObservationAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/LeftObservationAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -37,6 +37,8 @@
*/
public class LeftObservationAction extends ObservationAction {
+ private static final long serialVersionUID = 1L;
+
public LeftObservationAction(SammoaUIContext context) {
super(_("sammoa.observation.observations.left"), context, Position.FRONT_LEFT);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.left.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -39,6 +39,8 @@
*/
public class NextAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public NextAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/playback_next.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.next.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/NextTransectAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -38,7 +38,9 @@
* @author fdesbois <desbois(a)codelutin.com>
*/
public class NextTransectAction extends SammoaAction {
-
+
+ private static final long serialVersionUID = 1L;
+
public static final String CLIENT_PROPERTY_INDEX = "index";
public NextTransectAction(SammoaUIContext context) {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/ObservationAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -36,6 +36,8 @@
*/
public abstract class ObservationAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
protected Position position;
public ObservationAction(String name, SammoaUIContext context, Position position) {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/RightObservationAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/RightObservationAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/RightObservationAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -37,6 +37,8 @@
*/
public class RightObservationAction extends ObservationAction {
+ private static final long serialVersionUID = 1L;
+
public RightObservationAction(SammoaUIContext context) {
super(_("sammoa.observation.observations.right"), context, Position.FRONT_RIGHT);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.right.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/SammoaAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -42,6 +42,8 @@
*/
public abstract class SammoaAction extends AbstractAction implements PropertyChangeListener {
+ private static final long serialVersionUID = 1L;
+
protected SammoaUIContext context;
public SammoaAction(Icon icon, SammoaUIContext context) {
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StartAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -39,6 +39,8 @@
*/
public class StartAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public StartAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/playback_play.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.start.tip"));
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java 2012-08-10 12:25:54 UTC (rev 391)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/StopAction.java 2012-08-10 12:26:18 UTC (rev 392)
@@ -39,6 +39,8 @@
*/
public class StopAction extends SammoaAction {
+ private static final long serialVersionUID = 1L;
+
public StopAction(SammoaUIContext context) {
super(Resource.getIcon("/icons/playback_stop.png"), context);
putValue(Action.SHORT_DESCRIPTION, _("sammoa.action.stop.tip"));
1
0
10 Aug '12
Author: tchemit
Date: 2012-08-10 14:25:54 +0200 (Fri, 10 Aug 2012)
New Revision: 391
Url: http://forge.codelutin.com/repositories/revision/sammoa/391
Log:
add lazy on Route#circleBackCause property
Modified:
trunk/sammoa-persistence/src/main/xmi/sammoa.properties
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.properties
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-10 11:56:16 UTC (rev 390)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.properties 2012-08-10 12:25:54 UTC (rev 391)
@@ -117,6 +117,7 @@
# transectFlight is not a collection (EAGER load)
fr.ulr.sammoa.persistence.Route.attribute.transectFlight.tagvalue.lazy=false
+fr.ulr.sammoa.persistence.Route.attribute.circleBackCause.tagvalue.lazy=false
# observerPositions is a collection but always used
fr.ulr.sammoa.persistence.Route.attribute.observerPosition.tagvalue.lazy=false
1
0
10 Aug '12
Author: fdesbois
Date: 2012-08-10 13:56:16 +0200 (Fri, 10 Aug 2012)
New Revision: 390
Url: http://forge.codelutin.com/repositories/revision/sammoa/390
Log:
refs #1378 : improve GPS errors + always register a GeoPoint for observation, route ...
Added:
trunk/sammoa-application/src/main/java/org/
trunk/sammoa-application/src/main/java/org/dinopolis/
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/
trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java
Removed:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/SammoaGPSSerialDevice.java
trunk/sammoa-application/src/main/java/gnu/
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsLocationEvent.java
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -29,6 +29,7 @@
import fr.ulr.sammoa.application.device.DeviceStateListener;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
import fr.ulr.sammoa.persistence.GeoPoint;
+import fr.ulr.sammoa.persistence.GeoPoints;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -195,33 +196,35 @@
protected GeoPoint location;
+ protected GeoPoint lastLocation;
+
protected int nbFailures;
@Override
public void run() {
- GeoPoint lastLocation = location;
-
location = getCurrentLocation();
- // reset nbFailures if currentLocation is defined
- if (location != null) {
+ boolean sameLocation = GeoPoints.equal(location, lastLocation);
+
+ logger.debug("sameLocation={} [{} :: {}]", new Object[]{sameLocation, location, lastLocation});
+
+ // reset nbFailures if location hasn't changed
+ if (sameLocation) {
+ nbFailures++;
+ } else {
nbFailures = 0;
- } else {
- nbFailures++;
}
+ location.setCaptureDelay(nbFailures * config.getCheckPeriod());
+
// Data is unavailable
- if (location == null && nbFailures >= nbFailuresMax) {
- setState(DeviceState.ERROR,
- new DeviceTechnicalException(BaseGpsHandler.this,
- String.format("The GPS signal is lost after %d seconds ! " +
- "The application will try again in %d seconds",
- config.getTimeout(),
- config.getCheckPeriod())
- )
- );
+ if (GeoPoints.isCoordinatesEmpty(location) || sameLocation && nbFailures >= nbFailuresMax) {
+ DeviceTechnicalException error = onError(location);
+
+ setState(DeviceState.ERROR, error);
+
// GPS is recording
} else {
@@ -232,6 +235,10 @@
listener.locationChanged(new GpsLocationEvent(BaseGpsHandler.this, lastLocation, location));
}
}
+
+ lastLocation = location;
}
};
+
+ protected abstract DeviceTechnicalException onError(GeoPoint location);
}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/FakeGpsHandler.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -107,6 +107,11 @@
}
@Override
+ protected DeviceTechnicalException onError(GeoPoint location) {
+ return null;
+ }
+
+ @Override
public void close() throws DeviceTechnicalException {
setState(DeviceState.NO_DEVICE, null);
}
@@ -134,7 +139,7 @@
}
return result;
}
-
+
protected class GpsPointGenerator implements Runnable {
@Override
@@ -147,7 +152,7 @@
int count = MAX_POINTS;
- while (true && count != 0) {
+ while (count != 0) {
try {
Thread.sleep(2000);
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsHandlerGpsylon.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -25,18 +25,19 @@
package fr.ulr.sammoa.application.device.gps;
-import com.google.common.base.Objects;
import fr.ulr.sammoa.application.device.DeviceState;
import fr.ulr.sammoa.application.device.DeviceTechnicalException;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointImpl;
+import fr.ulr.sammoa.persistence.GeoPoints;
import gnu.io.CommPortIdentifier;
import org.dinopolis.gpstool.gpsinput.GPSDataProcessor;
import org.dinopolis.gpstool.gpsinput.GPSDevice;
import org.dinopolis.gpstool.gpsinput.GPSException;
import org.dinopolis.gpstool.gpsinput.GPSPosition;
import org.dinopolis.gpstool.gpsinput.GPSSerialDevice;
-import org.dinopolis.gpstool.gpsinput.nmea.GPSNmeaDataProcessor;
+import org.dinopolis.gpstool.gpsinput.SafeGPSSerialDevice;
+import org.dinopolis.gpstool.gpsinput.nmea.SafeGPSNmeaDataProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,14 +62,16 @@
protected GPSPosition lastPosition;
- protected GPSPosition lastSendPosition;
-
protected float lastAltitude;
protected float lastSpeed;
+ protected int lastNumberSatellites;
+
protected boolean deviceInitialized;
+ protected boolean opened;
+
public GpsHandlerGpsylon(GpsConfig config) {
super(config);
}
@@ -87,9 +90,9 @@
if (!deviceInitialized) {
- gpsDataProcessor = new GPSNmeaDataProcessor();
+ gpsDataProcessor = new SafeGPSNmeaDataProcessor();
- gpsDevice = new SammoaGPSSerialDevice();
+ gpsDevice = new SafeGPSSerialDevice();
Hashtable<String, Object> options = new Hashtable<String, Object>();
options.put(GPSSerialDevice.PORT_NAME_KEY, getConfig().getDevice());
@@ -105,30 +108,19 @@
deviceInitialized = true;
}
- if (logger.isTraceEnabled()) {
- Enumeration portList = CommPortIdentifier.getPortIdentifiers();
+ logAvailablePorts("beforeOpen");
- while (portList.hasMoreElements()) {
- CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
- if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
- logger.trace("Available SERIAL port : " + portId.getName());
- }
- }
- }
-
gpsDataProcessor.open();
- gpsDataProcessor.addGPSDataChangeListener(
- GPSDataProcessor.LOCATION, gpsDataProcessorListener);
- gpsDataProcessor.addGPSDataChangeListener(
- GPSDataProcessor.ALTITUDE, gpsDataProcessorListener);
- gpsDataProcessor.addGPSDataChangeListener(
- GPSDataProcessor.SPEED, gpsDataProcessorListener);
+ gpsDataProcessor.addGPSDataChangeListener(gpsDataProcessorListener);
logger.info("Connected to GPS device");
setState(DeviceState.READY, null);
+ opened = true;
+ logAvailablePorts("openedSuccessful");
+
} catch (GPSException ex) {
setState(DeviceState.NO_DEVICE, null);
@@ -147,18 +139,14 @@
logger.info("Closing GPS device...");
try {
- gpsDataProcessor.removeGPSDataChangeListener(
- GPSDataProcessor.LOCATION, gpsDataProcessorListener);
- gpsDataProcessor.removeGPSDataChangeListener(
- GPSDataProcessor.ALTITUDE, gpsDataProcessorListener);
- gpsDataProcessor.removeGPSDataChangeListener(
- GPSDataProcessor.SPEED, gpsDataProcessorListener);
+ gpsDataProcessor.removeGPSDataChangeListener(gpsDataProcessorListener);
gpsDataProcessor.close();
logger.info("GPS device is closed");
setState(DeviceState.NO_DEVICE, null);
+ opened = false;
} catch (GPSException e) {
setState(DeviceState.ERROR, null);
@@ -170,24 +158,99 @@
@Override
public GeoPoint getCurrentLocation() {
- GeoPoint result = null;
+ if (logger.isTraceEnabled()) {
+ logger.trace("Ask lastPosition = {}", lastPosition);
+ }
- logger.trace("Ask lastPosition = {}", lastPosition);
+// if (!Objects.equal(lastPosition, lastSendPosition) && lastPosition != null) {
+//
+// result = new GeoPointImpl(lastPosition.getLatitude(), lastPosition.getLongitude());
+// result.setAltitude(lastAltitude);
+// result.setSpeed(lastSpeed);
+// // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
+// result.setRecordTime(new Date());
+//
+// lastSendPosition = lastPosition;
+// }
- if (!Objects.equal(lastPosition, lastSendPosition) && lastPosition != null) {
+ double latitude = lastPosition != null
+ ? lastPosition.getLatitude() : GeoPoints.EMPTY_COORDINATE;
+ double longitude = lastPosition != null
+ ? lastPosition.getLongitude() : GeoPoints.EMPTY_COORDINATE;
- result = new GeoPointImpl(lastPosition.getLatitude(), lastPosition.getLongitude());
- result.setAltitude(lastAltitude);
- result.setSpeed(lastSpeed);
- // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
- result.setRecordTime(new Date());
+ GeoPoint result = new GeoPointImpl(latitude, longitude);
+ result.setAltitude(lastAltitude);
+ result.setSpeed(lastSpeed);
+ // FIXME-fdesbois-2012-07-02 : ensure time with GPS value and not system timestamp
+ result.setRecordTime(new Date());
- lastSendPosition = lastPosition;
+ if (logger.isWarnEnabled() && lastPosition == null) {
+ logger.warn("Retrieve a location without any coordinates : {}", result);
}
return result;
}
@Override
+ protected DeviceTechnicalException onError(GeoPoint location) {
+
+ DeviceTechnicalException result = null;
+
+ logAvailablePorts("checkIsOpened");
+
+ // TODO checkIsOpened
+ // Send error when device is connected :
+ // RXTX fhs_lock() Error: creating lock file: /var/lock/LCK..ttyUSB0: File exists
+ // No error when device is disconnected
+ // --> close handler
+ // Maybe with chance on next plug we will keep the same PORT
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("ERROR on GPS, nbSatellites = {} : geoPoint = {}", lastNumberSatellites, location);
+ }
+
+ if (!opened) {
+ start();
+
+ } else {
+
+ if (GeoPoints.isCoordinatesEmpty(location)) {
+
+ result = new DeviceTechnicalException(this,
+ "GPS is not ready, turn it on or wait for it to find satellites");
+
+ } else {
+
+ if (lastNumberSatellites == 0) {
+ result = new DeviceTechnicalException(this,
+ "GPS signal lost, there is no available satellite found");
+
+ } else {
+ result = new DeviceTechnicalException(this,
+ "GPS signal lost, please check the connection port");
+ }
+ }
+ }
+ return result;
+ }
+
+ protected void logAvailablePorts(String method) {
+
+ if (logger.isInfoEnabled()) {
+
+ logger.info("GPS configuration port {} [{}]", config.getDevice(), method);
+
+ Enumeration portList = CommPortIdentifier.getPortIdentifiers();
+
+ while (portList.hasMoreElements()) {
+ CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
+ if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
+ logger.info("## Available SERIAL port : {}", portId.getName());
+ }
+ }
+ }
+ }
+
+ @Override
protected void finalize() throws Throwable {
close();
super.finalize();
@@ -221,7 +284,9 @@
String property = evt.getPropertyName();
- logger.trace("Gps data received {} {}", property, evt.getNewValue());
+ if (logger.isTraceEnabled()) {
+ logger.trace("Gps data received {} {}", property, evt.getNewValue());
+ }
if (GPSDataProcessor.LOCATION.equals(property)) {
lastPosition = (GPSPosition) evt.getNewValue();
@@ -231,6 +296,9 @@
} else if (GPSDataProcessor.SPEED.equals(property)) {
lastSpeed = (Float) evt.getNewValue();
+
+ } else if (GPSDataProcessor.NUMBER_SATELLITES.equals(property)) {
+ lastNumberSatellites = (Integer) evt.getNewValue();
}
}
};
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsLocationEvent.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsLocationEvent.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/GpsLocationEvent.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -38,7 +38,9 @@
protected GeoPoint newValue;
- public GpsLocationEvent(GpsHandler source, GeoPoint oldValue, GeoPoint newValue) {
+ public GpsLocationEvent(GpsHandler source,
+ GeoPoint oldValue,
+ GeoPoint newValue) {
this.source = source;
this.oldValue = oldValue;
this.newValue = newValue;
Deleted: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/SammoaGPSSerialDevice.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/SammoaGPSSerialDevice.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/SammoaGPSSerialDevice.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -1,67 +0,0 @@
-package fr.ulr.sammoa.application.device.gps;
-/*
- * #%L
- * SAMMOA :: Application
- * $Id:$
- * $HeadURL:$
- * %%
- * Copyright (C) 2012 UMS 3462, Code Lutin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-import gnu.io.RXTXHack;
-import gnu.io.RXTXPort;
-import org.dinopolis.gpstool.gpsinput.GPSException;
-import org.dinopolis.gpstool.gpsinput.GPSSerialDevice;
-
-/**
- * There is an issue with closing on {@link gnu.io.SerialPort}. See
- * <a href="https://forums.oracle.com/forums/thread.jspa?threadID=1292323">
- * https://forums.oracle.com/forums/thread.jspa?threadID=1292323
- * </a>
- *
- * Note that only the {@link RXTXHack} works... Maybe the upgrade of rxtx.jar could
- * works (not in maven repo).
- * <p/>
- * The issue is probably from {@link org.dinopolis.gpstool.gpsinput.nmea.GPSNmeaDataProcessor}
- * that creates a daemon thread to read the serialPort InputStream. There is
- * no way to kill properly this thread before closing serialPort.
- *
- * Created: 06/08/12
- *
- * @author fdesbois <florian.desbois(a)codelutin.com>
- */
-public class SammoaGPSSerialDevice extends GPSSerialDevice {
-
- @Override
- public void close() throws GPSException {
- if (serial_port_ != null) {
-
-// serial_port_.removeEventListener();
-// try {
-// serial_port_.getOutputStream().flush();
-// serial_port_.getOutputStream().close();
-// serial_port_.getInputStream().close();
-// } catch (IOException e) {
-// throw Throwables.propagate(e);
-// }
-// serial_port_.close();
-
- RXTXHack.closeRxtxPort((RXTXPort) serial_port_);
- }
- }
-}
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -43,6 +43,7 @@
import fr.ulr.sammoa.persistence.FlightDAO;
import fr.ulr.sammoa.persistence.GeoPoint;
import fr.ulr.sammoa.persistence.GeoPointDAO;
+import fr.ulr.sammoa.persistence.GeoPoints;
import fr.ulr.sammoa.persistence.Observation;
import fr.ulr.sammoa.persistence.ObservationDAO;
import fr.ulr.sammoa.persistence.ObservationStatus;
@@ -102,7 +103,7 @@
protected Set<FlightControllerListener> listeners;
- protected GeoPoint lastLocation;
+// protected GeoPoint lastLocation;
public FlightControllerDefault(SammoaContext context,
Flight flight) {
@@ -570,8 +571,9 @@
TopiaContext transaction = persistence.beginTransaction();
try {
+ GeoPoint location = gpsHandler.getCurrentLocation();
- Date currentDate = saveGPS(transaction, gpsHandler.getCurrentLocation(), flight);
+ Date currentDate = saveGPS(transaction, location, flight);
ObserverPosition observer;
if (currentRoute == null) {
@@ -597,7 +599,7 @@
startTime = timeLog.log(startTime, "observation()", "Commited");
- fireObservationAdded(observation);
+ fireObservationAdded(observation, location);
timeLog.log(startTime, "observation()", "Fired");
@@ -807,7 +809,7 @@
} else {
- lastLocation = geoPoint;
+// lastLocation = geoPoint;
if (logger.isTraceEnabled()) {
logger.trace("Create GPS Point : {}", geoPoint);
@@ -827,9 +829,9 @@
return result;
}
- protected void fireObservationAdded(Observation observation) {
+ protected void fireObservationAdded(Observation observation, GeoPoint location) {
for (FlightControllerListener listener : listeners) {
- listener.onObservationAdded(new ObservationEvent(this, observation, lastLocation));
+ listener.onObservationAdded(new ObservationEvent(this, observation, location));
}
}
@@ -882,8 +884,8 @@
@Override
public void locationChanged(GpsLocationEvent event) {
GeoPoint newLocation = event.getNewValue();
- if (newLocation != null/* && newLocation.getTopiaId() == null*/) {
- lastLocation = newLocation;
+ if (!GeoPoints.isCoordinatesEmpty(newLocation) /* && newLocation.getTopiaId() == null*/) {
+// lastLocation = newLocation;
newLocation.setFlight(flight);
persistence.delayEntityCreation(newLocation);
}
Copied: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java (from rev 389, trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/SammoaGPSSerialDevice.java)
===================================================================
--- trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java (rev 0)
+++ trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -0,0 +1,60 @@
+package org.dinopolis.gpstool.gpsinput;
+/*
+ * #%L
+ * SAMMOA :: Application
+ * $Id:$
+ * $HeadURL:$
+ * %%
+ * Copyright (C) 2012 UMS 3462, Code Lutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+import com.google.common.base.Throwables;
+
+import java.io.IOException;
+
+/**
+ * There is an issue with closing on {@link gnu.io.SerialPort}. See
+ * <a href="https://forums.oracle.com/forums/thread.jspa?threadID=1292323">
+ * https://forums.oracle.com/forums/thread.jspa?threadID=1292323
+ * </a>
+ *
+ * Proper close. Need to use also {@link org.dinopolis.gpstool.gpsinput.nmea.SafeGPSNmeaDataProcessor}
+ * which is listener on the serial device
+ *
+ * Created: 06/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class SafeGPSSerialDevice extends GPSSerialDevice {
+
+ @Override
+ public void close() throws GPSException {
+ if (serial_port_ != null) {
+
+ serial_port_.removeEventListener();
+ try {
+ serial_port_.getOutputStream().flush();
+ serial_port_.getOutputStream().close();
+ serial_port_.getInputStream().close();
+ } catch (IOException e) {
+ throw Throwables.propagate(e);
+ }
+ serial_port_.close();
+ }
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/SafeGPSSerialDevice.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Added: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java
===================================================================
--- trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java (rev 0)
+++ trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -0,0 +1,90 @@
+package org.dinopolis.gpstool.gpsinput.nmea;
+
+import org.dinopolis.gpstool.gpsinput.GPSException;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * Created: 10/08/12
+ *
+ * @author fdesbois <florian.desbois(a)codelutin.com>
+ */
+public class SafeGPSNmeaDataProcessor extends GPSNmeaDataProcessor {
+
+ @Override
+ public void open() throws GPSException {
+
+ if (gps_device_ == null) {
+ throw new GPSException("no GPSDevice set!");
+ }
+
+ try {
+ gps_device_.open();
+ open_ = true;
+ in_stream_ = gps_device_.getInputStream();
+ // start this runnable as thread:
+ read_thread_ = new Thread(this, "GPSNmeaDataProcessor");
+
+ // >> START fix
+ // Remove daemon line from superclass implementation
+
+// read_thread_.setDaemon(true); // so thread is finished after exit of application
+ // << END fix
+
+ read_thread_.start();
+
+ OutputStream outStream = gps_device_.getOutputStream();
+ outStream.write(INIT_HOT_START.getBytes());
+ outStream.write(13);
+ outStream.write(10);
+
+ } catch (IOException e) {
+ throw new GPSException(e.getMessage());
+ }
+ }
+
+ @Override
+ public void close() throws GPSException {
+// for (Object rawDataListener : raw_data_listener_) {
+// removeGPSRawDataListener((GPSRawDataListener) rawDataListener);
+// }
+ if (read_thread_ != null) {
+ read_thread_.interrupt();
+ read_thread_ = null;
+ }
+ super.close();
+ }
+
+ @Override
+ protected void processGSA(NMEA0183Sentence sentence) {
+// if (logger_nmea_.isDebugEnabled())
+// logger_nmea_.debug("GSA detected: " + sentence);
+ List data_fields = sentence.getDataFields();
+ Integer[] satellites_ids = new Integer[12];
+ String pdop = (String) data_fields.get(14);
+ String hdop = (String) data_fields.get(15);
+ String vdop = (String) data_fields.get(16);
+// int valid_fix = Integer.parseInt((String) data_fields.get(1));
+
+ for (int i = 0; i < 12; i++) {
+ String id = (String) data_fields.get(i + 2);
+ if (id != null && id.length() > 0) {
+ satellites_ids[i] = Integer.parseInt(id);
+ }
+ }
+
+ // >> START fix
+ // Resolve NumberFormatException on new Float with empty String
+
+ changeGPSData(PDOP, pdop.isEmpty() ? 0 : new Float(pdop));
+
+ changeGPSData(HDOP, hdop.isEmpty() ? 0 : new Float(hdop));
+
+ changeGPSData(VDOP, vdop.isEmpty() ? 0 : new Float(vdop));
+ // << END fix
+
+ changeGPSData(IDS_SATELLITES, satellites_ids);
+ }
+}
Property changes on: trunk/sammoa-application/src/main/java/org/dinopolis/gpstool/gpsinput/nmea/SafeGPSNmeaDataProcessor.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:eol-style
+ native
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -24,6 +24,7 @@
*/
import com.google.common.base.Function;
+import com.google.common.base.Objects;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
@@ -38,10 +39,43 @@
*/
public final class GeoPoints {
+ public static final double EMPTY_COORDINATE = -1;
+
private GeoPoints() {
// static class do not have instanciation
}
+ public static boolean equal(GeoPoint geoPoint1, GeoPoint geoPoint2) {
+
+ boolean result = geoPoint1 == null && geoPoint2 == null;
+
+ if (geoPoint1 != null && geoPoint2 != null) {
+
+ result = Objects.equal(geoPoint1.getLatitude(), geoPoint2.getLatitude());
+ result &= Objects.equal(geoPoint1.getLongitude(), geoPoint2.getLongitude());
+ result &= Objects.equal(geoPoint1.getAltitude(), geoPoint2.getAltitude());
+ result &= Objects.equal(geoPoint1.getSpeed(), geoPoint2.getSpeed());
+ }
+ return result;
+ }
+
+ public static boolean isCoordinatesEmpty(GeoPoint geoPoint) {
+ return geoPoint.getLatitude() == GeoPoints.EMPTY_COORDINATE
+ && geoPoint.getLongitude() == GeoPoints.EMPTY_COORDINATE;
+ }
+
+ public static Function<GeoPoint, Date> toDate() {
+ return TO_DATE_FUNCTION;
+ }
+
+ /**
+ *
+ * @param geoPoints
+ * @param dates
+ * @return
+ * @deprecated useless method since GPS save same points at exact observation or route time
+ */
+ @Deprecated
public static List<GeoPoint> getClosestPoints(List<GeoPoint> geoPoints, Iterable<Date> dates) {
List<GeoPoint> result = Lists.newArrayList();
@@ -65,59 +99,6 @@
return result;
}
- public static Function<GeoPoint, Date> toDate() {
- return TO_DATE_FUNCTION;
- }
-
- protected static Function<GeoPoint, Date> TO_DATE_FUNCTION = new Function<GeoPoint, Date>() {
-
- @Override
- public Date apply(GeoPoint input) {
- return input.getRecordTime();
- }
- };
-
-// protected static Date getClosestDate(List<Date> source, Date date) {
-// int index = getClosestDateIndex(0, source, date);
-// Date result = source.get(index);
-// return result;
-// }
-//
-// protected static Date getClosestDate(List<Date> source, Date date) {
-// int size = source.size();
-// for (int index = 0; index < size; index++) {
-//
-// int nextIndex = index + 1;
-// if (nextIndex < size) {
-//
-// Date before = source.get(index);
-// Date after = source.get(nextIndex);
-//
-// // If the date is equal or before we take the current index
-// if (date.equals(before) || date.before(before)) {
-// return before;
-//
-// // If the date is before the next date, we check which one
-// // of the before and after is the nearest value and we return
-// // its index
-// } else if (date.before(after)) {
-//
-// long diffBefore = date.getTime() - before.getTime();
-// long diffAfter = after.getTime() - date.getTime();
-//
-// if (diffBefore <= diffAfter) {
-// return before;
-//
-// } else {
-// return after;
-// }
-// }
-// }
-// }
-// // We loop over the whole list, so we return the last date
-// return source.get(size - 1);
-// }
-
protected static int getClosestDateIndex(int startIndex, List<Date> source, Date date) {
int size = source.size();
for (int index = startIndex; index < size; index++) {
@@ -153,18 +134,12 @@
return size - 1;
}
-// protected static Date getNearestDate(List<Date> dates, Date currentDate) {
-// long minDiff = -1;
-// long currentTime = currentDate.getTime();
-// Date minDate = null;
-// for (Date date : dates) {
-// long diff = Math.abs(currentTime - date.getTime());
-// if ((minDiff == -1) || (diff < minDiff)) {
-// minDiff = diff;
-// minDate = date;
-// }
-// }
-// return minDate;
-// }
+ protected static Function<GeoPoint, Date> TO_DATE_FUNCTION = new Function<GeoPoint, Date>() {
+ @Override
+ public Date apply(GeoPoint input) {
+ return input.getRecordTime();
+ }
+ };
+
}
Modified: trunk/sammoa-persistence/src/main/xmi/sammoa.zargo
===================================================================
--- trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-persistence/src/main/xmi/sammoa.zargo 2012-08-10 11:56:16 UTC (rev 390)
@@ -1,159 +1,150 @@
-PK��@sammoa.argo�TM��0�ﯰr����B�K�Z��ʍ��Hv����zƱ�8�v%�RT�{��a�L�M���E=��Es�X-t��;BB���f�
+PK�X
+Asammoa.argo�TM��0�ﯰr����B�K�Z��ʍ��Hv����zƱ�8�v%�RT�{��a�L�M���E=��Es�X-t��;BB���f�
��ʌ��Q��hE>Eh��w���dEN�m
�s,�"Q]0\&V[p��&_����C�y��졤�WL<`{}�j)B-��qi���`z�G)Aiw.��#�V�8ŋ>����5�ڣ�-Jt�<����K����B��g9��=�r����#����Y�㢼hϼu`@G4�Ù�^�Kn�*p�����G;N���Ї
�7����(�Q�h�cprk(B�v���s�7M�#ݠ���̼���<���d,S=�������.�4c����p��Lk%�X���f��|Bh\�i�����v�����/��?7���
VMjK��F��\V��%iL�/Լ*,��&)ʓ2����K�me`_>7vJ��|'ҍ��'��L�U�MW��,×�҆m�n,uC뼁�cI�dN�0/�����8�_��;�v��\-�
-�:��laM���-o����,�5:-�+�=ѩ����hD���)��d��TVs�PK��,�=�PK��@sammoa_Diagrammedeclasses.pgml�]ms�8��>�B�[wU����L�e;�\�2I*�����֔,юv%ѥ���������cR�7�
-�(��Mj,���ht?��ӟ��M_��r�_�@A4�������_�o_/~��O������_?����
-w����e�"��b��`W��G��b�J�/�.���x�.J��'ç�pv�\
-W��o��b=Z���zr��/ﯧ������A��B��<'B����E��C�ë�q��x��w��3�/�ϚElX�Q��h��7욟���y{������X�)���{��r0aS��#�����L���i��q8]F?.W�"�Wߞ��L��_;?���b����݅��я��j1yX�"��l�_�#{ou��<N�S���Q<��_`�`J�?ٯټ�F�
-�o��<L��&�z��������pm�^�q��"���iĽ�������t��7��2pw?�>��������K4y��b#G����OO��~r������?V���0p$�*G�� �혍۩�`��X��c<_�b3��v�MV��d��E�lw_>�ӱ�U������������d4܈�u4g�~��7���|���O�'wn����"{�(�I�ˤk�s�H&�(J�e��߹'["�uU�1�K+yoo������V���
-_p���B�5�[��:Ea��2���k&^�^�Ϧ*��@�f�k6����J�^K%�-�?MW?&ط�շ?=���A2�OE�M����F_�bR��%����X�zZQ.$��D�\f[�u<{.V3��N�x�N�P�UC*U����b�T��e��j�c�v!��<6�Vh����*�- ��wLf�O�J��+���r����i��!�6^��B%�n�a�#^�8;
-.V�G��#��b�,��|l�7���E=ހ�W8�^��5+g+�o�o��5+�ƣ��z��c�?��4�+�*���ݳ����d-������wb}x�������|��@7_EO��𬟁���1�d�Ig}�mp���y�ճ>F����QW��^�Q#��&�N����SZ3�x�� ���8�gB�ifL(��BBL�a��.@�`�Z�؏ !!&��8p���1��[�QYDY�����$��L�s��H�q�SY�M�!%"��l���>!$D�$m�r�9V"��h�ݭ��^W5�Rd���I
-<'"��xP�yt���!%������
-��x��R������Q<֯t���;X��o���u�l�Nߺ���N���
-"���8K.F�8Xn���v �
-�
-��lj�%`��po����&v3��l����e����[��oI���CY�C8P��{..l�"�w��{�Ȼ�q�g�P�u�ּ.ɫH%4u�z��.�$��fNJۅ_��:խ�&�]��w�g:���{jy_��}�u7BJ�Fwن�u�/� �۠y+r�l�Ye�l|;��3T6�F�N-�L'�� )�Xq��1����?^�ݗz��{��#��@�@������u%�n�:�\5�����n*�&U@�r:�����x}s�A\�k�wh)�H��5������"���E,�����]Z)��q>�\{����x4I�Lv��*{�2^/F�u<����L����9��}��|t{��vs�/VA�����E��6��o>��H���Ev�O���C�Gd�h���S��ysT��%6��,�O���s?��F��(~ ��a�d#�g�9��?.�}-�,4�
-=�O��]���2J��L�
-�qC�e=]M���;Y};�ו���B07��m(�⼙�/��x%j��O��O��q��j%�z�Q`�9m(��_���#�p�K��O�;�L��a�6�S�ȶ��K�#��S<�`q�F����l����*�ث8���9;
-+l:�g7x
->�
-�B�u�k�tv�)-���44��~�f�H��cH�HH�i�Wδ4��dǗ��mit4�ܞ�Q"�хa�ʰ}y�F�Qu�g����_�ߔ�F�EFz"�i��b`��{�?ਾ������.x���澫u���
-�a�ל�iH��\�n��E'"�WԞ&_QQ��v>�L��o���o
-vT��DtA=m��F14�r� (����M�8Zt�ZEb����a={���s�ᣋ��:Nt���$�?)q!e�ia���"�T��a�a��w��"'�hkK��hsh���e���থpk+��psp�� ED)M$��-vփ�'��
-������u�z�9��/ï�x��C�B�-u�CΗ:�}2{;���a)��2g=ڼ6N��������|m��p���b`h
-x�A�����I���c��K�����Y�8��W���/=\�eB[�8�F��r�kV�u�]�����h�k�r���A���5�UϬ��,�!Ե�8Fh>n[YήC^<��r����9Η9�e!�
-1��!|*�����a��G�K�k
-������çB�u�0n��P����a�I�S��TE�>{
-�dR˹͗��.��):�6�J�[��
-��٬���hUb��'
-��=����k�B$_���<"j;�9U2���#B骖����`2�����d"�O�p~�y@�mP0b���_��|y��s�q�*|j]�j���?�����<��*a{k]�k���~��j�I9غz}=�<�W���[״j�v]�vB
-[�^9��La�{�uX_�M�;Lm�3+��A�k��m�5��B����Ζ}��jc$g����q��*/�&�'�\\7���\x���K�G��z�?�a�)�w�ݭ�@�k��Uy̜*O�ǒ ƭԛ�<�n$U}���
-><k�X�yL
-MĢ3ּ��Iշ�8c��)/O�mRB��8c�O�Ϩ�'������������mzvS�6�%�[�CK9U�^d/�"�:ʒN"q<��)^����.��!z���z<�+#���=��j��$�Q���W���dȱƟ�C^���)�Yq5X:�x)�P9-��j=�uI���U������<�㙙W��s\���ȇ�
-F>�|P
-�6f���Z/&cv$[yJ���.r�.�E�)lT~����{����`je�5)�;NY��L7OM�R�ׅ�{�������$5�A��,�
-����Gû;�C/?�j#�=�<�O��"�u>N��@-uT~
-�~��~�dѾ����hQ�y�y4��k�1W0���F�����ڔ�u��E<3Y���@W��G�G=z|���,��i��ۤ
-�t6�y4������� ʳ�Āh�l9B��&�ɔ����FI�R蜗����/:Z�����̩S�U�#T#�D��CM�8R�r��?�'���$
-��� ���]~�7�h ���vX(��\��N�f:t���L��g�<;,/%��u�aw�g�)^- �Ͼ5�N�Y� m�o�rw�w]9N��P�T�"t4g���9�;_��՟LO�ۇr��;Ic%�Y��Ǧ��v)w�B��v���q~�Ef�)�+<����cM�����ڤ�m���Y�^���-�����M^�%G�|�'kzŵߴ��ꆟӾ�A��e�����N$7���T���EvOy����A�}��7
-����"̭7
-����nt�9��m����!�{����4hzoP�1��=���w�_�^��a��6��OiW|��M]�i�-��~�oS
-�B
-��@�$�:�������Y�4���JT����nU!��&�-����|�A�F4��Sd�͛ygP�$T|���{S���)ͩA*>����k������U�FQW�i�^�Ю~�]R|�]l=?�";���v��I�)���J�{�yt����3pg�ư�P�{W ��1�!� L-*p��PI|W02�1�0��fC��G�i�[�j'��k[���u5�nRk*�j�J������F������M����������"�eE5F9O�r�*�kr<� �:l6���zrv,w�`���&E��4�ݲ��zj�5��}2��unX!\}��%\�g�x�3S��M5���0��$(��K�B8�80� �4��$.z(�ü���M?`�w�p��cȁp��g XPr�NA��$�9zN����A�Υp2��]��5?�}m̷�ֲ�r+r�7>US�Io|V("�a�[k��`�V�x�M̷ו��71Qob�o��D�61�V��_!�)���Ƅ��6&j������ј�ڵ6����#�6f����Ƽ��Ǽ��Ǽ9��Ѝ����,�bf�T�!�a�ڋyw�¼9����C�'�yS�D��E�0�
-L8��
-L�x)��*�b����)\31sM�On��|=ے2��#�P��)�Tw���ʢ����v3�{�m���(�\!S�ϗIJUV2�4M��#���dJ��#a�0p%U
-+�!��*�6�grP�-����.�^D"�t���V��-��� �!AT�E�|�vq�V��?y�T:di6}����ʚb�O���v��M���<qͼ�d��m�<s�h�h��~�g�h��)E4u�t�I���C$N��P1�yt�f����ݻ�R~}�4.E��5���~�s5�n9ʺ6:����p������߮.���t��S�
-���AZMWH�G�����V��3���Eu
-c�bش��\롓��n�=�J��V(�o��6װ��w�Q�w�rRx�MB/����K:��U����p<���mP :a�&��<8��9b��<n�(��~��<�m�H�x��h��YP�������a�;�Mu"�Ҳ�y��io3����,�B(�0�Y���e��A�9!\�ӎ��չ.�@v�ozoc�_�oB��72�s?�`�� 轕i�([���Dcd�\js��9�z�3��j�ˍ�rO�-�J�o�A�0s�&3̮�R�
-��o��9�%>!����E�Θl�H8n�a֒֘�o�l���L3��%5��{��4㥩*�Ո_ �R��s�%����c��A�fӷ�ܟi� L3Q{�D��g�i�*�wL3wV��L3Y4��0�N4�Q�D��L����ڠbf����O��~�)gAy
-�L�J��.�n��e�e
-�u叿,jR��Q�Ծ��]��� �>�" 3��Q�Uj�� C�Ծs�Gdj�"�!�a�8j_n��*�z�p�/,^�aN{^���{x�����h��8���7�w7�ʯ5�s8j���+/�E��/���aW��S��NG]�]�r��>���o���7=̊BW��Ծ��Qh7-��Z�I�`x���Z|���!�R���QB��*�j�$�W���V�T�C�߾��@����/�<TF^�sq���$Xz��xJ#���){
-�T�v{�R�P~<�� PB��
-U֨��ź�� `J�t��IkO�H���ٻ�㣲�3d����
-�j㭖 �V�X��q�ZF���b;E��G�H�O�8�t��E�b�n����)�uױ�;�u�'x�:馀��c`�h�8^k�ƣ��z�z?��4�MwQ>�'��.QhF��E��6��K��.j+�w����S��@��6.��[�'�q�W����^^��zX/{���+jXO�I�EvS��7�pX���+v�V((��Gp{���)Yo;�X,ՠ[k���L^��� �8�vd���|�/B�S�D�1y}��6l�������HhZT?"}7$� �X_�mv�Gw��>[�3����nA��A�D���?�p�D}nI
-6g�RLN���=�z��W}�e�|�#í�T_G�0wT"n���w��������+��Vv���cAn�F�[ߧ�&��E��}�M������0��6�ћ���N!�Mî���2����8�, G$��c^¢��2�N͏�I�q ��|��䔱�#a�Hy�)�
-��GT�*������T,a��:bt��Q)PE�x��H�N*K��lM�'��C*c�'��:�6�TƆl�T�U2tG*K��22�LK^K�;0�<�,�I��Ϥ����|�b���qJA��{=�����b��f�����@fYwQg�@S�I�z=�<�l��'��c�A����#��|��h6�L
-�*w���qsU�_=���Y���d�j���+�������<Y%oNG�G �p�G2WXF���éH\�U���1����h��|��6�*�{�����$��QVA1����e�FP]r���6\�{�?����U�i���u��ip��.�S����gjx�>(a05��#����)VQ;r�}*s����0GC@�i��N�i:�'
-�f�Th-���hSl��B�8��O1��l���uᬗ�d���(~�E=x@�mQ>U�}[��mQ8����
-�DzLY��ֲ4�\��vh�4Nf��55lء�Bvޞv�lu��ވ���S��H����J�
-V:��EƤ�v�e ��CIo��rISx�L:m�^��ם�A�s
-b/��D�/Q��)J�n�msh��a�+��_�-�5���+u�����k�7�3���6�+�%8{�
-�kn����˶0yM��kTH^s�<Z?�3�]�9�?�RiTU*�容&=����7%�� xSTI]s��2Z�����d�՟�I��^�i#��kTH\s��-���jޚ+����*9kMIp�e�<z�Ur�j�Èg�E {�/���4��-[A�{���)��et�0����j=N �kv`��-� ��:��sR�9��tw1N�1���:[�ݺ�U�/��h�b!��;��H�@|�j�Nj!RDAݻ�l!ʩ;� R]��Y4��B�K}7b<��{1['��r�zl�x�*X�j/����.����'� >A�&[4&I�0�d�I�����J��n�H�v/?D(b5yZL�����y-�Ouƅ���v�C� �'%���r��<4��%��r��
-/�Ǟ�t����<���?���"��*D�����$ʔiT7ɜ�SU�V���d�烈��ڟL'�o�MV�c���3�������Ǯ.��xE�DsS2���p%�F��:�l�pDi��M�,����o.׃Y��L���`�����TB�i�/\ϣA��L�~9����1^��.�9�G���r�V�ϟ����;�9��� w
-]��2�*w��cS���%�EG����"�U���%��l��_��D��m69GI@��圤�K�(G��f����~3ʷ�&֣{�#���+{�S�V�q���>9RF��z�w��h-KC�����ğ��*G[G�Σ���I~�6����|����h���=�e����M(�d���V�.�m����W�\���h�&�{̤�5�F�Z�S�o����|6��eQ�.�
-�}u�Jؓо)���Bg��n�:�@Z����ת�(%iU�~;���q8�L��v�r��v�m�J�9�\�\��f����Y6�"츠B�m>�lEH@Ql�%�!�+.�DnK�T\�?N���W\�?,�(���l�J!�,�������SvSEnnغ�u��9\�5�Hc��k.�m��`~X�#�[Xr�ΎQ����_a�.�v鯰��.M~�I��RZ���^�����P�jO~F@��K/!i���A�cgl.4�g��a����7>��q��_nNC�N�1��#�3����OI�p��܇`g�ۓ��ƍ�q�¸��y��Z�u�gBθ_�K��o�ɬ�8Q[
-�6�L|neمZ�u8�K�xn�Q�M��Sy����
-Gq�AMg�,�Ɣ�Q{6
-p?�gh�W�34D�:J�Ui��Fl���j����z��02?C�IL&)0
-svF:�r���q4�u��X���d��a={��R�%=�v�qc���e�)�n9�&��C�8�����4ZE�CvO>�'힞�#T9:l���{o�Vc{�����緗Agi���}��j��/Qy�=V�a��*Y����!%1@����<-/�`;
-�;��0`�sP���M�o�_�;�]Ժ(`���|d��0XK �@�d��<hہ@��v�"ȭG]��H�U�-�]��P`(����
-�/G�i�u�`�ν!}| �a�!p�G��C�Y
-?��?N�T�70������/Cn=�7��hw�y���|g^���yi,�ܾu��n�6���P`���:{F����ַ;� �m����Ӿ㪹�w��f��à���[�9N`h��9:}���嶺m�B?�5�na�����4G?�p��S$J��fH���-l�^c�)�Ù��l�^C�0�o���9�E���E����~Q��}õ���-�o�pm|ot}�IZdX��[�rT�s
-uՔ��aV�a+����ҖdW��._���ȡ�����
-]��q�
-/OP�%B�u�S�C��_hj
-�;^Z-��!��Bq�JFW�c^g�C���^k��E�rIA�1k��Y�hH �h[�UVi�d��A�����+�����v�����q������q��D˔7�l���0�tu�:�<e��t"�<�����L���/z�y���j�)�n�܋p���i2O��B�����
-�)�j�,��|l�8�@�V"�n�@@ML�����fb9��L��S�5C
-��j3Q�!R�2���t��zV���+�6{HY��yH�TS�-��C�G�V�#W
-��w �D�]�ں�x�զ|�m����"�_y�E(|o�5y-�[}֣䴍Q�Z�H�����ar��#��
-��>�1��
-�Ӧ��C_�fg���v���*_m[j����� jc��QR�����Mm�}�ݼ�c�r�:�u6�#�QC۞�v*��UFN�w#��9zb_��=k�m�R�L�&��l�.���%xJ`�[��խ�F�=%���t���^�mOl�*�W<��]���z,=�������N�8��jF�l�r�k\�Z�tL0�����3�l� ��)�m�P������ж����.5}�e�D���Ӫ!'���=�2��? ���=�bh{�d�̽
-�u�]�0��9�*�y�U�����QV�U��*w�pk�����Q.�Tq��Պc�x��r2Մ2x�(���W*��+<�L�5eGs��*L~�y�$�����NQ���[g�g��2��3�gv�1sc(q�o:q�cG�>��W�A�R���a���щlN�\���Ҫ�yu0�sWKlN\�]�ڜA�mN@��6g�q��t�6g�ۜ�[�9��ۜW�zƺ��6����:M�21��S�����V#5�>!;�Y��}:�� �<H�%���)���dT�w�ʨ
-�l���S�q�����*5�ߺUv�*���
-��h� �]
-��Ұ�v)էM���̂�qX�--��׃�R"d��O��g)����P���1�^�I�*4nѐznDp�����P�q~6*ɜ��ș"��3� �������P�}��95ne���Z�bcF�ҵ�<-&�D�.�ђ��T�\hELGK�؉�QT�S}+
-�Fm*n����
-��W��`�7ps�_�j�9��#������"�E+X���ͱ�J'�9\��
-���I���4�N0��t J���/vJ��
-�Ԯĝ;�N��9e�4i6�\v3ɣh�7��e��d�7��j
-�D��s�^��ƣF����~2���%Ys�吭�h0��є��G�M�����S�!�dxh[�8�9�0N��n���F8i|#T��5DZo/=̪>\+����G�(��c���M��]P�,���sBA+T��W<�+��X�"1��)��6B��̔O�} =c"���D����d��A�/��"��j�._�ή�5��"�1���`�r��M����#��%�o�J�w6��\�ә����14R
-[��n���6��o� ���06�6��ي�'�g/f�n����L�UYVnk�$8��a�(�cWr�=Ò^ay��]J`N��T�()���o�r[��m����ȑ2r��
-)�U<��:.�r[l#X=Ƌ�=����[ĵVt+y�����TUѭ:�T�w�����&�*�B�`".T�R�QsK7u+q�� [Ӂ���{:
-��/����=�
-oW(�%+oO���Q�ժ�j�?q��JL���'�ou��nu
-)
-T�Y�ȅ�T��4�et�I�p��V:�*-��^K��P;���/��ߔViI��H��B�Wii�o?�z%"
-Q�|mIq{J����jm�������.���f�-�fQd������f!����"�|�����.!9D�;d��p���n��_����)R�vX����Q)8�֣R��Q�j���XB��~�I�4=���C%���P���_�,�} x9pmmؖT t�i[R�"�l˲D�B���J��9��BS>��-[�8��4an߶l}�@��[�-[�(�ΎQ��}۲�}m�o۶l|_���#E�S��1����
-
-���Z�a�A�J-�����by}|�P�]pyx��R�yի�R�i�*�^��r�~��l5�Z����m���Zg��Zk��p��F��@�n߂��n�Z�ߺ �ф��kAn߆��n�Z�߶�5݈%���3��x�����
-/��<}���l���PKʣ~*��PK��@&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK��@sammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
+�:��laM���-o����,�5:-�+�=ѩ����hD���)��d��TVs�PK��,�=�PK�X
+Asammoa_Diagrammedeclasses.pgml�]m��6���_����Lbo�k�u���L�nkk+��8c�j�)�8��������$o$�$Q$��T,�4��ht?��ӟ�x�����$��y�ΝW�p6�Ɠ�ӛW��߾�_
+�����������_?�^��
+w����e�*���x9~ůH~���|�L�͟·�h�/��O�O����b9\NF�-���h��������������5�����y���^3'D����0xd�;D?�����?>���$���9|�j��k0��.^}��_���<Z�l.��<9��O�?%���<�
+�� �7u�����_�2YL����t��X��0Z~{ �2 �����a��.��?����a����~������A��y�L��!ҟG�4��y�g�)��I����7�����0����6�������pn������w�p�Ξ���F��w�ǛW�����������o����/K>r�NP�_���ٙ'7|���2�c)IG���6p�� y�N�q;e�����f�Dl������r8��J���ˇh:V������w�~���b9y���kq�
+g|կ|{?�����}|�JU,��G
+����ĻT�?Ǐ�B����P���]x�!�^W�3�����vs�,P�Hm�*O���w�+T[��U��Sd�iS/��a�����t����sdk6ޡf�/f ̑A���P����t�c��v����'�'��$��'���@_�
+ؠ�31���3ik ��zZS.$ç�r�H����e8_>sܶ�y[
+CqWU)U1�
+%�0����d֔�|�BJ�x"6�Vh����2�-1��w\ffO�J1�K����b����i��#~��q�q�� �/F������#N�Gj�t�p6��7-��E=ހ�W8�q��%��^o�o��%xO��pz5��8�Q4
+��R���~�,A~�p?y��lY�wP�w�;1�\�>��A���d�n6��-çp^���1Je�Ig}�]��1���g}���Y���Y�Q#��&�N���SY3�xv� ��C��� !�43&��g
+� !)&�1��w�S�y�D�
+<O8��ј�ݒ/��("��E��[HDَ &�)�p�E�����ЦG���a6}Dh���"B��F��+ٍ�5��F�P�U
+��4�� �d�����!-T>��AH��x����:�-�Ņt�i�i)A~��+�u�u���`Av,��ӳ�`9��Su��u17�����.����y����К{��������po����9&s~��{:����"�^f�-X����z����!�kz�=
+ K>r����ș:�.y\�(y]�5�K�* M��̚�E�����Xs���T[����$���.�L�w��{O-���/��FHK�0��ې���%6��hEn�
+?�l��g��{��F����i�����;"%k.�&�]���Nj��B�|/�MĹh�7��ݿ�*��-��Ę���{���M)ФhU�tw�Z�n.>�k`��-����&X#V=Z[[��6��%�� �"�K� �>P�5Χ�i�*���"M�5�Â�L��V�Qx�f�=����+qN�]�v��n�vn����#(��a�?��m}��C4�{��{~ڼ�b?"_E�|]=e�[4G�ORr`}i��ğ��?��o����L>�{���K���g���B�>��s��Qص<>.�X��+��/7�_V���o����a~U���(�*��
+�\P�7���l-e-z��u�IC�?̂�.W2.�@��
+�ӆb~�_�?r+.y�\�)~� �=,׆z
+��v~�����M����l@�� ]0���p��U��]��6������zDŽ�Pb]f��%��AhBK�?���$�_��C R'��R"�E���3-M�4���w�u[�&�ct�(tti؞6lOv�Ш>� �~|X���/E�Qb��KdR?ij��8�/�p�b�K�꙲���jGE��c����5�R5$Z{.
+p7����.*jf�W������6�l��ي aGU�ND�đ�
+∡q�}A���^o��E��U� F�m�V���N|tw�ĉ�q7����%.��?#�*]����=�"�/����\�mcɳm�q8�Hvܴncųn��0��h��T����z�Ť�U��"�=c��l�����$Z�����K������~�<_O��`P����Y���M�ӯI�'��F��7�X�\4�D���^x��g=�R�s삩�������Y����W��q�%^x��pˬLm
+��p.���Y)�Yt������Y˙�gߥ�k���Y=�YC�k�q��lܶ��]��
+#�g�7:��"ô(��&&<�O�>�V�?cU�x�YM���>�c�T���ƭu��ߜ?� ����>���!�Lj9��B����� E���T��S]��2�M�m�Z��d�A��'�qOy�T�����s�GDmg5'J�s�yD�!]�2j4_LP0��}��ί?衿
+FN���˻�/�?~.<�S-��Am*��C-B}��������g�S-l�am*��c�c�����^6)�T��[����?`�C�ٮ��N�a˚c
+���g[����ߌ�#��=����g��&��V]����#d9a���l�7�
+�1Fr���wO�"�6�4.=����A=������T]T��q`,���SA�Ь�v���_�ͬ�C�T1�K�@�Vo�'긻�T�9Z7�`֜������Egl��GU�Ls�
+�S]��ڤ�*�9c�O�Ϩ�%��I~XEOZ�L�Ӈ6�ݔ��v �F���RN����I���d�H�����2�[{ݥ^=�Op^Ӝ�*��t����W~&��b��彂��� �JymF'���j�t�B��rZ95z��h���������,�ㅛW��s\�x���
+F>��_�1f�/�\�&c~$[1-�J����s���6*>�c�=�ګ�p�2��',T`���4�M�� �~�y:IuЂ/>���=����n�O�P��O���~���t8����5PKG}��F!���Y��f��)��c^|�M��z�5��¯�n/��C�1��G]C�v=WY��R�T��G]D=||��˴,���o��d�t6�y4�V�諩 *��䀨�l9B���ɔ�����FI�R蜳�����C�N�T��i�jp�jW�H�>��F*R�2��;���˃8
+��l��F�.�̚E4�h�ID;,^2��v�pS�]x~��ɳ�$��������:갻��[/��g����,��6́�G�����'��(wX)g8���+��ʝ�Q��O����B��$ʝ������k�CS�<����v!�F����8=��2�4�44 �q�1�E�Wwvvm��zTZ�n�w~u�'#mu3�ɫ�����h�A/���6��^ވsڵ9�eV�l�#���4݉����қ�J��?�����;��з�zsP���Aa���zsP�oZ~��A�n7��-W2�:�}oP8��{��M�
+*5�Z������Π����\�]j#���vw��I�������Y�W�6��*�����N��3>�qM�ّ��UH��˭Duo|��V��i<�"|`��'mD<E�|�W��wUK�7Mnk��Ҝ��惯?���.>�@��+�Z��u���������%��'��V���S/�^�Hc��D��h���ןGg��-�q�����hy���>F=�䏉En�h����VF=����!_ޣ�4���I1�ƖF=�j]��ujMi]�@�W7����8سq�Y1ަ�&��[�����(��QΨF�&��T�^ͦ^�B�CΎ�4q5���f�]6P\�M�r��F<�ʌ+ă+��֮ă�L�l2fJ�|S
+�r:�=�*�n�R�@�)r�;�>�*���}�1��p�m�8���\i�X
+r`�ɉ��3��(9M� ��H`��S@�é�r�@p)�Ƽ��kc^_�s��Ƽ���m�@X�K��ۘ�Mf�D�ۘ�Z�>{�r�;mb^_��n��D��Y�&&궉y]Σ�\�hX�{�lۘ��6fl�Fc�k7ژ��}F*ژ��w4�Ʋ�ƪ�f~�\7f�~43��S��p�-̛r/�,L�m��NL�[��'?�`��n��7�N4�YT�����o��č70��
+q��</f������03�Ļ�F��V�R��<�c�t�!����١ZY�=�=�z�o�`��f묁�Rȕ2��l�$Te-S�Д;�:>L�8��J�R��V��RI��{.E�RL[�R�E��I7M�m�K݊���bDZ�'h�iI[���K%�A�f�'L��N��)�>Ĵ)Ek�Z���[���̛�����,�1��6��Z�z��F͜�D����$�HO�G�T2��Gwi���/>ܽ�/��'H�B���iE��������Qv�Q6��0���4��w�����vyq�U7H1�A� Y��Ш
+�j�B�=2�n�G[�Op{T�4145�5�a��
+�������d+�[�����L�ڎߥD�ߥ�I�I7I���?/�p�VcVf��E�H�#x�~)����W�������#�� �F��x��U��v�4=��<M#&GȜʆ�1�'^�Il�#Y��-�KqN;[���`fQB�� �B�]�0/�5�<� ຟv��,��p��^�{��*�x�q#�<��VW��2+�ʗ��)��1׃ڜ�4mN����}��Z���I������]?e�����K�Tm�b��Ru�o�O�0s�����I���m1�Z�3����jQ�4c֘f(���߃]��(Me�F4��U"\H���X-1���3�
+�4��=��L3&1�d�Mp�f�6�,Q4o�fQ�f�hSaN�h��_��Q�f���?�A�H̜�7W���|Ŝb�L�J��.�n��e�e
+�u叿UXԤnh���}���6��I�>�" R��Q�Uj�� �ԾS�GTj�&��a�8j_f�+�z��/,^/iN;^/��{x�����X��qvS�o��n�U\k�g�>��qWQ �@�_���î�N��:uw�<��S��>�Z��>��aV��z�ˡ��\���qS)�bǮŁG`0�m�w*ʱ��ŗn�a*���$T�K�R�K\{����m
+�0A�8���+��Xi�y��m��:��D��wɉ�0B�[���אHe`�w�(EPOw��{
+|-D*�Pm�Z�^l������Hw�N� i��4�i�1b|TU�A�Ls:�![ma��2�hK�8NQ˨�Q],`�ȣ���i��T�'��~��'[=��n�:.F�ul��n�1��N� �n ��9�r�5�O��pz5�=��hgUwQ1���.�hF��E��ֻ�K��.j+�w����ӥ�@��6.��Y�G� �W��������^V��zX/}��K+zXO�I�!����t8�'v�U?�n+�Z�!��=�vX���-�>,�Z�[k�����Z�~�$�ۑ=R �id/8�OA�5����|�a;�4>��`MB���A��˹!�U��eA!�f'}t��p���9cL�a�L����?�J���u��%)ٜYK39�{��{��n_��:�L��G�[٩��,�a�:�D��ǭ�To�����p+;���1� �N#í�So~~�"��}�M������1��6�1����}A!�͊]�Ie;g�8)��'$��cV¢��2�$N͎�I�q ��l����#i�Hy�)���GX�*������D,a��:bt��Q%PE�x��H�N*K��lM�'��B*��B$��:�6�TƇl�T�Q2tK*� ��2*�LKQ�;0���,�I��Ϥ����l����qJ@�%���TV��d�X~3����} �����C`U�I �z=�"�|��&��e�A����#��|���y8�V@�� ��[i ��z�z0=�����4Z�$�W �����y:�J^����@d�6�T��.�P6�+,h�c�6�J�6HYcj�
+���H�����n*�����6���fJYŰx3x�i~yɥ�F�p�`��6��{>~��r��L��
+D��6pOۀÏ�xu>��:P�n<S��������0^����X�S�F������Q��c�
+���;B������0��Dk��5F��b[5�8�><��ec4(�g�%���E���-��
+9�]�E�PT��mQ��E��[NP��7���1�g�F˲��%�C3�q4;4��a�����v�C/T��vh�F*ء�=%�t��-UQ�a��}x[dL:m�^��7;��vh�A.i
+/��I��Ћ���2���rn���-Q�@�?;EI�MQbl�pN���B ��0�2[�����m�H���vq�>�,{m���b^��ר���!����<:K<��m��ls����횼F��57#F��Gg��ʹk�q�H���a�)RJ��Ri-w���m�hD��� 2�M)rt��R�\����dY$���\Sgn'��j�k�gS%qm��4�����5*%�����-ڠ�˕�]f&����(�u��D�8��FM[Se��c�(�� �^�֨��V"U����\$�7_!�||?Iry��*��S-iM���4��\�n�=M��q�8Z�#C9�n1��=�r�ڲ*�sS#�s��2�sSo�s���K�+�
+���&�� S�XM�z4|�]K��t�Mo#1��l)�$���,���j�Tb�SmLrK�R'h���R��RF�bظT))����6zNV
+����s6p_1Tv,A�%u���\�2�q�2� +�勆ä����B�R@:(�bn���`ٙM[���|����/�p�_x�3A���s��Q3���j��_N���.w�k��<����c�4�O�u�����^��<�5�*Qvq�����4��ǩ�v�8]�����Wك*����k��'���[z����#���)i?�i��kJ]>\U'��T}��e���s�g�n�,������2S���j�����t8���ץ'��D�W�p%���������(���6z6��q���,|������ο�����2�yv�(���3�.6���)�Y�XL�D�:�@L�e��E��c���m����&�0�ͮ��!I�9J`���������y3ʶ�&���є$
+�h�����#��#G��;Z��%M�E!��^Wy��D���u��4���M�������՛��0����N4
+�����5S� �,7��(߅��m��Q��X�K�����U~��t�h�(C��
+�u�����??G�
+uh����}9�R�c&EU�I �}I�2ԓ]�"�uh5��^����*t�Y���@�8|�L�UX�^ �pC�n��ؕ`r.�,ʹ;�<Y%���E�qA��|,R�,�(r����8:K�C,���/�̖*(q��Xi.qX&Q��I鬵ʿi\C%I7I1����d�uE.�,4�����A�\ԑ�<����^��&���.��oa��:;F��k�m�pa~۵ւ��35"}Js���˓�}%~FF�����);�,&i��� �3�V�g��ᰌ��7>��q���_fNC�N�!��#�3�����9�=���Q�=�d>|;#�ݎ�>n$�ۓƭU����"g��>r��|8[��~;�g]������h�Kf�+pYE��$A���8�� FTq�T]����E��;FP�� K���Ш=���34�����Ѕ����#�J�H4L�x
+CYg5���Pe20e��d��0�`g$�(�-�yT�&��n���h��̞>��¹��k�Î
+n�v����c`�4A�-F�5��L�W���q8
+�a��S��)�'S�x�jG����|��-�jl�9l�z{it��X5ا����@Ě���c�@T
+T%�!�
+��*}HA����9�����`�̜dj0�9hQ@�&��b���Z��ִ����k d�������o;��oa �֮���H��� ����P���
+�}m�ߜ���@��ȩZ���[y6���:|5�N��xH�A�'X���I���&�avҴM�e �Gpy����������д����V���#�y�۷.[�^�&��A�����B�Ξ���}����m�o۸l|w��ѻn.�m7e��������<�#��+���FOC6��d�
+Q�����-�=�q�n�����}n�DA7�� `7z����k,3��?ӵ���k�b��M��w���u�h;����/��o����E�m��oFon�I�K��wk\��|�����x9�j�ػ�0��c~�
+��_$�1)>`u����p4rh�����@�ox��#��t��~�e�B�r=��PS ��9dyL�H �k]-�y5|~�0��X˽�/"�K
+��YK�N�FC�B�֨�J�^ 3��5��@�N�DJ�P����_��K��_����$`�Z��;�e�M,]S�I,Ŧ��� ZF��t���>f8.ܔ|�.>WLwK7�^?�O�Y�D�K7���`N�VKg1g�J���=`%��V �Ą��b��j&�����D�9E31��z��6�"]*�l\�@W*�g5[�"nӇe����J59�B�>D{q�j5"��{���|��H��U?����Zm�gQq�ƨx-���5c�����hy���۰%�m����E� �&�m�[�yDV@����=h6=lx�H5?��D���V�zXh�R�$���qP�����˘��жp�mbh[���f]�X����@H�����fRh���<rW9QGލ�����Y�f���5$RsM��]B'�K`Z`[X��5��F����a:}`{��6�۪��4��Ae�+l�Kf7���2�j�tVͨ�m].=���(�� �^B�Lm�0���*�����1��m���5���p���/�8�7�V��V9)��D��!W!�QrZ����C.��gOՖ9+��D�0a�e:�<g�C�r�G�X宗�He�[���r�6V�-� �*�@GSP�86�G�Y(G� PM�
+�����U����� eC�����쮒��a:Ja(��<�cT��z�@��3��3�Q����v[e��P��t����~��y��A�S���a���ёlN�\���ª�y�7��sWlN��]�ڜ~�mN@��6��q��t�6��ۜ�ns��9/���u���m�
+�ۮ��7����HO�y�f+�X����1ٱ�U���dzJa���σ�_�?m��2�x��*��ZUA��ңt`
+:n��S�[��n��J�;�F�)R��.���vi�t���ӦP��vf��8���xW��Av)����YE� ���S��c��ā$Z��hH���A��1� ��F�S2��9Sđr�bd��&�qC��m�IS����4��{�t�1�\�ZN��E,\�/�p�_z�\"f�%Y�D�h*e���֣6%7`�
+��
+����#g�o� ����Sx�xS9C����d%�7��N�(Y��pI�:*��:�����;�X!��(e_|S��*]�6�U�
+w�0d:���甚��|���s��$����@�����q�W�y8��./�j��������s��.Κ,�|ͅ���lNE�n�qT�iz�qt3~
+?D�cG2��Ɖtӭ�a��'�o�Zyw
+���+^����
+u�0�%�|L�!?����*�~�|N�i�
+~���g�<9����AzO�/���j�e�}R�K�*���ig[����|� �����/�E�m�|I;����>���V|P�;|m��r�>���_��&��7yg}���u��L�xy���FjŖ�y����y���7��l@q�����F�:[a������������$[�E��I�,&�:v�q�3,���Yۦf4ZC���r[��v,�E\���'�i#�}ސr[�o��B*��7��c4��PTt��֊n�/#Q���*+�UG���n
+�t���Q�U(L�jZ�5jn��n�"N2dk:К[;O�Y��5�ҽ�V�-�J��T�ʹZ��]������n�����b��F�0w�kHa��ͺF-��'3T�1 'q`¹��[�Dʴt"�z-m�2R퐻w�|zSX�%A� m*aB\��uH_��RF����,��fZ����jm���f�Vm�fi��VK�h2�A�`�J�������"�|������/!5D�9d��t��Mo*�_����1R�vX����Q)8�֣R��Q�r���XB��~�I�4=�b�CŹ9����� ^�,��} x9mmؖT"t�h[R�"�lˢD�\���J��9��B�>��-[�8��4�an߶l}�@��[�-[�(�Ύ���}۲�}m�o۶l|_�ے���)������
+*6*Vj!V���y(x�$����1D�q�e���J-��IT��J-�e��z�*���Ѳ5j�n2Z�%����~��ִ��X�F��@�n߂em�`��o݄em4ak�y�۷aY�mX���6bYӍX��T4n3FrLL#��崘�Ͽzz�����PK���Yh*��PK�X
+A&sammoa_Diagrammedecasdutilisation.pgmlMN=o�0��+�7�ٵAuM 0�1Q�d`���aY"qd'U~|������ݻw��Os'���m�q ���P�G��l7��eޕ���l:�\/��D`$���c�:����|�L�d�8m�n�����Xu��"����1���4TrR*�����M��9U�����o�� �n��gV��I�������л��z�Y��:��d�PKǒV9�PK�X
+Asammoa.todoeO�j�0<�_��.YnkW6�M��{��Xk#P�ERL?�5%Ѕeg��aV�/�,`�ƙ�H�3��Tz���ٝ�HɾI����Н?�ģBҞ���J�H��*%a%�u�|��
���,���\�l�v�
-l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK��@sammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
+l�:�L�A;��Nx�{�i7�����D�7��=�l5�^8�0�@h�@���h^PZ���ˢ����CYV�j*8�5���ӓ��LB�l�)�?�~�$?PKP����KPK�X
+Asammoa_profile.profile�����Q(K-*���S�UP2�3PRH�K�O��K ����Z()��qq��e��qqr�䔦g恘���>
�z& Q}�0�
-�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK��@
-sammoa.xmi�]�v�8�����陓t���!)*�I�$˙�&��v��^��HHf�"��q's���w{�٫}�͛�,@��(��?��x�L�@���
-�BՏo?������ʟ���F�]ӳlwJo�tyf�T�ݏ���^�<�������~������iÛM���f8�#7ȏ/��&�h6���#��%r�NKi�����2��+�f���������7�������!
- ����y��!i���%��(��p��1Fn�P���ۤ�������y�7�[4�lt���?���?\���D7Ϛ��VKi�_���Z��/�^S�����Q!���ܸ����;��ǯ^���̘�&��,�( �����V���Z
-���7�'=10��!y��#I�W����X���Y�|�ٙ��-]7Z�Z�&��A�WgF��|�\�]{��7J}���<�R���96�mƟB� '���[�S7>`4y���D;菃�G�Jۥ��\-G�������g�/\6z3zw���z/��U8�6��/�O�m�����B��l�0P�h���q��Ǹs������oV�Jw��GF��:(�>�Ǔm��o�<O�q.FG��a��߁���߾����SP�̼�"+NFeCﲬb^ȉ���_#{��X����9��)�Y|V�sgF�1�U�s�̀U�Q�8z�d|�:E�o��X�}E��s�d�<x~��0e�߿�G�*/����ѻ���}�+�L�HPLҀ���o�yf��Y�-��ȣ�z��������=�(�;������:s2��( ����M�AL�۷o��FG?<ӎ1r�݇�`T�a2�T\0������
-ω��&�S��Wb��1���e�?Xy&z����)Xy�Ţ���I/G�����_�yI��L�@����P@&��
-0��A��/�g�=B���軭o_�QH�Ml:62d�d�ПC/�C��o_�}u;~�����GY�SL����$�3?4Ve�?�-9�;ʼn�JrEa=�*��I��DO"����I�̙�Y�
-�R ~�k䅯o ���������|:�#9�r:r��"�J��g�:d)����!⠡�w�/Dn>z�'�k�4�L��
-פvV��=�:�)T��[��L�{s2ڭH!�n�@k��-Im�A����n�j�]��Y�]9��S�"RL��1�pxU��q!#�;Q�f^��n<�<�{�#�"$�NXh��������&���e�A,�d~����3�i&���Y��ћhL�u]� �����A�.m��R9��Y��FMz��]�.�o�Zu�p�����gG���U�\?��;"�(��r��?|v����P�r��e[~X4ܕ5�u�W�s;�o��q�r~4R�<R�F/�\"�>K;����9�0��ǚ�Z&L\p�?|;�0�y����l�8�3���~3n��B&~����ߘ`?>Α|?}���l�p�64�zm*q�i��5���$����^*�v`�m"�X�ϣ�c�<Q$��Lo?��ABD�
-�Uflң�'7��Sf��e�[�B?2 ېs�`_c9�='�dz�%ߕf��t������O?6�9��-m�+�L�L.����T�_*�|���AO$��|T�5S��� 3g�_�y��(D�����d�=�����9|^4s�?='k��M�\��FK=��Z�~A��n����n����26���˹�F�͘q �B|��u`�o����oK�����������?�.�KAk{3�������vx�R��<|U7�z`�
-l�^����*��v�k��n:
-�'�V�_r�ӆBf�ef��J�ѻR�����͛Jw�/��R��G��])fRo��yܾ�?,�܅�݇�2���=�G��pԿ���'��V�_���$_��4��+�Bí\lf����yz�Og.ve�vpo������-�?�Fn��X�Cө��ˇ���qnp]"���4�s�d�<G��T�mj-�q.K��QF s���(!��r�������/��Xߘ�$����չ��h��@�i��z2-���9m<`������Z�hcTΊ��Էɵ���
-̞Ug��Oad~Ͳ���������CWQ���&314\��Қ\��5y�A2��%1�8�Oƒ2]ʵ�$�1ɴqSmim�jiM�+g�vЫ:�>��#������n�����@H������V���ɓQ��h�b1Y���y*��*���Bq��~�u����~M)m1v �b{��.�n�1����XE�ke��F����S��;2J���L����}��^u;lt�>�D�U_��^_2�Jk����"^Oʶ|Ge���sH�����&�1�B�5w:x�LlP{<>~�o�Y��%36'�`at���;Y�W��w�\�*A�|t�)C���Td��r*fؠ��J����i�Qr�����n{�&�)�� 6:*�F�_�'��I��%٧S�&�m<Ps���^��\W����w��j�<���+��)R�����3�Xݍ�c�A��q����n�"�ſ���R��)����&O,nTp�(N2n��(�~���3s�ƨ�6��?�s�352�
-�Ix
-��d`�䉥�|r�8�6VM42w��sXU|���������N�+fM,N,��:�<XO|d@�����q3�Ug
OEg+�ѫ�:`Xj�p�e��o:x��OCQ�K�ƣ%[n�0�UI���)�I�.Z�\[�-�7���Z�Z�R�9d��^�+$3+N�X�,��ˍ��@H����p�̫��a��}/{�n�����k����&a�#ޠ���#,����
-Ë�r"�d�B2�ZҴ�ݲA��
-��)zv�״ ��n�Pm4Q��5���[>1�Bȝ���K�I7)Jߨ��c%Wy�����X�^���S�{!���V{����*���X �ׂ���L�\��(D���>A�����CfHO�l��{�ȉ'�>�9(Q?L�˞+uX�c�`!�Bh1��@�����:i�U��?��Xv0������F-'��+�
-�kH��Ur h�mST���3bk��mh:���|4XӺ=���삙&!2�Tl���K��!v���_V���\3�}����a7���ѡN��6�����h{+��#�0(�>gt�$mvPf�]H>&D�<X�d��JK.L-��L�e�'ы�s.J�Z�cȆ��*�p9[6K�>�dv.
-�w�,�HM�E�%(�G)�e����HS0�(L �� ��AE��y�iUPD
-��с�����(�k����+�V+��Q�Vkuۆ�E�N��[*�P�yu���?�-.}o�m� ),�ܲ�%�nU����M�_����$s0��Kuklu[:e�Ѷ�Iif��ʵ��B��[*��n!�Rq�r�Uz���R��|cIӻ��xL�ݞi`� �#�g��*}�X���2Mn^��I�_a��)�
+�����������b<��SR�S�R�K�����+�,EȂ9PK8��7y�PK�X
+A
+sammoa.xmi�]ݖ�8r�ߧ���cϜL�E��({�>�u���=�=���9 ���H
+z��k�.�q����IPM�(��?��xa�$�,
+_
+����~�9�#��s�?+/�Z���]ӳlwJ���~ta�T��O��^�<�k�捗�;�
+^������5o6�ц.��`�L\#?�TB�|�lNۍ|[�FSE�+������Jxw�4�j��?(
+}^�#�o�����!
+ ����y��!i���%��(��p��1Fn�P���ۤ�������e�7�Y4S�5��[?(>~�l)����D�/�ꅪ*�ƫF���)�D��+����+*��ܸ�ʟ��3��Ǐ^��x͘�&��,�( ��y��V���ߩ5���7�;=10��!���-I�W����xH��y���V�����R�-ܙ��&R_]�z�U}�2Z��'�Q��]��l桗��ͱiOl3~��9���z^���F��/��h�q��\i�%�WK)�~w�5t�l���F}oF���=�����mλ�=��H�m��:8P�˦
+�z��^����;/���_�|�r�U�k�u="
+��{n� xzAOv}Ǯ��2Eƥ�v��~w�[��~�J�xws��H�y1EV���(�0tFE��@n�}�-��h��_��2G��9�?2���̙Q���7�:�91 3`v�9�)߾Nт|���>V�o_�c��.�(�(1LY������'|�a���4|�|��'2�?(&i@T�ŷ���lr/��B��O��o�Ww���^�|���/j�#������DJ��&t�xjmS���[e/���g�1#������E�������&�����WpxIF��J`R<%�0Q�ɪXv@��ʓX���&6�BR���9�E�/�^�b;����� ���<��������L��`���'� ^���{���g[߾���v��T6"�
+�]"#��Ћ��P1�����Ww!��m�ǾO_ʊ�b:��}����ά�P[��
+A���
+A��S�(�!W�3���0 s��I�r��b%s&�W���_�y��[�2��Sy{$4���OǢx(G�/�B%��V"���M�t�R���l�����Q��q���<�\s��g�dV�&�[�rG�葻P��PI;$O!C`:��7'�nE
+YP�p�Z�h�ؒ�'M�D�Mk��F���Aϐ�n�\D�Iu�b6&�j�cD~'���ꢼ�ލg��~o�ydS����
+�r�{;^T��$�P��=��z��O�X�;i�;����v,�it&:stӺ.Y�N�Z��� ^���t��t�ɬQSR�^�rש��۶V]6�d��/��S�@w�%��vG�*
+�\���7�9�;���v�-?,�˚�:ի���7���9l�<�}�Wÿ�����_O�Ҧn`�cN(L4Zc�Ь &��������U���m�f�D�n���7O�`.?VC�دM0�g�|7}���l�p�0��ttı��;�Sg�x�7�.��>��h��&���y4vl�� �������ې5H��Za<ʌMz�|����&D�����d�[�B?2 ې3Z��6��Оr��Y���J�}Y�c��|Tͧ/�՜�ᖶߗ@&n&���NV���/�h>O�f@���2/�ٚ9���
+f��_�Y���{�Dyx���p����͜��O/�Zbb�%�%�B�.-<A�����GD�u�X[���l�e���E��\g#�v�8�M!.p|����w������nW�:�������pt_Z�i�}�Al�G,�)��Wm+�Gf�����@��ם&W!-�Q����(���Z�;�
+�ӆBf�hc��J��B�:��O��5��b_�9ΥN���ݻB̤ΐ��}��_B�˻�7E�!u;�����{%��N����}�rï���^�\|b��
-,0���-��ϛ��WZ����ŵ�"|�6��IF�;��x�6�VaG/N�����k�g�6=ߺ�g� ��A1u��c&ZH.��+��' 0cT p<wj��8 �Ӓ���f8X�N�^� 0�+�P@&8 �,K��#A�f>� ����>3g�2��(���I� P,W9����7d!�c��Z� &q�S�Ce�ాe��W9���q����ND�>�Ϡ�#"�_0��B� �|u*����M���e����hVq��X�����P��!��r7�V a���0g����i�#��;r���;���ܳ����M��Z�Q@gF;'��@��ak��M���fߝ:�R,-�Z�8}�Ǐ�Hp�H��4��R�,y��>�Mu��Q�}-
-��E�@���d����:�1�
-�/�D�j\��%/]�CDN�C�q@�:�n�ٳP@jW��Mq�`� ա�Nq��
-$0����= ND�:��]nZ���z�2�,&��8}�R<���@�[���0�wB�,y���E�a�C���s���J`�96�ԑc�Z�:�܄��:=��=p��4��6�qb�q㎥�s�r�-��N�I���(B !�0ա�XP��pFC҇���k�ʚ�`&�}.aӴ��P�bi��kH�R�\��0j���z��ѵb#�l��ٵ0{{��ٸ,jo�Ax� /�O����0}L�Ar�$p��A�,-��0}�~Luh^�Q�� ȵ��e����aA����A�i�@�x3<C� �ς�̈́�p�T�c�D�na6�3�3�1�-�>��P�-ա��KB��B���j;��g�:�Z�Sn���v<�;��g1qg��A�Y�Cea�,�a����.��[�����3�6E������#�B1����X@J^ᛢ�D9>�p�~jo�z����S�w!N 89Sj�|S|P\r�,;I�H ��b�$��T��ֻ�/��t�p�n�^�-���:=,����
-�U�i�`iQF�0�`�:T���D�5�b��:2�:��aM�t\ڸ��m1=�7���~���}y0�W���a��
-���kF��]3��_#b�����B���-wt
-�WD7G>aQ�}��I��("=W�'b�1!��a�'۵VZr�jI7g-��Tw��d���s.J�Z�c�&7��s��d�l���OɌ�h�ƈ��g�B"�E� ���C&�̭`n'�ܔ��ܖǐM��:]!�Ζ#&W22�+��{���fs��-�-&�����-ա��=�������ş�d�ukO��FRU A��������9ա��g�1˴γh�O�;,7��G����N` \,�[�P9�-�tX'�p��AE�T����x�o�R�,��8}p/�` �YD�_p|�a�V��"�ů��a��1.�TX$�1�t+/!�ӗw�
-��r,�4f¶�:=�`a3rKB݅h�C�'�j1E!�郚��F����fS�ĩ�����0��H�FL��\k���� �b N ��:�<�@�^������jGJq�����q��uz@�G�V=���(p��;��|-(�@�>�,Hu��A|X0��)8���@�O��C3�cr���,�����'�����rl-���0}��3ա�P �Mf?[��q��z[Ղ�!3���6��)I����.J��w��$�H����d˟NU�4S���'��I�mE�k����x�gk1�����q���b�����GH���*���,Ɵ$A 8�Rj�*��]Q
-G��bX�RR�@XK�:T6��kɎf`�gN�xj�c�P� ;eJ&�u������O��Z��kIqas7"LB9hv�!Nl@�:��t���4 ��^�*R�����j�:��w��s��݀�<-y:�!nNu c�[�c�{�p@���T���q�:�$��r�6�Oy{�s�Y�@8��PY��"�m�ՑA���T���'�a�����l�1I1�7�8}�&Hu��Y >&�Gۖ R �2����ؒ �P�8eC�dEXn.��V��
-�[~*O���ů;�UtFB��9����|!+�k�B@�4?�1r%+7ա�*n���:��ڞ��� ��:���%~��*'��b`@�>@�T�j�Y�f�%�qO�=�y*+���V�q^M�Ա�BL�S{�},|����I�a�+�Β'��AB�T�j*8�U��2�VǢ��cj��w���{���4|��h1GB$�3!�����8���%���8 ��b�y%���T���ִ��( �ς�Y��,R�������Hq��pa!<�p 7݊5( ��b
-bK�Sj���\�Ș�[p��P���Z;��g�d
-��s��Mq�`� ա�[*���g�̎�U
-��Uh�.u��9�l�k�π2l-
-��4Hu�fY��ʉ�Ȍ��P�KǞ>�̭=u=|Ґ��Q$������Bo��z=jPt��u{8G���c������6}��K�]��r�y�_#�Y��f���5��5"����1s1��X.
-�z����>G>a�%�n�6��(w8�� Q.O��]k�%W�-������*�lز?ȱ�����R����aoӮ�f��-��c�S2#7��1b���v�,�HM�E�% v���'m�=��t�*@Y[[���V�Ϊ�:�|�-:,Tn��G��,�e�YL}yq���|�x��a�qS���1]�8ZL�Vq� qk�CՁ`�C��Q����B5tS7�[Ap*��C){r����̎���ӌ��˗߫",(
-�*���Y���rG��)|D�P���ڗ:Ӹgә��KكZ;�l̵DK���? .�ܳ���r��?R�c߽�is�V|�=�_NF�L*��l�SL]l�vS������ә>5��<WdhL��cՃ�[ط�)���_�b�M�>�.�z.�q�u�䪉4ӊ�s.Ƨ"A`�aI��S���T9+ī")J�� p����:-;���LlǓ"C��Q@��W�$B?�X��͒cĠ"�J2���6�6G��f����X�h96�ٛt:m�2��j�5�+j��9s�F� �vU�4'���ǽ��`lj��F�>�
-n0�d]C�fVq&�8B03��o�(&?�8}b�N ��I����i���N<�P��56.3�*n�9�7�_��*��b��'g�*k�.�i���⭻�Uc��:��3F������N�Z��h�f��Vq%,��-f�haQ7�0�ՂR��L��\�����YR=,�]JPě��
-b_=� )�"n�fd��"f��E�E|YvE���O.P�k��l�� �7���f�3y�Š���<{zx�z��=L�P��L�O���#��^���XZ�å��;F@h���:�1��M՜�4���֊)a#N_�MzA`�)�B8y)el���O�mr�V����(7�8�2��LB:dQ��gA��� �zG�u��,��3P}[~�:�#N���?@�SB�67���6:��h��8��/�^���
+�r���ά��[�;�:s�+�ϰ��x�w��U/�oa�)&0r�O�b=M�>�.o�z.ǹ�u�d�z�L�͑�e��{�S�����|ƥ,e�'��
+uO)!��b��|c�{ǃ||c���7&9��CĦչ��h��@��&S�l�<�6�m���h��|��6>�
+Gs�\pV�>��M�%��W`��48�x
+c �k�ΐj���]]��R��5�C��BZ���9Z�'�w�\,����l,�>ӥ\yK��L�5Uo�TK[hҘX���Nّ����W�O�����^�wLAH������Vě��g����d�*b�����h�UrN���2�����G:n�}�B�b�(@��n���n�1����XI�kE�ņ����S��;4
+��Í��0v�X�V����Y��*UTE<�3��"1�J+��O�"^Oʶ|Fi�xČ9$>x�٨xL���;<f&6�<�>��^/��hČ�I.X��:>�NV����'�|�S%��N=g������֫3���7� |ZNJ��<9=�n�ф�1�c�5�FSc��v����2�#�u��$�t��$���{ZfZ��kc�������NM+����1�s%8EJ�x�`f��1vJ!�5Oj��V�nW-�^��@_"5,�?��ya����A���1��,��s��V8J@<3Gfi���a���S>>S#3����砑�I&L�X*0��g���clcUD#seD����Av�檫bvV^X:M\'�5�8}�(^�T�`=qɀ��c��i3Uo���ެ�G���`�a)!��2m�tp���(��.)=�[K ���0�UJ���,�I�.Z�\[�+��6���Z�Z�R��9d��^�+$�3+N�X�,������@H�����s���U��0�о#Ǟ>��l��5����4��0�oQ�b��:Tņ� ���5�d!�y^F-i��n� �x��QVJ��=�����u}�[f�I�6�H��
+���q�'_���Ի�ai>�&E�֙~��*�!�SU�_ �K���S�*u/!��j��X]]E�1����ӑBq��`����`�BD�=Z���BB���I���y�9�d?�#;%�� �~�s��Kr�,�Z*3�>�1��.�N�=��6Ԃg��b��
+v����P�`� (��@ �R��@�ۦ (\��g�ք�a�-����h���;8#ـ�&!2�ɨ���ޗ��1v�s��/+�bz��>v����a7���աN��6������h{+7G>aP�}�t�$m������A�1!����'۵VZrajI7g�,9�^��KQ��Z�bl�
+�c.g��ѱO72{��8��,�HM�E�%(�G)�e����DS0�(L��(��^I��y�iu��(��'�Sz�?F�^�u}��\��Z��ܴ��nV�;�V5l����|��
+^[�|o�m� )<<�e%���6=6�~Ղ�����$�]ڲ�V[mQF
+K�ԑ�d��h\��)�
+��2m��,�/�Z��JK��7��V[� ˄��֘�?Ԙq6������J�+c���kT;��+L�qʬB̝������mA�+��~X�⚤���X�$�{7������ы�=� <�̵�3v��o��3�H�aj/�����1-$�إ�G8��1* 8�;�����i��glf8X����^(!0�+�P@&8 �,K[G���|zT ė�]f��e�P�O�ɓ*A�X�r�sn�B0���14�L�� �T�j#��vG��b�>��Ԙ{ :�(0ќ�9��p ��|�a��(Hu(m���n3I����g���-9B�|��,y��3��H����S�\\��{�;fbܼ�C�y���-N�ة�ի���k�}�H�is��� �Y����:lΧ:��|}�bn�&h0��;�����^lh1>$���@��ak��5���ͮ;u �X�O�`q�2O"���\���tM��Y�J,]�4��P�Sq�Zp�� �7�I,,N�Nu 2�݈/ΦEPu@���bނ}�T�
+〸u��,~�gP@jW.�Mq�`� ա�Nq��
+$0�����= ND�:T���6�����=�~�S^@�>�.��p[�ͭ�[L�!u�<G�"l��0ա�ƀ���:��J`�96ړc�V�C{����:?��=p�R�V�a�����M�y�k0�Z��!��di>Q�Ba�Ci�� �!�
+I�ۥ�9$�,jrH�����j�M3�CY���b�!
+fHAr��¨�R��m�F��6�ٶ0{{��٘������
+A�X9�6��a��n��8K�. ��Y��14a�`���0P��Q�� ȵ��c��3��~N����A�i�@� n��!���gN�f��A�Y�C�1@���F�����y��S�Q�@��P��%!DP��jb���4��Tv��&7�ln;ĝI�3��3q� �,ա�0P������.��;���g�m>�w7�d�o="�%�!8U�_ƺR��-'��ᖳ�S{�ԛ4d$��S�q�ə�P���B1��?Xv�*�@����?H��.}#,�:3#�ۇ��bcAOe��N��Â*o{���[p�f��eFA�Ci=�O�_�AZL�u���q�l6
+kҦra��62���.��M�E&�߲��PLze��#�YA�s����k������+6r����%�F˔��"���͑OXb�#b7I�=����Óa�1!��a�'۵VZr�jI7g-��T��fd���s)J�Z�S�Mf6���l�>:�!Gf�F�4F�1>]�+�(�h"5�]��xl��zW����C�݆(3�8&��)�&�M��Fgˉ�;22�K�����fs��-��'�����-ա����w����ş�d�ukO��FRY A��������9ա��gq�eZ�h�O��/6t�G����J` \,�[�P9�-�tX'��4��p��AE�T���a��w���\)~�sO�>8���0���u���8>���\+�_���W�E�0{s����A�,��2��KH���cC�K�ņ���-���8X،ܒFw!���#��OQq��&D�C���9F�Yכq��d�w�L���肩�|��k�սz` �՜B� ��T���ۋ�|�1�C�H)�<�?;7���(�ˇ�Ђ��#�aGQ��9E����^#��s阂����
+dx�*8038&��AA�����ܬ�x2���*���Y �֜�J��=S���d��eNj���S-�
+�0SŶ 4fHIr��vyP�,���FҌA�zPI���T5K7uJ)�z2AX�4�V��x�7��lͧ|�8}P>.ա�:Cl�Y��� �PER�����$�R�C�R��+
+BᨽS\��YJJk�T��Ɵw-��
+lt� ��Fk��5a�Lوh].%)<`��-��<�ZR|��&���;�ـ�6 R*l:��7}$M��W���dj>�y���<�������Cf7��4O����S�Lp�qL}/���4�j��A1�T�
+�D�\��f�)���|N8KG�SJ�SB�VS�[ȠG];����Xl�41A3ہcLR��M N� R*l���h�2A*! @��ÂC�[r�
+�l�6�",7�C�DI��-?�'�����*��C�}�j`K\�����r!�R��������PNw�Jnp~���|�H�R���?���eg>0 N�@�C9��¬{7�%�qO䀞�<�����Vk�8��a���"��у��!��I :ܤ���eg��w �}�C9���R͖ڴ�P4M]��q�)�y���P@��� � ΄�:��w���;?���G��� 6zS��[����?s�f!N T�Hu�B�/rE����h^��Bx��@f
+�kP@���Ė *b�:T��#�(�1�36/8&� աڑ1�;��Mw|o�v�V=(�h>�����A�C�s�n!ԉ�
+�M��-fV�!���s�4�����?Ȱ5'4�� ա�em�*'�{`C��C�F�=}��[��z��!]G�гk2�lfz��[�ӡE�z��3}��=F�z`��7^`����$�+��P.�?G���2��皑�c�
+�o�����L ���h{+}�|�"2�4�I��;D����0�����'۵VZr�ڒn�.���-���+~Υ(Uk-O06�m�ձ�/g��ѱ92C7��1b���2��(�h"5�]��x�%w�����|���Idilma��sXU�>8���PXh�:�ȱ-Xr��3�����A}�T���b�sS���1]�8�O�Vq� qk�Cف`�C���,u�c�Ќ��2[Ap*��C)r��M�)G��'y�=�WEx�t�{|�����xO w����#���Z��]�Rg:�l:s�z9���N23-���j���M�Y@J��9<Rb߽�is�V|�}ÿ�H�L*�݀l�UjL]l�vS��l���L��|V�+"S��X����mwJ�����X�Cө��˛���q�p�-�j"ʹ<���H�iX�k�T��8U.r�H%k� p����:-;���LlǓ"C��I@��W�$B?�X����cD�$�
+2��Nm2m���;�a-�OƚN˱�Τ�l ��Ume�`/�&��̕
+a���Z�9i4��<�';N4�t4��mp� &���s7��3�����,�CD>����;tq OZ�/]����n�
�N�0�Lmd+��%���#�` «8��d�O,��U��ꌊi�KS�V�����~Z|�#Ӭ뱠5ړ��i2mX��\ ���ʌ<-,�ff��S�q�ɖ����u5��%@��K �x���� F��� IQ��������y����芘��\���0�����ol�ƺ�Y��A�^A�#$0�y������=L�P��L�W�����N���XZ�Å��;
+F@h��2tm�1b6��9��,lj���)a#N_�MzA`�9�B8y)el���O�]r��V����(��8�2��LB:dQ��gN��� �zG�U��,��3P}W~6r:�#N���?@�sB�7���6:��h��8��/�^�G�
�
-�()0��U(@P�D��z١�Y�&�
-N
-���U�)��,-��S�
-�\�'����1�] ��b�K�S*��ȿ����ff�:�!�͑=��Z�01��a�ik~� A Ӎ�\��0��L�9qJ��$�ϲ��:�NJu�X�o���K�k�9�S�O�@(��(��+��t+$P�]�@��Ť:� �"�dv�ݶ��I<&�v�i�m�Wc��w�=9C���@���,���A�Ce��֭,\���Di�x��x��_�1��5��-y`��&"�VL�V�ܬ𗳝�plV�L�(��b���AE,̒����h��Ь��8�RG�U+9>��;á�}�¡ٽ�_j���i�-�q��C���[!6F�\���������Y>lτ,�qP8�������� J�|c�,�O'g�����h�#S���w�?�|qX�U�!�f|q��@�������L�-l�3�u+}&��P��H���ߐ �o�u�d����I�?�l����\�k�`�����3�A
-�}Ӥ�NQ
-��k��c�42���@W�P;r��n��#=���
-m2���zn�Ɋ*a�O?�;-,�肎̈(����d��~Y���#�����%�����?^Ȗ�4��z:��n�������gOO�O�l�
-Yϧ8B"�}��l��k���/NW\�I�+��УV���y�Yo�&�{4��۵��3���9�l���#����⨉���F)
-k���Pa�%25z~��
-����W�0Z����7��c�v?=��b�Y����fc+V�d^ SD�Vfȍ�����o5_���{�k�y���B�")D��1#G��2w��>��a��G���_��?t ��(
-�wz�_p�̽�W��3?����m��7�������O�7��z!
-���^��Al����LG�]r{�v[I�t�i�N��7�D;X[��7����
-Q��7��Z�*��yO�����8K���3���m����n��*p;��?����{�
-cd��|��PK��� ��PK��@��,�=�sammoa.argoPK��@ʣ~*��vsammoa_Diagrammedeclasses.pgmlPK��@ǒV9�&�,sammoa_Diagrammedecasdutilisation.pgmlPK��@P����K�-sammoa.todoPK��@8��7y�/sammoa_profile.profilePK��@��� ��
-�/sammoa.xmiPK�P
\ No newline at end of file
+�((0��U(@P�D����C��Mr�-0�!�� �S0dYZ���3(�����c,�@���$`� 2��:����K����@�h6G�v�*���ܦ�����OX��L7br����2-��u(��4?��Nj�;)�P`k5�1��.1�
+䘚O%? ��_��ᡠ���&ӭ�@v-i���P����� ��Fê7&�L�f�l5�^����i�L��}Os@��@������w\��p}�Ff����Q�d���l���j�-3恥M��Z1�Z�s��o�v2ñY�3q�|�� l���X�9'^9�(�Yq�8�R'�M/8>��;á�C,áك�_Z��y�-�p��c�Y���:��|>i��b�&vgB�8(�x��z[���
+�� J��c���ɘ}+-?,��������7��0��8drÌ���\�V�o4��V�8s]��g���N+�O�
+ ���Z�R&1:
+H�e�3�6�jy�E���,�sf�6��o��)��St�xl�$��tpi
+�g�n�����荖�O&X�0����9YR%,��ǘc磅%�ӑq�R3�����-�ZX\2��0;=\P[�@zx��Q����F㝭������n�� ��~���4�$Φ���|�#$��=�m�|�}jc�E��K? }e��U��7YM����Y�{4����ؙhY�9�l�<�3�/�"��&~f3JQX�'�
+3,��ѳ�<l!������嚬���=㵻鹝�cϊ�Ǖ7�X��2'�� ���2Cn�����Z�U�h�����
+��|��g"nj��܉z3�!V��#��|ў܋�($����Ce�E������;�� ����b�^g���{���\�Q�P
+�M�E
+bc_n��v:R풯�k���'O_<��[AN�����ox+�?�f������rV1~Ϻ� ���|h�Xƛ>?��p��>!����r[ngr��˿}|OW@a����7�PKn�V�/ �PK�X
+A��,�=�sammoa.argoPK�X
+A���Yh*��vsammoa_Diagrammedeclasses.pgmlPK�X
+AǒV9�&*-sammoa_Diagrammedecasdutilisation.pgmlPK�X
+AP����KL.sammoa.todoPK�X
+A8��7y�i/sammoa_profile.profilePK�X
+An�V�/ �
+&0sammoa.xmiPK��P
\ No newline at end of file
Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java
===================================================================
--- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-10 11:53:45 UTC (rev 389)
+++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-10 11:56:16 UTC (rev 390)
@@ -898,15 +898,16 @@
public void locationChanged(GpsLocationEvent event) {
GeoPoint location = event.getNewValue();
- if (location != null) {
+ if (!GeoPoints.isCoordinatesEmpty(location)) {
+
// Add the GeoPoint to the layer
if (flightLayer != null) {
flightLayer.addGeoPoint(location);
}
// Center the map on the location if mapFollow is activated
- if (getModel().isMapFollow()) {
+ if (getModel() != null && getModel().isMapFollow()) {
MapBean mapBean = getOverlayMapPanel().getMapBean();
LatLonPoint center = new LatLonPoint.Double(
location.getLatitude(), location.getLongitude());
1
0
Author: fdesbois
Date: 2012-08-10 13:53:45 +0200 (Fri, 10 Aug 2012)
New Revision: 389
Url: http://forge.codelutin.com/repositories/revision/sammoa/389
Log:
Add more doc
Modified:
trunk/src/site/resources/ulr-sammoa-echange-data.svg
trunk/src/site/rst/gps.rst
trunk/src/site/rst/import-export.rst
trunk/src/site/rst/index.rst
Modified: trunk/src/site/resources/ulr-sammoa-echange-data.svg
===================================================================
(Binary files differ)
Modified: trunk/src/site/rst/gps.rst
===================================================================
--- trunk/src/site/rst/gps.rst 2012-08-10 11:45:40 UTC (rev 388)
+++ trunk/src/site/rst/gps.rst 2012-08-10 11:53:45 UTC (rev 389)
@@ -139,3 +139,26 @@
Sous linux, ajouter un user au groupe "uucp":
usermod -aG uucp myuser
+
+
+Comment gérer les connexions/déconnexions et les erreurs GPS
+--------------------------------------------------------------
+
+TODO non implémenté
+
+- si aucun satellite > erreur à remonter (LED rouge) : "Pas de satellite"
+
+- si je continue à recevoir toujours la même donnée > vérifier si le port est accessible ::
+
+ Enumeration portList = CommPortIdentifier.getPortIdentifiers();
+
+ while (portList.hasMoreElements()) {
+ CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
+ if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
+ logger.trace("Accessible SERIAL port with device : " + portId.getName());
+ }
+ }
+
+- si le port n'est plus accessible > erreur à remonter (LED rouge) : "pas de GPS"
+
+- si un autre ou plusieurs port potentiels sont disponibles > popup avec le choix du port
Modified: trunk/src/site/rst/import-export.rst
===================================================================
--- trunk/src/site/rst/import-export.rst 2012-08-10 11:45:40 UTC (rev 388)
+++ trunk/src/site/rst/import-export.rst 2012-08-10 11:53:45 UTC (rev 389)
@@ -29,6 +29,23 @@
:Author: fdesbois <florian.desbois(a)codelutin.com>
:Date: $Date$
+Echange de données
+------------------
+
+Le schéma ci-dessous reprend les principaux échanges de données possibles entre les différentes stations de travail.
+Chaque bloc bleue représente un type de station :
+
+- Central : Ordinateur avec la base de données centrale contenant toutes les données
+- Saisie : Ordinateur pour la saisie en vol
+- Validation: Ordinateur pour la validation des données
+- Suivi : Ordinateur pour le suivi et la préparation des vols
+
+A noter que ce sont des rôles de station de travail, une seule même machine physique peut avoir tous ces différents rôles.
+
+.. image:: ulr-sammoa-echange-data.png
+
+TODO explications supplémentaires sur les étapes
+
Import référentiels
-------------------
@@ -123,7 +140,7 @@
Espèces (CSV)
~~~~~~~~~~~~~
-L'import des observateurs est possible depuis l'interface d'édition d'une
+L'import des espèces est possible depuis l'interface d'édition d'une
région.
Le fichier doit être encodé en UTF-8. Le caractère de séparation est
@@ -147,8 +164,7 @@
Trois types de SHP peuvent être exportés :
- Points GPS : ensemble des points GPS capturés associés au vol
-- Effort : conditions d'observations, détails des routes et coordonnées GPS du
- tracée de l'avion.
+- Effort : conditions d'observations, détails des routes et coordonnées GPS.
- Observation : observations et coordonnées GPS des points sur lesquels ont
été effectuées ces observations.
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-08-10 11:45:40 UTC (rev 388)
+++ trunk/src/site/rst/index.rst 2012-08-10 11:53:45 UTC (rev 389)
@@ -67,14 +67,44 @@
Premiers pas
------------
+Version 0.5
+~~~~~~~~~~~
+
+1. Une fois l'application démarré, il faut créer une nouvelle campagne via le bouton "New" à côté de la
+ liste déroulante des campagnes sur la page d'accueil.
+
+2. La région "FR-METRO" pour "France Métropolitaine" existe par défaut. Vous pouvez l'éditer via le bouton "Edit"
+ ou en créer une nouvelle avec le bouton "New".
+
+3. C'est lors de l'édition d'une région que l'on peut `importer les espèces
+ <import-export.html#especes-csv>`_ .
+
+4. De retour sur l'édition d'une campagne on peut choisir les fichiers pour :
+
+ - `Importer les strates
+ <import-export.html##fichier-de-strate-dbf>`_
+
+ - `Importer les transects
+ <import-export.html##fichier-de-transect-dbf>`_
+
+ - `Importer les observateurs
+ <import-export.html#observateurs-csv>`_
+
+5. Une fois la campagne prête, vous pouvez créer un nouveau vol depuis la page d'accueil avec le bouton "On Board".
+ L'écran principal s'affiche, vous pouvez désormais préparer le plan de vol avec les transects et les observateurs.
+
+6. Une fois le plan de vol préparé, vous pouvez lancer le vol via le bouton START
+ et commencer ainsi la saisie de l'effort et des observations.
+
Version 0.3
+~~~~~~~~~~~
1. Une fois l'application démarré, elle vous demande de créer une campagne.
2. Une fois la campagne créée, il faut configurer les fichiers de référentiels strates et
transects depuis le menu "File > Configuration". Attention ces fichiers doivent respecter un
certain formalisme défini dans la rubrique `Import
- <import-export.html#Fichiers_SHP_transectsstrates>`_ . Une fois les fichiers modifiés,
+ <import-export.html#fichier-de-transect-dbf>`_ . Une fois les fichiers modifiés,
l'application est redémarrée.
3. SAMMOA nécessite un import des observateurs depuis le menu "Data > Import observers (csv)".
1
0
r388 - trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 13:45:40 +0200 (Fri, 10 Aug 2012)
New Revision: 388
Url: http://forge.codelutin.com/repositories/revision/sammoa/388
Log:
remove milli-secondes on geoPoins date
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-10 11:15:27 UTC (rev 387)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/flightController/FlightControllerDefault.java 2012-08-10 11:45:40 UTC (rev 388)
@@ -800,7 +800,7 @@
result = new Date();
// always remove milli-seconds
- DateUtils.setMilliseconds(result, 0);
+ result = DateUtils.setMilliseconds(result, 0);
if (logger.isWarnEnabled()) {
logger.warn("No GPS point at {}", result);
}
@@ -816,7 +816,7 @@
result = geoPoint.getRecordTime();
// always remove milli-seconds
- DateUtils.setMilliseconds(result, 0);
+ geoPoint.setRecordTime(result = DateUtils.setMilliseconds(result, 0));
GeoPointDAO dao = SammoaDAOHelper.getGeoPointDAO(transaction);
1
0
r387 - trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 13:15:27 +0200 (Fri, 10 Aug 2012)
New Revision: 387
Url: http://forge.codelutin.com/repositories/revision/sammoa/387
Log:
fix validation message
Modified:
trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Route-error-validation.xml
Modified: trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Route-error-validation.xml
===================================================================
--- trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Route-error-validation.xml 2012-08-10 10:07:50 UTC (rev 386)
+++ trunk/sammoa-ui-swing/src/main/resources/fr/ulr/sammoa/persistence/Route-error-validation.xml 2012-08-10 11:15:27 UTC (rev 387)
@@ -118,7 +118,7 @@
<field-validator type="stringlength" short-circuit="true">
<param name="minLength">2</param>
<param name="maxLength">2</param>
- <message>sammoa.validator.route.subjectiveConditions.badLength##minLength</message>
+ <message>sammoa.validator.route.subjectiveConditions.badLength##${minLength}</message>
</field-validator>
<field-validator type="regex" short-circuit="true">
1
0
r386 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application/map sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence
by tchemit@users.forge.codelutin.com 10 Aug '12
by tchemit@users.forge.codelutin.com 10 Aug '12
10 Aug '12
Author: tchemit
Date: 2012-08-10 12:07:50 +0200 (Fri, 10 Aug 2012)
New Revision: 386
Url: http://forge.codelutin.com/repositories/revision/sammoa/386
Log:
refs #1203: Export SHP (retains observations and add more logs)
Modified:
trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java
===================================================================
--- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-10 10:07:01 UTC (rev 385)
+++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-10 10:07:50 UTC (rev 386)
@@ -52,6 +52,7 @@
import fr.ulr.sammoa.persistence.Transect;
import fr.ulr.sammoa.persistence.TransectFlight;
import org.nuiton.topia.TopiaContext;
+import org.nuiton.util.PeriodDates;
import org.nuiton.util.TimeLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -413,6 +414,13 @@
for (Route route : routes) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Export Observations from route {} - {} (flight end time {})",
+ new Object[]{route.getBeginTime(),
+ route.getRouteType(),
+ flight.getEndDate()}
+ );
+ }
nextRouteIndex++;
boolean routeIsLeg = Routes.isRouteLeg(route);
@@ -423,6 +431,38 @@
effortGroup = null;
}
+ // compute route period
+ Date beginTime = route.getBeginTime();
+ Date routeEndTime;
+
+ if (nextRouteIndex < nbRoutes) {
+
+ // use next route begin time
+ Route nextRoute = routes.get(nextRouteIndex);
+ routeEndTime = nextRoute.getBeginTime();
+ } else {
+
+ // use flight end date
+ routeEndTime = flight.getEndDate();
+ }
+ Preconditions.checkState(routeEndTime.after(beginTime),
+ String.format("Route debut de route %s - fin de route %s", beginTime, routeEndTime));
+
+ PeriodDates routePeriod =
+ new PeriodDates(beginTime, routeEndTime);
+
+ // Get observations for this route
+ List<Observation> routeObservations =
+ Observations.retainsObservations(observations,
+ routePeriod);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Export Observations from route {} [{}-{}] nb observations {}",
+ new Object[]{beginTime,
+ routeEndTime,
+ routeObservations.size()}
+ );
+ }
if (!Routes.isRouteAccepted(route, routeTypes, strates)) {
// not selected route
@@ -440,26 +480,6 @@
fillRouteTypeRecord(flight, route, effortGroup, routeRecord);
- // get routeEndTime
- Date routeEndTime;
-
- if (nextRouteIndex < nbRoutes) {
-
- // use next route begin time
- Route nextRoute = routes.get(nextRouteIndex);
- routeEndTime = nextRoute.getBeginTime();
- } else {
-
- // use flight end date
- routeEndTime = flight.getEndDate();
- }
-
- // Get observations for this route
- List<Observation> routeObservations =
- Observations.getObservations(observations,
- route.getBeginTime(),
- routeEndTime);
-
// get best geo points for each observation
Iterable<GeoPoint> observationGeoPoints =
GeoPoints.getClosestPoints(
Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java
===================================================================
--- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-10 10:07:01 UTC (rev 385)
+++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/Observations.java 2012-08-10 10:07:50 UTC (rev 386)
@@ -92,16 +92,16 @@
}
};
- public static List<Observation> getObservations(List<Observation> observations,
- Date beginTime,
- Date endTime) {
+ public static List<Observation> retainsObservations(List<Observation> observations,
+ PeriodDates periodDate) {
- PeriodDates periodDate = new PeriodDates(beginTime, endTime);
-
List<Observation> result = Lists.newArrayList();
- for (Observation observation : observations) {
+ Iterator<Observation> itr = observations.iterator();
+ while (itr.hasNext()) {
+ Observation observation = itr.next();
Date observationTime = observation.getObservationTime();
if (periodDate.between(observationTime)) {
+ itr.remove();
result.add(observation);
}
}
1
0