/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** 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.
*/
#ifndef _android_modem_h_
#define _android_modem_h_
#include "sim_card.h"
#include "sms.h"
/** MODEM OBJECT
**/
typedef struct AModemRec_* AModem;
/* a function used by the modem to send unsolicited messages to the channel controller */
typedef void (*AModemUnsolFunc)( void* opaque, const char* message );
extern AModem amodem_create( int base_port, AModemUnsolFunc unsol_func, void* unsol_opaque );
extern void amodem_set_legacy( AModem modem );
extern void amodem_destroy( AModem modem );
/* send a command to the modem */
extern const char* amodem_send( AModem modem, const char* cmd );
/* simulate the receipt on an incoming SMS message */
extern void amodem_receive_sms( AModem modem, SmsPDU pdu );
/** RADIO STATE
**/
typedef enum {
A_RADIO_STATE_OFF = 0, /* Radio explictly powered off (eg CFUN=0) */
A_RADIO_STATE_ON, /* Radio on */
} ARadioState;
extern ARadioState amodem_get_radio_state( AModem modem );
extern void amodem_set_radio_state( AModem modem, ARadioState state );
/* Set the received signal strength indicator and bit error rate */
extern void amodem_set_signal_strength( AModem modem, int rssi, int ber );
/** SIM CARD STATUS
**/
extern ASimCard amodem_get_sim( AModem modem );
/** VOICE AND DATA NETWORK REGISTRATION
**/
/* 'stat' for +CREG/+CGREG commands */
typedef enum {
A_REGISTRATION_UNREGISTERED = 0,
A_REGISTRATION_HOME = 1,
A_REGISTRATION_SEARCHING,
A_REGISTRATION_DENIED,
A_REGISTRATION_UNKNOWN,
A_REGISTRATION_ROAMING
} ARegistrationState;
typedef enum {
A_DATA_NETWORK_UNKNOWN = 0,
A_DATA_NETWORK_GPRS,
A_DATA_NETWORK_EDGE,
A_DATA_NETWORK_UMTS,
A_DATA_NETWORK_LTE,
A_DATA_NETWORK_CDMA1X,
A_DATA_NETWORK_EVDO, // TODO: Should REV0, REVA and REVB be added?
} ADataNetworkType;
// TODO: Merge the usage of these two structs and rename ADataNetworkType
typedef enum {
A_TECH_GSM = 0,
A_TECH_WCDMA,
A_TECH_CDMA,
A_TECH_EVDO,
A_TECH_LTE,
A_TECH_UNKNOWN // This must always be the last value in the enum
} AModemTech;
typedef enum {
A_SUBSCRIPTION_NVRAM = 0,
A_SUBSCRIPTION_RUIM,
A_SUBSCRIPTION_UNKNOWN // This must always be the last value in the enum
} ACdmaSubscriptionSource;
typedef enum {
A_ROAMING_PREF_HOME = 0,
A_ROAMING_PREF_AFFILIATED,
A_ROAMING_PREF_ANY,
A_ROAMING_PREF_UNKNOWN // This must always be the last value in the enum
} ACdmaRoamingPref;
extern ARegistrationState amodem_get_voice_registration( AModem modem );
extern void amodem_set_voice_registration( AModem modem, ARegistrationState state );
extern ARegistrationState amodem_get_data_registration( AModem modem );
extern void amodem_set_data_registration( AModem modem, ARegistrationState state );
extern void amodem_set_data_network_type( AModem modem, ADataNetworkType type );
extern ADataNetworkType android_parse_network_type( const char* speed );
extern AModemTech android_parse_modem_tech( const char* tech );
extern void amodem_set_cdma_subscription_source( AModem modem, ACdmaSubscriptionSource ssource );
extern void amodem_set_cdma_prl_version( AModem modem, int prlVersion);
/** OPERATOR NAMES
**/
typedef enum {
A_NAME_LONG = 0,
A_NAME_SHORT,
A_NAME_NUMERIC,
A_NAME_MAX /* don't remove */
} ANameIndex;
/* retrieve operator name into user-provided buffer. returns number of writes written, including terminating zero */
extern int amodem_get_operator_name ( AModem modem, ANameIndex index, char* buffer, int buffer_size );
/* reset one operator name from a user-provided buffer, set buffer_size to -1 for zero-terminated strings */
extern void amodem_set_operator_name( AModem modem, ANameIndex index, const char* buffer, int buffer_size );
/** CALL STATES
**/
typedef enum {
A_CALL_OUTBOUND = 0,
A_CALL_INBOUND = 1,
} ACallDir;
typedef enum {
A_CALL_ACTIVE = 0,
A_CALL_HELD,
A_CALL_DIALING,
A_CALL_ALERTING,
A_CALL_INCOMING,
A_CALL_WAITING
} ACallState;
typedef enum {
A_CALL_VOICE = 0,
A_CALL_DATA,
A_CALL_FAX,
A_CALL_UNKNOWN = 9
} ACallMode;
#define A_CALL_NUMBER_MAX_SIZE 16
typedef struct {
int id;
ACallDir dir;
ACallState state;
ACallMode mode;
int multi;
char number[ A_CALL_NUMBER_MAX_SIZE+1 ];
} ACallRec, *ACall;
extern int amodem_get_call_count( AModem modem );
extern ACall amodem_get_call( AModem modem, int index );
extern ACall amodem_find_call_by_number( AModem modem, const char* number );
extern int amodem_add_inbound_call( AModem modem, const char* number );
extern int amodem_update_call( AModem modem, const char* number, ACallState state );
extern int amodem_disconnect_call( AModem modem, const char* number );
/**/
#endif /* _android_modem_h_ */