1 /*
2  * Copyright 2020 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 SURROUND_VIEW_SERVICE_IMPL_IOMODULECOMMON_H_
18 #define SURROUND_VIEW_SERVICE_IMPL_IOMODULECOMMON_H_
19 
20 #include <string>
21 
22 #include "core_lib.h"
23 
24 namespace android {
25 namespace hardware {
26 namespace automotive {
27 namespace sv {
28 namespace V1_0 {
29 namespace implementation {
30 
31 // Struct for camera related configurations.
32 // Note: Does not include camera intrinsics and extrinsics, these are specified in EVS metadata.
33 struct CameraConfig {
34     // Id of logical group containing surronnd view cameras.
35     std::string evsGroupId;
36 
37     // List of evs camera Ids  in order: front, right, rear, left.
38     std::vector<std::string> evsCameraIds;
39 
40     // In order: front, right, rear, left.
41     std::vector<std::string> maskFilenames;
42 };
43 
44 struct SvConfig2d {
45     // Bool flag for surround view 2d.
46     bool sv2dEnabled;
47 
48     // Surround view 2d params.
49     android_auto::surround_view::SurroundView2dParams sv2dParams;
50 
51     // Car model bounding box for 2d surround view.
52     // To be moved into sv 2d params.
53     android_auto::surround_view::BoundingBox carBoundingBox;
54 };
55 
56 struct SvConfig3d {
57     // Bool flag for enabling/disabling surround view 3d.
58     bool sv3dEnabled;
59 
60     // Bool flag for enabling/disabling animations.
61     bool sv3dAnimationsEnabled;
62 
63     // Car model config file.
64     std::string carModelConfigFile;
65 
66     // Car model obj file.
67     std::string carModelObjFile;
68 
69     // Surround view 3d params.
70     android_auto::surround_view::SurroundView3dParams sv3dParams;
71 };
72 
73 // Main struct in which surround view config is parsed into.
74 struct SurroundViewConfig {
75     // Version info.
76     std::string version;
77 
78     // Camera config.
79     CameraConfig cameraConfig;
80 
81     // Surround view 2d config.
82     SvConfig2d sv2dConfig;
83 
84     // Surround view 3d config.
85     SvConfig3d sv3dConfig;
86 };
87 
88 struct Range {
89     // Range start.
90     // Start value may be greater than end value.
91     float start;
92 
93     // Range end.
94     float end;
95 };
96 
97 // Rotation axis
98 struct RotationAxis {
99     // Unit axis direction vector.
100     std::array<float, 3> axisVector;
101 
102     // Rotate about this point.
103     std::array<float, 3> rotationPoint;
104 };
105 
106 enum AnimationType {
107     // Rotate a part about an axis from a start to end angle.
108     ROTATION_ANGLE = 0,
109 
110     // Continuously rotate a part about an axis by a specified angular speed.
111     ROTATION_SPEED = 1,
112 
113     // Linearly translates a part from one point to another.
114     TRANSLATION = 2,
115 
116     // Switch to another texture once.
117     SWITCH_TEXTURE_ONCE = 3,
118 
119     // Adjust the brightness of the texture once.
120     ADJUST_GAMMA_ONCE = 4,
121 
122     // Repeatedly toggle between two textures.
123     SWITCH_TEXTURE_REPEAT = 5,
124 
125     // Repeatedly toggle between two gamma values.
126     ADJUST_GAMMA_REPEAT = 6,
127 };
128 
129 // Rotation operation
130 struct RotationOp {
131     // VHAL signal to trigger operation.
132     uint64_t vhalProperty;
133 
134     // Rotation operation type.
135     AnimationType type;
136 
137     // Rotation axis.
138     RotationAxis axis;
139 
140     // Default rotation (angle/speed) value.
141     // It is used for default rotation when the signal is on while vhal_range is
142     // not provided.
143     float defaultRotationValue;
144 
145     // Default animation time elapsed to finish the rotation operation.
146     // It is ignored if VHAL provides continuous signal value.
147     float animationTime;
148 
149     // physical rotation range with start mapped to vhal_range start and
150     // end mapped to vhal_range end.
151     Range rotationRange;
152 
153     // VHAL signal range.
154     // Un-supported types: STRING, BYTES and VEC
155     // Refer:  hardware/interfaces/automotive/vehicle/2.0/types.hal
156     // VehiclePropertyType
157     Range vhalRange;
158 };
159 
160 // Translation operation.
161 struct TranslationOp {
162     // VHAL signal to trigger operation.
163     uint64_t vhalProperty;
164 
165     // Translation operation type.
166     AnimationType type;
167 
168     // Unit direction vector.
169     std::array<float, 3> direction;
170 
171     // Default translation value.
172     // It is used for default translation when the signal is on while vhal_range
173     // is not provided.
174     float defaultTranslationValue;
175 
176     // Default animation time elapsed to finish the texture operation.
177     // It is ignored if VHAL provides continuous signal value.
178     float animationTime;
179 
180     // Physical translation range with start mapped to vhal_range start and
181     // end mapped to vhal_range end.
182     Range translationRange;
183 
184     // VHAL signal range.
185     // Un-supported types: STRING, BYTES and VEC
186     // Refer:  hardware/interfaces/automotive/vehicle/2.0/types.hal
187     // VehiclePropertyType
188     Range vhalRange;
189 };
190 
191 // Texture operation.
192 struct TextureOp {
193     // VHAL signal to trigger operation.
194     uint64_t vhalProperty;
195 
196     // Texture operation type.
197     AnimationType type;
198 
199     // Default texture id.
200     // It is used as default texture when the signal is on while vhal_range is
201     // not provided.
202     std::string defaultTexture;
203 
204     // Default animation time elapsed to finish the texture operation.
205     // Unit is milliseconds.
206     // If the animation time is specified, the vhal_property is assumed to be
207     // on/off type.
208     // It is ignored if it is equal or less than zero and vhal_property is
209     // assumed to provide continuous value.
210     int animationTime;
211 
212     // texture range mapped to texture_ids[i].first.
213     Range textureRange;
214 
215     // VHAL signal range.
216     // Un-supported types: STRING, BYTES and VEC
217     // Refer:  hardware/interfaces/automotive/vehicle/2.0/types.hal
218     // VehiclePropertyType
219     Range vhalRange;
220 
221     // Texture ids for switching textures.
222     // Applicable for animation types: kSwitchTextureOnce and
223     // kSwitchTextureRepeated
224     // 0 - n-1
225     std::vector<std::pair<float, std::string>> textureIds;
226 };
227 
228 // Gamma operation.
229 struct GammaOp {
230     // VHAL signal to trigger operation.
231     uint64_t vhalProperty;
232 
233     // Texture operation type.
234     // Applicable for animation types: kAdjustGammaOnce and kAdjustGammaRepeat.
235     AnimationType type;
236 
237     // Default animation time elapsed to finish the gamma operation.
238     // Unit is milliseconds.
239     // If the animation time is specified, the vhal_property is assumed to be
240     // on/off type.
241     // It is ignored if it is equal or less than zero and vhal_property is
242     // assumed to provide continuous value.
243     int animationTime;
244 
245     // Gamma range with start mapped to vhal_range start and
246     // end mapped to vhal_range end.
247     Range gammaRange;
248 
249     // VHAL signal range.
250     // Un-supported types: STRING, BYTES and VEC
251     // Refer:  hardware/interfaces/automotive/vehicle/2.0/types.hal
252     // VehiclePropertyType
253     Range vhalRange;
254 };
255 
256 // Animation info of a car part
257 struct AnimationInfo {
258     // Car animation part id(name). It is a unique id.
259     std::string partId;
260 
261     // Car part parent name.
262     std::string parentId;
263 
264     // List of child Ids.
265     std::vector<std::string> childIds;
266 
267     // Car part pose w.r.t parent's coordinate.
268     android_auto::surround_view::Mat4x4 pose;
269 
270     // VHAL priority from high [0] to low [n-1]. Only VHALs specified in the
271     // vector have priority.
272     std::vector<uint64_t> vhalPriority;
273 
274     // TODO(b/158245554): simplify xxOpsMap data structs.
275     // Map of gamma operations. Key value is VHAL property.
276     std::map<uint64_t, std::vector<GammaOp>> gammaOpsMap;
277 
278     // Map of texture operations. Key value is VHAL property.
279     std::map<uint64_t, std::vector<TextureOp>> textureOpsMap;
280 
281     // Map of rotation operations. Key value is VHAL property.
282     // Multiple rotation ops are supported and will be simultaneously animated in
283     // order if their rotation axis are different and rotation points are the
284     // same.
285     std::map<uint64_t, std::vector<RotationOp>> rotationOpsMap;
286 
287     // Map of translation operations. Key value is VHAL property.
288     std::map<uint64_t, std::vector<TranslationOp>> translationOpsMap;
289 };
290 
291 // Main struct in which surround view car model config is parsed into.
292 struct AnimationConfig {
293     std::string version;
294 
295     std::vector<AnimationInfo> animations;
296 };
297 
298 // Car model.
299 struct CarModel {
300     // Car model parts map.
301     std::map<std::string, android_auto::surround_view::CarPart> partsMap;
302 
303     // Car testures map.
304     std::map<std::string, android_auto::surround_view::CarTexture> texturesMap;
305 };
306 
307 struct CarModelConfig {
308     CarModel carModel;
309 
310     AnimationConfig animationConfig;
311 };
312 
313 struct IOModuleConfig {
314     // Camera config.
315     CameraConfig cameraConfig;
316 
317     // Surround view 2d config.
318     SvConfig2d sv2dConfig;
319 
320     // Surround view 3d config.
321     SvConfig3d sv3dConfig;
322 
323     // Car model config.
324     CarModelConfig carModelConfig;
325 };
326 
327 enum IOStatus : uint8_t {
328     // OK ststus. ALL fields read and parsed.
329     OK = 0,
330 
331     // Error status. Cannot read the config file (config file missing or not
332     // accessible)
333     ERROR_READ_CONFIG_FILE = 1,
334 
335     // Error ststus. Config file format doesn't match.
336     ERROR_CONFIG_FILE_FORMAT = 2,
337 
338     // Warning status. Read car model (obj, mtl) error. Either the files are
339     // missing or wrong format.
340     ERROR_READ_CAR_MODEL = 3,
341 
342     // Warning status. Read animation config file error. Either the file is
343     // missing or wrong format.
344     ERROR_READ_ANIMATION = 4,
345 };
346 
347 }  // namespace implementation
348 }  // namespace V1_0
349 }  // namespace sv
350 }  // namespace automotive
351 }  // namespace hardware
352 }  // namespace android
353 
354 #endif  // SURROUND_VIEW_SERVICE_IMPL_IOMODULECOMMON_H_
355