/******************************************************************************
 *
 * $Id: Measure.h 304 2011-08-12 07:52:29Z kihara.gb $
 *
 * -- Copyright Notice --
 *
 * Copyright (c) 2004 Asahi Kasei Microdevices Corporation, Japan
 * All Rights Reserved.
 *
 * This software program is proprietary program of Asahi Kasei Microdevices
 * Corporation("AKM") licensed to authorized Licensee under Software License
 * Agreement (SLA) executed between the Licensee and AKM.
 *
 * Use of the software by unauthorized third party, or use of the software
 * beyond the scope of the SLA is strictly prohibited.
 *
 * -- End Asahi Kasei Microdevices Copyright Notice --
 *
 ******************************************************************************/
#ifndef AKMD_INC_MEASURE_H
#define AKMD_INC_MEASURE_H

// Include files for AK8963 library.
#include "AKCompass.h"
#include "misc.h"

/*** Constant definition ******************************************************/
#define AKRET_PROC_SUCCEED      0x00	/*!< The process has been successfully done. */
#define AKRET_FORMATION_CHANGED 0x01	/*!< The formation is changed */
#define AKRET_DATA_READERROR    0x02	/*!< Data read error occurred. */
#define AKRET_DATA_OVERFLOW     0x04	/*!< Data overflow occurred. */
#define AKRET_OFFSET_OVERFLOW	0x08	/*!< Offset values overflow. */
#define AKRET_HBASE_CHANGED	0x10	/*!< hbase was changed. */
#define AKRET_HFLUC_OCCURRED    0x20	/*!< A magnetic field fluctuation occurred. */
#define AKRET_VNORM_ERROR	0x40	/*!< AKSC_VNorm error. */
#define AKRET_PROC_FAIL         0x80	/*!< The process failes. */

#define AKMD_MAG_MIN_INTERVAL	 10000000	/*!< Minimum magnetometer interval */
#define AKMD_ACC_MIN_INTERVAL	 10000000	/*!< Minimum acceleration interval */
#define AKMD_ORI_MIN_INTERVAL	 10000000	/*!< Minimum orientation interval */
#define AKMD_LOOP_MARGIN	  3000000	/*!< Minimum sleep time */
#define AKMD_SETTING_INTERVAL	500000000	/*!< Setting event interval */

/*** Type declaration *********************************************************/
typedef int16(*OPEN_FORM)(void);
typedef void(*CLOSE_FORM)(void);
typedef int16(*CHECK_FORM)(void);

typedef struct _FORM_CLASS {
	OPEN_FORM	open;
	CLOSE_FORM	close;
	CHECK_FORM	check;
} FORM_CLASS;

/*** Global variables *********************************************************/

/*** Prototype of function ****************************************************/
void RegisterFormClass(
	FORM_CLASS* pt
);

void InitAK8963PRMS(
	AK8963PRMS*	prms
);

void SetDefaultPRMS(
	AK8963PRMS*	prms
);

int16 GetInterval(
	AKMD_LOOP_TIME* acc_acq,
	AKMD_LOOP_TIME* mag_acq,
	AKMD_LOOP_TIME* ori_acq,
	AKMD_LOOP_TIME* mag_mes,
	AKMD_LOOP_TIME* acc_mes,
	int16* hdoe_dec
);

int SetLoopTime(
	AKMD_LOOP_TIME* tm,
	int64_t execTime,
	int64_t* minDuration
);

int16 ReadAK8963FUSEROM(
	AK8963PRMS*	prms
);

int16 InitAK8963_Measure(
	AK8963PRMS*	prms
);

int16 FctShipmntTest_Body(
	AK8963PRMS*	prms
);

int16 FctShipmntTestProcess_Body(
	AK8963PRMS*	prms
);

void MeasureSNGLoop(
	AK8963PRMS*	prms
);

int16 GetMagneticVector(
	const int16	bData[],
	AK8963PRMS*	prms,
	const int16	curForm,
	const int16	hDecimator
);

int16 CalcDirection(
	AK8963PRMS* prms
);

#endif