Enable vehicle HAL to be controlled via ADB
Add emulator functionality to DefaultVehicleHal:
- Create default list of properties based upon DefaultConfig.h
- Add socket that is reachable via ADB to set/get vehicle properties.
BUG: 29601815
Test: Tested with Python interface from host.
Change-Id: I6f8e4cba37d927565e10797875eb8f5a1840a94f
diff --git a/automotive/vehicle/2.0/default/impl/DefaultVehicleHal.h b/automotive/vehicle/2.0/default/impl/DefaultVehicleHal.h
index ccedeeb..edfc224 100644
--- a/automotive/vehicle/2.0/default/impl/DefaultVehicleHal.h
+++ b/automotive/vehicle/2.0/default/impl/DefaultVehicleHal.h
@@ -21,8 +21,12 @@
#include <VehicleHal.h>
#include <impl/DefaultConfig.h>
-#include <vehicle_hal_manager/Obd2SensorStore.h>
+#include <sys/socket.h>
+#include <thread>
#include <utils/SystemClock.h>
+#include <vehicle_hal_manager/Obd2SensorStore.h>
+#include "VehicleHalProto.pb.h"
+
namespace android {
namespace hardware {
@@ -34,6 +38,23 @@
class DefaultVehicleHal : public VehicleHal {
public:
+ DefaultVehicleHal() : mThread() {}
+ ~DefaultVehicleHal() override {
+ // Notify thread to finish and wait for it to terminate
+ mExit = 1;
+
+ // Close emulator socket if it is open
+ {
+ std::lock_guard<std::mutex> lock(mTxMutex);
+ if (mCurSocket != -1) {
+ close(mCurSocket);
+ mCurSocket = -1;
+ }
+ }
+
+ mThread.join();
+ }
+
std::vector<VehiclePropConfig> listProperties() override {
return std::vector<VehiclePropConfig>(std::begin(kVehicleProperties),
std::end(kVehicleProperties));
@@ -46,38 +67,47 @@
StatusCode set(const VehiclePropValue& propValue) override;
- StatusCode subscribe(int32_t /*property*/,
- int32_t /*areas*/,
- float /*sampleRate*/) override {
- // TODO(pavelm): implement
+ StatusCode subscribe(int32_t property, int32_t areas, float sampleRate) {
+ ALOGD("%s: not implemented: prop=0x%x, areas=0x%x, rate=%f", __FUNCTION__, property,
+ areas, sampleRate);
return StatusCode::OK;
}
- StatusCode unsubscribe(int32_t /*property*/) override {
- // TODO(pavelm): implement
+ StatusCode unsubscribe(int32_t property) {
+ ALOGD("%s: not implemented: prop=0x%x", __FUNCTION__, property);
return StatusCode::OK;
}
private:
- StatusCode getHvacTemperature(int32_t areaId, float* outValue);
- StatusCode setHvacTemperature(int32_t areaId, float value);
- StatusCode getHvacDefroster(int32_t areaId, bool* outValue);
- StatusCode setHvacDefroster(int32_t areaId, bool value);
+ void doGetConfig(emulator::EmulatorMessage& rxMsg, emulator::EmulatorMessage& respMsg);
+ void doGetConfigAll(emulator::EmulatorMessage& rxMsg, emulator::EmulatorMessage& respMsg);
+ void doGetProperty(emulator::EmulatorMessage& rxMsg, emulator::EmulatorMessage& respMsg);
+ void doGetPropertyAll(emulator::EmulatorMessage& rxMsg, emulator::EmulatorMessage& respMsg);
+ void doSetProperty(emulator::EmulatorMessage& rxMsg, emulator::EmulatorMessage& respMsg);
+ VehiclePropValue* getVehiclePropValueLocked(int32_t propId, int32_t areaId);
+ void initObd2LiveFrame(VehiclePropConfig& obd2LiveFramePropConfig);
+ void parseRxProtoBuf(std::vector<uint8_t>& msg);
+ void populateProtoVehicleConfig(emulator::VehiclePropConfig* protoCfg,
+ const VehiclePropConfig& cfg);
+ void populateProtoVehiclePropValue(emulator::VehiclePropValue* protoVal,
+ const VehiclePropValue* val);
+ void setDefaultValue(VehiclePropValue* prop);
+ void rxMsg(void);
+ void rxThread(void);
+ void txMsg(emulator::EmulatorMessage& txMsg);
+ StatusCode updateProperty(const VehiclePropValue& propValue);
StatusCode fillObd2LiveFrame(VehiclePropValuePtr* v);
StatusCode fillObd2FreezeFrame(VehiclePropValuePtr* v);
private:
- int32_t mFanSpeed = 3;
- int32_t mBrightness = 7;
- float mRow1LeftHvacTemperatureSet = 16;
- float mRow1RightHvacTemperatureSet = 22;
- bool mFrontDefroster = false;
- bool mRearDefroster = false;
- bool mHvacPowerOn = true;
- bool mHvacRecircOn = true;
- bool mHvacAcOn = true;
- bool mHvacAutoOn = true;
- VehicleHvacFanDirection mFanDirection = VehicleHvacFanDirection::FACE;
+ // TODO: Use a hashtable to support indexing props
+ std::vector<std::unique_ptr<VehiclePropValue>> mProps;
+ std::atomic<int> mCurSocket;
+ std::atomic<int> mExit;
std::unique_ptr<Obd2SensorStore> mObd2SensorStore{nullptr};
+ std::mutex mPropsMutex;
+ int mSocket;
+ std::mutex mTxMutex;
+ std::thread mThread;
};
} // impl