/*!
 * @section LICENSE
 *
 * (C) Copyright 2011~2014 Bosch Sensortec GmbH All Rights Reserved
 *
 * 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.
 *
 *------------------------------------------------------------------------------
 * Disclaimer
 *
 * Common: Bosch Sensortec products are developed for the consumer goods
 * industry. They may only be used within the parameters of the respective valid
 * product data sheet.  Bosch Sensortec products are provided with the express
 * understanding that there is no warranty of fitness for a particular purpose.
 * They are not fit for use in life-sustaining, safety or security sensitive
 * systems or any system or device that may lead to bodily harm or property
 * damage if the system or device malfunctions. In addition, Bosch Sensortec
 * products are not fit for use in products which interact with motor vehicle
 * systems.  The resale and/or use of products are at the purchaser's own risk
 * and his own responsibility. The examination of fitness for the intended use
 * is the sole responsibility of the Purchaser.
 *
 * The purchaser shall indemnify Bosch Sensortec from all third party claims,
 * including any claims for incidental, or consequential damages, arising from
 * any product use not covered by the parameters of the respective valid product
 * data sheet or not approved by Bosch Sensortec and reimburse Bosch Sensortec
 * for all costs in connection with such claims.
 *
 * The purchaser must monitor the market for the purchased products,
 * particularly with regard to product safety and inform Bosch Sensortec without
 * delay of all security relevant incidents.
 *
 * Engineering Samples are marked with an asterisk (*) or (e). Samples may vary
 * from the valid technical specifications of the product series. They are
 * therefore not intended or fit for resale to third parties or for use in end
 * products. Their sole purpose is internal client testing. The testing of an
 * engineering sample may in no way replace the testing of a product series.
 * Bosch Sensortec assumes no liability for the use of engineering samples. By
 * accepting the engineering samples, the Purchaser agrees to indemnify Bosch
 * Sensortec from all claims arising from the use of engineering samples.
 *
 * Special: This software module (hereinafter called "Software") and any
 * information on application-sheets (hereinafter called "Information") is
 * provided free of charge for the sole purpose to support your application
 * work. The Software and Information is subject to the following terms and
 * conditions:
 *
 * The Software is specifically designed for the exclusive use for Bosch
 * Sensortec products by personnel who have special experience and training. Do
 * not use this Software if you do not have the proper experience or training.
 *
 * This Software package is provided `` as is `` and without any expressed or
 * implied warranties, including without limitation, the implied warranties of
 * merchantability and fitness for a particular purpose.
 *
 * Bosch Sensortec and their representatives and agents deny any liability for
 * the functional impairment of this Software in terms of fitness, performance
 * and safety. Bosch Sensortec and their representatives and agents shall not be
 * liable for any direct or indirect damages or injury, except as otherwise
 * stipulated in mandatory applicable law.
 *
 * The Information provided is believed to be accurate and reliable. Bosch
 * Sensortec assumes no responsibility for the consequences of use of such
 * Information nor for any infringement of patents or other rights of third
 * parties which may result from its use.
 *
 * @file         BstSensorInfo.cpp
 * @date         "Tue May 28 15:47:53 2013 +0800"
 * @commit       "5293218"
 *
 * @brief
 *
 * @detail
 *
 */

#include "sensors.h"

#include "BstSensor.h"
#include "BstSensorInfo.h"

#define VENDOR_NAME_BST_SHORT "BOSCH "
#define VENDOR_NAME_BST "Bosch Sensortec GmbH"
#define SENSOR_STR " Sensor"

#define SENSOR_VER_BST 3060102


const struct sensor_t BstSensorInfo::g_bst_sensor_list[] = {
	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_A SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_ACCELERATION_HANDLE,
		type: SENSOR_TYPE_ACCELEROMETER,
		maxRange: 16.0f * 9.805,
		resolution: 4.0f * 9.805 / (1 << HW_INFO_BITWIDTH_A),
		power: 0.13f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
		fifoReservedEventCount: 0,
		fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
		stringType: SENSOR_STRING_TYPE_ACCELEROMETER,
		requiredPermission: "",
		maxDelay: 200000,
		flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_M SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_MAGNETIC_FIELD_HANDLE,
		type: SENSOR_TYPE_MAGNETIC_FIELD,
		maxRange: 1600.0f,
		resolution: 0.3f,
		power: 0.5f,
                // THIS SHOULD BE THE VALUE OF CFG_DELAY_M_MIN * 1000!
		minDelay: 50000,
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_MAGNETIC_FIELD,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_G SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_GYROSCOPE_HANDLE,
		type: SENSOR_TYPE_GYROSCOPE,
		maxRange: 2500.0f,
		resolution: 250.0f / (1 << 16),
		power: 5.0f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_GYROSCOPE,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_O SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_ORIENTATION_HANDLE,
		type: SENSOR_TYPE_ORIENTATION,
		maxRange: 360.0f,
		resolution: 1.0f,
		power: 0.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_ORIENTATION,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_VG SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_GRAVITY_HANDLE,
		type: SENSOR_TYPE_GRAVITY,
		maxRange: 9.805f * 2,
		resolution: 4.0f * 9.805 / (1 << HW_INFO_BITWIDTH_A),
		power: 5.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_GRAVITY,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_VLA SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_LINEAR_ACCEL_HANDLE,
		type: SENSOR_TYPE_LINEAR_ACCELERATION,
		maxRange: 9.805f * 2,
		resolution: 4.0f * 9.805 / (1 << HW_INFO_BITWIDTH_A),
		power: 5.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_LINEAR_ACCELERATION,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_VRV SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_ROTATION_VECTOR_HANDLE,
		type: SENSOR_TYPE_ROTATION_VECTOR,
		maxRange: 1.0f,
		resolution: 1.0f / (1 << 24),
		power: 5.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_ROTATION_VECTOR,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},


