package com.openxc.messages;
import com.google.common.base.Objects;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import android.os.Parcel;
import com.google.common.base.MoreObjects;
import com.google.gson.annotations.SerializedName;
/**
* A diagnostic request message, for example an OBD-II request.
*/
public class DiagnosticRequest extends DiagnosticMessage {
private static final String MULTIPLE_RESPONSES_KEY = "multiple_responses";
private static final String FREQUENCY_KEY = "frequency";
private static final String NAME_KEY = NamedVehicleMessage.NAME_KEY;
public static final String ADD_ACTION_KEY = "add";
public static final String CANCEL_ACTION_KEY = "cancel";
private static final String[] sRequiredFieldsValues = new String[] {
ID_KEY, BUS_KEY, MODE_KEY };
private static final Set<String> sRequiredFields = new HashSet<>(
Arrays.asList(sRequiredFieldsValues));
@SerializedName(MULTIPLE_RESPONSES_KEY)
private Boolean mMultipleResponses;
@SerializedName(FREQUENCY_KEY)
// Frequency is an optional field, so it is stored as a Double so it can
// be nulled.
private Double mFrequency;
@SerializedName(NAME_KEY)
private String mName;
public DiagnosticRequest(int busId, int id, int mode) {
super(busId, id, mode);
}
public DiagnosticRequest(int busId, int id, int mode, int pid) {
super(busId, id, mode, pid);
}
public void setMultipleResponses(boolean multipleResponses) {
mMultipleResponses = multipleResponses;
}
public boolean hasFrequency() {
return getFrequency() != null;
}
public void setFrequency(Double frequency) {
mFrequency = frequency;
}
public void setName(String name) {
mName = name;
}
public boolean getMultipleResponses() {
return mMultipleResponses == null ? false : mMultipleResponses;
}
public Double getFrequency() {
return mFrequency;
}
public boolean hasName() {
return getName() != null;
}
public String getName() {
return mName;
}
public static boolean containsRequiredFields(Set<String> fields) {
return fields.containsAll(sRequiredFields);
}
@Override
public boolean equals(Object obj) {
if(!super.equals(obj) || !(obj instanceof DiagnosticRequest)) {
return false;
}
final DiagnosticRequest other = (DiagnosticRequest) obj;
return getMultipleResponses() == other.getMultipleResponses()
&& Objects.equal(mFrequency, other.mFrequency)
&& Objects.equal(mName, other.mName);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("timestamp", getTimestamp())
.add("bus", getBusId())
.add("id", getId())
.add("mode", getMode())
.add("pid", getPid())
.add("payload", Arrays.toString(getPayload()))
.add("multiple_responses", getMultipleResponses())
.add("frequency", getFrequency())
.add("name", getName())
.add("extras", getExtras())
.toString();
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeValue(mMultipleResponses);
out.writeValue(getFrequency());
out.writeString(getName());
}
@Override
protected void readFromParcel(Parcel in) {
super.readFromParcel(in);
mMultipleResponses = (Boolean) in.readValue(Boolean.class.getClassLoader());
mFrequency = (Double) in.readValue(Double.class.getClassLoader());
mName = in.readString();
}
protected DiagnosticRequest(Parcel in) {
readFromParcel(in);
}
protected DiagnosticRequest() { }
}