--- /dev/null
+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;
+ }
+}