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