/*
 $License:
   Copyright 2011 InvenSense, Inc.

 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.
  $
 */
/*******************************************************************************
 *
 * $Id: compass.h 5629 2011-06-11 03:13:08Z mcaramello $
 *
 *******************************************************************************/

#ifndef COMPASS_H
#define COMPASS_H

#ifdef __cplusplus
extern "C" {
#endif

#include "mltypes.h"
#include "mpu.h"
#ifdef INV_INCLUDE_LEGACY_HEADERS
#include "compass_legacy.h"
#endif
    /* ------------ */
    /* - Defines. - */
    /* ------------ */

#define YAS_MAX_FILTER_LEN (20)
#define YAS_DEFAULT_FILTER_LEN (20)
#define YAS_DEFAULT_FILTER_THRESH (700) /* 700 nT */
#define YAS_DEFAULT_FILTER_NOISE (5000 * 5000) /* standard deviation 5000 nT */

    /* --------------- */
    /* - Structures. - */
    /* --------------- */

struct yas_adaptive_filter {
    int num;
    int index;
    int len;
    float noise;
    float sequence[YAS_MAX_FILTER_LEN];
};

struct yas_thresh_filter {
    float threshold;
    float last;
};

typedef struct {
    struct yas_adaptive_filter adap_filter[3];
    struct yas_thresh_filter thresh_filter[3];
} yas_filter_handle_t;

typedef struct {
    int (*init)(yas_filter_handle_t *t);
    int (*update)(yas_filter_handle_t *t, float *input, float *output);
} yas_filter_if_s;

    /* --------------------- */
    /* - Function p-types. - */
    /* --------------------- */

    unsigned char inv_compass_present(void);
    unsigned char inv_get_compass_slave_addr(void);
    inv_error_t inv_get_compass_data(long *data);
    inv_error_t inv_set_compass_bias(long *bias);
    unsigned short inv_get_compass_id(void);
    inv_error_t inv_set_compass_offset(void);
    inv_error_t inv_compass_check_range(void);
    inv_error_t inv_compass_write_reg(unsigned char reg, unsigned char val);
    inv_error_t inv_compass_read_reg(unsigned char reg, unsigned char *val);
    inv_error_t inv_compass_read_scale(long *val);

    int yas_filter_init(yas_filter_if_s *f);

#ifdef __cplusplus
}
#endif
#endif                          // COMPASS_H
