/*
 * Copyright (c) 2012, Motorola, Inc. All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef __M4SENSORHUB_CLIENT_IOCTL_H__
#define __M4SENSORHUB_CLIENT_IOCTL_H__

/** The following define the IOCTL command values via the ioctl macros */

#define M4_SENSOR_IOCTL_BASE            		0xA2
#define M4_SENSOR_IOCTL_GET_TEMPRATURE  		_IOR(M4_SENSOR_IOCTL_BASE, 01, int)
#define M4_SENSOR_IOCTL_GET_PRESSURE    		_IOR(M4_SENSOR_IOCTL_BASE, 02, int)
#define M4_SENSOR_IOCTL_GET_GYRO        		_IOR(M4_SENSOR_IOCTL_BASE, 03, int)
#define M4_SENSOR_IOCTL_SET_DELAY       		_IOW(M4_SENSOR_IOCTL_BASE, 04, int)
#define M4_SENSOR_IOCTL_APP_GET_FLAG    		_IOR(M4_SENSOR_IOCTL_BASE, 05, int)
#define M4_SENSOR_IOCTL_APP_SET_FLAG    		_IOW(M4_SENSOR_IOCTL_BASE, 06, int)
#define M4_SENSOR_IOCTL_GET_PEDOMETER   		_IOR(M4_SENSOR_IOCTL_BASE, 07, int)
#define M4_SENSOR_IOCTL_GET_PASSIVE_DATA		_IOR(M4_SENSOR_IOCTL_BASE, 10, int)
#define M4_SENSOR_IOCTL_GET_SLEEP_DATA			_IOR(M4_SENSOR_IOCTL_BASE, 11, int)
#define M4_SENSOR_IOCTL_SET_POSIX_TIME			_IOW(M4_SENSOR_IOCTL_BASE, 12, int)
#define M4_SENSOR_IOCTL_SET_ACTIVE_MODE			_IOW(M4_SENSOR_IOCTL_BASE, 13, int)
#define M4_SENSOR_IOCTL_SET_PASSIVE_MODE 		_IOW(M4_SENSOR_IOCTL_BASE, 14, int)
#define M4_SENSOR_IOCTL_SLEEP_ANALYSIS			_IOW(M4_SENSOR_IOCTL_BASE, 15, int)
#define M4_SENSOR_IOCTL_SET_EQUIPMENT_TYPE		_IOW(M4_SENSOR_IOCTL_BASE, 16, int)
#define M4_SENSOR_IOCTL_SET_MANUAL_CALIB_WALK_SPEED	_IOW(M4_SENSOR_IOCTL_BASE, 17, int)
#define M4_SENSOR_IOCTL_SET_MANUAL_CALIB_JOG_SPEED	_IOW(M4_SENSOR_IOCTL_BASE, 20, int)
#define M4_SENSOR_IOCTL_SET_MANUAL_CALIB_RUN_SPEED	_IOW(M4_SENSOR_IOCTL_BASE, 21, int)
#define M4_SENSOR_IOCTL_SET_MANUAL_CALIB_STATUS		_IOW(M4_SENSOR_IOCTL_BASE, 22, int)
#define M4_SENSOR_IOCTL_SET_USER_PROFILE		_IOW(M4_SENSOR_IOCTL_BASE, 23, int)
#define M4_SENSOR_IOCTL_SET_USER_DISTANCE		_IOW(M4_SENSOR_IOCTL_BASE, 24, int)
#define M4_SENSOR_IOCTL_SET_USER_CALIB_TABLE		_IOW(M4_SENSOR_IOCTL_BASE, 25, int)
#define M4_SENSOR_IOCTL_GET_MANUAL_CALIB_STATUS		_IOR(M4_SENSOR_IOCTL_BASE, 26, int)
#define M4_SENSOR_IOCTL_ERASE_CALIB			_IOW(M4_SENSOR_IOCTL_BASE, 27, int)
#define M4_SENSOR_IOCTL_SET_SCREEN_ON_GESTURE_STATUS	_IOW(M4_SENSOR_IOCTL_BASE, 30, int)
#define M4_SENSOR_IOCTL_SET_ALTITUDE 			_IOW(M4_SENSOR_IOCTL_BASE, 31, int)
#define M4_SENSOR_IOCTL_GET_FUSION			_IOR(M4_SENSOR_IOCTL_BASE, 32, int)
#define M4_SENSOR_IOCTL_GET_COMPASS			_IOR(M4_SENSOR_IOCTL_BASE, 33, int)
#define M4_SENSOR_IOCTL_GET_ACCEL			_IOR(M4_SENSOR_IOCTL_BASE, 34, int)
#define M4_SENSOR_IOCTL_GYRO_SET_DELAY			_IOW(M4_SENSOR_IOCTL_BASE, 35, int)
#define M4_SENSOR_IOCTL_COMPASS_SET_DELAY		_IOW(M4_SENSOR_IOCTL_BASE, 36, int)
#define M4_SENSOR_IOCTL_ACCEL_SET_DELAY			_IOW(M4_SENSOR_IOCTL_BASE, 37, int)
#define M4_SENSOR_IOCTL_FUSION_SET_DELAY		_IOW(M4_SENSOR_IOCTL_BASE, 40, int)
#define M4_SENSOR_IOCTL_SET_SCREEN_STATUS _IOW(M4_SENSOR_IOCTL_BASE, 41, int)
#define M4_SENSOR_IOCTL_DL_SEND_PACKET    _IOW(M4_SENSOR_IOCTL_BASE, 42, int)
#define M4_SENSOR_IOCTL_SET_TIMEZONE_OFFSET _IOW(M4_SENSOR_IOCTL_BASE, 43, int)
#define M4_SENSOR_IOCTL_LOCK_CLOCKFACE    _IOW(M4_SENSOR_IOCTL_BASE, 44, int)
#define M4_SENSOR_IOCTL_SET_DAILYSTEP_OFFSET _IOW(M4_SENSOR_IOCTL_BASE, 45, int)

