/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __HALINTF_H #define __HALINTF_H #include <stdint.h> #include "toolchain.h" #include "sensType.h" /* * This files contains data structure for HAL and driver / algo to exchange information. */ #define APP_TO_SENSOR_HAL_SIZE_MAX HOSTINTF_SENSOR_DATA_MAX #define APP_TO_SENSOR_HAL_PAYLOAD_MAX \ (APP_TO_SENSOR_HAL_DATA_MAX - sizeof(struct AppToSensorHalDataBuffer)) #define APP_TO_SENSOR_HAL_TYPE(sensor, subtype) (((sensor) && 0xFF) | (((subtype) & 0x7F) << 8)) #define APP_TO_SENSOR_HAL_TYPE_MASK 0x7FFF enum { // gyro sensor calibration: GyroCalBias HALINTF_TYPE_GYRO_CAL_BIAS = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_GYRO, 1), // gyro sensor over temperature calibration: GyroOtcData HALINTF_TYPE_GYRO_OTC_DATA = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_GYRO, 2), // mag sensor calibration: MagCalBias HALINTF_TYPE_MAG_CAL_BIAS = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 1), // mag local field information: MagLocalField HALINTF_TYPE_MAG_LOCAL_FIELD = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 2), // mag sensor spherical calibration: MagSphericalData HALINTF_TYPE_MAG_SPERICAL_DATA = APP_TO_SENSOR_HAL_TYPE(SENS_TYPE_MAG, 3), }; SET_PACKED_STRUCT_MODE_ON struct GyroCalBias { int32_t hardwareBias[3]; // unit depending on hardware implementation float softwareBias[3]; // rad/s } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct GyroOtcData { float lastOffset[3]; // rad/s float lastTemperature; // Celsius float sensitivity[3]; // rad/s/K float intercept[3]; // rad/s } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct MagCalBias { float bias[3]; // in uT } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct MagLocalField { float strength; // in uT float declination; // in rad float inclination; // in rad } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF SET_PACKED_STRUCT_MODE_ON struct MagSphericalData { float bias[3]; float scale[3]; float skew[3]; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF // data structure for upload bulk data to sensor hal SET_PACKED_STRUCT_MODE_ON struct AppToSensorHalDataPayload { uint8_t size; // number of bytes in payload data uint8_t reserved; uint16_t type; // use EVENT_TYPE_BIT_DISCARDABLE to mark discardable update union { uint32_t u[0]; int32_t i[0]; float f[0]; struct GyroCalBias gyroCalBias[0]; struct GyroOtcData gyroOtcData[0]; struct MagCalBias magCalBias[0]; struct MagLocalField magLocalField[0]; struct MagSphericalData magSphericalData[0]; }; } ATTRIBUTE_PACKED; SET_PACKED_STRUCT_MODE_OFF // buffer data structure with header, header compatible with HostIntfDataBuffer SET_PACKED_STRUCT_MODE_ON struct AppToSensorHalDataBuffer { uint32_t eventType; // placeholder for HostIntfDataBuffer event type field struct AppToSensorHalDataPayload payload; }; SET_PACKED_STRUCT_MODE_OFF #endif //__HALINTF_H