• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 package android.car.hardware.cabin;
18 
19 import android.annotation.IntDef;
20 import android.annotation.SystemApi;
21 import android.car.Car;
22 import android.car.CarManagerBase;
23 import android.car.CarNotConnectedException;
24 import android.car.hardware.CarPropertyConfig;
25 import android.car.hardware.CarPropertyValue;
26 import android.car.hardware.property.CarPropertyManagerBase;
27 import android.car.hardware.property.CarPropertyManagerBase.CarPropertyEventCallback;
28 import android.content.Context;
29 import android.os.Handler;
30 import android.os.IBinder;
31 import android.os.Looper;
32 import android.util.ArraySet;
33 
34 import java.lang.annotation.Retention;
35 import java.lang.annotation.RetentionPolicy;
36 import java.lang.ref.WeakReference;
37 import java.util.Collection;
38 import java.util.List;
39 
40 /**
41  * API for controlling Cabin system in cars.
42  * Most Car Cabin properties have both a MOVE and POSITION parameter associated with them.
43  *
44  * The MOVE parameter will start moving the device in the indicated direction.  Magnitude
45  * indicates relative speed.  For instance, setting the WINDOW_MOVE parameter to +1 rolls
46  * the window up.  Setting it to +2 (if available) will roll it up faster.
47  *
48  * POSITION parameter will move the device to the desired position.  For instance, if the
49  * WINDOW_POS has a range of 0-100, setting this parameter to 50 will open the window
50  * halfway.  Depending upon the initial position, the window may move up or down to the
51  * 50% value.
52  *
53  * One or both of the MOVE/POSITION parameters may be implemented depending upon the
54  * capability of the hardware.
55  * @hide
56  */
57 @SystemApi
58 public final class CarCabinManager implements CarManagerBase {
59     private final static boolean DBG = false;
60     private final static String TAG = "CarCabinManager";
61     private final CarPropertyManagerBase mMgr;
62     private final ArraySet<CarCabinEventCallback> mCallbacks = new ArraySet<>();
63     private CarPropertyEventListenerToBase mListenerToBase = null;
64 
65     /** Door properties are zoned by VehicleDoor */
66     /**
67      * door position, int type
68      * Max value indicates fully open, min value (0) indicates fully closed.
69      *
70      * Some vehicles (minivans) can open the door electronically.  Hence, the ability
71      * to write this property.
72      */
73     public static final int ID_DOOR_POS = 0x0001;
74     /** door move, int type
75      * Positive values open the door, negative values close it.
76      */
77     public static final int ID_DOOR_MOVE = 0x0002;
78     /** door lock, bool type
79      * 'true' indicates door is locked.
80      */
81     public static final int ID_DOOR_LOCK = 0x0003;
82 
83     /** Mirror properties are zoned by VehicleMirror */
84     /**
85      * mirror z position, int type
86      * Positive value indicates tilt upwards, negative value tilt downwards.
87      */
88     public static final int ID_MIRROR_Z_POS = 0x1001;
89     /** mirror z move, int type
90      * Positive value tilts the mirror upwards, negative value tilts downwards.
91      */
92     public static final int ID_MIRROR_Z_MOVE = 0x1002;
93     /**
94      * mirror y position, int type
95      * Positive value indicates tilt right, negative value tilt left
96      */
97     public static final int ID_MIRROR_Y_POS = 0x1003;
98     /** mirror y move, int type
99      * Positive value tilts the mirror right, negative value tilts left.
100      */
101     public static final int ID_MIRROR_Y_MOVE = 0x1004;
102     /**
103      * mirror lock, bool type
104      * True indicates mirror positions are locked and not changeable.
105      */
106     public static final int ID_MIRROR_LOCK = 0x1005;
107     /**
108      * mirror fold, bool type
109      * True indicates mirrors are folded.
110      */
111     public static final int ID_MIRROR_FOLD = 0x1006;
112 
113     /** Seat properties are zoned by VehicleSeat */
114     /**
115      * seat memory select, int type
116      * This parameter selects the memory preset to use to select the seat position.
117      * The minValue is always 1, and the maxValue determines the number of seat
118      * positions available.
119      *
120      * For instance, if the driver's seat has 3 memory presets, the maxValue will be 3.
121      * When the user wants to select a preset, the desired preset number (1, 2, or 3)
122      * is set.
123      */
124     public static final int ID_SEAT_MEMORY_SELECT = 0x2001;
125     /**
126      * seat memory set, int type
127      * This setting allows the user to save the current seat position settings into
128      * the selected preset slot.  The maxValue for each seat position shall match
129      * the maxValue for VEHICLE_PROPERTY_SEAT_MEMORY_SELECT.
130      */
131     public static final int ID_SEAT_MEMORY_SET = 0x2002;
132     /**
133      * seat belt buckled, bool type
134      * True indicates belt is buckled.
135      */
136     public static final int ID_SEAT_BELT_BUCKLED = 0x2003;
137     /**
138      * seat belt height position, int type
139      * Adjusts the shoulder belt anchor point.
140      * Max value indicates highest position.
141      * Min value indicates lowest position.
142      */
143     public static final int ID_SEAT_BELT_HEIGHT_POS = 0x2004;
144     /** seat belt height move, int type
145      * Adjusts the shoulder belt anchor point.
146      * Positive value moves towards highest point.
147      * Negative value moves towards lowest point.
148      */
149     public static final int ID_SEAT_BELT_HEIGHT_MOVE = 0x2005;
150     /**
151      * seat fore/aft position, int type
152      * Sets the seat position forward (closer to steering wheel) and backwards.
153      * Max value indicates closest to wheel, min value indicates most rearward position.
154      */
155     public static final int ID_SEAT_FORE_AFT_POS = 0x2006;
156     /**
157      * seat fore/aft move, int type
158      * Positive value moves seat forward (closer to steering wheel).
159      * Negative value moves seat rearward.
160      */
161     public static final int ID_SEAT_FORE_AFT_MOVE = 0x2007;
162     /**
163      * seat backrest angle #1 position, int type
164      * Backrest angle 1 is the actuator closest to the bottom of the seat.
165      * Max value indicates angling forward towards the steering wheel.
166      * Min value indicates full recline.
167      */
168     public static final int ID_SEAT_BACKREST_ANGLE_1_POS = 0x2008;
169     /** seat backrest angle #1 move, int type
170      * Backrest angle 1 is the actuator closest to the bottom of the seat.
171      * Positive value angles seat towards the steering wheel.
172      * Negatie value angles away from steering wheel.
173      */
174     public static final int ID_SEAT_BACKREST_ANGLE_1_MOVE = 0x2009;
175     /**
176      * seat backrest angle #2 position, int type
177      * Backrest angle 2 is the next actuator up from the bottom of the seat.
178      * Max value indicates angling forward towards the steering wheel.
179      * Min value indicates full recline.
180      */
181     public static final int ID_SEAT_BACKREST_ANGLE_2_POS = 0x200A;
182     /** seat backrest angle #2 move, int type
183      * Backrest angle 2 is the next actuator up from the bottom of the seat.
184      * Positive value tilts forward towards the steering wheel.
185      * Negative value tilts backwards.
186      */
187     public static final int ID_SEAT_BACKREST_ANGLE_2_MOVE = 0x200B;
188     /**
189      * seat height position, int type
190      * Sets the seat height.
191      * Max value indicates highest position.
192      * Min value indicates lowest position.
193      */
194     public static final int ID_SEAT_HEIGHT_POS = 0x200C;
195     /** seat height move, int type
196      * Sets the seat height.
197      * Positive value raises the seat.
198      * Negative value lowers the seat.
199      * */
200     public static final int ID_SEAT_HEIGHT_MOVE = 0x200D;
201     /**
202      * seat depth position, int type
203      * Sets the seat depth, distance from back rest to front edge of seat.
204      * Max value indicates longest depth position.
205      * Min value indicates shortest position.
206      */
207     public static final int ID_SEAT_DEPTH_POS = 0x200E;
208     /** seat depth move, int type
209      * Adjusts the seat depth, distance from back rest to front edge of seat.
210      * Positive value increases the distance from back rest to front edge of seat.
211      * Negative value decreases this distance.
212      */
213     public static final int ID_SEAT_DEPTH_MOVE = 0x200F;
214     /**
215      * seat tilt position, int type
216      * Sets the seat tilt.
217      * Max value indicates front edge of seat higher than back edge.
218      * Min value indicates front edge of seat lower than back edge.
219      */
220     public static final int ID_SEAT_TILT_POS = 0x2010;
221     /** seat tilt move, int type
222      * Adjusts the seat tilt.
223      * Positive value lifts front edge of seat higher than back edge.
224      * Negative value lowers front edge of seat in relation to back edge.
225      */
226     public static final int ID_SEAT_TILT_MOVE = 0x2011;
227     /**
228      * seat lumbar fore/aft position, int type
229      * Pushes the lumbar support forward and backwards.
230      * Max value indicates most forward position.
231      * Min value indicates most rearward position.
232      */
233     public static final int ID_SEAT_LUMBAR_FORE_AFT_POS = 0x2012;
234     /** seat lumbar fore/aft move, int type
235      * Adjusts the lumbar support forwards and backwards.
236      * Positive value moves lumbar support forward.
237      * Negative value moves lumbar support rearward.
238      */
239     public static final int ID_SEAT_LUMBAR_FORE_AFT_MOVE = 0x2013;
240     /**
241      * seat lumbar side support position, int type
242      * Sets the amount of lateral lumbar support.
243      * Max value indicates widest lumbar setting (i.e. least support)
244      * Min value indicates thinnest lumbar setting.
245      */
246     public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_POS = 0x2014;
247     /** seat lumbar side support move, int type
248      * Adjusts the amount of lateral lumbar support.
249      * Positive value widens the lumbar area.
250      * Negative value makes the lumbar area thinner.
251      */
252     public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 0x2015;
253     /**
254      * seat headrest height position, int type
255      * Sets the headrest height.
256      * Max value indicates tallest setting.
257      * Min value indicates shortest setting.
258      */
259     public static final int ID_SEAT_HEADREST_HEIGHT_POS = 0x2016;
260     /** seat headrest height move, int type
261      * Postive value moves the headrest higher.
262      * Negative value moves the headrest lower.
263      */
264     public static final int ID_SEAT_HEADREST_HEIGHT_MOVE = 0x2017;
265     /**
266      * seat headrest angle position, int type
267      * Sets the angle of the headrest.
268      * Max value indicates most upright angle.
269      * Min value indicates shallowest headrest angle.
270      */
271     public static final int ID_SEAT_HEADREST_ANGLE_POS = 0x2018;
272     /** seat headrest angle move, int type
273      * Adjusts the angle of the headrest.
274      * Positive value angles headrest towards most upright angle.
275      * Negative value angles headrest towards shallowest headrest angle.
276      */
277     public static final int ID_SEAT_HEADREST_ANGLE_MOVE = 0x2019;
278     /**
279      * seat headrest fore/aft position, int type
280      * Sets the headrest forwards and backwards.
281      * Max value indicates position closest to front of car.
282      * Min value indicates position closest to rear of car.
283      */
284     public static final int ID_SEAT_HEADREST_FORE_AFT_POS = 0x201A;
285     /** seat headrest fore/aft move, int type
286      * Adjsuts the headrest forwards and backwards.
287      * Positive value moves the headrest closer to front of car.
288      * Negative value moves the headrest closer to rear of car.
289      */
290     public static final int ID_SEAT_HEADREST_FORE_AFT_MOVE = 0x201B;
291 
292     /** Window properties are zoned by VehicleWindow */
293     /**
294      * window position, int type
295      * Max = window up / closed.
296      * Min = window down / open.
297      */
298     public static final int ID_WINDOW_POS = 0x3001;
299     /** window move, int type
300      * Positive value moves window up / closes window.
301      * Negative value moves window down / opens window.
302      */
303     public static final int ID_WINDOW_MOVE = 0x3002;
304     /**
305      * window vent position, int type
306      * This feature is used to control the vent feature on a sunroof.
307      * Max = vent open.
308      * Min = vent closed.
309      */
310     public static final int ID_WINDOW_VENT_POS = 0x3003;
311     /** window vent move, int type
312      * This feature is used to control the vent feature on a sunroof.
313      * Positive value opens the vent.
314      * Negative value closes the vent.
315      */
316     public static final int ID_WINDOW_VENT_MOVE = 0x3004;
317     /**
318      * window lock, bool type
319      * True indicates windows are locked and can't be moved.
320      */
321     public static final int ID_WINDOW_LOCK = 0x3005;
322 
323     /** @hide */
324     @IntDef({
325         ID_DOOR_POS,
326         ID_DOOR_MOVE,
327         ID_DOOR_LOCK,
328         ID_MIRROR_Z_POS,
329         ID_MIRROR_Z_MOVE,
330         ID_MIRROR_Y_POS,
331         ID_MIRROR_Y_MOVE,
332         ID_MIRROR_LOCK,
333         ID_MIRROR_FOLD,
334         ID_SEAT_MEMORY_SELECT,
335         ID_SEAT_MEMORY_SET,
336         ID_SEAT_BELT_BUCKLED,
337         ID_SEAT_BELT_HEIGHT_POS,
338         ID_SEAT_BELT_HEIGHT_MOVE,
339         ID_SEAT_FORE_AFT_POS,
340         ID_SEAT_FORE_AFT_MOVE,
341         ID_SEAT_BACKREST_ANGLE_1_POS,
342         ID_SEAT_BACKREST_ANGLE_1_MOVE,
343         ID_SEAT_BACKREST_ANGLE_2_POS,
344         ID_SEAT_BACKREST_ANGLE_2_MOVE,
345         ID_SEAT_HEIGHT_POS,
346         ID_SEAT_HEIGHT_MOVE,
347         ID_SEAT_DEPTH_POS,
348         ID_SEAT_DEPTH_MOVE,
349         ID_SEAT_TILT_POS,
350         ID_SEAT_TILT_MOVE,
351         ID_SEAT_LUMBAR_FORE_AFT_POS,
352         ID_SEAT_LUMBAR_FORE_AFT_MOVE,
353         ID_SEAT_LUMBAR_SIDE_SUPPORT_POS,
354         ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
355         ID_SEAT_HEADREST_HEIGHT_POS,
356         ID_SEAT_HEADREST_HEIGHT_MOVE,
357         ID_SEAT_HEADREST_ANGLE_POS,
358         ID_SEAT_HEADREST_ANGLE_MOVE,
359         ID_SEAT_HEADREST_FORE_AFT_POS,
360         ID_SEAT_HEADREST_FORE_AFT_MOVE,
361         ID_WINDOW_POS,
362         ID_WINDOW_MOVE,
363         ID_WINDOW_VENT_POS,
364         ID_WINDOW_VENT_MOVE,
365         ID_WINDOW_LOCK
366     })
367     @Retention(RetentionPolicy.SOURCE)
368     public @interface PropertyId {}
369 
370     /**
371      * Application registers CarCabinEventCallback object to receive updates and changes to
372      * subscribed Car Cabin properties.
373      */
374     public interface CarCabinEventCallback {
375         /**
376          * Called when a property is updated
377          * @param value Property that has been updated.
378          */
onChangeEvent(CarPropertyValue value)379         void onChangeEvent(CarPropertyValue value);
380 
381         /**
382          * Called when an error is detected with a property
383          * @param propertyId
384          * @param zone
385          */
onErrorEvent(@ropertyId int propertyId, int zone)386         void onErrorEvent(@PropertyId int propertyId, int zone);
387     }
388 
389     private static class CarPropertyEventListenerToBase implements CarPropertyEventCallback {
390         private final WeakReference<CarCabinManager> mManager;
391 
CarPropertyEventListenerToBase(CarCabinManager manager)392         public CarPropertyEventListenerToBase(CarCabinManager manager) {
393             mManager = new WeakReference<>(manager);
394         }
395 
396         @Override
onChangeEvent(CarPropertyValue value)397         public void onChangeEvent(CarPropertyValue value) {
398             CarCabinManager manager = mManager.get();
399             if (manager != null) {
400                 manager.handleOnChangeEvent(value);
401             }
402         }
403 
404         @Override
onErrorEvent(int propertyId, int zone)405         public void onErrorEvent(int propertyId, int zone) {
406             CarCabinManager manager = mManager.get();
407             if (manager != null) {
408                 manager.handleOnErrorEvent(propertyId, zone);
409             }
410         }
411     }
412 
handleOnChangeEvent(CarPropertyValue value)413     private void handleOnChangeEvent(CarPropertyValue value) {
414         Collection<CarCabinEventCallback> callbacks;
415         synchronized (this) {
416             callbacks = new ArraySet<>(mCallbacks);
417         }
418         for (CarCabinEventCallback l: callbacks) {
419             l.onChangeEvent(value);
420         }
421     }
422 
handleOnErrorEvent(int propertyId, int zone)423     private void handleOnErrorEvent(int propertyId, int zone) {
424         Collection<CarCabinEventCallback> listeners;
425         synchronized (this) {
426             listeners = new ArraySet<>(mCallbacks);
427         }
428         if (!listeners.isEmpty()) {
429             for (CarCabinEventCallback l: listeners) {
430                 l.onErrorEvent(propertyId, zone);
431             }
432         }
433     }
434 
435     /**
436      * Get an instance of CarCabinManager
437      *
438      * Should not be obtained directly by clients, use {@link Car#getCarManager(String)} instead.
439      * @param service
440      * @param context
441      * @param handler
442      * @hide
443      */
CarCabinManager(IBinder service, Context context, Handler handler)444     public CarCabinManager(IBinder service, Context context, Handler handler) {
445         mMgr = new CarPropertyManagerBase(service, handler, DBG, TAG);
446     }
447 
448     /**
449      * All properties in CarCabinManager are zoned.
450      * @param propertyId
451      * @return true if property is a zoned type
452      */
isZonedProperty(@ropertyId int propertyId)453     public static boolean isZonedProperty(@PropertyId int propertyId) {
454         return true;
455     }
456 
457     /**
458      * Implement wrappers for contained CarPropertyManagerBase object
459      * @param callback
460      * @throws CarNotConnectedException
461      */
registerCallback(CarCabinEventCallback callback)462     public synchronized void registerCallback(CarCabinEventCallback callback) throws
463             CarNotConnectedException {
464         if (mCallbacks.isEmpty()) {
465             mListenerToBase = new CarPropertyEventListenerToBase(this);
466             mMgr.registerCallback(mListenerToBase);
467         }
468         mCallbacks.add(callback);
469     }
470 
471     /**
472      * Stop getting property updates for the given callback. If there are multiple registrations for
473      * this listener, all listening will be stopped.
474      * @param callback
475      */
unregisterCallback(CarCabinEventCallback callback)476     public synchronized void unregisterCallback(CarCabinEventCallback callback) {
477         mCallbacks.remove(callback);
478         if (mCallbacks.isEmpty()) {
479             mMgr.unregisterCallback();
480             mListenerToBase = null;
481         }
482     }
483 
484     /**
485      * Get list of properties available to Car Cabin Manager
486      * @return List of CarPropertyConfig objects available via Car Cabin Manager.
487      * @throws CarNotConnectedException if the connection to the car service has been lost.
488      */
getPropertyList()489     public List<CarPropertyConfig> getPropertyList() throws CarNotConnectedException {
490         return mMgr.getPropertyList();
491     }
492 
493     /**
494      * Get value of boolean property
495      * @param propertyId
496      * @param area
497      * @return value of requested boolean property
498      * @throws CarNotConnectedException
499      */
getBooleanProperty(@ropertyId int propertyId, int area)500     public boolean getBooleanProperty(@PropertyId int propertyId, int area)
501             throws CarNotConnectedException {
502         return mMgr.getBooleanProperty(propertyId, area);
503     }
504 
505     /**
506      * Get value of float property
507      * @param propertyId
508      * @param area
509      * @return value of requested float property
510      * @throws CarNotConnectedException
511      */
getFloatProperty(@ropertyId int propertyId, int area)512     public float getFloatProperty(@PropertyId int propertyId, int area)
513             throws CarNotConnectedException {
514         return mMgr.getFloatProperty(propertyId, area);
515     }
516 
517     /**
518      * Get value of integer property
519      * @param propertyId
520      * @param area
521      * @return value of requested integer property
522      * @throws CarNotConnectedException
523      */
getIntProperty(@ropertyId int propertyId, int area)524     public int getIntProperty(@PropertyId int propertyId, int area)
525             throws CarNotConnectedException {
526         return mMgr.getIntProperty(propertyId, area);
527     }
528 
529     /**
530      * Set the value of a boolean property
531      * @param propertyId
532      * @param area
533      * @param val
534      * @throws CarNotConnectedException
535      */
setBooleanProperty(@ropertyId int propertyId, int area, boolean val)536     public void setBooleanProperty(@PropertyId int propertyId, int area, boolean val)
537             throws CarNotConnectedException {
538         mMgr.setBooleanProperty(propertyId, area, val);
539     }
540 
541     /**
542      * Set the value of a float property
543      * @param propertyId
544      * @param area
545      * @param val
546      * @throws CarNotConnectedException
547      */
setFloatProperty(@ropertyId int propertyId, int area, float val)548     public void setFloatProperty(@PropertyId int propertyId, int area, float val)
549             throws CarNotConnectedException {
550         mMgr.setFloatProperty(propertyId, area, val);
551     }
552 
553     /**
554      * Set the value of an integer property
555      * @param propertyId
556      * @param area
557      * @param val
558      * @throws CarNotConnectedException
559      */
setIntProperty(@ropertyId int propertyId, int area, int val)560     public void setIntProperty(@PropertyId int propertyId, int area, int val)
561             throws CarNotConnectedException {
562         mMgr.setIntProperty(propertyId, area, val);
563     }
564 
565     /** @hide */
566     @Override
onCarDisconnected()567     public void onCarDisconnected() {
568         mMgr.onCarDisconnected();
569     }
570 }
571