Add default behavior for HVAC power
Add properties to HVAC_POWER_ON config string
Return NOT_AVAILABLE for properties in HVAC_POWER_ON config string when
power is off.
Change-Id: Icfa06aa169345e973d2e152aa6dbd8c14f3a5d17
diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h
index 3c17183..9591689 100644
--- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h
+++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultConfig.h
@@ -28,6 +28,11 @@
namespace impl {
+const VehicleProperty kHvacPowerProperties[] = {
+ VehicleProperty::HVAC_FAN_SPEED,
+ VehicleProperty::HVAC_FAN_DIRECTION,
+};
+
const VehiclePropConfig kVehicleProperties[] = {
{
.prop = toInt(VehicleProperty::INFO_MAKE),
@@ -63,7 +68,10 @@
.prop = toInt(VehicleProperty::HVAC_POWER_ON),
.access = VehiclePropertyAccess::READ_WRITE,
.changeMode = VehiclePropertyChangeMode::ON_CHANGE,
- .supportedAreas = toInt(VehicleAreaZone::ROW_1)
+ .supportedAreas = toInt(VehicleAreaZone::ROW_1),
+ // TODO(bryaneyler): Ideally, this is generated dynamically from
+ // kHvacPowerProperties.
+ .configString = "0x12400500,0x12400501" // HVAC_FAN_SPEED,HVAC_FAN_DIRECTION
},
{
diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
index 38e21c7..7a66c04 100644
--- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
+++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp
@@ -102,9 +102,9 @@
{
std::lock_guard<std::mutex> lock(mPropsMutex);
- for (auto& propVal : mProps) {
+ for (auto& prop : mProps) {
emulator::VehiclePropValue* protoVal = respMsg.add_value();
- populateProtoVehiclePropValue(protoVal, propVal.get());
+ populateProtoVehiclePropValue(protoVal, prop.second.get());
}
}
}
@@ -172,10 +172,9 @@
areaId = 0;
}
- for (auto& prop : mProps) {
- if ((prop->prop == propId) && (prop->areaId == areaId)) {
- return prop.get();
- }
+ auto prop = mProps.find(std::make_pair(propId, areaId));
+ if (prop != mProps.end()) {
+ return prop->second.get();
}
ALOGW("%s: Property not found: propId = 0x%x, areaId = 0x%x", __FUNCTION__, propId, areaId);
return nullptr;
@@ -497,6 +496,18 @@
StatusCode status;
switch (propId) {
default:
+ if (mHvacPowerProps.find(VehicleProperty(propId)) !=
+ mHvacPowerProps.end()) {
+ auto prop = mProps.find(
+ std::make_pair(toInt(VehicleProperty::HVAC_POWER_ON), 0));
+ if (prop != mProps.end()) {
+ if (prop->second->value.int32Values.size() == 1 &&
+ prop->second->value.int32Values[0] == 0) {
+ status = StatusCode::NOT_AVAILABLE;
+ break;
+ }
+ }
+ }
status = updateProperty(propValue);
if (status == StatusCode::OK) {
// Send property update to emulator
@@ -518,6 +529,10 @@
// Initialize member variables
mExit = 0;
+ for (auto& prop : kHvacPowerProperties) {
+ mHvacPowerProps.insert(prop);
+ }
+
// Get the list of configurations supported by this HAL
std::vector<VehiclePropConfig> configs = listProperties();
@@ -579,7 +594,7 @@
prop->areaId = curArea;
prop->prop = cfg.prop;
setDefaultValue(prop.get());
- mProps.push_back(std::move(prop));
+ mProps[std::make_pair(prop->prop, prop->areaId)] = std::move(prop);
} while (supportedAreas != 0);
}
diff --git a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h
index b4ba8ba..1ad8702 100644
--- a/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h
+++ b/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.h
@@ -17,9 +17,11 @@
#ifndef android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleHal_H_
#define android_hardware_automotive_vehicle_V2_0_impl_DefaultVehicleHal_H_
+#include <map>
#include <memory>
#include <sys/socket.h>
#include <thread>
+#include <unordered_set>
#include <utils/SystemClock.h>
@@ -93,9 +95,11 @@
void txMsg(emulator::EmulatorMessage& txMsg);
StatusCode updateProperty(const VehiclePropValue& propValue);
private:
- // TODO: Use a hashtable to support indexing props
- std::vector<std::unique_ptr<VehiclePropValue>> mProps;
+ std::map<
+ std::pair<int32_t /*VehicleProperty*/, int32_t /*areaId*/>,
+ std::unique_ptr<VehiclePropValue>> mProps;
std::atomic<int> mExit;
+ std::unordered_set<VehicleProperty> mHvacPowerProps;
std::mutex mPropsMutex;
std::thread mThread;
std::unique_ptr<CommBase> mComm{nullptr};