aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeun-young Park <keunyoung@google.com>2016-03-10 18:44:40 -0800
committerKeun-young Park <keunyoung@google.com>2016-03-15 12:25:13 -0700
commit71b2f5cd736f3a9aac8a9356b049d20ea76edb88 (patch)
tree809d08ec632d9a9e5332606f48ab70581ae81fd2
parent569ba04e9c4d05571d88daeac3367733541206db (diff)
downloadCar-71b2f5cd736f3a9aac8a9356b049d20ea76edb88.tar.gz
vehicle hal refactoring from hal review
- call release_memory_from_get for freeing memory allocated from get call - add retry for NOT_READY error which can happen at initial stage - simplify zoned properties with missing multiple mins/maxs for zoned properties - update HVAC API to return min/max values per each zone - change HVACV API to return all zones available (renamed to getZones()) - fix missing write permision to property 0 which is used to gatekeep hal mocking bug: 27597338, 27596281 Change-Id: I353acc0398f62c4933491e43592ea598d17d2422
-rw-r--r--car-lib/src/android/car/hardware/hvac/CarHvacManager.java234
-rw-r--r--car-lib/src/android/car/hardware/hvac/CarHvacProperty.java206
-rw-r--r--libvehiclenetwork/include/IVehicleNetwork.h20
-rw-r--r--libvehiclenetwork/include/VehicleNetworkDataTypes.h16
-rw-r--r--libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java17
-rw-r--r--libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java48
-rw-r--r--libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java16
-rw-r--r--libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java77
-rw-r--r--libvehiclenetwork/native/IVehicleNetwork.cpp13
-rw-r--r--libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp276
-rw-r--r--libvehiclenetwork/proto/VehicleNetworkProto.proto39
-rw-r--r--service/src/com/android/car/CarServiceUtils.java20
-rw-r--r--service/src/com/android/car/hal/HvacHalService.java63
-rw-r--r--service/src/com/android/car/hal/PowerHalService.java2
-rw-r--r--service/src/com/android/car/hal/VehicleHal.java18
-rw-r--r--tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java243
-rw-r--r--tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java6
-rw-r--r--tests/libvehiclenetwork-java-test/Android.mk13
-rw-r--r--tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java34
-rw-r--r--tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java4
-rw-r--r--tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java7
-rw-r--r--tests/libvehiclenetwork-java-test/vendor_vns_policy.xml34
-rw-r--r--vehicle_network_service/VehicleHalPropertyUtil.h76
-rw-r--r--vehicle_network_service/VehicleNetworkService.cpp33
-rw-r--r--vehicle_network_service/VehicleNetworkService.h4
-rw-r--r--vns_policy/vns_policy.xml3
26 files changed, 980 insertions, 542 deletions
diff --git a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
index 99eea23e44..269fce2d13 100644
--- a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
+++ b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
@@ -30,6 +30,7 @@ import android.util.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -136,17 +137,93 @@ public class CarHvacManager implements CarManagerBase {
public static class CarHvacBaseProperty {
protected final int mPropertyId;
protected final int mType;
- protected final int mZone;
+ protected final int mZones;
- public CarHvacBaseProperty(int propId, int type, int zone) {
+ public CarHvacBaseProperty(int propId, int type, int zones) {
mPropertyId = propId;
mType = type;
- mZone = zone;
+ mZones = zones;
}
- public int getPropertyId() { return mPropertyId; }
- public int getType() { return mType; }
- public int getZone() { return mZone; }
+ public int getPropertyId() {
+ return mPropertyId;
+ }
+
+ public int getType() {
+ return mType;
+ }
+
+ /**
+ * Return bit flags of supported zones.
+ */
+ public int getZones() { return mZones; }
+
+ /**
+ * Return an active zone for Hvac event. This will return only one zone.
+ * If there is no valid zone, this will return 0.
+ */
+ public int getZone() {
+ if (mZones == 0) {
+ return 0;
+ }
+ int flag = 0x1;
+ for (int i = 0; i < 32; i++) {
+ if ((flag & mZones) != 0) {
+ return flag;
+ }
+ flag <<= 1;
+ }
+ return 0;
+ }
+
+ public static int zoneToIndex(int zone) {
+ if (zone == 0) {
+ return 0;
+ }
+ int flag = 0x1;
+ for (int i = 0; i < 32; i++) {
+ if ((flag & zone) != 0) {
+ return i;
+ }
+ flag <<= 1;
+ }
+ return 0;
+ }
+
+ public static int getNumZones(int zones) {
+ int numZones = 0;
+ int flag = 0x1;
+ for (int i = 0; i < 32; i++) {
+ if ((flag & zones) != 0) {
+ numZones++;
+ }
+ flag <<= 1;
+ }
+ return numZones;
+ }
+
+ @Override
+ public String toString() {
+ return "CarHvacBaseProperty [mPropertyId=0x" + Integer.toHexString(mPropertyId) +
+ ", mType=0x" + Integer.toHexString(mType) +
+ ", mZones=0x" + Integer.toHexString(mZones) + "]";
+ }
+
+ protected void assertZonedProperty() {
+ if (mPropertyId <= MAX_GLOBAL_PROPETY_ID) {
+ throw new IllegalArgumentException(
+ "assertZonedProperty called for non-zoned property 0x" +
+ Integer.toHexString(mPropertyId));
+ }
+ }
+
+ protected void assertNonZonedProperty() {
+ if (mPropertyId > MAX_GLOBAL_PROPETY_ID) {
+ throw new IllegalArgumentException(
+ "assertNonZonedProperty called for zoned property 0x" +
+ Integer.toHexString(mPropertyId));
+ }
+ }
}
public static final class CarHvacBooleanProperty extends CarHvacBaseProperty {
@@ -156,65 +233,150 @@ public class CarHvacManager implements CarManagerBase {
}
public static final class CarHvacFloatProperty extends CarHvacBaseProperty {
- private float mMaxValue;
- private float mMinValue;
+ private final float[] mMaxValues;
+ private final float[] mMinValues;
+
+ public CarHvacFloatProperty(int propId, int zones, float[] maxs, float mins[]) {
+ super(propId, PROPERTY_TYPE_FLOAT, zones);
+ int expectedLength = zones == 0 ? 1 : getNumZones(zones);
+ if (maxs.length != expectedLength || mins.length != expectedLength) {
+ throw new IllegalArgumentException("Expected length:" + expectedLength +
+ " while maxs length:" + maxs.length + " mins length:" + mins.length +
+ " property:0x" + Integer.toHexString(propId));
+ }
+ mMaxValues = maxs;
+ mMinValues = mins;
+ }
- public CarHvacFloatProperty(int propId, int zone, float max, float min) {
- super(propId, PROPERTY_TYPE_FLOAT, zone);
- mMaxValue = max;
- mMinValue = min;
+ /**
+ * Get max value. Should be used only for non-zoned property.
+ */
+ public float getMaxValue() {
+ assertNonZonedProperty();
+ return mMaxValues[0];
}
- public float getMaxValue() { return mMaxValue; }
- public float getMinValue() { return mMinValue; }
+ /**
+ * Get min value. Should be used only for non-zoned property.
+ */
+ public float getMinValue() {
+ assertNonZonedProperty();
+ return mMinValues[0];
+ }
+
+ public float getMaxValue(int zone) {
+ assertZonedProperty();
+ return mMaxValues[zoneToIndex(zone)];
+ }
+
+ public float getMinValue(int zone) {
+ assertZonedProperty();
+ return mMinValues[zoneToIndex(zone)];
+ }
+
+ @Override
+ public String toString() {
+ return "CarHvacFloatProperty [mMaxValues=" + Arrays.toString(mMaxValues)
+ + ", mMinValues=" + Arrays.toString(mMinValues) + " " + super.toString() + "]";
+ }
}
public static final class CarHvacIntProperty extends CarHvacBaseProperty {
- private int mMaxValue;
- private int mMinValue;
+ private int[] mMaxValues;
+ private int[] mMinValues;
+
+ public CarHvacIntProperty(int propId, int zones, int[] maxs, int[] mins) {
+ super(propId, PROPERTY_TYPE_INT, zones);
+ int expectedLength = zones == 0 ? 1 : getNumZones(zones);
+ if (maxs.length != expectedLength || mins.length != expectedLength) {
+ throw new IllegalArgumentException("Expected length:" + expectedLength +
+ " while maxs length:" + maxs.length + " mins length:" + mins.length +
+ " property:0x" + Integer.toHexString(propId));
+ }
+ mMaxValues = maxs;
+ mMinValues = mins;
+ }
+
+ /**
+ * Get max value. Should be used only for non-zoned property.
+ */
+ public int getMaxValue() {
+ assertNonZonedProperty();
+ return mMaxValues[0];
+ }
+
+ /**
+ * Get min value. Should be used only for non-zoned property.
+ */
+ public int getMinValue() {
+ assertNonZonedProperty();
+ return mMinValues[0];
+ }
- public CarHvacIntProperty(int propId, int zone, int max, int min) {
- super(propId, PROPERTY_TYPE_INT, zone);
- mMaxValue = max;
- mMinValue = min;
+ public int getMaxValue(int zone) {
+ assertZonedProperty();
+ return mMaxValues[zoneToIndex(zone)];
}
- public int getMaxValue() { return mMaxValue; }
- public int getMinValue() { return mMinValue; }
+ public int getMinValue(int zone) {
+ assertZonedProperty();
+ return mMinValues[zoneToIndex(zone)];
+ }
+
+ @Override
+ public String toString() {
+ return "CarHvacIntProperty [mMaxValues=" + Arrays.toString(mMaxValues)
+ + ", mMinValues=" + Arrays.toString(mMinValues) + " " + super.toString() + "]";
+ }
}
public static final class CarHvacBooleanValue extends CarHvacBaseProperty {
private boolean mValue;
- public CarHvacBooleanValue(int propId, int zone, boolean value) {
- super(propId, PROPERTY_TYPE_BOOLEAN, zone);
+ public CarHvacBooleanValue(int propId, int zones, boolean value) {
+ super(propId, PROPERTY_TYPE_BOOLEAN, zones);
mValue = value;
}
public boolean getValue() { return mValue; }
+
+ @Override
+ public String toString() {
+ return "CarHvacBooleanValue [mValue=" + mValue + " " + super.toString() + "]";
+ }
}
public static final class CarHvacFloatValue extends CarHvacBaseProperty {
private float mValue;
- public CarHvacFloatValue(int propId, int zone, float value) {
- super(propId, PROPERTY_TYPE_FLOAT, zone);
+ public CarHvacFloatValue(int propId, int zones, float value) {
+ super(propId, PROPERTY_TYPE_FLOAT, zones);
mValue = value;
}
public float getValue() { return mValue; }
+
+ @Override
+ public String toString() {
+ return "CarHvacFloatValue [mValue=" + mValue + " " + super.toString() + "]";
+ }
}
public static final class CarHvacIntValue extends CarHvacBaseProperty {
private int mValue;
- public CarHvacIntValue(int propId, int zone, int value) {
- super(propId, PROPERTY_TYPE_INT, zone);
+ public CarHvacIntValue(int propId, int zones, int value) {
+ super(propId, PROPERTY_TYPE_INT, zones);
mValue = value;
}
public int getValue() { return mValue; }
+
+ @Override
+ public String toString() {
+ return "CarHvacIntValue [mValue=" + mValue + " " + super.toString() + "]";
+ }
}
public interface CarHvacEventListener {
@@ -352,19 +514,19 @@ public class CarHvacManager implements CarManagerBase {
switch (carProp.getType()) {
case PROPERTY_TYPE_BOOLEAN: {
CarHvacBooleanProperty newProp =
- new CarHvacBooleanProperty(carProp.getPropertyId(), carProp.getZone());
+ new CarHvacBooleanProperty(carProp.getPropertyId(), carProp.getZones());
hvacProps.add(newProp);
} break;
case PROPERTY_TYPE_FLOAT: {
CarHvacFloatProperty newProp =
- new CarHvacFloatProperty(carProp.getPropertyId(), carProp.getZone(),
- carProp.getFloatMax(), carProp.getFloatMin());
+ new CarHvacFloatProperty(carProp.getPropertyId(), carProp.getZones(),
+ carProp.getFloatMaxs(), carProp.getFloatMins());
hvacProps.add(newProp);
} break;
case PROPERTY_TYPE_INT: {
CarHvacIntProperty newProp =
- new CarHvacIntProperty(carProp.getPropertyId(), carProp.getZone(),
- carProp.getIntMax(), carProp.getIntMin());
+ new CarHvacIntProperty(carProp.getPropertyId(), carProp.getZones(),
+ carProp.getIntMaxs(), carProp.getIntMins());
hvacProps.add(newProp);
} break;
}
@@ -477,7 +639,8 @@ public class CarHvacManager implements CarManagerBase {
}
try {
// Set floatMin and floatMax to 0, as they are ignored in set()
- CarHvacProperty carProp = new CarHvacProperty(prop, zone, 0, 0, val);
+ CarHvacProperty carProp = new CarHvacProperty(prop, zone,
+ new float[] { 0 }, new float[] { 0 }, val);
mService.setProperty(carProp);
} catch (RemoteException ex) {
Log.e(TAG, "setFloatProperty failed with " + ex.toString());
@@ -490,7 +653,8 @@ public class CarHvacManager implements CarManagerBase {
}
try {
// Set intMin and intMax to 0, as they are ignored in set()
- CarHvacProperty carProp = new CarHvacProperty(prop, zone, 0, 0, val);
+ CarHvacProperty carProp = new CarHvacProperty(prop, zone,
+ new int[] { 0 }, new int[] { 0 }, val);
mService.setProperty(carProp);
} catch (RemoteException ex) {
Log.e(TAG, "setIntProperty failed with " + ex.toString());
diff --git a/car-lib/src/android/car/hardware/hvac/CarHvacProperty.java b/car-lib/src/android/car/hardware/hvac/CarHvacProperty.java
index ff85baba55..e94b2a698d 100644
--- a/car-lib/src/android/car/hardware/hvac/CarHvacProperty.java
+++ b/car-lib/src/android/car/hardware/hvac/CarHvacProperty.java
@@ -29,15 +29,15 @@ import java.util.Objects;
@SystemApi
public class CarHvacProperty implements Parcelable {
- private final int mPropertyId;
- private final int mType;
- private int mZone;
- private final float mFloatMax;
- private final float mFloatMin;
- private float[] mFloatValues;
- private final int mIntMax;
- private final int mIntMin;
- private int[] mIntValues;
+ private final int mPropertyId;
+ private final int mType;
+ private int mZones;
+ private final float[] mFloatMaxs;
+ private final float[] mFloatMins;
+ private float[] mFloatValues;
+ private final int[] mIntMaxs;
+ private final int[] mIntMins;
+ private int[] mIntValues;
public int describeContents() {
return 0;
@@ -46,12 +46,12 @@ public class CarHvacProperty implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mPropertyId);
out.writeInt(mType);
- out.writeInt(mZone);
- out.writeFloat(mFloatMax);
- out.writeFloat(mFloatMin);
+ out.writeInt(mZones);
+ out.writeFloatArray(mFloatMaxs);
+ out.writeFloatArray(mFloatMins);
out.writeFloatArray(mFloatValues);
- out.writeInt(mIntMax);
- out.writeInt(mIntMin);
+ out.writeIntArray(mIntMaxs);
+ out.writeIntArray(mIntMins);
out.writeIntArray(mIntValues);
}
@@ -69,12 +69,12 @@ public class CarHvacProperty implements Parcelable {
private CarHvacProperty(Parcel in) {
mPropertyId = in.readInt();
mType = in.readInt();
- mZone = in.readInt();
- mFloatMax = in.readFloat();
- mFloatMin = in.readFloat();
+ mZones = in.readInt();
+ mFloatMaxs = in.createFloatArray();
+ mFloatMins = in.createFloatArray();
mFloatValues = in.createFloatArray();
- mIntMax = in.readInt();
- mIntMin = in.readInt();
+ mIntMaxs = in.createIntArray();
+ mIntMins = in.createIntArray();
mIntValues = in.createIntArray();
}
@@ -84,97 +84,97 @@ public class CarHvacProperty implements Parcelable {
public CarHvacProperty(CarHvacProperty that) {
mPropertyId = that.getPropertyId();
mType = that.getType();
- mZone = that.getZone();
- mFloatMax = that.getFloatMax();
- mFloatMin = that.getFloatMin();
+ mZones = that.getZones();
+ mFloatMaxs = that.getFloatMaxs();
+ mFloatMins = that.getFloatMins();
mFloatValues = that.getFloatValues();
- mIntMax = that.getIntMax();
- mIntMin = that.getIntMin();
+ mIntMaxs = that.getIntMaxs();
+ mIntMins = that.getIntMins();
mIntValues = that.getIntValues();
}
/**
* Constructor for a boolean property
*/
- public CarHvacProperty(int propertyId, int zone, boolean value) {
+ public CarHvacProperty(int propertyId, int zones, boolean value) {
mPropertyId = propertyId;
mType = CarHvacManager.PROPERTY_TYPE_BOOLEAN;
- mZone = zone;
- mIntMax = 1;
- mIntMin = 0;
+ mZones = zones;
+ mIntMaxs = new int[] { 1 };
+ mIntMins = new int[] { 0 };
mIntValues = new int[] { value ? 1 : 0 };
- mFloatMax = 0;
- mFloatMin = 0;
+ mFloatMaxs = null;
+ mFloatMins = null;
}
/**
* Constructor for a float property
*/
- public CarHvacProperty(int propertyId, int zone, float min, float max, float value) {
+ public CarHvacProperty(int propertyId, int zones, float[] mins, float[] maxs, float value) {
mPropertyId = propertyId;
mType = CarHvacManager.PROPERTY_TYPE_FLOAT;
- mZone = zone;
- mFloatMax = max;
- mFloatMin = min;
+ mZones = zones;
+ mFloatMaxs = maxs;
+ mFloatMins = mins;
mFloatValues = new float[] {value};
mIntValues = null;
- mIntMax = 0;
- mIntMin = 0;
+ mIntMaxs = null;
+ mIntMins = null;
}
/**
* Constructor for an integer property
*/
- public CarHvacProperty(int propertyId, int zone, int min, int max, int value) {
+ public CarHvacProperty(int propertyId, int zones, int[] mins, int[] maxs, int value) {
mPropertyId = propertyId;
mType = CarHvacManager.PROPERTY_TYPE_INT;
- mZone = zone;
- mIntMax = max;
- mIntMin = min;
+ mZones = zones;
+ mIntMaxs = maxs;
+ mIntMins = mins;
mIntValues = new int[] { value };
- mFloatMax = 0;
- mFloatMin = 0;
+ mFloatMaxs = null;
+ mFloatMins = null;
}
/**
* Constructor for an integer vector property
*/
- public CarHvacProperty(int propertyId, int zone, int min, int max, int[] values) {
+ public CarHvacProperty(int propertyId, int zones, int[] mins, int[] maxs, int[] values) {
mPropertyId = propertyId;
mType = CarHvacManager.PROPERTY_TYPE_INT_VECTOR;
- mZone = zone;
- mIntMax = max;
- mIntMin = min;
+ mZones = zones;
+ mIntMaxs = maxs;
+ mIntMins = mins;
mIntValues = Arrays.copyOf(values, values.length);
- mFloatMax = 0;
- mFloatMin = 0;
+ mFloatMaxs = null;
+ mFloatMins = null;
}
/**
* Constructor for a float vector property
*/
- public CarHvacProperty(int propertyId, int zone, float min, float max, float[] values) {
+ public CarHvacProperty(int propertyId, int zones, float[] mins, float[] maxs, float[] values) {
mPropertyId = propertyId;
mType = CarHvacManager.PROPERTY_TYPE_FLOAT_VECTOR;
- mZone = zone;
- mFloatMax = max;
- mFloatMin = min;
+ mZones = zones;
+ mFloatMaxs = maxs;
+ mFloatMins = mins;
mFloatValues = Arrays.copyOf(values, values.length);
- mIntMax = 0;
- mIntMin = 0;
+ mIntMaxs = null;
+ mIntMins = null;
}
// Getters.
public int getPropertyId() { return mPropertyId; }
public int getType() { return mType; }
- public int getZone() { return mZone; }
+ public int getZones() { return mZones; }
public boolean getBooleanValue() { return mIntValues[0] == 1; }
- public float getFloatMax() { return mFloatMax; }
- public float getFloatMin() { return mFloatMin; }
+ public float[] getFloatMaxs() { return mFloatMaxs; }
+ public float[] getFloatMins() { return mFloatMins; }
public float getFloatValue() { return mFloatValues[0]; }
public float[] getFloatValues() { return mFloatValues; }
- public int getIntMax() { return mIntMax; }
- public int getIntMin() { return mIntMin; }
+ public int[] getIntMaxs() { return mIntMaxs; }
+ public int[] getIntMins() { return mIntMins; }
public int getIntValue() { return mIntValues[0]; }
public int[] getIntValues() { return mIntValues; }
@@ -199,35 +199,35 @@ public class CarHvacProperty implements Parcelable {
assertType(CarHvacManager.PROPERTY_TYPE_INT_VECTOR);
mFloatValues = Arrays.copyOf(values, values.length);
}
- public void setZone(int zone) { mZone = zone; }
+ public void setZones(int zones) { mZones = zones; }
@Override
public String toString() {
String myString = "mPropertyId: " + mPropertyId + "\n" +
"mType: " + mType + "\n" +
- "mZone: " + mZone + "\n";
+ "mZones: " + mZones + "\n";
switch (mType) {
case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
myString += "mIntValue: " + mIntValues[0] + "\n";
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT:
- myString += "mFloatMax: " + mFloatMax + "\n" +
- "mFloatMin: " + mFloatMin + "\n" +
+ myString += "mFloatMaxs: " + Arrays.toString(mFloatMaxs) + "\n" +
+ "mFloatMins: " + Arrays.toString(mFloatMins) + "\n" +
"mFloatValue: " + mFloatValues[0] + "\n";
break;
case CarHvacManager.PROPERTY_TYPE_INT:
- myString += "mIntMax: " + mIntMax + "\n" +
- "mIntMin: " + mIntMin + "\n" +
+ myString += "mIntMax: " + Arrays.toString(mIntMaxs) + "\n" +
+ "mIntMin: " + Arrays.toString(mIntMins) + "\n" +
"mIntValue: " + mIntValues[0] + "\n";
break;
case CarHvacManager.PROPERTY_TYPE_INT_VECTOR:
- myString += "mIntMax: " + mIntMax + "\n" +
- "mIntMin: " + mIntMin + "\n" +
+ myString += "mIntMax: " + Arrays.toString(mIntMaxs) + "\n" +
+ "mIntMin: " + Arrays.toString(mIntMins) + "\n" +
"mIntValues: " + Arrays.toString(mIntValues) + "\n";
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT_VECTOR:
- myString += "mFloatMax: " + mFloatMax + "\n" +
- "mFloatMin: " + mFloatMin + "\n" +
+ myString += "mFloatMax: " + Arrays.toString(mFloatMaxs) + "\n" +
+ "mFloatMin: " + Arrays.toString(mFloatMins) + "\n" +
"mFloatValues: " + Arrays.toString(mFloatValues) + "\n";
break;
default:
@@ -238,37 +238,49 @@ public class CarHvacProperty implements Parcelable {
}
@Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- CarHvacProperty that = (CarHvacProperty) o;
- return mPropertyId == that.mPropertyId &&
- mType == that.mType &&
- mZone == that.mZone &&
- Float.compare(that.mFloatMax, mFloatMax) == 0 &&
- Float.compare(that.mFloatMin, mFloatMin) == 0 &&
- mIntMax == that.mIntMax &&
- mIntMin == that.mIntMin &&
- Arrays.equals(mFloatValues, that.mFloatValues) &&
- Arrays.equals(mIntValues, that.mIntValues);
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + Arrays.hashCode(mFloatMaxs);
+ result = prime * result + Arrays.hashCode(mFloatMins);
+ result = prime * result + Arrays.hashCode(mFloatValues);
+ result = prime * result + Arrays.hashCode(mIntMaxs);
+ result = prime * result + Arrays.hashCode(mIntMins);
+ result = prime * result + Arrays.hashCode(mIntValues);
+ result = prime * result + mPropertyId;
+ result = prime * result + mType;
+ result = prime * result + mZones;
+ return result;
}
@Override
- public int hashCode() {
- return Objects.hash(
- mPropertyId,
- mType,
- mZone,
- mFloatMax,
- mFloatMin,
- mFloatValues,
- mIntMax,
- mIntMin,
- mIntValues);
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CarHvacProperty other = (CarHvacProperty) obj;
+ if (!Arrays.equals(mFloatMaxs, other.mFloatMaxs))
+ return false;
+ if (!Arrays.equals(mFloatMins, other.mFloatMins))
+ return false;
+ if (!Arrays.equals(mFloatValues, other.mFloatValues))
+ return false;
+ if (!Arrays.equals(mIntMaxs, other.mIntMaxs))
+ return false;
+ if (!Arrays.equals(mIntMins, other.mIntMins))
+ return false;
+ if (!Arrays.equals(mIntValues, other.mIntValues))
+ return false;
+ if (mPropertyId != other.mPropertyId)
+ return false;
+ if (mType != other.mType)
+ return false;
+ if (mZones != other.mZones)
+ return false;
+ return true;
}
private void assertType(int expectedType) {
diff --git a/libvehiclenetwork/include/IVehicleNetwork.h b/libvehiclenetwork/include/IVehicleNetwork.h
index 5f33ee1af1..19e439f858 100644
--- a/libvehiclenetwork/include/IVehicleNetwork.h
+++ b/libvehiclenetwork/include/IVehicleNetwork.h
@@ -82,10 +82,30 @@ class BnVehicleNetwork : public BnInterface<IVehicleNetwork> {
Parcel* reply,
uint32_t flags = 0);
virtual bool isOperationAllowed(int32_t property, bool isWrite) = 0;
+ virtual void releaseMemoryFromGet(vehicle_prop_value_t* value) = 0;
};
// ----------------------------------------------------------------------------
+class VehicleNetworkUtil {
+public:
+ static int countNumberOfZones(int32_t zones) {
+ if (zones == 0) { // no-zone, treat as one zone.
+ return 1;
+ }
+ int count = 0;
+ uint32_t flag = 0x1;
+ for (int i = 0; i < 32; i++) {
+ if ((flag & zones) != 0) {
+ count++;
+ }
+ flag <<= 1;
+ }
+ return count;
+ }
+};
+
+// ----------------------------------------------------------------------------
}; // namespace android
#endif /* ANDROID_IVEHICLE_NETWORK_H */
diff --git a/libvehiclenetwork/include/VehicleNetworkDataTypes.h b/libvehiclenetwork/include/VehicleNetworkDataTypes.h
index bc6d25d425..f5cc209bee 100644
--- a/libvehiclenetwork/include/VehicleNetworkDataTypes.h
+++ b/libvehiclenetwork/include/VehicleNetworkDataTypes.h
@@ -63,6 +63,22 @@ public:
if (config->config_string.data != NULL && config->config_string.len > 0){
delete[] config->config_string.data;
}
+ switch (config->prop) {
+ case VEHICLE_VALUE_TYPE_ZONED_INT32:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ delete[] config->int32_max_values;
+ delete[] config->int32_min_values;
+ } break;
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
+ delete[] config->float_max_values;
+ delete[] config->float_min_values;
+ } break;
+ }
};
static bool isTheSame(const vehicle_prop_config_t& l, const vehicle_prop_config_t& r) {
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java
index 331f93c579..3ac50402a3 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetwork.java
@@ -31,7 +31,6 @@ import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.ZonedValue;
import com.android.internal.annotations.GuardedBy;
import java.lang.ref.WeakReference;
@@ -312,10 +311,10 @@ public class VehicleNetwork {
public int getZonedIntProperty(int property, int zone) throws IllegalArgumentException {
VehiclePropValue v = getProperty(
property, zone, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32);
- if (v.getZonedValue().getInt32ValuesCount() != 1) {
+ if (v.getInt32ValuesCount() != 1) {
throw new IllegalStateException();
}
- return v.getZonedValue().getInt32Values(0);
+ return v.getInt32Values(0);
}
/**
@@ -335,8 +334,8 @@ public class VehicleNetwork {
throws IllegalArgumentException {
VehiclePropValue v = getProperty(
property, zone, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32);
- assertVectorLength(v.getZonedValue().getInt32ValuesCount(), property, v.getValueType());
- return toIntArray(v.getZonedValue().getInt32ValuesList());
+ assertVectorLength(v.getInt32ValuesCount(), property, v.getValueType());
+ return toIntArray(v.getInt32ValuesList());
}
/**
@@ -368,8 +367,8 @@ public class VehicleNetwork {
throws IllegalArgumentException {
VehiclePropValue v = getProperty(property, zone,
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT);
- assertVectorLength(v.getZonedValue().getFloatValuesCount(), property, v.getValueType());
- return toFloatArray(v.getZonedValue().getFloatValuesList());
+ assertVectorLength(v.getFloatValuesCount(), property, v.getValueType());
+ return toFloatArray(v.getFloatValuesList());
}
/**
@@ -694,9 +693,7 @@ public class VehicleNetwork {
VehiclePropValueUtil.createBuilder(property, valueType, 0);
if (zone != NO_ZONE) {
- valuePrototypeBuilder.setZonedValue(ZonedValue.newBuilder().
- setZoneOrWindow(zone).
- build());
+ valuePrototypeBuilder.setZone(zone);
}
VehiclePropValue v = getProperty(valuePrototypeBuilder.build());
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
index 6cc3f0525f..003451f969 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
@@ -615,9 +615,11 @@ public static final int VEHICLE_VALUE_TYPE_INT32_VEC4 = 0x23;
public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT = 0x30;
public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2 = 0x31;
public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3 = 0x32;
+public static final int VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4 = 0x33;
public static final int VEHICLE_VALUE_TYPE_ZONED_INT32 = 0x40;
public static final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2 = 0x41;
public static final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3 = 0x42;
+public static final int VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4 = 0x43;
public static String enumToString(int v) {
switch(v) {
case VEHICLE_VALUE_TYPE_SHOUD_NOT_USE: return "VEHICLE_VALUE_TYPE_SHOUD_NOT_USE";
@@ -637,9 +639,11 @@ case VEHICLE_VALUE_TYPE_INT32_VEC4: return "VEHICLE_VALUE_TYPE_INT32_VEC4";
case VEHICLE_VALUE_TYPE_ZONED_FLOAT: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT";
case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2";
case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3";
+case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: return "VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4";
case VEHICLE_VALUE_TYPE_ZONED_INT32: return "VEHICLE_VALUE_TYPE_ZONED_INT32";
case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2";
case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3";
+case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: return "VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4";
default: return "UNKNOWN";
}
}
@@ -679,50 +683,6 @@ default: return "UNKNOWN";
}
}
-public static class VehicleErrorCode {
-public static final int VEHICLE_NO_ERROR = 0x0;
-public static final int VEHICLE_ERROR_UNKNOWN = (-2147483647 - 1);
-public static final int VEHICLE_ERROR_NO_MEMORY = -12;
-public static final int VEHICLE_ERROR_INVALID_OPERATION = -38;
-public static final int VEHICLE_ERROR_BAD_VALUE = -22;
-public static final int VEHICLE_ERROR_BAD_TYPE = (VEHICLE_ERROR_UNKNOWN + 1);
-public static final int VEHICLE_ERROR_NAME_NOT_FOUND = -2;
-public static final int VEHICLE_ERROR_PERMISSION_DENIED = -1;
-public static final int VEHICLE_ERROR_NO_INIT = -19;
-public static final int VEHICLE_ERROR_ALREADY_EXISTS = -17;
-public static final int VEHICLE_ERROR_DEAD_OBJECT = -32;
-public static final int VEHICLE_ERROR_FAILED_TRANSACTION = (VEHICLE_ERROR_UNKNOWN + 2);
-public static final int VEHICLE_ERROR_BAD_INDEX = -75;
-public static final int VEHICLE_ERROR_NOT_ENOUGH_DATA = -61;
-public static final int VEHICLE_ERROR_WOULD_BLOCK = -11;
-public static final int VEHICLE_ERROR_TIMED_OUT = -110;
-public static final int VEHICLE_ERROR_UNKNOWN_TRANSACTION = -74;
-public static final int VEHICLE_FDS_NOT_ALLOWED = (VEHICLE_ERROR_UNKNOWN + 7);
-public static String enumToString(int v) {
-switch(v) {
-case VEHICLE_NO_ERROR: return "VEHICLE_NO_ERROR";
-case VEHICLE_ERROR_UNKNOWN: return "VEHICLE_ERROR_UNKNOWN";
-case VEHICLE_ERROR_NO_MEMORY: return "VEHICLE_ERROR_NO_MEMORY";
-case VEHICLE_ERROR_INVALID_OPERATION: return "VEHICLE_ERROR_INVALID_OPERATION";
-case VEHICLE_ERROR_BAD_VALUE: return "VEHICLE_ERROR_BAD_VALUE";
-case VEHICLE_ERROR_BAD_TYPE: return "VEHICLE_ERROR_BAD_TYPE";
-case VEHICLE_ERROR_NAME_NOT_FOUND: return "VEHICLE_ERROR_NAME_NOT_FOUND";
-case VEHICLE_ERROR_PERMISSION_DENIED: return "VEHICLE_ERROR_PERMISSION_DENIED";
-case VEHICLE_ERROR_NO_INIT: return "VEHICLE_ERROR_NO_INIT";
-case VEHICLE_ERROR_ALREADY_EXISTS: return "VEHICLE_ERROR_ALREADY_EXISTS";
-case VEHICLE_ERROR_DEAD_OBJECT: return "VEHICLE_ERROR_DEAD_OBJECT";
-case VEHICLE_ERROR_FAILED_TRANSACTION: return "VEHICLE_ERROR_FAILED_TRANSACTION";
-case VEHICLE_ERROR_BAD_INDEX: return "VEHICLE_ERROR_BAD_INDEX";
-case VEHICLE_ERROR_NOT_ENOUGH_DATA: return "VEHICLE_ERROR_NOT_ENOUGH_DATA";
-case VEHICLE_ERROR_WOULD_BLOCK: return "VEHICLE_ERROR_WOULD_BLOCK";
-case VEHICLE_ERROR_TIMED_OUT: return "VEHICLE_ERROR_TIMED_OUT";
-case VEHICLE_ERROR_UNKNOWN_TRANSACTION: return "VEHICLE_ERROR_UNKNOWN_TRANSACTION";
-case VEHICLE_FDS_NOT_ALLOWED: return "VEHICLE_FDS_NOT_ALLOWED";
-default: return "UNKNOWN";
-}
-}
-}
-
public static class VehiclePropChangeMode {
public static final int VEHICLE_PROP_CHANGE_MODE_STATIC = 0x00;
public static final int VEHICLE_PROP_CHANGE_MODE_ON_CHANGE = 0x01;
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java
index 506bb2caa7..61e675b930 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropConfigUtil.java
@@ -36,6 +36,22 @@ public class VehiclePropConfigUtil {
.build();
}
+ public static VehiclePropConfig createZonedProperty(
+ int property, int propAccess, int changeType, int valueType, int zones,
+ int configFlags) {
+ return VehiclePropConfig.newBuilder().
+ setProp(property).
+ setAccess(propAccess).
+ setChangeMode(changeType).
+ setValueType(valueType).
+ setPermissionModel(VehiclePermissionModel.VEHICLE_PERMISSION_NO_RESTRICTION).
+ setZones(zones).
+ addConfigArray(configFlags).
+ setSampleRateMax(0).
+ setSampleRateMin(0).
+ build();
+ }
+
public static VehiclePropConfig createProperty(
int property, int propAccess, int changeType, int valueType, int configFlags) {
return getBuilder(property,
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
index 66e613f29d..78b2141dd6 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehiclePropValueUtil.java
@@ -17,7 +17,6 @@ package com.android.car.vehiclenetwork;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.ZonedValue;
import com.google.protobuf.ByteString;
@@ -40,7 +39,7 @@ public final class VehiclePropValueUtil {
public static VehiclePropValue createIntVectorValue(int property, int[] values,
long timestamp) {
- VehiclePropValue.Builder builder =createBuilder(property,
+ VehiclePropValue.Builder builder = createBuilder(property,
getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_INT32, values.length),
timestamp);
for (int v : values) {
@@ -57,7 +56,7 @@ public final class VehiclePropValueUtil {
public static VehiclePropValue createFloatVectorValue(int property, float[] values,
long timestamp) {
- VehiclePropValue.Builder builder =createBuilder(property,
+ VehiclePropValue.Builder builder = createBuilder(property,
getVectorValueType(VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT, values.length),
timestamp);
for (float v : values) {
@@ -93,60 +92,49 @@ public final class VehiclePropValueUtil {
public static VehiclePropValue createZonedIntValue(int property, int zone, int value,
long timestamp) {
return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, timestamp).
- setZonedValue(ZonedValue.newBuilder().
- setZoneOrWindow(zone).
- addInt32Values(value).
- build()).
+ setZone(zone).
+ addInt32Values(value).
build();
}
public static VehiclePropValue createZonedIntVectorValue(int property, int zone, int[] values,
long timestamp) {
- ZonedValue.Builder zonedValueBuilder = ZonedValue.newBuilder()
- .setZoneOrWindow(zone);
- for (int value : values) {
- zonedValueBuilder.addInt32Values(value);
- }
int valueType = getVectorValueType(
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32, values.length);
- return createBuilder(property, valueType, timestamp).
- setZonedValue(zonedValueBuilder.build()).
- build();
+ VehiclePropValue.Builder builder = createBuilder(property, valueType, timestamp).
+ setZone(zone);
+ for (int value : values) {
+ builder.addInt32Values(value);
+ }
+ return builder.build();
}
public static VehiclePropValue createZonedFloatVectorValue(int property, int zone,
float[] values, long timestamp) {
- ZonedValue.Builder zonedValueBuilder = ZonedValue.newBuilder()
- .setZoneOrWindow(zone);
- for (float value : values) {
- zonedValueBuilder.addFloatValues(value);
- }
int valueType = getVectorValueType(
VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT, values.length);
- return createBuilder(property, valueType, timestamp).
- setZonedValue(zonedValueBuilder.build()).
- build();
+ VehiclePropValue.Builder builder = createBuilder(property, valueType, timestamp).
+ setZone(zone);
+ for (float value : values) {
+ builder.addFloatValues(value);
+ }
+ return builder.build();
}
public static VehiclePropValue createZonedBooleanValue(int property, int zone, boolean value,
long timestamp) {
return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN,timestamp).
- setZonedValue(ZonedValue.
- newBuilder().
- setZoneOrWindow(zone).
- addInt32Values(value ? 1 : 0).
- build()).
+ setZone(zone).
+ addInt32Values(value ? 1 : 0).
build();
}
public static VehiclePropValue createZonedFloatValue(int property, int zone, float value,
long timestamp) {
return createBuilder(property, VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT,timestamp).
- setZonedValue(ZonedValue.newBuilder().
- setZoneOrWindow(zone).
- addFloatValues(value).
- build()).
+ setZone(zone).
+ addFloatValues(value).
build();
}
@@ -180,7 +168,8 @@ public final class VehiclePropValueUtil {
case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3:
case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:{
return createFloatVectorValue(property, new float[getVectorLength(valueType)], 0);
}
case VehicleValueType.VEHICLE_VALUE_TYPE_INT32: {
@@ -190,7 +179,8 @@ public final class VehiclePropValueUtil {
case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3:
case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
return createIntVectorValue(property, new int[getVectorLength(valueType)], 0);
}
@@ -220,6 +210,8 @@ public final class VehiclePropValueUtil {
return 3;
case VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4:
case VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
return 4;
default:
throw new IllegalArgumentException("Unknown value type: " + vehicleValueType);
@@ -244,23 +236,8 @@ public final class VehiclePropValueUtil {
+ "\n")
.append("stringValue: " + value.getStringValue() + "\n")
.append("byteValue: " + Arrays.toString(value.getBytesValue().toByteArray()) + "\n")
- .append("zonedValue: {" + toString(value.getZonedValue(), " ") + "}")
- .toString();
- }
-
- private static String toString(ZonedValue zonedValue, String indent) {
- if (zonedValue == null) {
- return "null";
- }
-
- return new StringBuilder()
- .append(indent + "zoneOrWindow: " + zonedValue.getZoneOrWindow() + "\n")
- .append(indent + "int32Values: "
- + Arrays.toString(toIntArray(zonedValue.getInt32ValuesList())) + "\n")
- .append(indent + "floatValues: "
- + Arrays.toString(toFloatArray(zonedValue.getFloatValuesList())) + "\n")
+ .append("zone: {" + value.getZone() + "}")
.toString();
-
}
public static int[] toIntArray(List<Integer> collection) {
diff --git a/libvehiclenetwork/native/IVehicleNetwork.cpp b/libvehiclenetwork/native/IVehicleNetwork.cpp
index d70a69801d..09da0eebd8 100644
--- a/libvehiclenetwork/native/IVehicleNetwork.cpp
+++ b/libvehiclenetwork/native/IVehicleNetwork.cpp
@@ -17,6 +17,7 @@
#define LOG_TAG "VehicleNetwork"
#include <memory>
+#include <string.h>
#include <binder/IPCThreadState.h>
@@ -285,20 +286,22 @@ status_t BnVehicleNetwork::onTransact(uint32_t code, const Parcel& data, Parcel*
} break;
case GET_PROPERTY: {
CHECK_INTERFACE(IVehicleNetwork, data, reply);
- ScopedVehiclePropValue value;
- r = VehiclePropValueBinderUtil::readFromParcel(data, &value.value,
+ vehicle_prop_value_t value;
+ memset(&value, 0, sizeof(value));
+ r = VehiclePropValueBinderUtil::readFromParcel(data, &value,
false /* deleteMembers */, true /*canIgnoreNoData*/);
if (r != NO_ERROR) {
ALOGE("getProperty cannot read %d", r);
return r;
}
- if (!isOperationAllowed(value.value.prop, false)) {
+ if (!isOperationAllowed(value.prop, false)) {
return PERMISSION_DENIED;
}
- r = getProperty(&(value.value));
+ r = getProperty(&value);
if (r == NO_ERROR) {
reply->writeNoException();
- r = VehiclePropValueBinderUtil::writeToParcel(*reply, value.value);
+ r = VehiclePropValueBinderUtil::writeToParcel(*reply, value);
+ releaseMemoryFromGet(&value);
}
return r;
} break;
diff --git a/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp b/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
index 164b95a94f..2d7e6c9a4e 100644
--- a/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
+++ b/libvehiclenetwork/native/VehicleNetworkProtoUtil.cpp
@@ -40,6 +40,7 @@ status_t VehicleNetworkProtoUtil::toVehiclePropValue(const vehicle_prop_value_t&
out.set_prop(in.prop);
out.set_value_type(in.value_type);
out.set_timestamp(in.timestamp);
+ out.set_zone(in.zone);
switch (in.value_type) {
case VEHICLE_VALUE_TYPE_STRING: {
//TODO fix ugly copy here for inplace mode
@@ -64,7 +65,8 @@ status_t VehicleNetworkProtoUtil::toVehiclePropValue(const vehicle_prop_value_t&
case VEHICLE_VALUE_TYPE_INT64: {
out.set_int64_value(in.value.int64_value);
} break;
- case VEHICLE_VALUE_TYPE_BOOLEAN: {
+ case VEHICLE_VALUE_TYPE_BOOLEAN:
+ case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
out.add_int32_values(in.value.int32_value);
} break;
case VEHICLE_VALUE_TYPE_INT32:
@@ -76,35 +78,23 @@ status_t VehicleNetworkProtoUtil::toVehiclePropValue(const vehicle_prop_value_t&
out.add_int32_values(in.value.int32_array[i]);
}
} break;
- case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
case VEHICLE_VALUE_TYPE_ZONED_INT32:
case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
- int expectedSize;
- if (in.value_type == VEHICLE_VALUE_TYPE_ZONED_BOOLEAN) {
- expectedSize = 1;
- } else {
- expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
- }
- ZonedValue* zonedValue = new ZonedValue();
- ASSERT_OR_HANDLE_NO_MEMORY(zonedValue, return NO_MEMORY);
- zonedValue->set_zone_or_window(in.value.zoned_int32_array.zone);
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
for (int i = 0; i < expectedSize; i++) {
- zonedValue->add_int32_values(in.value.zoned_int32_array.values[i]);
+ out.add_int32_values(in.value.int32_array[i]);
}
- out.set_allocated_zoned_value(zonedValue);
} break;
case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
- ZonedValue* zonedValue = new ZonedValue();
- ASSERT_OR_HANDLE_NO_MEMORY(zonedValue, return NO_MEMORY);
- zonedValue->set_zone_or_window(in.value.zoned_float_array.zone);
for (int i = 0; i < expectedSize; i++) {
- zonedValue->add_float_values(in.value.zoned_float_array.values[i]);
+ out.add_float_values(in.value.float_array[i]);
}
- out.set_allocated_zoned_value(zonedValue);
} break;
}
return NO_ERROR;
@@ -115,6 +105,7 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropValue(const VehiclePropValue& i
out.prop = in.prop();
out.value_type = in.value_type();
out.timestamp = in.timestamp();
+ out.zone = in.zone();
switch (out.value_type) {
case VEHICLE_VALUE_TYPE_STRING: {
if (!in.has_string_value()) {
@@ -158,20 +149,11 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropValue(const VehiclePropValue& i
return r;
}
} break;
- case VEHICLE_VALUE_TYPE_FLOAT: {
- if (in.float_values_size() != 1) {
- if (canIgnoreNoData) {
- return NO_ERROR;
- }
- ALOGE("float value, wrong size %d, expecting 1", in.float_values_size());
- return BAD_VALUE;
- }
- out.value.float_value = in.float_values(0);
- } break;
+ case VEHICLE_VALUE_TYPE_FLOAT:
case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
- int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_FLOAT_VEC2 + 2;
+ int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_FLOAT + 1;
if (in.float_values_size() != expectedSize) {
if (canIgnoreNoData) {
return NO_ERROR;
@@ -194,7 +176,8 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropValue(const VehiclePropValue& i
}
out.value.int64_value = in.int64_value();
} break;
- case VEHICLE_VALUE_TYPE_BOOLEAN: {
+ case VEHICLE_VALUE_TYPE_BOOLEAN:
+ case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
if (in.int32_values_size() != 1) {
if (canIgnoreNoData) {
return NO_ERROR;
@@ -221,60 +204,39 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropValue(const VehiclePropValue& i
out.value.int32_array[i] = in.int32_values(i);
}
} break;
- case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
+
case VEHICLE_VALUE_TYPE_ZONED_INT32:
case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
- if (!in.has_zoned_value()) {
- if (canIgnoreNoData) {
- return NO_ERROR;
- }
- ALOGE("no zoned value");
- return BAD_VALUE;
- }
- const ZonedValue& zonedValue = in.zoned_value();
- out.value.zoned_int32_array.zone = zonedValue.zone_or_window();
- int expectedSize;
- if (out.value_type == VEHICLE_VALUE_TYPE_ZONED_BOOLEAN) {
- expectedSize = 1;
- } else {
- expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
- }
- if (zonedValue.int32_values_size() != expectedSize) {
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
+ if (in.int32_values_size() != expectedSize) {
if (canIgnoreNoData) {
return NO_ERROR;
}
- ALOGE("Wrong data length in zoned int boolean value, expected:%d, got:%d",
- expectedSize, zonedValue.int32_values_size());
+ ALOGE("int32 value, wrong size %d, expecting %d", in.int32_values_size(),
+ expectedSize);
return BAD_VALUE;
}
for (int i = 0; i < expectedSize; i++) {
- out.value.zoned_int32_array.values[i] = zonedValue.int32_values(i);
+ out.value.int32_array[i] = in.int32_values(i);
}
} break;
case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
- if (!in.has_zoned_value()) {
- if (canIgnoreNoData) {
- return NO_ERROR;
- }
- ALOGE("no zoned value");
- return BAD_VALUE;
- }
- const ZonedValue& zonedValue = in.zoned_value();
- out.value.zoned_float_array.zone = zonedValue.zone_or_window();
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:{
int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
- if (zonedValue.float_values_size() != expectedSize) {
+ if (in.float_values_size() != expectedSize) {
if (canIgnoreNoData) {
return NO_ERROR;
}
- ALOGE("Wrong data length in zoned float value, expected:%d, got:%d",
- expectedSize, zonedValue.float_values_size());
+ ALOGE("float value, wrong size %d, expecting %d", in.float_values_size(),
+ expectedSize);
return BAD_VALUE;
}
for (int i = 0; i < expectedSize; i++) {
- out.value.zoned_float_array.values[i] = zonedValue.float_values(i);
+ out.value.float_array[i] = in.float_values(i);
}
} break;
default: {
@@ -332,6 +294,7 @@ status_t VehicleNetworkProtoUtil::toVehiclePropConfig(const vehicle_prop_config_
out.set_change_mode(in.change_mode);
out.set_value_type(in.value_type);
out.set_permission_model(in.permission_model);
+ out.set_zones(in.vehicle_zone_flags);
for (unsigned int i = 0; i < sizeof(in.config_array) / sizeof(int32_t); i++) {
out.add_config_array(in.config_array[i]);
}
@@ -344,26 +307,80 @@ status_t VehicleNetworkProtoUtil::toVehiclePropConfig(const vehicle_prop_config_
case VEHICLE_VALUE_TYPE_FLOAT:
case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VEHICLE_VALUE_TYPE_FLOAT_VEC4:
+ case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
+ out.add_float_maxs(in.float_max_value);
+ out.add_float_mins(in.float_min_value);
+ } break;
case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
- out.set_float_max(in.float_max_value);
- out.set_float_min(in.float_min_value);
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
+ int numZones = VehicleNetworkUtil::countNumberOfZones(in.vehicle_zone_flags);
+ if (in.float_min_values == NULL) {
+ if (in.float_max_values == NULL) {
+ // all the same min/max
+ for (int i = 0; i < numZones; i++) {
+ out.add_float_maxs(in.float_max_value);
+ out.add_float_mins(in.float_min_value);
+ }
+ } else { // invalid combination
+ ALOGW("Zoned property 0x%x, min_values NULL while max_values not NULL",
+ in.prop);
+ return BAD_VALUE;
+ }
+ } else {
+ if (in.float_max_values != NULL) {
+ for (int i = 0; i < numZones; i++) {
+ out.add_float_maxs(in.float_max_values[i]);
+ out.add_float_mins(in.float_min_values[i]);
+ }
+ } else { // invalid combination
+ ALOGW("Zoned property 0x%x, max_values NULL while min_values not NULL",
+ in.prop);
+ return BAD_VALUE;
+ }
+ }
} break;
case VEHICLE_VALUE_TYPE_INT64: {
- out.set_int64_max(in.int64_max_value);
- out.set_int64_min(in.int64_min_value);
+ out.add_int64_maxs(in.int64_max_value);
+ out.add_int64_mins(in.int64_min_value);
} break;
case VEHICLE_VALUE_TYPE_INT32:
case VEHICLE_VALUE_TYPE_INT32_VEC2:
case VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VEHICLE_VALUE_TYPE_INT32_VEC4:
+ case VEHICLE_VALUE_TYPE_INT32_VEC4: {
+ out.add_int32_maxs(in.int32_max_value);
+ out.add_int32_mins(in.int32_min_value);
+ } break;
case VEHICLE_VALUE_TYPE_ZONED_INT32:
case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
- out.set_int32_max(in.int32_max_value);
- out.set_int32_min(in.int32_min_value);
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ int numZones = VehicleNetworkUtil::countNumberOfZones(in.vehicle_zone_flags);
+ if (in.int32_min_values == NULL) {
+ if (in.int32_max_values == NULL) {
+ // all the same min/max
+ for (int i = 0; i < numZones; i++) {
+ out.add_int32_maxs(in.int32_max_value);
+ out.add_int32_mins(in.int32_min_value);
+ }
+ } else { // invalid combination
+ ALOGW("Zoned property 0x%x, min_values NULL while max_values not NULL",
+ in.prop);
+ return BAD_VALUE;
+ }
+ } else {
+ if (in.int32_max_values != NULL) {
+ for (int i = 0; i < numZones; i++) {
+ out.add_int32_maxs(in.int32_max_values[i]);
+ out.add_int32_mins(in.int32_min_values[i]);
+ }
+ } else { // invalid combination
+ ALOGW("Zoned property 0x%x, max_values NULL while min_values not NULL",
+ in.prop);
+ return BAD_VALUE;
+ }
+ }
} break;
}
out.set_sample_rate_max(in.max_sample_rate);
@@ -378,6 +395,7 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropConfig(const VehiclePropConfig&
out.change_mode = in.change_mode();
out.value_type = in.value_type();
out.permission_model = in.permission_model();
+ out.vehicle_zone_flags = in.zones();
int maxConfigSize = sizeof(out.config_array) / sizeof(int32_t);
int configSize = in.config_array_size();
if (configSize > maxConfigSize) {
@@ -404,23 +422,58 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropConfig(const VehiclePropConfig&
case VEHICLE_VALUE_TYPE_FLOAT:
case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
- if (in.has_float_max() && in.has_float_min()) {
- out.float_max_value = in.float_max();
- out.float_min_value = in.float_min();
+ case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
+ if ((in.float_maxs_size() == 1) && (in.float_mins_size() == 1)) {
+ out.float_max_value = in.float_maxs(0);
+ out.float_min_value = in.float_mins(0);
} else {
ALOGW("no float max/min for property 0x%x", out.prop);
out.float_max_value = 0;
out.float_min_value = 0;
}
} break;
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
+ int numZones = VehicleNetworkUtil::countNumberOfZones(out.vehicle_zone_flags);
+ int maxSize = in.float_maxs_size();
+ int minSize = in.float_mins_size();
+ if (maxSize != minSize) {
+ ALOGW("Zoned property 0x%x, config maxSize %d minSize %d", out.prop, maxSize,
+ minSize);
+ return BAD_VALUE;
+ }
+ if (maxSize == 0) {
+ out.float_max_value = 0;
+ out.float_min_value = 0;
+ out.float_max_values = NULL;
+ out.float_min_values = NULL;
+ } else if (maxSize == 1) { // one for all
+ out.float_max_value = in.float_maxs(0);
+ out.float_min_value = in.float_mins(0);
+ out.float_max_values = NULL;
+ out.float_min_values = NULL;
+ } else if (numZones > 1){
+ if (numZones != maxSize) {
+ ALOGW("Zoned property 0x%x, config maxSize %d num Zones %d", out.prop, maxSize,
+ numZones);
+ return BAD_VALUE;
+ }
+ out.float_max_values = new float[numZones];
+ ASSERT_OR_HANDLE_NO_MEMORY(out.float_max_values, return NO_MEMORY);
+ out.float_min_values = new float[numZones];
+ ASSERT_OR_HANDLE_NO_MEMORY(out.float_min_values, return NO_MEMORY);
+ for (int i = 0; i < numZones; i++) {
+ out.float_max_values[i] = in.float_maxs(i);
+ out.float_min_values[i] = in.float_mins(i);
+ }
+ }
+ } break;
case VEHICLE_VALUE_TYPE_INT64: {
- if (in.has_int64_max() && in.has_int64_min()) {
- out.int64_max_value = in.int64_max();
- out.int64_min_value = in.int64_min();
+ if ((in.int64_maxs_size() == 1) && (in.int64_mins_size() == 1)) {
+ out.int64_max_value = in.int64_maxs(0);
+ out.int64_min_value = in.int64_mins(0);
} else {
ALOGW("no int64 max/min for property 0x%x", out.prop);
out.int64_max_value = 0;
@@ -430,19 +483,54 @@ status_t VehicleNetworkProtoUtil::fromVehiclePropConfig(const VehiclePropConfig&
case VEHICLE_VALUE_TYPE_INT32:
case VEHICLE_VALUE_TYPE_INT32_VEC2:
case VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_INT32:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
- if (in.has_int32_max() && in.has_int32_min()) {
- out.int32_max_value = in.int32_max();
- out.int32_min_value = in.int32_min();
+ case VEHICLE_VALUE_TYPE_INT32_VEC4: {
+ if ((in.int32_maxs_size() == 1) && (in.int32_mins_size() == 1)) {
+ out.int32_max_value = in.int32_maxs(0);
+ out.int32_min_value = in.int32_mins(0);
} else {
ALOGW("no int32 max/min for property 0x%x", out.prop);
out.int32_max_value = 0;
out.int32_min_value = 0;
}
} break;
+ case VEHICLE_VALUE_TYPE_ZONED_INT32:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ int numZones = VehicleNetworkUtil::countNumberOfZones(out.vehicle_zone_flags);
+ int maxSize = in.int32_maxs_size();
+ int minSize = in.int32_mins_size();
+ if (maxSize != minSize) {
+ ALOGW("Zoned property 0x%x, config maxSize %d minSize %d", out.prop, maxSize,
+ minSize);
+ return BAD_VALUE;
+ }
+ if (maxSize == 0) {
+ out.int32_max_value = 0;
+ out.int32_min_value = 0;
+ out.int32_max_values = NULL;
+ out.int32_min_values = NULL;
+ } else if (maxSize == 1) { // one for all
+ out.int32_max_value = in.int32_maxs(0);
+ out.int32_min_value = in.int32_mins(0);
+ out.int32_max_values = NULL;
+ out.int32_min_values = NULL;
+ } else if (numZones > 1){
+ if (numZones != maxSize) {
+ ALOGW("Zoned property 0x%x, config maxSize %d num Zones %d", out.prop, maxSize,
+ numZones);
+ return BAD_VALUE;
+ }
+ out.int32_max_values = new int32_t[numZones];
+ ASSERT_OR_HANDLE_NO_MEMORY(out.int32_max_values, return NO_MEMORY);
+ out.int32_min_values = new int32_t[numZones];
+ ASSERT_OR_HANDLE_NO_MEMORY(out.int32_min_values, return NO_MEMORY);
+ for (int i = 0; i < numZones; i++) {
+ out.int32_max_values[i] = in.int32_maxs(i);
+ out.int32_min_values[i] = in.int32_mins(i);
+ }
+ }
+ } break;
}
out.max_sample_rate = in.sample_rate_max();
out.min_sample_rate = in.sample_rate_min();
diff --git a/libvehiclenetwork/proto/VehicleNetworkProto.proto b/libvehiclenetwork/proto/VehicleNetworkProto.proto
index 4cd81e4aa1..487ecfdfbc 100644
--- a/libvehiclenetwork/proto/VehicleNetworkProto.proto
+++ b/libvehiclenetwork/proto/VehicleNetworkProto.proto
@@ -24,40 +24,35 @@ message VehiclePropConfig {
required int32 change_mode = 3;
required int32 value_type = 4;
required int32 permission_model = 5;
- repeated int32 config_array = 6;
- required float sample_rate_max = 7;
- required float sample_rate_min = 8;
- optional string config_string = 9;
- optional float float_max = 10;
- optional float float_min = 11;
- optional int32 int32_max = 12;
- optional int32 int32_min = 13;
- optional int64 int64_max = 14;
- optional int64 int64_min = 15;
+ optional int32 zones = 6;
+ repeated int32 config_array = 7;
+ required float sample_rate_max = 8;
+ required float sample_rate_min = 9;
+ optional string config_string = 10;
+ repeated float float_maxs = 11;
+ repeated float float_mins = 12;
+ repeated int32 int32_maxs = 13;
+ repeated int32 int32_mins = 14;
+ repeated int64 int64_maxs = 15;
+ repeated int64 int64_mins = 16;
};
message VehiclePropConfigs {
repeated VehiclePropConfig configs = 1;
};
-message ZonedValue {
- required int32 zone_or_window = 1;
- repeated int32 int32_values = 2; // also covers boolean value.
- repeated float float_values = 3;
-};
-
message VehiclePropValue {
// common data
required int32 prop = 1;
required int32 value_type = 2;
optional int64 timestamp = 3; // required for valid data from HAL, but can be skipped for set.
// values
- repeated int32 int32_values= 4; // this also covers boolean value.
- optional int64 int64_value = 5;
- repeated float float_values = 6;
- optional string string_value = 7;
- optional bytes bytes_value = 8;
- optional ZonedValue zoned_value = 9;
+ optional int32 zone = 4;
+ repeated int32 int32_values= 5; // this also covers boolean value.
+ optional int64 int64_value = 6;
+ repeated float float_values = 7;
+ optional string string_value = 8;
+ optional bytes bytes_value = 9;
};
message VehiclePropValues {
diff --git a/service/src/com/android/car/CarServiceUtils.java b/service/src/com/android/car/CarServiceUtils.java
index fba04705ad..b47e22c81b 100644
--- a/service/src/com/android/car/CarServiceUtils.java
+++ b/service/src/com/android/car/CarServiceUtils.java
@@ -16,6 +16,8 @@
package com.android.car;
+import java.util.List;
+
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -138,4 +140,22 @@ public final class CarServiceUtils {
}
}
}
+
+ public static float[] toFloatArray(List<Float> list) {
+ final int size = list.size();
+ final float[] array = new float[size];
+ for (int i = 0; i < size; ++i) {
+ array[i] = list.get(i);
+ }
+ return array;
+ }
+
+ public static int[] toIntArray(List<Integer> list) {
+ final int size = list.size();
+ final int[] array = new int[size];
+ for (int i = 0; i < size; ++i) {
+ array[i] = list.get(i);
+ }
+ return array;
+ }
}
diff --git a/service/src/com/android/car/hal/HvacHalService.java b/service/src/com/android/car/hal/HvacHalService.java
index 958ce52ed4..34d27ffaf7 100644
--- a/service/src/com/android/car/hal/HvacHalService.java
+++ b/service/src/com/android/car/hal/HvacHalService.java
@@ -24,6 +24,7 @@ import android.car.hardware.hvac.CarHvacProperty;
import android.util.Log;
import com.android.car.CarLog;
+import com.android.car.CarServiceUtils;
import com.android.car.vehiclenetwork.VehicleNetwork;
import com.android.car.vehiclenetwork.VehicleNetworkConsts;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
@@ -130,34 +131,24 @@ public class HvacHalService extends HalServiceBase {
if(value != null) {
switch(hvacProp.getType()) {
case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
- hvacProp.setBooleanValue(zoned
- ? value.getZonedValue().getInt32Values(0) == 1
- : value.getInt32Values(0) == 1);
+ hvacProp.setBooleanValue(value.getInt32Values(0) == 1);
break;
case CarHvacManager.PROPERTY_TYPE_INT:
- hvacProp.setIntValue(zoned
- ? value.getZonedValue().getInt32Values(0)
- : value.getInt32Values(0));
+ hvacProp.setIntValue(value.getInt32Values(0));
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT:
- hvacProp.setFloatValue(zoned
- ? value.getZonedValue().getFloatValues(0)
- : value.getFloatValues(0));
+ hvacProp.setFloatValue(value.getFloatValues(0));
break;
case CarHvacManager.PROPERTY_TYPE_INT_VECTOR:
- hvacProp.setIntValues(toIntArray(zoned
- ? value.getZonedValue().getInt32ValuesList()
- : value.getInt32ValuesList()));
+ hvacProp.setIntValues(toIntArray(value.getInt32ValuesList()));
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT_VECTOR:
hvacProp.setFloatValues(
- toFloatArray(zoned
- ? value.getZonedValue().getFloatValuesList()
- : value.getFloatValuesList()));
+ toFloatArray(value.getFloatValuesList()));
break;
}
if (zoned) {
- hvacProp.setZone(zone);
+ hvacProp.setZones(zone);
}
} else {
hvacProp = null;
@@ -169,7 +160,7 @@ public class HvacHalService extends HalServiceBase {
public void setHvacProperty(CarHvacProperty prop) {
int halProp = hvacToHalPropId(prop.getPropertyId());
VehicleNetwork vehicleNetwork = mVehicleHal.getVehicleNetwork();
- int zone = prop.getZone();
+ int zone = prop.getZones();
boolean zoned = CarHvacManager.isZonedProperty(prop.getPropertyId());
switch(prop.getType()) {
@@ -263,40 +254,44 @@ public class HvacHalService extends HalServiceBase {
if (hvacPropId != 0) {
CarHvacProperty hvacProp;
int halType = p.getValueType();
- int valZone = p.getConfigArray(0);
+ int valZone = p.getZones();
switch(halType) {
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
hvacProp = new CarHvacProperty(hvacPropId, valZone, false);
break;
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
- float valMin = p.getFloatMin();
- float valMax = p.getFloatMax();
- hvacProp = new CarHvacProperty(hvacPropId, valZone, valMin, valMax, 0);
+ float[] valMins = CarServiceUtils.toFloatArray(p.getFloatMinsList());
+ float[] valMaxs = CarServiceUtils.toFloatArray(p.getFloatMaxsList());
+ hvacProp = new CarHvacProperty(hvacPropId, valZone, valMins, valMaxs, 0);
break;
}
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32: {
- int valMin = p.getInt32Min();
- int valMax = p.getInt32Max();
- hvacProp = new CarHvacProperty(hvacPropId, valZone, valMin, valMax, 0);
+ int[] valMins = CarServiceUtils.toIntArray(p.getInt32MinsList());
+ int[] valMaxs = CarServiceUtils.toIntArray(p.getInt32MaxsList());
+ hvacProp = new CarHvacProperty(hvacPropId, valZone, valMins, valMaxs, 0);
break;
}
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
{
- int valMin = p.getInt32Min();
- int valMax = p.getInt32Max();
+ int[] valMins = CarServiceUtils.toIntArray(p.getInt32MinsList());
+ int[] valMaxs = CarServiceUtils.toIntArray(p.getInt32MaxsList());
int[] values = new int[VehiclePropValueUtil.getVectorLength(halType)];
- hvacProp = new CarHvacProperty(hvacPropId, valZone, valMin, valMax, values);
+ hvacProp = new CarHvacProperty(hvacPropId, valZone, valMins, valMaxs,
+ values);
break;
}
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
{
- float valMin = p.getFloatMin();
- float valMax = p.getFloatMax();
+ float[] valMins = CarServiceUtils.toFloatArray(p.getFloatMinsList());
+ float[] valMaxs = CarServiceUtils.toFloatArray(p.getFloatMaxsList());
float[] values = new float[VehiclePropValueUtil.getVectorLength(halType)];
- hvacProp = new CarHvacProperty(hvacPropId, valZone, valMin, valMax, values);
+ hvacProp = new CarHvacProperty(hvacPropId, valZone, valMins, valMaxs,
+ values);
break;
}
@@ -341,21 +336,21 @@ public class HvacHalService extends HalServiceBase {
if (hvacPropId != 0) {
CarHvacEvent event = null;
int halType = v.getValueType();
- int zone = v.getZonedValue().getZoneOrWindow();
+ int zone = v.getZone();
switch(halType) {
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
- hvacPropId, zone, v.getZonedValue().getInt32Values(0) == 1);
+ hvacPropId, zone, v.getInt32Values(0) == 1);
break;
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT: {
event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
- hvacPropId, zone, v.getZonedValue().getFloatValues(0));
+ hvacPropId, zone, v.getFloatValues(0));
break;
}
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32: {
event = new CarHvacEvent(CarHvacEvent.HVAC_EVENT_PROPERTY_CHANGE,
- hvacPropId, zone, v.getZonedValue().getInt32Values(0));
+ hvacPropId, zone, v.getInt32Values(0));
break;
}
default:
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 8cf412ac40..04559f789b 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -266,7 +266,7 @@ public class PowerHalService extends HalServiceBase {
VehiclePropConfig brightnessProperty = mProperties.get(
VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS);
if (brightnessProperty != null) {
- mMaxDisplayBrightness = brightnessProperty.getInt32Max();
+ mMaxDisplayBrightness = brightnessProperty.getInt32Maxs(0);
if (mMaxDisplayBrightness <= 0) {
Log.w(CarLog.TAG_POWER, "Max display brightness from vehicle HAL is invald:" +
mMaxDisplayBrightness);
diff --git a/service/src/com/android/car/hal/VehicleHal.java b/service/src/com/android/car/hal/VehicleHal.java
index ef0e6c7382..9bb076b5bf 100644
--- a/service/src/com/android/car/hal/VehicleHal.java
+++ b/service/src/com/android/car/hal/VehicleHal.java
@@ -321,17 +321,17 @@ public class VehicleHal implements VehicleNetworkListener {
builder.append(",config:" + Integer.toHexString(config.getConfigArray(0)));
builder.append(",fs min:" + config.getSampleRateMin());
builder.append(",fs max:" + config.getSampleRateMax());
- if (config.hasFloatMin()) {
- builder.append(",v min:" + config.getFloatMin());
- builder.append(",v max:" + config.getFloatMax());
+ for (int i = 0; i < config.getFloatMaxsCount(); i++) {
+ builder.append(",v min:" + config.getFloatMins(i));
+ builder.append(",v max:" + config.getFloatMaxs(i));
}
- if (config.hasInt32Min()) {
- builder.append(",v min:" + config.getInt32Min());
- builder.append(",v max:" + config.getInt32Max());
+ for (int i = 0; i < config.getInt32MaxsCount(); i++) {
+ builder.append(",v min:" + config.getInt32Mins(i));
+ builder.append(",v max:" + config.getInt32Maxs(i));
}
- if (config.hasInt64Min()) {
- builder.append(",v min:" + config.getInt64Min());
- builder.append(",v max:" + config.getInt64Max());
+ for (int i = 0; i < config.getInt64MaxsCount(); i++) {
+ builder.append(",v min:" + config.getInt64Mins(i));
+ builder.append(",v max:" + config.getInt64Maxs(i));
}
writer.println(builder.toString());
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
index 002b38724a..f41fda2ce3 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/hvac/HvacTestFragment.java
@@ -62,12 +62,17 @@ public class HvacTestFragment extends Fragment {
private float mCurDTemp = 23;
private float mCurPTemp = 23;
private CarHvacManager mCarHvacManager;
+ private int mZoneForAcOn;
+ private int mZoneForSetTempD;
+ private int mZoneForSetTempP;
+ private int mZoneForFanSpeed;
+ private int mZoneForFanPosition;
private final CarHvacManager.CarHvacEventListener mHvacListener =
new CarHvacManager.CarHvacEventListener () {
@Override
public void onChangeEvent(final CarHvacManager.CarHvacBaseProperty value) {
- int zone = value.getZone();
+ int zones = value.getZones();
switch(value.getPropertyId()) {
case CarHvacManager.HVAC_ZONED_AC_ON:
mTbAc.setChecked(((CarHvacBooleanValue)value).getValue());
@@ -91,30 +96,27 @@ public class HvacTestFragment extends Fragment {
}
break;
case CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT:
- mCurFanSpeed = ((CarHvacIntValue)value).getValue();
- mTvFanSpeed.setText(String.valueOf(mCurFanSpeed));
+ if ((zones & mZoneForFanSpeed) != 0) {
+ mCurFanSpeed = ((CarHvacIntValue)value).getValue();
+ mTvFanSpeed.setText(String.valueOf(mCurFanSpeed));
+ }
break;
case CarHvacManager.HVAC_ZONED_TEMP_SETPOINT:
- switch(zone) {
- case VehicleZone.VEHICLE_ZONE_ROW_1_LEFT:
- mCurDTemp = ((CarHvacFloatValue)value).getValue();
- mTvDTemp.setText(String.valueOf(mCurDTemp));
- break;
- case VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT:
- mCurPTemp = ((CarHvacFloatValue)value).getValue();
- mTvPTemp.setText(String.valueOf(mCurPTemp));
- break;
- default:
- Log.w(TAG, "Unknown zone = " + zone);
- break;
+ if ((zones & mZoneForSetTempD) != 0) {
+ mCurDTemp = ((CarHvacFloatValue)value).getValue();
+ mTvDTemp.setText(String.valueOf(mCurDTemp));
+ }
+ if ((zones & mZoneForSetTempP) != 0) {
+ mCurPTemp = ((CarHvacFloatValue)value).getValue();
+ mTvPTemp.setText(String.valueOf(mCurPTemp));
}
break;
case CarHvacManager.HVAC_WINDOW_DEFROSTER_ON:
- if((zone & VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD) ==
+ if((zones & VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD) ==
VehicleWindow.VEHICLE_WINDOW_FRONT_WINDSHIELD) {
mTbDefrostFront.setChecked(((CarHvacBooleanValue)value).getValue());
}
- if((zone & VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD) ==
+ if((zones & VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD) ==
VehicleWindow.VEHICLE_WINDOW_REAR_WINDSHIELD) {
mTbDefrostRear.setChecked(((CarHvacBooleanValue)value).getValue());
}
@@ -158,41 +160,24 @@ public class HvacTestFragment extends Fragment {
int type = prop.getType();
if(DBG) {
- switch(type) {
- case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
- Log.d(TAG, "propertyId = " + propId + " type = " + type +
- " zone = " + prop.getZone());
- break;
- case CarHvacManager.PROPERTY_TYPE_FLOAT:
- CarHvacFloatProperty f = (CarHvacFloatProperty)prop;
- Log.d(TAG, "propertyId = " + propId + " type = " + type +
- " zone = " + f.getZone() + " min = " + f.getMinValue() +
- " max = " + f.getMaxValue());
- break;
- case CarHvacManager.PROPERTY_TYPE_INT:
- CarHvacIntProperty i = (CarHvacIntProperty)prop;
- Log.d(TAG, "propertyId = " + propId + " type = " + type +
- " zone = " + i.getZone() + " min = " + i.getMinValue() +
- " max = " + i.getMaxValue());
- break;
- }
+ Log.d(TAG, prop.toString());
}
switch(propId) {
case CarHvacManager.HVAC_ZONED_AC_ON:
- configureAcOn(v);
+ configureAcOn(v, prop);
break;
case CarHvacManager.HVAC_ZONED_FAN_POSITION:
- configureFanPosition(v);
+ configureFanPosition(v, prop);
break;
case CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT:
- configureFanSpeed(v);
+ configureFanSpeed(v, prop);
break;
case CarHvacManager.HVAC_ZONED_TEMP_SETPOINT:
- configureTempSetpoint(v);
+ configureTempSetpoint(v, prop);
break;
case CarHvacManager.HVAC_WINDOW_DEFROSTER_ON:
- configureDefrosterOn(v, prop.getZone());
+ configureDefrosterOn(v, prop.getZones());
break;
default:
Log.w(TAG, "propertyId " + propId + " is not handled");
@@ -219,19 +204,49 @@ public class HvacTestFragment extends Fragment {
mCarHvacManager = hvacManager;
}
- private void configureAcOn(View v) {
+ private static int getFirstZone(int zones) {
+ if (zones == 0) {
+ return 0;
+ }
+ int flag = 0x1;
+ for (int i = 0; i < 32; i++) {
+ if ((flag & zones) != 0) {
+ return flag;
+ }
+ flag <<= 1;
+ }
+ return 0;
+ }
+
+ private static int getNextZone(int zones, int startingZone) {
+ int flag = startingZone << 1;
+ while (flag != 0x80000000) {
+ if ((flag & zones) != 0) {
+ return flag;
+ }
+ flag <<= 1;
+ }
+ if ((flag & zones) != 0) {
+ return flag;
+ }
+ return 0;
+ }
+
+ private void configureAcOn(View v, CarHvacBaseProperty prop) {
+ mZoneForAcOn = getFirstZone(prop.getZones());
mTbAc = (ToggleButton)v.findViewById(R.id.tbAc);
mTbAc.setEnabled(true);
mTbAc.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO handle zone properly
- mCarHvacManager.setBooleanProperty(CarHvacManager.HVAC_ZONED_AC_ON, 0x8,
+ mCarHvacManager.setBooleanProperty(CarHvacManager.HVAC_ZONED_AC_ON, mZoneForAcOn,
mTbAc.isChecked());
}
});
}
- private void configureFanPosition(View v) {
+ private void configureFanPosition(View v, CarHvacBaseProperty prop) {
+ mZoneForFanPosition = getFirstZone(prop.getZones());
RadioGroup rg = (RadioGroup)v.findViewById(R.id.rgFanPosition);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
@@ -239,18 +254,18 @@ public class HvacTestFragment extends Fragment {
switch(checkedId) {
case R.id.rbPositionFace:
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_POSITION,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL,
+ mZoneForFanPosition,
VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FACE);
break;
case R.id.rbPositionFloor:
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_POSITION,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL,
+ mZoneForFanPosition,
VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FLOOR);
break;
case R.id.rbPositionFaceAndFloor:
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_POSITION,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL, VehicleHvacFanDirection.
- VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR);
+ mZoneForFanPosition,
+ VehicleHvacFanDirection.VEHICLE_HVAC_FAN_DIRECTION_FACE_AND_FLOOR);
break;
}
}
@@ -264,10 +279,11 @@ public class HvacTestFragment extends Fragment {
mRbFanPositionFloor.setClickable(true);
}
- private void configureFanSpeed(View v) {
+ private void configureFanSpeed(View v, CarHvacBaseProperty prop) {
+ mZoneForFanSpeed = getFirstZone(prop.getZones());
mCurFanSpeed = mCarHvacManager.getIntProperty(
CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL);
+ mZoneForFanSpeed);
Button btnFanSpeedUp = (Button) v.findViewById(R.id.btnFanSpeedUp);
btnFanSpeedUp.setEnabled(true);
@@ -277,7 +293,7 @@ public class HvacTestFragment extends Fragment {
mCurFanSpeed++;
mTvFanSpeed.setText(String.valueOf(mCurFanSpeed));
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL, mCurFanSpeed);
+ mZoneForFanSpeed, mCurFanSpeed);
}
}
});
@@ -290,71 +306,96 @@ public class HvacTestFragment extends Fragment {
mCurFanSpeed--;
mTvFanSpeed.setText(String.valueOf(mCurFanSpeed));
mCarHvacManager.setIntProperty(CarHvacManager.HVAC_ZONED_FAN_SPEED_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_ALL, mCurFanSpeed);
+ mZoneForFanSpeed, mCurFanSpeed);
}
}
});
}
- private void configureTempSetpoint(View v) {
- mCurDTemp = mCarHvacManager.getFloatProperty(
- CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT);
- mCurPTemp = mCarHvacManager.getFloatProperty(
- CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT);
-
+ private void configureTempSetpoint(View v, CarHvacBaseProperty prop) {
+ mZoneForSetTempD = 0;
+ if ((prop.getZones() & VehicleZone.VEHICLE_ZONE_ROW_1_LEFT) != 0) {
+ mZoneForSetTempD = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
+ }
+ mZoneForSetTempP = 0;
+ if ((prop.getZones() & VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT) != 0) {
+ mZoneForSetTempP = VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT;
+ }
+ if (mZoneForSetTempD == 0) {
+ mZoneForSetTempD = getFirstZone(prop.getZones());
+ }
+ if (mZoneForSetTempP == 0) {
+ mZoneForSetTempP = getNextZone(prop.getZones(), mZoneForSetTempD);
+ }
+ int numZones = CarHvacBaseProperty.getNumZones(prop.getZones());
+ if (numZones < 2) {
+ mZoneForSetTempP = 0;
+ }
Button btnDTempUp = (Button) v.findViewById(R.id.btnDTempUp);
- btnDTempUp.setEnabled(true);
- btnDTempUp.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- if(mCurDTemp < 29.5) {
- mCurDTemp += 0.5;
- mTvDTemp.setText(String.valueOf(mCurDTemp));
- mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, mCurDTemp);
+ if (mZoneForSetTempD != 0) {
+ mCurDTemp = mCarHvacManager.getFloatProperty(
+ CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempD);
+ btnDTempUp.setEnabled(true);
+ btnDTempUp.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if(mCurDTemp < 29.5) {
+ mCurDTemp += 0.5;
+ mTvDTemp.setText(String.valueOf(mCurDTemp));
+ mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempD, mCurDTemp);
+ }
}
- }
- });
+ });
- Button btnDTempDn = (Button) v.findViewById(R.id.btnDTempDn);
- btnDTempDn.setEnabled(true);
- btnDTempDn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- if(mCurDTemp > 15.5) {
- mCurDTemp -= 0.5;
- mTvDTemp.setText(String.valueOf(mCurDTemp));
- mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_LEFT, mCurDTemp);
+ Button btnDTempDn = (Button) v.findViewById(R.id.btnDTempDn);
+ btnDTempDn.setEnabled(true);
+ btnDTempDn.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if(mCurDTemp > 15.5) {
+ mCurDTemp -= 0.5;
+ mTvDTemp.setText(String.valueOf(mCurDTemp));
+ mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempD, mCurDTemp);
+ }
}
- }
- });
+ });
+ } else {
+ btnDTempUp.setEnabled(false);
+ }
Button btnPTempUp = (Button) v.findViewById(R.id.btnPTempUp);
- btnPTempUp.setEnabled(true);
- btnPTempUp.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- if (mCurPTemp < 29.5) {
- mCurPTemp += 0.5;
- mTvPTemp.setText(String.valueOf(mCurPTemp));
- mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT, mCurPTemp);
+ if (mZoneForSetTempP !=0 ) {
+ mCurPTemp = mCarHvacManager.getFloatProperty(
+ CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempP);
+ btnPTempUp.setEnabled(true);
+ btnPTempUp.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if (mCurPTemp < 29.5) {
+ mCurPTemp += 0.5;
+ mTvPTemp.setText(String.valueOf(mCurPTemp));
+ mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempP, mCurPTemp);
+ }
}
- }
- });
+ });
- Button btnPTempDn = (Button) v.findViewById(R.id.btnPTempDn);
- btnPTempDn.setEnabled(true);
- btnPTempDn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- if (mCurPTemp > 15.5) {
- mCurPTemp -= 0.5;
- mTvPTemp.setText(String.valueOf(mCurPTemp));
- mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
- VehicleZone.VEHICLE_ZONE_ROW_1_RIGHT, mCurPTemp);
+ Button btnPTempDn = (Button) v.findViewById(R.id.btnPTempDn);
+ btnPTempDn.setEnabled(true);
+ btnPTempDn.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ if (mCurPTemp > 15.5) {
+ mCurPTemp -= 0.5;
+ mTvPTemp.setText(String.valueOf(mCurPTemp));
+ mCarHvacManager.setFloatProperty(CarHvacManager.HVAC_ZONED_TEMP_SETPOINT,
+ mZoneForSetTempP, mCurPTemp);
+ }
}
- }
- });
+ });
+ } else {
+ btnPTempUp.setEnabled(false);
+ }
}
private void configureDefrosterOn(View v, int zone) {
diff --git a/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java b/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
index 13d0936495..497e6c65b5 100644
--- a/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarHvacManagerTest.java
@@ -212,21 +212,21 @@ public class CarHvacManagerTest extends MockedCarTestBase {
case CarHvacManager.PROPERTY_TYPE_BOOLEAN:
CarHvacBooleanValue boolVal = (CarHvacBooleanValue) value;
mEventBoolVal = boolVal.getValue();
- mEventZoneVal = boolVal.getZone();
+ mEventZoneVal = boolVal.getZones();
Log.d(TAG, "onChangeEvent - propId = " + boolVal.getPropertyId() +
" bool = " + boolVal.getValue());
break;
case CarHvacManager.PROPERTY_TYPE_FLOAT:
CarHvacFloatValue floatVal = (CarHvacFloatValue) value;
mEventFloatVal = floatVal.getValue();
- mEventZoneVal = floatVal.getZone();
+ mEventZoneVal = floatVal.getZones();
Log.d(TAG, "onChangeEvent - propId = " + floatVal.getPropertyId() +
" float = " + floatVal.getValue());
break;
case CarHvacManager.PROPERTY_TYPE_INT:
CarHvacIntValue intVal = (CarHvacIntValue) value;
mEventIntVal = intVal.getValue();
- mEventZoneVal = intVal.getZone();
+ mEventZoneVal = intVal.getZones();
Log.d(TAG, "onChangeEvent - propId = " + intVal.getPropertyId() +
" int = " + intVal.getValue());
break;
diff --git a/tests/libvehiclenetwork-java-test/Android.mk b/tests/libvehiclenetwork-java-test/Android.mk
index bde7dda392..6dae564f46 100644
--- a/tests/libvehiclenetwork-java-test/Android.mk
+++ b/tests/libvehiclenetwork-java-test/Android.mk
@@ -15,7 +15,7 @@
#
LOCAL_PATH:= $(call my-dir)
-
+##################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -36,3 +36,14 @@ LOCAL_STATIC_JAVA_LIBRARIES += libvehiclenetwork-java
LOCAL_JAVA_LIBRARIES := android.test.runner
include $(BUILD_PACKAGE)
+
+##################################
+include $(CLEAR_VARS)
+#vendor_vns_policy for testing purpose
+LOCAL_MODULE := vendor_vns_policy.xml
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+LOCAL_MODULE_TAGS := tests
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/vns
+include $(BUILD_PREBUILT)
+
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java
index 7b3c5e6a77..78b0ece3c4 100644
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java
+++ b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkMockedTest.java
@@ -31,7 +31,6 @@ import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.ZonedValue;
import com.android.car.vehiclenetwork.VehiclePropConfigUtil;
import com.android.car.vehiclenetwork.VehiclePropValueUtil;
@@ -111,21 +110,25 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createIntVectorValue(
CUSTOM_PROPERTY_INT32_VEC2, new int[2], 0)));
mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
+ VehiclePropConfigUtil.createZonedProperty(
CUSTOM_PROPERTY_ZONED_INT32_VEC3,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3, 0x0),
+ VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3,
+ VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
+ 0x0),
new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedIntVectorValue(
CUSTOM_PROPERTY_ZONED_INT32_VEC3,
VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
new int[3], 0)));
mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
+ VehiclePropConfigUtil.createZonedProperty(
CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2, 0x0),
+ VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2,
+ VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
+ 0x0),
new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
CUSTOM_PROPERTY_ZONED_FLOAT_VEC2,
VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
@@ -139,11 +142,13 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createFloatVectorValue(
CUSTOM_PROPERTY_FLOAT_VEC2, new float[2], 0)));
mVehicleHalMock.registerProperty(
- VehiclePropConfigUtil.createProperty(
+ VehiclePropConfigUtil.createZonedProperty(
CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
VehiclePropAccess.VEHICLE_PROP_ACCESS_READ_WRITE,
VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE,
- VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3, 0x0),
+ VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3,
+ VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
+ 0x0),
new DefaultVehiclePropertyHandler(VehiclePropValueUtil.createZonedFloatVectorValue(
CUSTOM_PROPERTY_ZONED_FLOAT_VEC3,
VehicleZone.VEHICLE_ZONE_ROW_1_LEFT,
@@ -328,7 +333,7 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
final int ZONE = VehicleZone.VEHICLE_ZONE_ROW_1_LEFT;
final int[] VALUES = new int[] {10, 20, 30};
mVehicleNetwork.startMocking(mVehicleHalMock);
- mVehicleNetwork.subscribe(PROPERTY, ZONE);
+ mVehicleNetwork.subscribe(PROPERTY, 0, ZONE);
VehiclePropValue value = VehiclePropValueUtil.createZonedIntVectorValue(
PROPERTY, ZONE, VALUES, 0);
mVehicleNetwork.injectEvent(value);
@@ -366,6 +371,7 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
@Override
public void onVehicleNetworkEvents(VehiclePropValues values) {
+ Log.i(TAG, "onVehicleNetworkEvents");
mValuesReceived = values;
mEventWait.release();
}
@@ -501,7 +507,7 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
@Override
public synchronized VehiclePropValue onPropertyGet(VehiclePropValue property) {
- int zone = getZoneOrDefault(property.getZonedValue());
+ int zone = property.getZone();
VehiclePropValue value = mZoneValueMap.get(zone);
if (value == null) {
Log.w(TAG, "Property not found: " + property.getProp() + ", zone: " + zone);
@@ -511,7 +517,8 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
@Override
public void onPropertySubscribe(int property, float sampleRate, int zones) {
- // TODO Auto-generated method stub
+ Log.i(TAG, "Property subscribed:0x" + Integer.toHexString(property) +
+ " zones:0x" + Integer.toHexString(zones));
}
@Override
@@ -520,12 +527,7 @@ public class VehicleNetworkMockedTest extends AndroidTestCase {
}
private void setValue(VehiclePropValue value) {
- mZoneValueMap.put(getZoneOrDefault(value.getZonedValue()), VehiclePropValue.newBuilder(value).build());
- }
-
- private int getZoneOrDefault(ZonedValue value) {
- return value != null ? value.getZoneOrWindow() : 0;
-
+ mZoneValueMap.put(value.getZone(), VehiclePropValue.newBuilder(value).build());
}
}
}
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java
index dc2d472018..5febc7e664 100644
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java
+++ b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTest.java
@@ -118,7 +118,7 @@ public class VehicleNetworkTest extends AndroidTestCase {
build();
mVehicleNetwork.setProperty(value);
fail();
- } catch (IllegalArgumentException e) {
+ } catch (SecurityException e) {
// expected
}
VehiclePropConfigs configs = mVehicleNetwork.listProperties();
@@ -154,7 +154,7 @@ public class VehicleNetworkTest extends AndroidTestCase {
try {
mVehicleNetwork.subscribe(-1, 0);
fail();
- } catch (IllegalArgumentException e) {
+ } catch (SecurityException e) {
//expected
}
VehiclePropConfigs configs = mVehicleNetwork.listProperties();
diff --git a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
index 0542cfb6e2..91c155ba4d 100644
--- a/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
+++ b/tests/libvehiclenetwork-java-test/src/com/android/car/vehiclenetwork/libtest/VehicleNetworkTestUtil.java
@@ -17,7 +17,6 @@ package com.android.car.vehiclenetwork.libtest;
import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.ZonedValue;
import com.google.protobuf.ByteString;
public class VehicleNetworkTestUtil {
@@ -38,11 +37,9 @@ public class VehicleNetworkTestUtil {
break;
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32:
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
- builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).addInt32Values(0).
- build());
+ builder.setZone(0).addInt32Values(0);
case VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- builder.setZonedValue(ZonedValue.newBuilder().setZoneOrWindow(0).addFloatValues(0f).
- build());
+ builder.setZone(0).addFloatValues(0f);
case VehicleValueType.VEHICLE_VALUE_TYPE_INT64:
builder.setInt64Value(0);
break;
diff --git a/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml b/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml
new file mode 100644
index 0000000000..8d48fdba6f
--- /dev/null
+++ b/tests/libvehiclenetwork-java-test/vendor_vns_policy.xml
@@ -0,0 +1,34 @@
+<ALLOW>
+ <PROPERTY name="CUSTOM_PROPERTY_INT32" value = "0x70000000">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32" value = "0x70000001">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32_VEC2" value = "0x70000002">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_ZONED_INT32_VEC3" value = "0x70000003">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_ZONED_FLOAT_VEC2" value = "0x70000004">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_ZONED_FLOAT_VEC3" value = "0x70000005">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_FLOAT_VEC2" value = "0x70000006">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+
+ <PROPERTY name="CUSTOM_PROPERTY_INT32_VEC2" value = "0x70000007">
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
+ </PROPERTY>
+</ALLOW>
+
diff --git a/vehicle_network_service/VehicleHalPropertyUtil.h b/vehicle_network_service/VehicleHalPropertyUtil.h
index da0d476909..0a9eb31744 100644
--- a/vehicle_network_service/VehicleHalPropertyUtil.h
+++ b/vehicle_network_service/VehicleHalPropertyUtil.h
@@ -26,6 +26,8 @@
#include <utils/String8.h>
+#include <IVehicleNetwork.h>
+
namespace android {
class VechilePropertyUtil {
@@ -33,20 +35,46 @@ public:
static void dumpProperty(String8& msg, const vehicle_prop_config_t& config) {
msg.appendFormat("property 0x%x, access:0x%x, change_mode:0x%x, value_type:0x%x",
config.prop, config.access, config.change_mode, config.value_type);
- msg.appendFormat(",permission:0x%x, conflg_flag:0x%x, fsmin:%f, fsmax:%f",
- config.permission_model, config.config_flags, config.min_sample_rate,
- config.max_sample_rate);
+ msg.appendFormat(",permission:0x%x, zones:0x%x, conflg_flag:0x%x, fsmin:%f, fsmax:%f",
+ config.permission_model, config.vehicle_zone_flags, config.config_flags,
+ config.min_sample_rate, config.max_sample_rate);
switch (config.value_type) {
case VEHICLE_VALUE_TYPE_FLOAT:
case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
- case VEHICLE_VALUE_TYPE_FLOAT_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3: {
+ case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
msg.appendFormat(",v min:%f, v max:%f\n", config.float_min_value,
config.float_max_value);
} break;
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
+ if (config.float_min_values == NULL) {
+ if (config.float_max_values == NULL) {
+ msg.appendFormat(",v min:%f, v max:%f\n", config.float_min_value,
+ config.float_max_value);
+ } else {
+ msg.appendFormat(", ERROR: float_max_values not NULL while min is NULL");
+
+ }
+ } else {
+ if (config.float_max_values == NULL) {
+ msg.appendFormat(", ERROR: float_min_values not NULL while max is NULL");
+ } else {
+ int n = VehicleNetworkUtil::countNumberOfZones(
+ config.vehicle_zone_flags);
+ msg.appendFormat(", v min:");
+ for (int i = 0; i < n; i++) {
+ msg.appendFormat("%f,", config.float_min_values[i]);
+ }
+ msg.appendFormat(", v max:");
+ for (int i = 0; i < n; i++) {
+ msg.appendFormat("%f,", config.float_max_values[i]);
+ }
+ }
+ }
+ } break;
case VEHICLE_VALUE_TYPE_INT64: {
msg.appendFormat(",v min:%" PRId64 " max:%" PRId64 "\n", config.int64_min_value,
config.int64_max_value);
@@ -54,13 +82,39 @@ public:
case VEHICLE_VALUE_TYPE_INT32:
case VEHICLE_VALUE_TYPE_INT32_VEC2:
case VEHICLE_VALUE_TYPE_INT32_VEC3:
- case VEHICLE_VALUE_TYPE_INT32_VEC4:
- case VEHICLE_VALUE_TYPE_ZONED_INT32:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
- case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3: {
+ case VEHICLE_VALUE_TYPE_INT32_VEC4: {
msg.appendFormat(",v min:%d, v max:%d\n", config.int32_min_value,
config.int32_max_value);
} break;
+ case VEHICLE_VALUE_TYPE_ZONED_INT32:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
+ case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
+ if (config.int32_min_values == NULL) {
+ if (config.int32_max_values == NULL) {
+ msg.appendFormat(",v min:%d, v max:%d\n", config.int32_min_value,
+ config.int32_max_value);
+ } else {
+ msg.appendFormat(", ERROR: int32_max_values not NULL while min is NULL");
+
+ }
+ } else {
+ if (config.int32_max_values == NULL) {
+ msg.appendFormat(", ERROR: int32_min_values not NULL while max is NULL");
+ } else {
+ int n = VehicleNetworkUtil::countNumberOfZones(
+ config.vehicle_zone_flags);
+ msg.appendFormat(", v min:");
+ for (int i = 0; i < n; i++) {
+ msg.appendFormat("%d,", config.int32_min_values[i]);
+ }
+ msg.appendFormat(", v max:");
+ for (int i = 0; i < n; i++) {
+ msg.appendFormat("%d,", config.int32_max_values[i]);
+ }
+ }
+ }
+ } break;
default:
msg.appendFormat("\n");
}
diff --git a/vehicle_network_service/VehicleNetworkService.cpp b/vehicle_network_service/VehicleNetworkService.cpp
index d717e7a069..2a6b5741e4 100644
--- a/vehicle_network_service/VehicleNetworkService.cpp
+++ b/vehicle_network_service/VehicleNetworkService.cpp
@@ -517,13 +517,43 @@ status_t VehicleNetworkService::getProperty(vehicle_prop_value_t *data) {
}
return r;
}
- status_t r = mDevice->get(mDevice, data);
+ /*
+ * get call can return NOT_READY error when hal has not fetched all data. In that case,
+ * keep retrying for certain time with some sleep. This will happen only at initial stage.
+ */
+ status_t r = -EAGAIN;
+ int retryCount = 0;
+ while (true) {
+ r = mDevice->get(mDevice, data);
+ if (r == NO_ERROR) {
+ break;
+ }
+ if (r != -EAGAIN) {
+ break;
+ }
+ retryCount++;
+ if (retryCount > MAX_GET_RETRY_FOR_NOT_READY) {
+ ALOGE("Vehicle hal keep retrying not ready after multiple retries");
+ break;
+ }
+ usleep(GET_WAIT_US);
+ }
if (r != NO_ERROR) {
ALOGW("getProperty 0x%x failed, HAL returned %d", data->prop, r);
}
return r;
}
+void VehicleNetworkService::releaseMemoryFromGet(vehicle_prop_value_t* value) {
+ switch (value->prop) {
+ case VEHICLE_VALUE_TYPE_STRING:
+ case VEHICLE_VALUE_TYPE_BYTES: {
+ Mutex::Autolock autoLock(mLock);
+ mDevice->release_memory_from_get(mDevice, value);
+ } break;
+ }
+}
+
status_t VehicleNetworkService::setProperty(const vehicle_prop_value_t& data) {
bool isInternalProperty = false;
bool inMocking = false;
@@ -774,6 +804,7 @@ bool VehicleNetworkService::removePropertyFromClientLocked(sp<IBinder>& ibinder,
}
status_t VehicleNetworkService::injectEvent(const vehicle_prop_value_t& value) {
+ ALOGI("injectEvent property:0x%x", value.prop);
return onHalEvent(&value, true);
}
diff --git a/vehicle_network_service/VehicleNetworkService.h b/vehicle_network_service/VehicleNetworkService.h
index 5d6afee103..6c2a998e4a 100644
--- a/vehicle_network_service/VehicleNetworkService.h
+++ b/vehicle_network_service/VehicleNetworkService.h
@@ -295,6 +295,7 @@ public:
virtual sp<VehiclePropertiesHolder> listProperties(int32_t property = 0);
virtual status_t setProperty(const vehicle_prop_value_t& value);
virtual status_t getProperty(vehicle_prop_value_t* value);
+ virtual void releaseMemoryFromGet(vehicle_prop_value_t* value);
virtual status_t subscribe(const sp<IVehicleNetworkListener> &listener, int32_t property,
float sampleRate, int32_t zones);
virtual void unsubscribe(const sp<IVehicleNetworkListener> &listener, int32_t property);
@@ -334,6 +335,9 @@ private:
static int eventCallback(const vehicle_prop_value_t *eventData);
static int errorCallback(int32_t errorCode, int32_t property, int32_t operation);
private:
+ static const int GET_WAIT_US = 100000;
+ static const int MAX_GET_RETRY_FOR_NOT_READY = 30;
+
VehiclePropertyAccessControl mVehiclePropertyAccessControl;
static VehicleNetworkService* sInstance;
sp<HandlerThread> mHandlerThread;
diff --git a/vns_policy/vns_policy.xml b/vns_policy/vns_policy.xml
index 0fb5be02d8..5b0a396419 100644
--- a/vns_policy/vns_policy.xml
+++ b/vns_policy/vns_policy.xml
@@ -1,6 +1,7 @@
<ALLOW>
<PROPERTY name="VEHICLE_PROPERTY_INVALID" value = "0x0">
- <UID name="AID_SYSTEM" access="r" value="1000"/>
+ <!-- Property 0 write is used to allow hal mocking -->
+ <UID name="AID_SYSTEM" access="rw" value="1000"/>
<UID name="AID_AUDIOSERVER" access="r" value="1041"/>
</PROPERTY>