/*
 * cc110x.h
 *
 *  Created on: Jul 20, 2012
 *      Author: tkl
 */

#ifndef CC110X_H_
#define CC110X_H_

enum cc110x_radio_mode {
	CC110X_RADIO_MODE_NONE = 0,
	CC110X_RADIO_MODE_IDLE,
	CC110X_RADIO_MODE_RX,
	CC110X_RADIO_MODE_TX,
	CC110X_RADIO_MODE_PWD
};

enum cc110x_strobe_cmd {
	STROBE_SRES = 0,
	STROBE_SFSTXON,
	STROBE_SXOFF,
	STROBE_SCAL,
	STROBE_SRX,
	STROBE_STX,
	STROBE_SIDLE,
	STROBE_SWOR,
	STROBE_SPWD,
	STROBE_SFRX,
	STROBE_SFTX,
	STROBE_SWORRST,
	STROBE_SNOP
};

enum cc110x_it_type {
	IT_TYPE_NONE = 0,
	IT_TYPE_RX_COMPLETE,
	IT_TYPE_TX_COMPLETE
};

typedef void (*cc110x_fp_init)(const void *);
typedef void (*cc110x_fp_write_pa_table)(const void *);
typedef void (*cc110x_fp_set_radio_mode)(const void *, enum cc110x_radio_mode);
typedef char (*cc110x_fp_strobe)(const void *, enum cc110x_strobe_cmd);
typedef int (*cc110x_fp_write)(const void *, const char *, int);
typedef int (*cc110x_fp_read)(const void *, char *, int);
typedef int (*cc110x_fp_set_it_cb)(const void *, const void *, const void *);
typedef int (*cc110x_fp_get_rx_count)(const void *);

//! \brief Contains the function pointer to access the cc110x driver.
struct cc110x_fp {
	/*! Function pointer to the init function. */
	const cc110x_fp_init			init;
	/*! Function pointer to the strobe function. */
	const cc110x_fp_strobe			strobe;
	/*! Function pointer to the write function. */
	const cc110x_fp_write			write;
	/*! Function pointer to the read function. */
	const cc110x_fp_read			read;
	/*! Function pointer to the write_pa_table function. */
	const cc110x_fp_write_pa_table	write_pa_table;
	/*! Function pointer to the set_it_callback function. */
	const cc110x_fp_set_it_cb		set_it_callback;
	/*! Function pointer to the get_rx_count function. */
	const cc110x_fp_get_rx_count	get_rx_count;
};

//! \brief The cc110x driver object.
struct cc110x {
	/*! Radio mode. */
	enum cc110x_radio_mode	*radio_mode;
	/*! Architecture depended underlaying device (i.e. spi_t or NULL). */
	const void				*arch_dep_device;
	/*! Function pointer for the cc110x driver access. */
	const struct cc110x_fp	*fp;
};

int cc110x_open(const struct cc110x *cc110x);
int cc110x_close(const struct cc110x *cc110x);
int cc110x_write(const struct cc110x *cc110x, const char *buffer, int size);
int cc110x_read(const struct cc110x *cc110x, char *buffer, int size);
int cc110x_get_rx_count(const struct cc110x *cc110x);
void cc110x_set_radio_mode(const struct cc110x *cc110x, enum cc110x_radio_mode mode);
enum cc110x_radio_mode cc110x_get_radio_mode(const  struct cc110x *cc110x);
void cc110x_write_pa_table(const struct cc110x *cc110x);
void cc110x_strobe(const struct cc110x *cc110x, enum cc110x_strobe_cmd cmd);

#endif /* CC110X_H_ */
