Hi,

Revisited proposal for neighbouring cell info based on previous feedback:
- Low-level driver API instead of oFono.org DBUS API 
- Polling based, no automatic periodic updates
- Follows definitions in OMA SUPL v2.0

I'm not particular fond of the nested list -> wcdma. 
measured_results_list[].cell_measured_results[], maybe flatten that into a 
single list?

Cheers,
Waldo

/*
 *
 *  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 */


Cheers,
Waldo
-- 
Intel Corporation - Hillsboro, Oregon
Ultra Mobility Group - Platform Software Architecture
Tel: +1 503 264 6237 - Mobile: +1 503 703-7327
/*
 *
 *  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 */
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to