1 /*
2  * Copyright (C) 2015 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 #ifndef ANDROID_VEHICLE_NETWORK_H
18 #define ANDROID_VEHICLE_NETWORK_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <binder/IInterface.h>
24 #include <binder/IMemory.h>
25 
26 #include <utils/threads.h>
27 #include <utils/Errors.h>
28 #include <utils/List.h>
29 #include <utils/RefBase.h>
30 
31 #include "IVehicleNetwork.h"
32 #include "HandlerThread.h"
33 
34 namespace android {
35 
36 // ----------------------------------------------------------------------------
37 
38 /**
39  * Listener for client to implement to get events from Vehicle network service.
40  */
41 class VehicleNetworkListener : public RefBase
42 {
43 public:
VehicleNetworkListener()44     VehicleNetworkListener() {};
~VehicleNetworkListener()45     virtual ~VehicleNetworkListener() {};
46     virtual void onEvents(sp<VehiclePropValueListHolder>& events) = 0;
47     virtual void onHalError(int32_t errorCode, int32_t property, int32_t operation) = 0;
48     virtual void onHalRestart(bool inMocking) = 0;
49 };
50 
51 // ----------------------------------------------------------------------------
52 
53 /** For internal event handling, not for client */
54 class VehicleNetworkEventMessageHandler : public MessageHandler {
55     enum {
56         EVENT_EVENTS = 0,
57         EVENT_HAL_ERROR = 1,
58         EVENT_HAL_RESTART = 2,
59     };
60 public:
61     VehicleNetworkEventMessageHandler(const sp<Looper>& looper,
62             sp<VehicleNetworkListener>& listener);
63     virtual ~VehicleNetworkEventMessageHandler();
64 
65     void handleHalEvents(sp<VehiclePropValueListHolder>& events);
66     void handleHalError(int32_t errorCode, int32_t property, int32_t operation);
67     /**
68      * This error must be handled always. This can be called in vehicle network service's crash
69      * as well.
70      */
71     void handleHalRestart(bool inMocking);
72 
73 private:
74     virtual void handleMessage(const Message& message);
75     void doHandleHalEvents();
76     void doHandleHalError();
77     void doHandleHalRestart();
78 private:
79     mutable Mutex mLock;
80     sp<Looper> mLooper;
81     sp<VehicleNetworkListener>& mListener;
82     List<sp<VehiclePropValueListHolder>> mEvents;
83     List<VehicleHalError*> mHalErrors;
84     List<bool> mHalRestartEvents;
85 };
86 
87 // ----------------------------------------------------------------------------
88 
89 /**
90  * Vehicle network API for low level components like HALs to access / control car information.
91  * This is reference counted. So use with sp<>.
92  */
93 class VehicleNetwork : public IBinder::DeathRecipient, public BnVehicleNetworkListener
94 {
95 public:
96     /**
97      * Factory method for VehicleNetwork. Client should use this method to create
98      * a new instance.
99      */
100     static sp<VehicleNetwork> createVehicleNetwork(sp<VehicleNetworkListener> &listener);
101 
102     virtual ~VehicleNetwork();
103 
104     /** Set int32 value */
105     status_t setInt32Property(int32_t property, int32_t value);
106     /** get int32 value */
107     status_t getInt32Property(int32_t property, int32_t* value, int64_t* timestamp);
108     status_t setInt64Property(int32_t property, int64_t value);
109     status_t getInt64Property(int32_t property, int64_t* value, int64_t* timestamp);
110     status_t setFloatProperty(int32_t property, float value);
111     status_t getFloatProperty(int32_t property, float* value, int64_t* timestamp);
112     status_t setStringProperty(int32_t property, const String8& value);
113     status_t getStringProperty(int32_t property, String8& value, int64_t* timestamp);
114     sp<VehiclePropertiesHolder> listProperties(int32_t property = 0);
115     /** For generic value setting. At least prop, value_type, and value should be set. */
116     status_t setProperty(const vehicle_prop_value_t& value);
117     /** For generic value getting. value->prop should be set. */
118     status_t getProperty(vehicle_prop_value_t* value);
119     status_t subscribe(int32_t property, float sampleRate, int32_t zones = 0);
120     void unsubscribe(int32_t property);
121 
122     // Only for testing purpose
123     status_t injectEvent(const vehicle_prop_value_t& value);
124 
125     // starting / stopping mocking not added yet.
126     status_t startMocking(const sp<IVehicleNetworkHalMock>& mock);
127     void stopMocking(const sp<IVehicleNetworkHalMock>& mock);
128 
129     // only for testing
130     status_t injectHalError(int32_t errorCode, int32_t property, int32_t operation);
131 
132     status_t startErrorListening();
133     void stopErrorListening();
134 
135     //IBinder::DeathRecipient, not for client
136     void binderDied(const wp<IBinder>& who);
137     // BnVehicleNetworkListener, not for client
138     void onEvents(sp<VehiclePropValueListHolder>& events);
139     void onHalError(int32_t errorCode, int32_t property, int32_t operation);
140     void onHalRestart(bool inMocking);
141 
142 private:
143     VehicleNetwork(sp<IVehicleNetwork>& vehicleNetwork, sp<VehicleNetworkListener> &listener);
144     // RefBase
145     virtual void onFirstRef();
146     sp<IVehicleNetwork> getService();
147     sp<VehicleNetworkEventMessageHandler> getEventHandler();
148 
149 private:
150     sp<IVehicleNetwork> mService;
151     sp<VehicleNetworkListener> mClientListener;
152     Mutex mLock;
153     sp<HandlerThread> mHandlerThread;
154     sp<VehicleNetworkEventMessageHandler> mEventHandler;
155 };
156 
157 // ----------------------------------------------------------------------------
158 
159 }; // namespace android
160 
161 #endif /* ANDROID_VEHICLE_NETWORK_H */
162 
163