com.geotab.model.entity.device.GoDevice Maven / Gradle / Ivy
package com.geotab.model.entity.device;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.geotab.model.CustomParameter;
import com.geotab.model.entity.enginetype.EngineType;
import com.geotab.model.entity.group.Group;
import com.geotab.model.entity.worktime.WorkTime;
import com.geotab.model.enumeration.DevicePlan;
import com.geotab.model.enumeration.DeviceType;
import com.geotab.model.enumeration.GoTalkLanguage;
import com.geotab.model.enumeration.HosOption;
import com.geotab.util.DeviceDefaultsUtil;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* The base device for all Geotab GO products. Additional properties can be seen in {@link Device}.
*/
@NoArgsConstructor
@Getter
@Setter
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public abstract class GoDevice
extends Device
implements VehicleIdentificationNumberAware, LicensableAware {
/**
* Gets or sets the messaging status {@link Group}(s). Drivers with Garmin-equipped vehicles can
* update their working status by choosing one from a set of common statuses. This status update
* is shared with their team. For example, when drivers finish their work, they can set their
* statuses to 'Available'. Their dispatcher is notified of this and can begin to assign work
* based on both the location and availability of the drivers. Default [Empty].
*/
protected List autoGroups;
/**
* The set of CustomParameter(s) associated with this device. Custom parameters allow the
* activation of special features — limited to custom and beta firmware. Custom parameters are
* issued only when necessary. Default [Empty].
*/
private List customParameters;
/**
* Gets or sets master toggle to disable the device buzzer. When set to [true], the device will
* not provide driver feedback of any kind. Default [false].
*/
private boolean disableBuzzer;
/**
* Gets or sets toggle to enable beeping when the vehicle idles for more than IdleMinutes. Default
* [false].
*/
private boolean enableBeepOnIdle;
/**
* Gets or sets flag to force the parameters to be updated between the store and a go device, the
* store will be updated with the parameter version of the go device +1. This is to avoid the
* issue where: a device is added (store parameter v0, device parameter v0), parameter version has
* changed (store parameter v1, device parameter v1), device has been removed, device is re-added
* (store parameter v0, device parameter v1). Thus when the store is updated to v1 there would be
* no change.
*/
private boolean enableMustReprogram;
/**
* Gets or sets toggle to enable speed warning value for the vehicle. When enabled [true], only
* beep briefly (instead of continuously), when 'SpeedingOn' value is exceeded. 'IsSpeedIndicator'
* must also be enabled. Default [false].
*/
private boolean enableSpeedWarning;
/**
* Gets or sets the EngineType. Default [EngineTypeGeneric].
*
* Deprecated. The EngineType entity will be removed completely in a future version of the
* SDK.
*/
private EngineType engineType;
/**
* Gets or sets the Vehicles Identity Number reported by the engine.
*/
private String engineVehicleIdentificationNumber;
/**
* Gets or sets a value indicating whether to wake up the GPS while the vehicle is parked: this
* will allow for a faster GPS latch when the vehicle begins its trip. Note: This will drain the
* vehicle's battery at a faster rate and should not be used with newer devices. Default [false].
*/
private boolean ensureHotStart;
/**
* Gets or sets the GPS off delay in minutes. When enabled this allows the device to keep the GPS
* on for a period after the vehicle has been turned off. Normally, the GPS turns off immediately.
* Keeping the GPS on can improve tracking on older devices when many stops are made.
*/
private Integer gpsOffDelay;
/**
* Gets or sets the number of minutes of allowed idling before device beeping starts.
* EnableBeepOnIdle must be enabled. Default [3].
*/
private Integer idleMinutes;
/**
* Gets or sets a toggle to beep constantly when the vehicle reaches the speed set in
* 'SpeedingOn', and do not stop until the vehicle slows below the 'SpeedingOff' speed. To only
* beep briefly (instead of continuously), enable 'EnableSpeedWarning'. Default [false].
*/
private Boolean isSpeedIndicator;
/**
* Gets or sets the vehicle license plate details of the vehicle associated with the device.
* Maximum length [50] Default [""].
*/
private String licensePlate;
/**
* Gets or sets the state or province of the vehicle associated with the device. Maximum length
* [50] Default [""].
*/
private String licenseState;
/**
* Gets or sets the device major firmware version. Newer versions have more functionality. Live
* device firmware versions are managed automatically. Default [0].
*/
private Short major;
/**
* Gets or sets the minimum accident speed in km/h. Default [4].
*/
private Double minAccidentSpeed;
/**
* Gets or sets the device minor firmware version. Newer versions have more functionality. Live
* device firmware versions are managed automatically. Default [0].
*/
private Short minor;
/**
* Gets or sets the parameter version that is stored in MyGeotab. The parameter version should be
* increased by one when the parameters have been modified and need to be synced with the physical
* device. Default [0].
*/
private Short parameterVersion;
/**
* Gets or sets a toggle that determines whether or not a device is under automatic vehicle
* management. Default [false].
*/
private boolean pinDevice;
/**
* Gets or sets the speeding off value in km/h. When 'IsSpeedIndicator' is enabled, once beeping
* starts, the vehicle must slow down to this speed for the beeping to stop. Default [90].
*/
private Double speedingOff;
/**
* Gets or sets the speeding on value in km/h. When 'IsSpeedIndicator' is enabled, the device will
* start beeping when the vehicle exceeds this speed. Default [100].
*/
private Double speedingOn;
/**
* Gets or sets the Vehicle Identification Number (VIN) of the vehicle associated with the device.
* Maximum length [50] Default [""].
*/
private String vehicleIdentificationNumber;
/**
* Gets or sets the {@link GoDevice} of an attached GoTalk. Default [English].
*/
private GoTalkLanguage goTalkLanguage;
/**
* Gets or sets the capacity of all usable fuel tanks in litres. Default [0].
*/
private Double fuelTankCapacity;
private Boolean disableSleeperBerth;
/**
* Gets or sets a toggle that represents automatic generation of DutyStatusLog's for a {@link
* Device}.
*/
private HosOption autoHos;
public GoDevice(String id, String name, Long version,
DeviceType deviceType, LocalDateTime ignoreDownloadsUntil,
String serialNumber, Integer productId, String vehicleIdentificationNumber,
String licensePlate, String licenseState, Short major, Short minor, Duration timeToDownload,
WorkTime workTime, List groups, List devicePlans, boolean pinDevice,
String timeZoneId, Float maxSecondsBetweenLogs,
LocalDateTime activeFrom, LocalDateTime activeTo, String comment, DeviceFlags deviceFlags,
List autoGroups, List customParameters, boolean disableBuzzer,
boolean enableBeepOnIdle, boolean enableMustReprogram, boolean enableSpeedWarning,
EngineType engineType, String engineVehicleIdentificationNumber, boolean ensureHotStart,
Integer gpsOffDelay, Integer idleMinutes, Boolean isSpeedIndicator,
Double minAccidentSpeed, Short parameterVersion, Double speedingOff, Double speedingOn,
GoTalkLanguage goTalkLanguage, Double fuelTankCapacity,
Boolean disableSleeperBerth, HosOption autoHos, Short parameterVersionOnDevice,
Map customFeatures) {
super(id, name, version, deviceType, ignoreDownloadsUntil, serialNumber, productId,
timeToDownload, workTime, groups, devicePlans, timeZoneId,
maxSecondsBetweenLogs, activeFrom, activeTo, comment, deviceFlags, customFeatures);
setupGoDevice(vehicleIdentificationNumber, engineVehicleIdentificationNumber, pinDevice,
licensePlate, licenseState, enableMustReprogram, minor, major, autoGroups,
engineType, minAccidentSpeed, isSpeedIndicator, speedingOn, speedingOff,
gpsOffDelay, disableBuzzer, parameterVersion, ensureHotStart, enableSpeedWarning,
enableBeepOnIdle, idleMinutes, customParameters, goTalkLanguage, fuelTankCapacity,
disableSleeperBerth, parameterVersionOnDevice, autoHos);
}
/**
* Gets returns true if this device supports external device power control. Originally only GO4v3
* was to support this - but there are a significant number of customers that had GO3V2s with this
* feature. As per DB: We had to support Iridium on Go4v2 for Oz and Garmin on GO4v2 for Toronto
* Hydro 78.x.x and 79.x.x supports Iridium, 66.x.x (J1708 Live) and 80.x.x supports Garmin.
*/
@JsonIgnore
public Boolean isExternalDevicePowerControlSupported() {
if (deviceType == null || productId == null) {
return null;
}
return deviceType == DeviceType.GO9
|| deviceType == DeviceType.GO8
|| deviceType == DeviceType.GO7
|| deviceType == DeviceType.GO6
|| deviceType == DeviceType.GO4V3
|| productId == 66
|| (productId >= 78 && productId <= 80);
}
/**
* Converts bytes to degrees.
*
* @param value The value.
* @return The angle.
*/
public static int byteToDegrees(short value) {
return (int) Math.round(2.403 * value);
}
/**
* Converts byte to speed.
*
* @param value The value.
* @return The speed in km/h.
*/
public static double byteToSpeed(short value) {
return value * 3.6 * 0.512;
}
/**
* Checks the provided array is the correct length and pads it to the correct length if it is
* not.
*
* @param booleanArray The boolean array.
* @return Array of boolean.
*/
public static boolean[] checkAndPadAuxArray(boolean[] booleanArray) {
if (booleanArray == null) {
return new boolean[8];
}
if (booleanArray.length > 8) {
throw new IllegalArgumentException("booleanArray.length cannot be more then 8");
}
return Arrays.copyOf(booleanArray, 8);
}
/**
* Checks the provided array is the correct length and pads it to the correct length if it is
* not.
*
* @param doubleArray The double array.
* @return Array of double.
*/
public static double[] checkAndPadAuxArray(double[] doubleArray) {
if (doubleArray == null) {
return new double[8];
}
if (doubleArray.length > 8) {
throw new IllegalArgumentException("doubleArray.length cannot be more then 8");
}
return Arrays.copyOf(doubleArray, 8);
}
/**
* Checks the provided array is the correct length and pads it to the correct length if it is
* not.
*
* @param booleanArray The boolean array.
* @return Array of boolean.
*/
public static boolean[] checkAndPadAuxIgnArray(boolean[] booleanArray) {
if (booleanArray == null) {
return new boolean[4];
}
if (booleanArray.length > 4) {
throw new IllegalArgumentException("booleanArray.Length cannot be more then 4");
}
return Arrays.copyOf(booleanArray, 4);
}
/**
* Checks the provided array is the correct length and pads it to the correct length if it is
* not.
*
* @param shortArray The short array.
* @return Array of short.
*/
public static short[] checkAndPadChannelArray(short[] shortArray) {
if (shortArray == null) {
return new short[20];
}
if (shortArray.length > 20) {
throw new IllegalArgumentException("shortArray.length cannot be more then 20");
}
return Arrays.copyOf(shortArray, 20);
}
/**
* Converts Degrees to byte.
*
* @param value The value.
* @return The byte representation of the direction.
*/
public static short degreesToByte(int value) {
return (short) (int) Math.round(value / 2.403);
}
/**
* Converts speed to byte.
*
* @param value The value.
* @return The byte representation of the speed.
*/
public static short speedToByte(double value) {
return (short) (int) Math.round(value / 3.6 / 0.512);
}
/**
* Determines whether garmin is supported on this device.
*
* @return Boolean
*/
@JsonIgnore
public Boolean isGarminSupported() {
if (deviceType == null || productId == null) {
return null;
}
return deviceType == DeviceType.GO9 || deviceType == DeviceType.GO8
|| deviceType == DeviceType.GO7
|| deviceType == DeviceType.GO6 || deviceType == DeviceType.GO4V3 || productId == 66
|| productId == 80;
}
/**
* Returns true if this device is definitely an rf device. Device will need to connect once before
* the product id is available to check.
*/
@SuppressWarnings("AbbreviationAsWordInName")
@JsonIgnore
public Boolean isRFDevice() {
if (productId == null) {
return null;
}
switch (productId) {
case 3:
case 5:
case 10:
case 12:
case 14:
case 32:
case 36:
case 38:
case 39:
case 68:
case 69:
case 70:
case 75:
case 76:
case 77:
case 78:
case 82:
case 84: {
return true;
}
case 17:
case 20:
case 21:
case 26:
case 27:
case 30:
case 34:
case 35:
case 37:
case 65:
case 66:
case 67:
case 71:
case 72:
case 73:
case 79:
case 80:
case 81:
case 83: {
return false;
}
default: {
return deviceType == DeviceType.GO5 || deviceType == DeviceType.GO6
|| deviceType == DeviceType.GO7 || deviceType == DeviceType.GO8
|| deviceType == DeviceType.GO9 || deviceType == DeviceType.CUSTOM_DEVICE
|| deviceType == DeviceType.CUSTOM_VEHICLE_DEVICE
|| deviceType == DeviceType.GO_DRIVE_DEVICE ? false : null;
}
}
}
/**
* Gets or sets the parameter version that is on the device. Can be used to track the parameter
* version currently on the device by comparing to ParameterVersion. Default [0].
*/
private Short parameterVersionOnDevice;
private void setupGoDevice(String vehicleIdentificationNumber,
String engineVehicleIdentificationNumber, Boolean pinDevice, String licensePlate,
String licenseState, Boolean enableMustReprogram, Short minor, Short major,
List autoGroups, EngineType engineType, Double minAccidentSpeed,
Boolean isSpeedIndicator, Double speedingOn, Double speedingOff, Integer gpsOffDelay,
Boolean disableBuzzer, Short parameterVersion, Boolean ensureHotStart,
Boolean enableSpeedWarning, Boolean enableBeepOnIdle, Integer idleMinutes,
List customParams, GoTalkLanguage goTalkLanguage, Double fuelTankCapacity,
Boolean disableSleeperBerth, Short parameterVersionOnDevice, HosOption autoHos) {
this.vehicleIdentificationNumber = vehicleIdentificationNumber;
this.engineVehicleIdentificationNumber = engineVehicleIdentificationNumber;
this.pinDevice = pinDevice;
this.licensePlate = licensePlate;
this.licenseState = licenseState;
this.enableMustReprogram = enableMustReprogram;
this.engineType = engineType;
this.minor = minor;
this.major = major;
if (autoGroups != null) {
this.autoGroups = new ArrayList<>(autoGroups);
} else {
this.autoGroups = null;
}
this.minAccidentSpeed = minAccidentSpeed;
this.isSpeedIndicator = isSpeedIndicator;
this.speedingOn = speedingOn;
this.speedingOff = speedingOff;
this.gpsOffDelay = gpsOffDelay;
this.disableBuzzer = disableBuzzer;
this.parameterVersion = parameterVersion;
this.parameterVersionOnDevice = parameterVersionOnDevice;
this.ensureHotStart = ensureHotStart;
this.enableSpeedWarning = enableSpeedWarning;
this.enableBeepOnIdle = enableBeepOnIdle;
this.idleMinutes = idleMinutes;
if (customParams != null) {
this.customParameters = new ArrayList<>(customParams);
} else {
this.customParameters = null;
}
this.goTalkLanguage = goTalkLanguage;
this.fuelTankCapacity = fuelTankCapacity;
this.disableSleeperBerth = disableSleeperBerth;
this.autoHos = autoHos;
}
@Override
public void populateDefaults() {
super.populateDefaults();
DeviceDefaultsUtil.addVehicleIdentificationNumberDefaults(this);
DeviceDefaultsUtil.addGoDeviceDefaults(this);
}
}