//	{
//		name: VENDOR_NAME_BST_SHORT
//			      BST_SENSOR_NAME_GEST_FLIP SENSOR_STR,
//		vendor: VENDOR_NAME_BST,
//		version: SENSOR_VER_BST,
//		handle: SENSORS_GEST_FLIP_HANDLE,
//		type: BST_SENSOR_TYPE_GEST_FLIP,
//		maxRange: 1.0f,
//		resolution: 1.0f,
//		power: 0.13f,
//		minDelay: 0,
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
//                fifoReservedEventCount: 0,
//                fifoMaxEventCount: 0,
//#endif
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
//                stringType: "bosch.gest.flip.sensor",
//                requiredPermission: "",
//                maxDelay: 200000,
//                flags: 0,
//#endif
//		reserved: {}
//	},
//
//	{
//		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_SGM SENSOR_STR,
//		vendor: VENDOR_NAME_BST,
//		version: SENSOR_VER_BST,
//		handle: SENSORS_SW_SIGNIFICANT_MOTION_HANDLE,
//		type: BSTEXT_SENSOR_TYPE_SW_SGM,
//		maxRange: 1.0f,
//		resolution: 1.0f,
//		power: 0.13f,
//#ifdef __FASTEST_MODE_100HZ__
//		minDelay: 10000,
//#else
//		minDelay: 5000,
//#endif
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
//                fifoReservedEventCount: 0,
//                fifoMaxEventCount: 0,
//#endif
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
//                stringType: "bosch.software.signficant.motion.sensor",
//                requiredPermission: "",
//                maxDelay: 200000,
//                flags: 0,
//#endif
//		reserved: {}
//	},

#ifdef __UNCALIBRATED_VIRTUAL_SENSOR_SUPPORT__
	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_GRV SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_GAME_ROTATION_VECTOR_HANDLE,
		type: SENSOR_TYPE_GAME_ROTATION_VECTOR,
		maxRange: 1.0f,
		resolution: 1.0f / (1 << 24),
		power: 5.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_GYU SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_GYROSCOPE_UNCALIBRATED_HANDLE,
		type: SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
		maxRange: 2500.0f,
		resolution: 250.0f / (1 << 16),
		power: 5.0f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},

	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_MU SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_MAGNETIC_UNCALIBRATED_HANDLE,
		type: SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
		maxRange: 1600.0f,
		resolution: 0.3f,
		power: 0.5f,
                // THIS SHOULD BE THE VALUE OF CFG_DELAY_M_MIN * 1000!
		minDelay: 50000,
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
                fifoReservedEventCount: 0,
                fifoMaxEventCount: 0,
#endif
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},
#endif

#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
	{
		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_GEOM_RY SENSOR_STR,
		vendor: VENDOR_NAME_BST,
		version: SENSOR_VER_BST,
		handle: SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE,
		type: SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
		maxRange: 1.0f,
		resolution: 1.0f / (1 << 24),
		power: 5.63f,
#ifdef __FASTEST_MODE_100HZ__
		minDelay: 10000,
#else
		minDelay: 5000,
#endif
		fifoReservedEventCount: 0,
		fifoMaxEventCount: 0,
#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
                stringType: SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
                requiredPermission: "",
                maxDelay: 200000,
                flags: 0,
#endif
		reserved: {}
	},
#endif

//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_0__
//	{
//		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_STC SENSOR_STR,
//		vendor: VENDOR_NAME_BST,
//		version: SENSOR_VER_BST,
//		handle: SENSORS_STEP_COUNTER_HANDLE,
//		type: SENSOR_TYPE_STEP_COUNTER,
//		maxRange: 10000.0f,
//		resolution: 1.0f,
//		power: 5.63f,
//		minDelay: 0,
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
//                fifoReservedEventCount: 0,
//                fifoMaxEventCount: 0,
//#endif
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
//                stringType: SENSOR_STRING_TYPE_STEP_COUNTER,
//                requiredPermission: "",
//                maxDelay: 1000000,
//                flags: 0,
//#endif
//		reserved: {}
//	},
//	{
//		name: VENDOR_NAME_BST_SHORT BST_SENSOR_NAME_STD SENSOR_STR,
//		vendor: VENDOR_NAME_BST,
//		version: SENSOR_VER_BST,
//		handle: SENSORS_STEP_DETECTOR_HANDLE,
//		type: SENSOR_TYPE_STEP_DETECTOR,
//		maxRange: 1.0f,
//		resolution: 1.0f,
//		power: 5.63f,
//		minDelay: 0,
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_1__
//                fifoReservedEventCount: 0,
//                fifoMaxEventCount: 0,
//#endif
//#if __HAL_VER__ >= __SENSORS_DEVICE_API_VERSION_1_3__
//                stringType: SENSOR_STRING_TYPE_STEP_DETECTOR,
//                requiredPermission: "",
//                maxDelay: 1000000,
//                flags: 0,
//#endif
//		reserved: {}
//	},
//
//#endif

};


const struct sensor_t * BstSensorInfo::getSensor(int handle)
{
	const struct sensor_t *s = NULL;
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(g_bst_sensor_list); i++) {
		if (g_bst_sensor_list[i].handle == handle) {
			break;
		}
	}

	if (i < ARRAY_SIZE(g_bst_sensor_list)) {
		s = (const struct sensor_t *) g_bst_sensor_list + i;
	}

	return s;
}
