1f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan/*
2f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * Copyright (C) 2018 The Android Open Source Project
3f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan *
4f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * Licensed under the Apache License, Version 2.0 (the "License");
5f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * you may not use this file except in compliance with the License.
6f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * You may obtain a copy of the License at
7f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan *
8f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan *      http://www.apache.org/licenses/LICENSE-2.0
9f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan *
10f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * Unless required by applicable law or agreed to in writing, software
11f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * distributed under the License is distributed on an "AS IS" BASIS,
12f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * See the License for the specific language governing permissions and
14f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan * limitations under the License.
15f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan */
16f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanpackage com.android.car.vehiclehal.test;
17f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
18f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport static org.junit.Assert.assertEquals;
19f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
20f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport android.hardware.automotive.vehicle.V2_0.IVehicle;
21f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport android.hardware.automotive.vehicle.V2_0.StatusCode;
22f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
23f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport android.os.RemoteException;
24f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
25f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport com.android.car.vehiclehal.VehiclePropValueBuilder;
26f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
27f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanimport java.time.Duration;
28f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
29f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yanclass LinearVhalEventGenerator implements VhalEventGenerator {
30f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
31f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private final IVehicle mVehicle;
32f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
33f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private int mProp;
34f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private Duration mInterval;
35f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private float mInitialValue;
36f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private float mDispersion;
37f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    private float mIncrement;
38f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
39f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator(IVehicle vehicle) {
40f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mVehicle = vehicle;
41f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        reset();
42f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
43f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
44f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator reset() {
45f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mProp = 0;
46f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mInterval = Duration.ofSeconds(1);
47f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mInitialValue = 1000;
48f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mDispersion = 0;
49f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mInitialValue = 0;
50f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
51f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
52f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
53f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator setIntervalMs(long intervalMs) {
54f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mInterval = Duration.ofMillis(intervalMs);
55f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
56f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
57f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
58f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator setInitialValue(float initialValue) {
59f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mInitialValue = initialValue;
60f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
61f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
62f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
63f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator setDispersion(float dispersion) {
64f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mDispersion = dispersion;
65f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
66f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
67f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
68f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator setIncrement(float increment) {
69f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mIncrement = increment;
70f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
71f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
72f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
73f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    LinearVhalEventGenerator setProp(int prop) {
74f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        mProp = prop;
75f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        return this;
76f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
77f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
78f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    @Override
79f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    public void start() throws RemoteException {
80f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        VehiclePropValue request =
81f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                VehiclePropValueBuilder.newBuilder(GENERATE_FAKE_DATA_CONTROLLING_PROPERTY)
82f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .addIntValue(CMD_START_LINEAR, mProp)
83f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .setInt64Value(mInterval.toNanos())
84f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .addFloatValue(mInitialValue, mDispersion, mIncrement)
85f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .build();
86f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        assertEquals(StatusCode.OK, mVehicle.set(request));
87f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
88f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan
89f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    @Override
90f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    public void stop() throws RemoteException {
91f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        VehiclePropValue request =
92f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                VehiclePropValueBuilder.newBuilder(GENERATE_FAKE_DATA_CONTROLLING_PROPERTY)
93f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .addIntValue(CMD_STOP_LINEAR, mProp)
94f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan                    .build();
95f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan        assertEquals(StatusCode.OK, mVehicle.set(request));
96f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan    }
97f2c109c14bfb74d209a8bd070b873d2cfe2ab0a4Chao Yan}
98