1 /*
2  * Copyright 2017 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 #ifndef EASEL_MANAGER_CLIENT_H
17 #define EASEL_MANAGER_CLIENT_H
18 
19 #include <future>
20 
21 #include <utils/Errors.h>
22 #include <utils/Mutex.h>
23 
24 #define FW_VER_SIZE 24
25 
26 namespace android {
27 
28 class EaselManagerClientListener;
29 class HdrPlusClient;
30 class HdrPlusClientListener;
31 
32 class EaselManagerClient {
33 public:
34     static std::unique_ptr<EaselManagerClient> create();
35 
EaselManagerClient()36     EaselManagerClient() {};
~EaselManagerClient()37     virtual ~EaselManagerClient() {};
38 
39     /*
40      * Return if Easel is present on the device.
41      *
42      * If Easel is not present, all other calls to HdrPlusClient are invalid.
43      */
44     virtual bool isEaselPresentOnDevice() const = 0;
45 
46     /*
47      * Open Easel manager client.
48      *
49      * This will power on Easel and initialize Easel manager client.
50      */
51     virtual status_t open() = 0;
52 
53     /*
54      * Suspend Easel.
55      *
56      * Put Easel on suspend mode.
57      */
58     virtual status_t suspend() = 0;
59 
60     /*
61      * Resume Easel.
62      *
63      * Resume Easel from suspend mode.
64      *
65      * listener will be invoked for Easel status.
66      */
67     virtual status_t resume(EaselManagerClientListener *listener) = 0;
68 
69     /*
70      * Retrieve Easel firmware version.
71      *
72      * Firmware version string is added to image exif
73      */
74     virtual status_t getFwVersion(char *fwVersion) = 0;
75 
76     /*
77      * Start MIPI with an output pixel lock rate for a camera.
78      *
79      * Can be called when Easel is powered on or resumed, for Easel to start sending sensor data
80      * to AP.
81      *
82      * cameraId is the camera ID to start MIPI for.
83      * outputPixelClkHz is the output pixel rate.
84      * enableCapture is whether to enable MIPI capture on Easel.
85      */
86     virtual status_t startMipi(uint32_t cameraId, uint32_t outputPixelClkHz,
87             bool enableCapture) = 0;
88 
89     /*
90      * Stop MIPI for a camera.
91      *
92      * cameraId is the camera is ID to stop MIPI for.
93      */
94     virtual status_t stopMipi(uint32_t cameraId) = 0;
95 
96     /*
97      * Open an HDR+ client asynchronously.
98      *
99      * Open an HDR+ client asynchronouly. When an HDR+ client is opened,
100      * HdrPlusClientListener::onOpened() will be invoked with the created HDR+ client. If opening
101      * an HDR+ client failed, HdrPlusClientListener::onOpenFailed() will be invoked with the error.
102      * If this method returns an error, HdrPlusClientListener::onOpenFailed() will not be invoked.
103      *
104      * listener is an HDR+ client listener.
105      *
106      * Returns:
107      *  OK:             if initiating opening an HDR+ client asynchronously was successful.
108      *                  HdrPlusClientListener::onOpened() or HdrPlusClientListener::onOpenFailed()
109      *                  will be invoked when opening an HDR+ client completed.
110      *  ALREADY_EXISTS: if there is already a pending HDR+ client being opened.
111      */
112     virtual status_t openHdrPlusClientAsync(HdrPlusClientListener *listener) = 0;
113 
114     /*
115      * Open an HDR+ client synchronously and block until it completes.
116      *
117      * listener is an HDR+ client listener.
118      * client is an output parameter for created HDR+ client.
119      *
120      * Returns:
121      *  OK:         on success.
122      *  -EEXIST:    if an HDR+ client is already opened.
123      *  -ENODEV:    if opening an HDR+ failed due to a serious error.
124      */
125     virtual status_t openHdrPlusClient(HdrPlusClientListener *listener,
126             std::unique_ptr<HdrPlusClient> *client) = 0;
127 
128     /*
129      * Close an HDR+ client.
130      *
131      * client is the HDR+ client to be closed.
132      */
133     virtual void closeHdrPlusClient(std::unique_ptr<HdrPlusClient> client) = 0;
134 
135 private:
136     // Disallow copy and assign.
137     EaselManagerClient(const EaselManagerClient&) = delete;
138     void operator=(const EaselManagerClient&) = delete;
139 };
140 
141 
142 /*
143  * EaselManagerClientListener defines callbacks that will be invoked by EaselManagerClient.
144  */
145 class EaselManagerClientListener {
146 public:
~EaselManagerClientListener()147     virtual ~EaselManagerClientListener() {};
148 
149     // Invoked when Easel encountered a fatal error. Client should shut down Easel.
150     virtual void onEaselFatalError(std::string errMsg) = 0;
151 
152     // Invoked when device is in a thermal condition not suitable for HDR+ processing.
153     // Client should disable HDR+ as soon as possible.
154     virtual void onThermalThrottle() = 0;
155 };
156 
157 } // namespace android
158 
159 #endif // EASEL_MANAGER_CLIENT_H
160