blob: 65bd49dbe9bc6ec8733a7df13f13236cd61bb27f [file] [log] [blame]
Pavel Maltseve2603e32016-10-25 16:03:23 -07001/*
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#include "DefaultVehicleHal.h"
18
Yifan Hongf9d30342016-11-30 13:45:34 -080019#define LOG_TAG "default_vehicle"
20#include <android/log.h>
21
Pavel Maltseve2603e32016-10-25 16:03:23 -070022namespace android {
23namespace hardware {
24namespace vehicle {
25namespace V2_0 {
26
27namespace impl {
28
Pavel Maltsevdb179c52016-10-27 15:43:06 -070029VehicleHal::VehiclePropValuePtr DefaultVehicleHal::get(
30 const VehiclePropValue& requestedPropValue, StatusCode* outStatus) {
31 *outStatus = StatusCode::OK;
Pavel Maltseve2603e32016-10-25 16:03:23 -070032
33 VehiclePropValuePtr v;
Pavel Maltsev8e624b32017-02-01 16:30:25 -080034 auto property = static_cast<VehicleProperty>(requestedPropValue.prop);
Pavel Maltsevdb179c52016-10-27 15:43:06 -070035 int32_t areaId = requestedPropValue.areaId;
Pavel Maltsev30c84c32016-11-14 16:23:36 -080036 auto& pool = *getValuePool();
Pavel Maltseve2603e32016-10-25 16:03:23 -070037
38 switch (property) {
39 case VehicleProperty::INFO_MAKE:
Pavel Maltsev30c84c32016-11-14 16:23:36 -080040 v = pool.obtainString("Default Car");
Pavel Maltseve2603e32016-10-25 16:03:23 -070041 break;
42 case VehicleProperty::HVAC_FAN_SPEED:
Pavel Maltsev30c84c32016-11-14 16:23:36 -080043 v = pool.obtainInt32(mFanSpeed);
44 break;
45 case VehicleProperty::HVAC_POWER_ON:
46 v = pool.obtainBoolean(mHvacPowerOn);
47 break;
48 case VehicleProperty::HVAC_RECIRC_ON:
49 v = pool.obtainBoolean(mHvacRecircOn);
50 break;
51 case VehicleProperty::HVAC_AC_ON:
52 v = pool.obtainBoolean(mHvacAcOn);
53 break;
54 case VehicleProperty::HVAC_AUTO_ON:
55 v = pool.obtainBoolean(mHvacAutoOn);
56 break;
57 case VehicleProperty::HVAC_FAN_DIRECTION:
58 v = pool.obtainInt32(toInt(mFanDirection));
59 break;
60 case VehicleProperty::HVAC_DEFROSTER:
61 bool defroster;
62 *outStatus = getHvacDefroster(areaId, &defroster);
Pavel Maltsevdb179c52016-10-27 15:43:06 -070063 if (StatusCode::OK == *outStatus) {
Pavel Maltsev30c84c32016-11-14 16:23:36 -080064 v = pool.obtainBoolean(defroster);
65 }
66 break;
67 case VehicleProperty::HVAC_TEMPERATURE_SET:
68 float value;
69 *outStatus = getHvacTemperature(requestedPropValue.areaId,
70 &value);
71 if (StatusCode::OK == *outStatus) {
72 v = pool.obtainFloat(value);
Pavel Maltseve2603e32016-10-25 16:03:23 -070073 }
74 break;
75 case VehicleProperty::INFO_FUEL_CAPACITY:
Pavel Maltsev30c84c32016-11-14 16:23:36 -080076 v = pool.obtainFloat(0.75f);
Pavel Maltseve2603e32016-10-25 16:03:23 -070077 break;
78 case VehicleProperty::DISPLAY_BRIGHTNESS:
Pavel Maltsev30c84c32016-11-14 16:23:36 -080079 v = pool.obtainInt32(mBrightness);
80 break;
81 case VehicleProperty::NIGHT_MODE:
82 v = pool.obtainBoolean(false);
83 break;
84 case VehicleProperty::GEAR_SELECTION:
85 v = pool.obtainInt32(toInt(VehicleGear::GEAR_PARK));
Pavel Maltseve2603e32016-10-25 16:03:23 -070086 break;
Pavel Maltsevb5e51092016-11-22 11:01:03 -080087 case VehicleProperty::DRIVING_STATUS:
88 v = pool.obtainInt32(toInt(VehicleDrivingStatus::UNRESTRICTED));
89 break;
Pavel Maltsevd567a2a2016-12-14 16:07:29 -080090 case VehicleProperty::IGNITION_STATE:
91 v = pool.obtainInt32(toInt(VehicleIgnitionState::ACC));
92 break;
Enrico Granata4dcdf002017-01-11 11:47:37 -080093 case VehicleProperty::OBD2_LIVE_FRAME:
94 v = pool.obtainComplex();
95 *outStatus = fillObd2LiveFrame(&v);
96 break;
97 case VehicleProperty::OBD2_FREEZE_FRAME:
98 v = pool.obtainComplex();
99 *outStatus = fillObd2FreezeFrame(&v);
100 break;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700101 default:
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700102 *outStatus = StatusCode::INVALID_ARG;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700103 }
104
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700105 if (StatusCode::OK == *outStatus && v.get() != nullptr) {
Pavel Maltsev8e624b32017-02-01 16:30:25 -0800106 v->prop = toInt(property);
Pavel Maltseve2603e32016-10-25 16:03:23 -0700107 v->areaId = areaId;
108 v->timestamp = elapsedRealtimeNano();
109 }
110
111 return v;
112}
113
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700114StatusCode DefaultVehicleHal::set(const VehiclePropValue& propValue) {
Pavel Maltsev8e624b32017-02-01 16:30:25 -0800115 auto property = static_cast<VehicleProperty>(propValue.prop);
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800116 const auto& v = propValue.value;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700117
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700118 StatusCode status = StatusCode::OK;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700119
120 switch (property) {
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800121 case VehicleProperty::HVAC_POWER_ON:
122 mHvacPowerOn = v.int32Values[0] == 1;
123 break;
124 case VehicleProperty::HVAC_RECIRC_ON:
125 mHvacRecircOn = v.int32Values[0] == 1;
126 break;
127 case VehicleProperty::HVAC_AC_ON:
128 mHvacAcOn = v.int32Values[0] == 1;
129 break;
130 case VehicleProperty::HVAC_AUTO_ON:
131 mHvacAutoOn = v.int32Values[0] == 1;
132 break;
133 case VehicleProperty::HVAC_DEFROSTER:
134 status = setHvacDefroster(propValue.areaId, v.int32Values[0] == 1);
135 break;
136 case VehicleProperty::HVAC_FAN_DIRECTION:
137 mFanDirection =
138 static_cast<VehicleHvacFanDirection>(v.int32Values[0]);
139 break;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700140 case VehicleProperty::HVAC_FAN_SPEED:
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800141 mFanSpeed = v.int32Values[0];
142 break;
143 case VehicleProperty::HVAC_TEMPERATURE_SET:
144 status = setHvacTemperature(propValue.areaId, v.floatValues[0]);
Pavel Maltseve2603e32016-10-25 16:03:23 -0700145 break;
146 case VehicleProperty::DISPLAY_BRIGHTNESS:
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800147 mBrightness = v.int32Values[0];
Pavel Maltseve2603e32016-10-25 16:03:23 -0700148 break;
149 default:
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700150 status = StatusCode::INVALID_ARG;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700151 }
152
153 return status;
154}
155
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800156StatusCode DefaultVehicleHal::getHvacTemperature(int32_t areaId,
157 float* outValue) {
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700158 if (areaId == toInt(VehicleAreaZone::ROW_1_LEFT)) {
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800159 *outValue = mRow1LeftHvacTemperatureSet;
160 } else if (areaId == toInt(VehicleAreaZone::ROW_1_RIGHT)) {
161 *outValue = mRow1RightHvacTemperatureSet;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700162 } else {
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700163 return StatusCode::INVALID_ARG;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700164 }
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700165 return StatusCode::OK;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700166}
167
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800168StatusCode DefaultVehicleHal::setHvacTemperature(
169 int32_t areaId, float value) {
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700170 if (areaId == toInt(VehicleAreaZone::ROW_1_LEFT)) {
Pavel Maltsev30c84c32016-11-14 16:23:36 -0800171 mRow1LeftHvacTemperatureSet = value;
172 } else if (areaId == toInt(VehicleAreaZone::ROW_1_RIGHT)) {
173 mRow1RightHvacTemperatureSet = value;
174 } else {
175 return StatusCode::INVALID_ARG;
176 }
177 return StatusCode::OK;
178}
179
180StatusCode DefaultVehicleHal::getHvacDefroster(int32_t areaId,
181 bool* outValue) {
182 ALOGI("Getting Hvac defroster for area: 0x%x", areaId);
183
184 if (areaId == toInt(VehicleAreaWindow::FRONT_WINDSHIELD)) {
185 *outValue = mFrontDefroster;
186 } else if (areaId == toInt(VehicleAreaWindow::REAR_WINDSHIELD)) {
187 *outValue = mRearDefroster;
188 } else {
189 ALOGE("Unable to get hvac defroster for area: 0x%x", areaId);
190 return StatusCode::INVALID_ARG;
191 }
192
193 ALOGI("Getting Hvac defroster for area: 0x%x, OK", areaId);
194 return StatusCode::OK;
195}
196
197StatusCode DefaultVehicleHal::setHvacDefroster(int32_t areaId, bool value) {
198 if (areaId == toInt(VehicleAreaWindow::FRONT_WINDSHIELD)) {
199 mFrontDefroster = value;
200 } else if (areaId == toInt(VehicleAreaWindow::REAR_WINDSHIELD)) {
201 mRearDefroster = value;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700202 } else {
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700203 return StatusCode::INVALID_ARG;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700204 }
Pavel Maltsevdb179c52016-10-27 15:43:06 -0700205 return StatusCode::OK;
Pavel Maltseve2603e32016-10-25 16:03:23 -0700206}
207
Enrico Granata4dcdf002017-01-11 11:47:37 -0800208static std::vector<int32_t> fillObd2IntValues() {
209 std::vector<int32_t> intValues(toInt(Obd2IntegerSensorIndex::LAST_SYSTEM_INDEX));
210#define SENSOR(name) toInt(Obd2IntegerSensorIndex:: name)
211 intValues[SENSOR(FUEL_SYSTEM_STATUS)] = toInt(FuelSystemStatus::CLOSED_LOOP);
212 intValues[SENSOR(MALFUNCTION_INDICATOR_LIGHT_ON)] = 0;
213 intValues[SENSOR(IGNITION_MONITORS_SUPPORTED)] = toInt(IgnitionMonitorKind::SPARK);
214 intValues[SENSOR(IGNITION_SPECIFIC_MONITORS)] =
215 CommonIgnitionMonitors::COMPONENTS_AVAILABLE |
216 CommonIgnitionMonitors::MISFIRE_AVAILABLE |
217 SparkIgnitionMonitors::AC_REFRIGERANT_AVAILABLE |
218 SparkIgnitionMonitors::EVAPORATIVE_SYSTEM_AVAILABLE;
219 intValues[SENSOR(INTAKE_AIR_TEMPERATURE)] = 35;
220 intValues[SENSOR(COMMANDED_SECONDARY_AIR_STATUS)] =
221 toInt(SecondaryAirStatus::FROM_OUTSIDE_OR_OFF);
222 intValues[SENSOR(NUM_OXYGEN_SENSORS_PRESENT)] = 1;
223 intValues[SENSOR(RUNTIME_SINCE_ENGINE_START)] = 500;
224 intValues[SENSOR(DISTANCE_TRAVELED_WITH_MALFUNCTION_INDICATOR_LIGHT_ON)] = 0;
225 intValues[SENSOR(WARMUPS_SINCE_CODES_CLEARED)] = 51;
226 intValues[SENSOR(DISTANCE_TRAVELED_SINCE_CODES_CLEARED)] = 365;
227 intValues[SENSOR(ABSOLUTE_BAROMETRIC_PRESSURE)] = 30;
228 intValues[SENSOR(CONTROL_MODULE_VOLTAGE)] = 12;
229 intValues[SENSOR(AMBIENT_AIR_TEMPERATURE)] = 18;
230 intValues[SENSOR(MAX_FUEL_AIR_EQUIVALENCE_RATIO)] = 1;
231 intValues[SENSOR(FUEL_TYPE)] = toInt(FuelType::GASOLINE);
232#undef SENSOR
233 return intValues;
234}
235
236static std::vector<float> fillObd2FloatValues() {
237 std::vector<float> floatValues(toInt(Obd2FloatSensorIndex::LAST_SYSTEM_INDEX));
238#define SENSOR(name) toInt(Obd2FloatSensorIndex:: name)
239 floatValues[SENSOR(CALCULATED_ENGINE_LOAD)] = 0.153;
240 floatValues[SENSOR(SHORT_TERM_FUEL_TRIM_BANK1)] = -0.16;
241 floatValues[SENSOR(LONG_TERM_FUEL_TRIM_BANK1)] = -0.16;
242 floatValues[SENSOR(SHORT_TERM_FUEL_TRIM_BANK2)] = -0.16;
243 floatValues[SENSOR(LONG_TERM_FUEL_TRIM_BANK2)] = -0.16;
244 floatValues[SENSOR(INTAKE_MANIFOLD_ABSOLUTE_PRESSURE)] = 7.5;
245 floatValues[SENSOR(ENGINE_RPM)] = 1250.;
246 floatValues[SENSOR(VEHICLE_SPEED)] = 40.;
247 floatValues[SENSOR(TIMING_ADVANCE)] = 2.5;
248 floatValues[SENSOR(THROTTLE_POSITION)] = 19.75;
249 floatValues[SENSOR(OXYGEN_SENSOR1_VOLTAGE)] = 0.265;
250 floatValues[SENSOR(FUEL_TANK_LEVEL_INPUT)] = 0.824;
251 floatValues[SENSOR(EVAPORATION_SYSTEM_VAPOR_PRESSURE)] = -0.373;
252 floatValues[SENSOR(CATALYST_TEMPERATURE_BANK1_SENSOR1)] = 190.;
253 floatValues[SENSOR(RELATIVE_THROTTLE_POSITION)] = 3.;
254 floatValues[SENSOR(ABSOLUTE_THROTTLE_POSITION_B)] = 0.306;
255 floatValues[SENSOR(ACCELERATOR_PEDAL_POSITION_D)] = 0.188;
256 floatValues[SENSOR(ACCELERATOR_PEDAL_POSITION_E)] = 0.094;
257 floatValues[SENSOR(COMMANDED_THROTTLE_ACTUATOR)] = 0.024;
258#undef SENSOR
259 return floatValues;
260}
261
262StatusCode DefaultVehicleHal::fillObd2LiveFrame(VehiclePropValuePtr* v) {
263 static std::vector<int32_t> intValues(fillObd2IntValues());
264 static std::vector<float> floatValues(fillObd2FloatValues());
265 (*v)->value.int32Values = intValues;
266 (*v)->value.floatValues = floatValues;
267 return StatusCode::OK;
268}
269
270StatusCode DefaultVehicleHal::fillObd2FreezeFrame(VehiclePropValuePtr* v) {
271 static std::vector<int32_t> intValues(fillObd2IntValues());
272 static std::vector<float> floatValues(fillObd2FloatValues());
273 (*v)->value.int32Values = intValues;
274 (*v)->value.floatValues = floatValues;
275 (*v)->value.stringValue = "P0010";
276 return StatusCode::OK;
277}
278
279
Pavel Maltseve2603e32016-10-25 16:03:23 -0700280} // impl
281
282} // namespace V2_0
283} // namespace vehicle
284} // namespace hardware
285} // namespace android