/*
 *
 *  oFono - Open Source Telephony
 *
 *  Copyright (C) 2010 Intel Corporation.
 *
 *  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, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifndef __OFONO_CELL_INFO_H
#define __OFONO_CELL_INFO_H

#ifdef __cplusplus
extern "C" {
#endif

#include <ofono/types.h>

struct ofono_cell_info;

enum ofono_cell_info_type {
	OFONO_CELL_INFO_GSM = 0,
	OFONO_CELL_INFO_WCDMA = 1,
};


struct ofono_cell_info_results {
	enum ofono_cell_info_type rat;
	char mcc[OFONO_MAX_MCC_LENGTH + 1];
	char mnc[OFONO_MAX_MNC_LENGTH + 1];
	union {
		struct {
			int lac;	/* Location Area Code (0.65535) */ 
			int ci;		/* Cell Identity (0..65535) */
			int ta; 	/* Timing Advance (0..255), -1 = unsupported */
			int no_cells;	/* Number of valid nmr entries (1..15) */
			struct {
				int arfcn; /* ARFCN of the channel (0..1023) */
				int bsic;  /* BSIC of the channel (0..63) */
				int rxlev; /* Measured power of the channel (0..63) Subtract 110 to get power in dBm */
			} nmr[15];
		} gsm;
		
		struct {
			int uc;			/* Cell Identity, composed of RNC-ID and C-ID (0..268435455) */
			int dl_frequency;	/* (0..16383), -1 = unsupported */
			int ul_frequency;	/* (0..16383), -1 = unsupported */
			int scrambling_code;	/* Primary scrambling code (0..511) */
			int no_freq;		/* Number of valid measured_results_list entries (1..8) */ 			
			struct {
				int dl_frequency;	/* (0..16383), -1 = unsupported */
				int ul_frequency;	/* (0..16383), -1 = unsupported */
				int rssi;		/* UTRA-CarrierRSSI (0..76), -1 = unsupported */
				int no_cells;		/* Number of valid cell_measured_results entries (0..32) */
				struct {
					int ci; 	/* Cell Identity (0..268435455), -1 = unsupported */
					int scrambling_code; /* Primary scrambling code (0..511) */
					int ecn0;	/* (0..49), -1 = unsupported */
					int rscp;	/* cpich-RSCP per [3GPP RRC] (0..127), -1 = unsupported */
					int pathloss;	/* (46..158), -1 = unsupported */
				} cell_measured_results[32];
			} measured_results_list[8];
		} wcdma;
	};
};

typedef void (*ofono_cell_info_query_cb_t)(const struct ofono_error *error,
						const struct ofono_cell_info_results results,
						void *data);

struct ofono_cell_info_driver {
	const char *name;
	int (*probe)(struct ofono_cell_info *ci, unsigned int vendor,
			void *data);
	void (*remove)(struct ofono_cell_info *ci);
	void (*query)(struct ofono_cell_info *ci,
			ofono_cell_info_query_cb_t cb,
			void *data);
};

void ofono_cell_info_query(struct ofono_cell_info *ci, ofono_cell_info_query_cb_t cb, void *data);

int ofono_cell_info_driver_register(const struct ofono_cell_info_driver *d);
void ofono_cel_info_driver_unregister(const struct ofono_cell_info_driver *d);

struct ofono_cell_info *ofono_cell_info_create(struct ofono_modem *modem,
								unsigned int vendor,
								const char *driver,
								void *data);

void ofono_cell_info_register(struct ofono_cell_info *ci);
void ofono_cell_info_remove(struct ofono_cell_info *ci);

void ofono_cell_info_set_data(struct ofono_radio_settings *ci, void *data);
void *ofono_cell_info_get_data(struct ofono_radio_settings *ci);

#ifdef __cplusplus
}
#endif

#endif /* __OFONO_CELL_INFO_H */