#define M4_SENSOR_DL_MAX_FILE_SIZE 16
#define M4_SENSOR_DL_MAX_PACKET_SIZE 2048

enum M4_SENSOR_DL_CMDS {
	M4_SENSOR_DL_CMD_GET_CHECKSUM,
	M4_SENSOR_DL_CMD_OPEN_FILE,
	M4_SENSOR_DL_CMD_WRITE_FILE,
	M4_SENSOR_DL_CMD_CLOSE_FILE,
	M4_SENSOR_DL_CMD_DELETE_FILE,
};

enum M4_SENSOR_DL_ERROR_CODES {
	M4_SENSOR_DL_SUCCESS,
	M4_SENSOR_DL_ERROR_GET_CHECKSUM,
	M4_SENSOR_DL_ERROR_OPEN_FILE,
	M4_SENSOR_DL_ERROR_WRITE_FILE,
	M4_SENSOR_DL_ERROR_CLOSE_FILE,
	M4_SENSOR_DL_ERROR_DELETE_FILE,
	M4_SENSOR_DL_ERROR_INVALID_SIZE,
	/*internal error between M4<==>Kernel*/
	M4_SENSOR_DL_ERROR_SEND_CMD = 0x80,
	M4_SENSOR_DL_ERROR_DATA_CHECKSUM,
};

#define M4_MAX_LOG_LEVEL	3
#define get_log_level(loglevel, mask) ((loglevel >> mask) & 0x3)

struct m4sh_user_profile {
	unsigned char gender;
	unsigned char age;
	unsigned char height;
	unsigned char weight;
};

struct m4sh_workout_data {
	int msp_distance;
	int user_distance;
};

struct m4sh_download_packet{
	unsigned char command;
	unsigned char status;
	unsigned short size;
	unsigned int  checksum;
	char filename[M4_SENSOR_DL_MAX_FILE_SIZE];
	unsigned char buffer[M4_SENSOR_DL_MAX_PACKET_SIZE];
};

enum m4sh_log_level_mask {
	GEN_MASK_BIT_1,
	GEN_MASK_BIT_2,
	TIMER_MASK_BIT_1,
	TIMER_MASK_BIT_2,
	ACCEL_MASK_BIT_1,
	ACCEL_MASK_BIT_2,
	TMP_MASK_BIT_1,
	TMP_MASK_BIT_2,
	BMP_MASK_BIT_1,
	BMP_MASK_BIT_2,
	PEDO_MASK_BIT_1,
	PEDO_MASK_BIT_2,
	TCMD_MASK_BIT_1,
	TCMD_MASK_BIT_2,
	GYRO_MASK_BIT_1,
	GYRO_MASK_BIT_2,
	COMPASS_MASK_BIT_1,
	COMPASS_MASK_BIT_2,
	FUSION_MASK_BIT_1,
	FUSION_MASK_BIT_2,
	METS_MASK_BIT_1,
	METS_MASK_BIT_2,
	GESTURE_MASK_BIT_1,
	GESTURE_MASK_BIT_2,
	POWER_MASK_BIT_1,
	POWER_MASK_BIT_2,
	CORRELATION_MASK_BIT_1,
	CORRELATION_MASK_BIT_2,
	GPS_MASK_BIT_1,
	GPS_MASK_BIT_2,
	DOWNLOAD_MASK_BIT_1,
	DOWNLOAD_MASK_BIT_2,
	AUDIO_MASK_BIT_1,
	AUDIO_MASK_BIT_2,
	DISPLAY_MASK_BIT_1,
	DISPLAY_MASK_BIT_2,
	WRIST_MASK_BIT_1,
	WRIST_MASK_BIT_2,
};

#endif  /* __M4SENSORHUB_CLIENT_IOCTL_H__ */
