]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/data/Speed.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / data / Speed.java
diff --git a/src/tim/prune/data/Speed.java b/src/tim/prune/data/Speed.java
new file mode 100644 (file)
index 0000000..80cb7df
--- /dev/null
@@ -0,0 +1,102 @@
+package tim.prune.data;
+
+/**
+ * Class to hold either a horizontal speed or a vertical speed
+ * including the units
+ */
+public class Speed
+{
+       private double _value = 0.0;
+       private Unit   _unit  = null;
+       private boolean _valid = false;
+
+       /**
+        * Constructor
+        * @param inValue value
+        * @param inUnit unit, such as m/s or km/h
+        */
+       public Speed(double inValue, Unit inUnit)
+       {
+               _value = inValue;
+               _unit  = inUnit;
+               _valid = isValidUnit(inUnit);
+       }
+
+       /**
+        * Constructor
+        * @param inValue value as string
+        * @param inUnit unit, such as m/s or km/h
+        */
+       public Speed(String inValue, Unit inUnit)
+       {
+               try {
+                       _value = Double.parseDouble(inValue);
+                       _unit  = inUnit;
+                       _valid = isValidUnit(inUnit);
+               }
+               catch (Exception e)
+               {
+                       _valid = false;
+               }
+       }
+
+       /**
+        * Check if the given unit is valid for a speed
+        * @param inUnit unit
+        * @return true if it's valid
+        */
+       private static boolean isValidUnit(Unit inUnit)
+       {
+               return inUnit != null && (inUnit == UnitSetLibrary.SPEED_UNITS_METRESPERSEC
+                               || inUnit == UnitSetLibrary.SPEED_UNITS_KMPERHOUR
+                               || inUnit == UnitSetLibrary.SPEED_UNITS_FEETPERSEC
+                               || inUnit == UnitSetLibrary.SPEED_UNITS_MILESPERHOUR
+                               || inUnit == UnitSetLibrary.SPEED_UNITS_KNOTS);
+       }
+
+       /**
+        * Invert the speed value, for example when vertical speeds are positive downwards
+        */
+       public void invert() {
+               if (_valid) _value = -_value;
+       }
+
+       /** @return the numerical value in whatever units they're in */
+       public double getValue() {return _value;}
+
+       /** @return the units they're in */
+       public Unit getUnit() {return _unit;}
+
+       /**
+        * @return speed value in metres per second
+        */
+       public double getValueInMetresPerSec()
+       {
+               if (!_valid) return 0.0;
+               return _value / _unit.getMultFactorFromStd();
+       }
+
+       /**
+        * @param inUnit specified speed units
+        * @return speed value in the specified units
+        */
+       public double getValue(Unit inUnit)
+       {
+               if (!_valid || !isValidUnit(inUnit)) return 0.0;
+               return getValueInMetresPerSec() * inUnit.getMultFactorFromStd();
+       }
+
+       /** @return true if this is valid */
+       public boolean isValid() {return _valid;}
+
+       /**
+        * Copy the values from the other object into this one, to make this one a clone
+        * @param inOther other speed object
+        */
+       public void copyFrom(Speed inOther)
+       {
+               _value = inOther._value;
+               _unit  = inOther._unit;
+               _valid = inOther._valid;
+       }
+}