133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev/* 233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * Copyright (C) 2017 The Android Open Source Project 333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * 433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * Licensed under the Apache License, Version 2.0 (the "License"); 533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * you may not use this file except in compliance with the License. 633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * You may obtain a copy of the License at 733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * 833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * http://www.apache.org/licenses/LICENSE-2.0 933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * 1033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * Unless required by applicable law or agreed to in writing, software 1133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * distributed under the License is distributed on an "AS IS" BASIS, 1233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * See the License for the specific language governing permissions and 1433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev * limitations under the License. 1533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev */ 1633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#define LOG_TAG "VehicleEmulator_v2_0" 1733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include <android/log.h> 1833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 1933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include <algorithm> 2033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include <android-base/properties.h> 2133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include <utils/SystemClock.h> 2233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 2333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include <vhal_v2_0/VehicleUtils.h> 2433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 2533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include "PipeComm.h" 2633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include "SocketComm.h" 2733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 2833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev#include "VehicleEmulator.h" 2933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 3033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace android { 3133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace hardware { 3233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace automotive { 3333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace vehicle { 3433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace V2_0 { 3533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 3633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevnamespace impl { 3733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 3833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevstd::unique_ptr<CommBase> CommFactory::create() { 3933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev bool isEmulator = android::base::GetBoolProperty("ro.kernel.qemu", false); 4033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 4133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (isEmulator) { 4233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev return std::make_unique<PipeComm>(); 4333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } else { 4433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev return std::make_unique<SocketComm>(); 4533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 4633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 4733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 4833676528f85f29906b5875cfc5d28b4639402afdPavel MaltsevVehicleEmulator::~VehicleEmulator() { 4933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev mExit = true; // Notify thread to finish and wait for it to terminate. 5033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev mComm->stop(); // Close emulator socket if it is open. 5133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (mThread.joinable()) mThread.join(); 5233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 5333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 5433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doSetValueFromClient(const VehiclePropValue& propValue) { 5533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::EmulatorMessage msg; 5633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropValue *val = msg.add_value(); 5733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev populateProtoVehiclePropValue(val, &propValue); 5833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev msg.set_status(emulator::RESULT_OK); 5933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev msg.set_msg_type(emulator::SET_PROPERTY_ASYNC); 6033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev txMsg(msg); 6133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 6233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 6333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doGetConfig(VehicleEmulator::EmulatorMessage& rxMsg, 6433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehicleEmulator::EmulatorMessage& respMsg) { 6533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev std::vector<VehiclePropConfig> configs = mHal->listProperties(); 6633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropGet getProp = rxMsg.prop(0); 6733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 6833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_msg_type(emulator::GET_CONFIG_RESP); 6933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(emulator::ERROR_INVALID_PROPERTY); 7033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 7133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& config : configs) { 7233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Find the config we are looking for 7333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (config.prop == getProp.prop()) { 7433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropConfig* protoCfg = respMsg.add_config(); 7533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev populateProtoVehicleConfig(protoCfg, config); 7633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(emulator::RESULT_OK); 7733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 7833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 7933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 8033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 8133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 8233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doGetConfigAll(VehicleEmulator::EmulatorMessage& /* rxMsg */, 8333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehicleEmulator::EmulatorMessage& respMsg) { 8433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev std::vector<VehiclePropConfig> configs = mHal->listProperties(); 8533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 8633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_msg_type(emulator::GET_CONFIG_ALL_RESP); 8733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(emulator::RESULT_OK); 8833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 8933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& config : configs) { 9033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropConfig* protoCfg = respMsg.add_config(); 9133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev populateProtoVehicleConfig(protoCfg, config); 9233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 9333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 9433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 9533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doGetProperty(VehicleEmulator::EmulatorMessage& rxMsg, 9633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehicleEmulator::EmulatorMessage& respMsg) { 9733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev int32_t areaId = 0; 9833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropGet getProp = rxMsg.prop(0); 9933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev int32_t propId = getProp.prop(); 10033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::Status status = emulator::ERROR_INVALID_PROPERTY; 10133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 10233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_msg_type(emulator::GET_PROPERTY_RESP); 10333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 10433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (getProp.has_area_id()) { 10533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev areaId = getProp.area_id(); 10633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 10733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 10833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev { 10933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehiclePropValue request = { .prop = propId, .areaId = areaId }; 11033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev StatusCode halStatus; 11133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev auto val = mHal->get(request, &halStatus); 11233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (val != nullptr) { 11333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropValue* protoVal = respMsg.add_value(); 11433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev populateProtoVehiclePropValue(protoVal, val.get()); 11533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev status = emulator::RESULT_OK; 11633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 11733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 11833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 11933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(status); 12033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 12133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 12233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doGetPropertyAll(VehicleEmulator::EmulatorMessage& /* rxMsg */, 12333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehicleEmulator::EmulatorMessage& respMsg) { 12433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_msg_type(emulator::GET_PROPERTY_ALL_RESP); 12533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(emulator::RESULT_OK); 12633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 12733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev { 12833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (const auto& prop : mHal->getAllProperties()) { 12933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropValue* protoVal = respMsg.add_value(); 13033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev populateProtoVehiclePropValue(protoVal, &prop); 13133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 13233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 13333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 13433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 13533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::doSetProperty(VehicleEmulator::EmulatorMessage& rxMsg, 13633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehicleEmulator::EmulatorMessage& respMsg) { 13733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehiclePropValue protoVal = rxMsg.value(0); 13833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev VehiclePropValue val = { 13933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev .prop = protoVal.prop(), 14033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev .areaId = protoVal.area_id(), 1415160ba3455ee468020642073157f736d596e82dbSteve Paik .status = (VehiclePropertyStatus)protoVal.status(), 14233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev .timestamp = elapsedRealtimeNano(), 14333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev }; 14433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 14533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_msg_type(emulator::SET_PROPERTY_RESP); 14633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 14733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Copy value data if it is set. This automatically handles complex data types if needed. 14833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (protoVal.has_string_value()) { 14933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev val.value.stringValue = protoVal.string_value().c_str(); 15033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 15133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 15233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (protoVal.has_bytes_value()) { 15333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev val.value.bytes = std::vector<uint8_t> { protoVal.bytes_value().begin(), 15433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal.bytes_value().end() }; 15533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 15633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 15733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (protoVal.int32_values_size() > 0) { 15833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev val.value.int32Values = std::vector<int32_t> { protoVal.int32_values().begin(), 15933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal.int32_values().end() }; 16033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 16133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 16233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (protoVal.int64_values_size() > 0) { 16333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev val.value.int64Values = std::vector<int64_t> { protoVal.int64_values().begin(), 16433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal.int64_values().end() }; 16533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 16633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 16733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (protoVal.float_values_size() > 0) { 16833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev val.value.floatValues = std::vector<float> { protoVal.float_values().begin(), 16933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal.float_values().end() }; 17033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 17133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 17233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev bool halRes = mHal->setPropertyFromVehicle(val); 17333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(halRes ? emulator::RESULT_OK : emulator::ERROR_INVALID_PROPERTY); 17433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 17533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 17633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::txMsg(emulator::EmulatorMessage& txMsg) { 17733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev int numBytes = txMsg.ByteSize(); 17833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev std::vector<uint8_t> msg(static_cast<size_t>(numBytes)); 17933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 18033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (!txMsg.SerializeToArray(msg.data(), static_cast<int32_t>(msg.size()))) { 18133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGE("%s: SerializeToString failed!", __func__); 18233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev return; 18333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 18433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 18533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (mExit) { 18633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGW("%s: unable to transmit a message, connection closed", __func__); 18733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev return; 18833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 18933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 19033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Send the message 19133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev int retVal = mComm->write(msg); 19233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (retVal < 0) { 19333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGE("%s: Failed to tx message: retval=%d, errno=%d", __func__, retVal, errno); 19433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 19533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 19633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 19733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::parseRxProtoBuf(std::vector<uint8_t>& msg) { 19833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::EmulatorMessage rxMsg; 19933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::EmulatorMessage respMsg; 20033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 20133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (rxMsg.ParseFromArray(msg.data(), static_cast<int32_t>(msg.size()))) { 20233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev switch (rxMsg.msg_type()) { 20333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case emulator::GET_CONFIG_CMD: 20433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev doGetConfig(rxMsg, respMsg); 20533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 20633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case emulator::GET_CONFIG_ALL_CMD: 20733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev doGetConfigAll(rxMsg, respMsg); 20833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 20933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case emulator::GET_PROPERTY_CMD: 21033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev doGetProperty(rxMsg, respMsg); 21133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 21233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case emulator::GET_PROPERTY_ALL_CMD: 21333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev doGetPropertyAll(rxMsg, respMsg); 21433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 21533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case emulator::SET_PROPERTY_CMD: 21633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev doSetProperty(rxMsg, respMsg); 21733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 21833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev default: 21933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGW("%s: Unknown message received, type = %d", __func__, rxMsg.msg_type()); 22033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev respMsg.set_status(emulator::ERROR_UNIMPLEMENTED_CMD); 22133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 22233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 22333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 22433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Send the reply 22533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev txMsg(respMsg); 22633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } else { 22733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGE("%s: ParseFromString() failed. msgSize=%d", __func__, static_cast<int>(msg.size())); 22833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 22933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 23033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 23133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::populateProtoVehicleConfig(emulator::VehiclePropConfig* protoCfg, 23233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev const VehiclePropConfig& cfg) { 23333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_prop(cfg.prop); 23433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_access(toInt(cfg.access)); 23533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_change_mode(toInt(cfg.changeMode)); 23633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_value_type(toInt(getPropType(cfg.prop))); 23733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 23833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& configElement : cfg.configArray) { 23933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->add_config_array(configElement); 24033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 24133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 24233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (cfg.configString.size() > 0) { 24333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_config_string(cfg.configString.c_str(), cfg.configString.size()); 24433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 24533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 24633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Populate the min/max values based on property type 24733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev switch (getPropType(cfg.prop)) { 24833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::STRING: 24933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::BOOLEAN: 25033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::INT32_VEC: 2511ae977d6e87a88e1689d406636982e8296d68175Steve Paik case VehiclePropertyType::INT64_VEC: 25233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::FLOAT_VEC: 25333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::BYTES: 2541ae977d6e87a88e1689d406636982e8296d68175Steve Paik case VehiclePropertyType::MIXED: 25533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Do nothing. These types don't have min/max values 25633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 25733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::INT64: 25833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (cfg.areaConfigs.size() > 0) { 25933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehicleAreaConfig* aCfg = protoCfg->add_area_configs(); 26033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_min_int64_value(cfg.areaConfigs[0].minInt64Value); 26133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_max_int64_value(cfg.areaConfigs[0].maxInt64Value); 26233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 26333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 26433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::FLOAT: 26533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (cfg.areaConfigs.size() > 0) { 26633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehicleAreaConfig* aCfg = protoCfg->add_area_configs(); 26733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_min_float_value(cfg.areaConfigs[0].minFloatValue); 26833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_max_float_value(cfg.areaConfigs[0].maxFloatValue); 26933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 27033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 27133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev case VehiclePropertyType::INT32: 27233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (cfg.areaConfigs.size() > 0) { 27333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev emulator::VehicleAreaConfig* aCfg = protoCfg->add_area_configs(); 27433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_min_int32_value(cfg.areaConfigs[0].minInt32Value); 27533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev aCfg->set_max_int32_value(cfg.areaConfigs[0].maxInt32Value); 27633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 27733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 27833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev default: 27933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGW("%s: Unknown property type: 0x%x", __func__, toInt(getPropType(cfg.prop))); 28033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 28133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 28233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 28333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_min_sample_rate(cfg.minSampleRate); 28433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoCfg->set_max_sample_rate(cfg.maxSampleRate); 28533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 28633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 28733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::populateProtoVehiclePropValue(emulator::VehiclePropValue* protoVal, 28833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev const VehiclePropValue* val) { 28933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_prop(val->prop); 29033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_value_type(toInt(getPropType(val->prop))); 29133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_timestamp(val->timestamp); 2925160ba3455ee468020642073157f736d596e82dbSteve Paik protoVal->set_status((emulator::VehiclePropStatus)(val->status)); 29333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_area_id(val->areaId); 29433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 29533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Copy value data if it is set. 29633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // - for bytes and strings, this is indicated by size > 0 29733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // - for int32, int64, and float, copy the values if vectors have data 29833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (val->value.stringValue.size() > 0) { 29933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_string_value(val->value.stringValue.c_str(), val->value.stringValue.size()); 30033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 30133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 30233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (val->value.bytes.size() > 0) { 30333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->set_bytes_value(val->value.bytes.data(), val->value.bytes.size()); 30433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 30533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 30633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& int32Value : val->value.int32Values) { 30733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->add_int32_values(int32Value); 30833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 30933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 31033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& int64Value : val->value.int64Values) { 31133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->add_int64_values(int64Value); 31233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 31333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 31433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev for (auto& floatValue : val->value.floatValues) { 31533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev protoVal->add_float_values(floatValue); 31633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 31733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 31833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 31933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::rxMsg() { 32033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev while (!mExit) { 32133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev std::vector<uint8_t> msg = mComm->read(); 32233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 32333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (msg.size() > 0) { 32433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Received a message. 32533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev parseRxProtoBuf(msg); 32633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } else { 32733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // This happens when connection is closed 32833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev ALOGD("%s: msgSize=%zu", __func__, msg.size()); 32933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev break; 33033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 33133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 33233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 33333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 33433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsevvoid VehicleEmulator::rxThread() { 33533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (mExit) return; 33633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 33733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev int retVal = mComm->open(); 33833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (retVal != 0) mExit = true; 33933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 34033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Comms are properly opened 34133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev while (!mExit) { 34233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev retVal = mComm->connect(); 34333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 34433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev if (retVal >= 0) { 34533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev rxMsg(); 34633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 34733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 34833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev // Check every 100ms for a new connection 34933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev std::this_thread::sleep_for(std::chrono::milliseconds(100)); 35033676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev } 35133676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} 35233676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 35333676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // impl 35433676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev 35533676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // namespace V2_0 35633676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // namespace vehicle 35733676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // namespace automotive 35833676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // namespace hardware 35933676528f85f29906b5875cfc5d28b4639402afdPavel Maltsev} // namespace android 360