
com.highmobility.autoapi.Trips Maven / Gradle / Ivy
/*
* The MIT License
*
* Copyright (c) 2014- High-Mobility GmbH (https://high-mobility.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.highmobility.autoapi;
import com.highmobility.autoapi.property.ByteEnum;
import com.highmobility.autoapi.property.Property;
import com.highmobility.autoapi.value.AddressComponent;
import com.highmobility.autoapi.value.Coordinates;
import com.highmobility.autoapi.value.measurement.FuelEfficiency;
import com.highmobility.autoapi.value.measurement.Length;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import static com.highmobility.utils.ByteUtils.hexFromByte;
/**
* The Trips capability
*/
public class Trips {
public static final int IDENTIFIER = Identifier.TRIPS;
public static final byte PROPERTY_TYPE = 0x01;
public static final byte PROPERTY_DRIVER_NAME = 0x02;
public static final byte PROPERTY_DESCRIPTION = 0x03;
public static final byte PROPERTY_START_TIME = 0x04;
public static final byte PROPERTY_END_TIME = 0x05;
public static final byte PROPERTY_START_ADDRESS = 0x06;
public static final byte PROPERTY_END_ADDRESS = 0x07;
public static final byte PROPERTY_START_COORDINATES = 0x08;
public static final byte PROPERTY_END_COORDINATES = 0x09;
public static final byte PROPERTY_START_ODOMETER = 0x0a;
public static final byte PROPERTY_END_ODOMETER = 0x0b;
public static final byte PROPERTY_AVERAGE_FUEL_CONSUMPTION = 0x0c;
public static final byte PROPERTY_DISTANCE = 0x0d;
public static final byte PROPERTY_START_ADDRESS_COMPONENTS = 0x0e;
public static final byte PROPERTY_END_ADDRESS_COMPONENTS = 0x0f;
/**
* The trips state
*/
public static class State extends SetCommand {
Property type = new Property<>(Type.class, PROPERTY_TYPE);
Property driverName = new Property<>(String.class, PROPERTY_DRIVER_NAME);
Property description = new Property<>(String.class, PROPERTY_DESCRIPTION);
Property startTime = new Property<>(Calendar.class, PROPERTY_START_TIME);
Property endTime = new Property<>(Calendar.class, PROPERTY_END_TIME);
Property startAddress = new Property<>(String.class, PROPERTY_START_ADDRESS);
Property endAddress = new Property<>(String.class, PROPERTY_END_ADDRESS);
Property startCoordinates = new Property<>(Coordinates.class, PROPERTY_START_COORDINATES);
Property endCoordinates = new Property<>(Coordinates.class, PROPERTY_END_COORDINATES);
Property startOdometer = new Property<>(Length.class, PROPERTY_START_ODOMETER);
Property endOdometer = new Property<>(Length.class, PROPERTY_END_ODOMETER);
Property averageFuelConsumption = new Property<>(FuelEfficiency.class, PROPERTY_AVERAGE_FUEL_CONSUMPTION);
Property distance = new Property<>(Length.class, PROPERTY_DISTANCE);
List> startAddressComponents;
List> endAddressComponents;
/**
* @return Type of the trip
*/
public Property getType() {
return type;
}
/**
* @return Name of the driver of the trip
*/
public Property getDriverName() {
return driverName;
}
/**
* @return Description of the trip
*/
public Property getDescription() {
return description;
}
/**
* @return Start time of the trip
*/
public Property getStartTime() {
return startTime;
}
/**
* @return End time of the trip
*/
public Property getEndTime() {
return endTime;
}
/**
* @return Start address of the trip
*/
public Property getStartAddress() {
return startAddress;
}
/**
* @return End address of the trip
*/
public Property getEndAddress() {
return endAddress;
}
/**
* @return Start coordinates of the trip
*/
public Property getStartCoordinates() {
return startCoordinates;
}
/**
* @return End coordinates of the trip
*/
public Property getEndCoordinates() {
return endCoordinates;
}
/**
* @return Odometer reading at the start of the trip
*/
public Property getStartOdometer() {
return startOdometer;
}
/**
* @return Odometer reading at the end of the trip
*/
public Property getEndOdometer() {
return endOdometer;
}
/**
* @return Average fuel consumption during the trip
*/
public Property getAverageFuelConsumption() {
return averageFuelConsumption;
}
/**
* @return Distance of the trip
*/
public Property getDistance() {
return distance;
}
/**
* @return Start address components
*/
public List> getStartAddressComponents() {
return startAddressComponents;
}
/**
* @return End address components
*/
public List> getEndAddressComponents() {
return endAddressComponents;
}
State(byte[] bytes) throws CommandParseException {
super(bytes);
final ArrayList> startAddressComponentsBuilder = new ArrayList<>();
final ArrayList> endAddressComponentsBuilder = new ArrayList<>();
while (propertyIterator.hasNext()) {
propertyIterator.parseNext(p -> {
switch (p.getPropertyIdentifier()) {
case PROPERTY_TYPE: return type.update(p);
case PROPERTY_DRIVER_NAME: return driverName.update(p);
case PROPERTY_DESCRIPTION: return description.update(p);
case PROPERTY_START_TIME: return startTime.update(p);
case PROPERTY_END_TIME: return endTime.update(p);
case PROPERTY_START_ADDRESS: return startAddress.update(p);
case PROPERTY_END_ADDRESS: return endAddress.update(p);
case PROPERTY_START_COORDINATES: return startCoordinates.update(p);
case PROPERTY_END_COORDINATES: return endCoordinates.update(p);
case PROPERTY_START_ODOMETER: return startOdometer.update(p);
case PROPERTY_END_ODOMETER: return endOdometer.update(p);
case PROPERTY_AVERAGE_FUEL_CONSUMPTION: return averageFuelConsumption.update(p);
case PROPERTY_DISTANCE: return distance.update(p);
case PROPERTY_START_ADDRESS_COMPONENTS:
Property startAddressComponent = new Property<>(AddressComponent.class, p);
startAddressComponentsBuilder.add(startAddressComponent);
return startAddressComponent;
case PROPERTY_END_ADDRESS_COMPONENTS:
Property endAddressComponent = new Property<>(AddressComponent.class, p);
endAddressComponentsBuilder.add(endAddressComponent);
return endAddressComponent;
}
return null;
});
}
startAddressComponents = startAddressComponentsBuilder;
endAddressComponents = endAddressComponentsBuilder;
}
private State(Builder builder) {
super(builder);
type = builder.type;
driverName = builder.driverName;
description = builder.description;
startTime = builder.startTime;
endTime = builder.endTime;
startAddress = builder.startAddress;
endAddress = builder.endAddress;
startCoordinates = builder.startCoordinates;
endCoordinates = builder.endCoordinates;
startOdometer = builder.startOdometer;
endOdometer = builder.endOdometer;
averageFuelConsumption = builder.averageFuelConsumption;
distance = builder.distance;
startAddressComponents = builder.startAddressComponents;
endAddressComponents = builder.endAddressComponents;
}
public static final class Builder extends SetCommand.Builder {
private Property type;
private Property driverName;
private Property description;
private Property startTime;
private Property endTime;
private Property startAddress;
private Property endAddress;
private Property startCoordinates;
private Property endCoordinates;
private Property startOdometer;
private Property endOdometer;
private Property averageFuelConsumption;
private Property distance;
private final List> startAddressComponents = new ArrayList<>();
private final List> endAddressComponents = new ArrayList<>();
public Builder() {
super(IDENTIFIER);
}
public State build() {
return new State(this);
}
/**
* @param type Type of the trip
* @return The builder
*/
public Builder setType(Property type) {
this.type = type.setIdentifier(PROPERTY_TYPE);
addProperty(this.type);
return this;
}
/**
* @param driverName Name of the driver of the trip
* @return The builder
*/
public Builder setDriverName(Property driverName) {
this.driverName = driverName.setIdentifier(PROPERTY_DRIVER_NAME);
addProperty(this.driverName);
return this;
}
/**
* @param description Description of the trip
* @return The builder
*/
public Builder setDescription(Property description) {
this.description = description.setIdentifier(PROPERTY_DESCRIPTION);
addProperty(this.description);
return this;
}
/**
* @param startTime Start time of the trip
* @return The builder
*/
public Builder setStartTime(Property startTime) {
this.startTime = startTime.setIdentifier(PROPERTY_START_TIME);
addProperty(this.startTime);
return this;
}
/**
* @param endTime End time of the trip
* @return The builder
*/
public Builder setEndTime(Property endTime) {
this.endTime = endTime.setIdentifier(PROPERTY_END_TIME);
addProperty(this.endTime);
return this;
}
/**
* @param startAddress Start address of the trip
* @return The builder
*/
public Builder setStartAddress(Property startAddress) {
this.startAddress = startAddress.setIdentifier(PROPERTY_START_ADDRESS);
addProperty(this.startAddress);
return this;
}
/**
* @param endAddress End address of the trip
* @return The builder
*/
public Builder setEndAddress(Property endAddress) {
this.endAddress = endAddress.setIdentifier(PROPERTY_END_ADDRESS);
addProperty(this.endAddress);
return this;
}
/**
* @param startCoordinates Start coordinates of the trip
* @return The builder
*/
public Builder setStartCoordinates(Property startCoordinates) {
this.startCoordinates = startCoordinates.setIdentifier(PROPERTY_START_COORDINATES);
addProperty(this.startCoordinates);
return this;
}
/**
* @param endCoordinates End coordinates of the trip
* @return The builder
*/
public Builder setEndCoordinates(Property endCoordinates) {
this.endCoordinates = endCoordinates.setIdentifier(PROPERTY_END_COORDINATES);
addProperty(this.endCoordinates);
return this;
}
/**
* @param startOdometer Odometer reading at the start of the trip
* @return The builder
*/
public Builder setStartOdometer(Property startOdometer) {
this.startOdometer = startOdometer.setIdentifier(PROPERTY_START_ODOMETER);
addProperty(this.startOdometer);
return this;
}
/**
* @param endOdometer Odometer reading at the end of the trip
* @return The builder
*/
public Builder setEndOdometer(Property endOdometer) {
this.endOdometer = endOdometer.setIdentifier(PROPERTY_END_ODOMETER);
addProperty(this.endOdometer);
return this;
}
/**
* @param averageFuelConsumption Average fuel consumption during the trip
* @return The builder
*/
public Builder setAverageFuelConsumption(Property averageFuelConsumption) {
this.averageFuelConsumption = averageFuelConsumption.setIdentifier(PROPERTY_AVERAGE_FUEL_CONSUMPTION);
addProperty(this.averageFuelConsumption);
return this;
}
/**
* @param distance Distance of the trip
* @return The builder
*/
public Builder setDistance(Property distance) {
this.distance = distance.setIdentifier(PROPERTY_DISTANCE);
addProperty(this.distance);
return this;
}
/**
* Add an array of start address components.
*
* @param startAddressComponents The start address components. Start address components
* @return The builder
*/
public Builder setStartAddressComponents(Property[] startAddressComponents) {
this.startAddressComponents.clear();
for (int i = 0; i < startAddressComponents.length; i++) {
addStartAddressComponent(startAddressComponents[i]);
}
return this;
}
/**
* Add a single start address component.
*
* @param startAddressComponent The start address component. Start address components
* @return The builder
*/
public Builder addStartAddressComponent(Property startAddressComponent) {
startAddressComponent.setIdentifier(PROPERTY_START_ADDRESS_COMPONENTS);
addProperty(startAddressComponent);
startAddressComponents.add(startAddressComponent);
return this;
}
/**
* Add an array of end address components.
*
* @param endAddressComponents The end address components. End address components
* @return The builder
*/
public Builder setEndAddressComponents(Property[] endAddressComponents) {
this.endAddressComponents.clear();
for (int i = 0; i < endAddressComponents.length; i++) {
addEndAddressComponent(endAddressComponents[i]);
}
return this;
}
/**
* Add a single end address component.
*
* @param endAddressComponent The end address component. End address components
* @return The builder
*/
public Builder addEndAddressComponent(Property endAddressComponent) {
endAddressComponent.setIdentifier(PROPERTY_END_ADDRESS_COMPONENTS);
addProperty(endAddressComponent);
endAddressComponents.add(endAddressComponent);
return this;
}
}
}
public enum Type implements ByteEnum {
SINGLE((byte) 0x00),
MULTI((byte) 0x01);
public static Type fromByte(byte byteValue) throws CommandParseException {
Type[] values = Type.values();
for (int i = 0; i < values.length; i++) {
Type state = values[i];
if (state.getByte() == byteValue) {
return state;
}
}
throw new CommandParseException("Trips.Type does not contain: " + hexFromByte(byteValue));
}
private final byte value;
Type(byte value) {
this.value = value;
}
@Override public byte getByte() {
return value;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy