1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "automotive.vehicle@2.0-impl"
18
19#include "VehicleUtils.h"
20
21#include <log/log.h>
22
23namespace android {
24namespace hardware {
25namespace automotive {
26namespace vehicle {
27namespace V2_0 {
28
29//namespace utils {
30
31std::unique_ptr<VehiclePropValue> createVehiclePropValue(
32    VehiclePropertyType type, size_t vecSize) {
33    auto val = std::unique_ptr<VehiclePropValue>(new VehiclePropValue);
34    switch (type) {
35        case VehiclePropertyType::INT32:      // fall through
36        case VehiclePropertyType::INT32_VEC:  // fall through
37        case VehiclePropertyType::BOOLEAN:
38            val->value.int32Values.resize(vecSize);
39            break;
40        case VehiclePropertyType::FLOAT:      // fall through
41        case VehiclePropertyType::FLOAT_VEC:
42            val->value.floatValues.resize(vecSize);
43            break;
44        case VehiclePropertyType::INT64:
45            val->value.int64Values.resize(vecSize);
46            break;
47        case VehiclePropertyType::BYTES:
48            val->value.bytes.resize(vecSize);
49            break;
50        case VehiclePropertyType::STRING:
51        case VehiclePropertyType::COMPLEX:
52            break; // Valid, but nothing to do.
53        default:
54            ALOGE("createVehiclePropValue: unknown type: %d", type);
55            val.reset(nullptr);
56    }
57    return val;
58}
59
60size_t getVehicleRawValueVectorSize(
61    const VehiclePropValue::RawValue& value, VehiclePropertyType type) {
62    switch (type) {
63        case VehiclePropertyType::INT32:      // fall through
64        case VehiclePropertyType::INT32_VEC:  // fall through
65        case VehiclePropertyType::BOOLEAN:
66            return value.int32Values.size();
67        case VehiclePropertyType::FLOAT:      // fall through
68        case VehiclePropertyType::FLOAT_VEC:
69            return value.floatValues.size();
70        case VehiclePropertyType::INT64:
71            return value.int64Values.size();
72        case VehiclePropertyType::BYTES:
73            return value.bytes.size();
74        default:
75            return 0;
76    }
77}
78
79template<typename T>
80inline void copyHidlVec(hidl_vec <T>* dest, const hidl_vec <T>& src) {
81    for (size_t i = 0; i < std::min(dest->size(), src.size()); i++) {
82        (*dest)[i] = src[i];
83    }
84}
85
86void copyVehicleRawValue(VehiclePropValue::RawValue* dest,
87                         const VehiclePropValue::RawValue& src) {
88    dest->int32Values = src.int32Values;
89    dest->floatValues = src.floatValues;
90    dest->int64Values = src.int64Values;
91    dest->bytes = src.bytes;
92    dest->stringValue = src.stringValue;
93}
94
95template<typename T>
96void shallowCopyHidlVec(hidl_vec <T>* dest, const hidl_vec <T>& src) {
97    if (src.size() > 0) {
98        dest->setToExternal(const_cast<T*>(&src[0]), src.size());
99    } else if (dest->size() > 0) {
100        dest->resize(0);
101    }
102}
103
104void shallowCopyHidlStr(hidl_string* dest, const hidl_string& src) {
105    if (!src.empty()) {
106        dest->setToExternal(src.c_str(), src.size());
107    } else if (dest->size() > 0) {
108        dest->setToExternal(0, 0);
109    }
110}
111
112void shallowCopy(VehiclePropValue* dest, const VehiclePropValue& src) {
113    dest->prop = src.prop;
114    dest->areaId = src.areaId;
115    dest->timestamp = src.timestamp;
116    shallowCopyHidlVec(&dest->value.int32Values, src.value.int32Values);
117    shallowCopyHidlVec(&dest->value.int64Values, src.value.int64Values);
118    shallowCopyHidlVec(&dest->value.floatValues, src.value.floatValues);
119    shallowCopyHidlVec(&dest->value.bytes, src.value.bytes);
120    shallowCopyHidlStr(&dest->value.stringValue, src.value.stringValue);
121}
122
123
124//}  // namespace utils
125
126}  // namespace V2_0
127}  // namespace vehicle
128}  // namespace automotive
129}  // namespace hardware
130}  // namespace android
131