Rework SRS to support multiple clients
[samsung-ril.git] / samsung-ril.h
1 /**
2  * This file is part of samsung-ril.
3  *
4  * Copyright (C) 2010-2011 Joerie de Gram <j.de.gram@gmail.com>
5  * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr>
6  *
7  * samsung-ril is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * samsung-ril is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with samsung-ril.  If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21
22 #ifndef _SAMSUNG_RIL_H_
23 #define _SAMSUNG_RIL_H_
24
25 #include <pthread.h>
26
27 #include <telephony/ril.h>
28 #include <radio.h>
29
30 #include "compat.h"
31 #include "ipc.h"
32 #include "srs.h"
33
34 /**
35  * Defines
36  */
37
38 #define RIL_CLIENT_LOCK(client) pthread_mutex_lock(&(client->mutex));
39 #define RIL_CLIENT_UNLOCK(client) pthread_mutex_unlock(&(client->mutex));
40
41 #define RIL_onRequestCompleteReal(t, e, response, responselen) ril_env->OnRequestComplete(t,e, response, responselen)
42 #define RIL_onUnsolicitedResponse(a,b,c) ril_env->OnUnsolicitedResponse(a,b,c)
43 #define RIL_requestTimedCallback(a,b,c) ril_env->RequestTimedCallback(a,b,c)
44
45 #define reqIdNew() ril_request_id_new()
46 #define reqGetId(t) ril_request_get_id(t)
47 #define reqGetToken(i) ril_request_get_token(i)
48
49 #define RIL_TOKEN_DATA_WAITING  (RIL_Token) 0xff
50 /**
51  * RIL structures
52  */
53
54 struct ril_client;
55 struct ril_token;
56 struct ril_tokens;
57 struct ril_state;
58
59 /**
60  * RIL globals
61  */
62
63 extern struct ril_client *ipc_fmt_client;
64 extern struct ril_client *ipc_rfs_client;
65 extern struct ril_client *srs_client;
66
67 extern const struct RIL_Env *ril_env;
68 extern struct ril_state ril_state;
69
70 /**
71  * RIL client
72  */
73
74 typedef int (*ril_client_func)(struct ril_client *client);
75
76 typedef enum {
77         RIL_CLIENT_NULL         = 0,
78         RIL_CLIENT_CREATED      = 1,
79         RIL_CLIENT_READY        = 2,
80         RIL_CLIENT_DESTROYED    = 3,
81         RIL_CLIENT_ERROR        = 4,
82
83 } ril_client_state;
84
85 struct ril_client {
86         ril_client_func create;
87         ril_client_func destroy;
88         ril_client_func read_loop;
89
90         void *object;
91
92         pthread_t thread;
93         pthread_mutex_t mutex;
94
95         ril_client_state state;
96 };
97
98 struct ril_client_funcs {
99         ril_client_func create;
100         ril_client_func destroy;
101         ril_client_func read_loop;
102 };
103
104 struct ril_client *ril_client_new(struct ril_client_funcs *client_funcs);
105 int ril_client_free(struct ril_client *client);
106 int ril_client_create(struct ril_client *client);
107 int ril_client_destroy(struct ril_client *client);
108 int ril_client_thread_start(struct ril_client *client);
109
110 /**
111  * RIL request token
112  */
113
114 struct ril_request_token {
115         RIL_Token token;
116         int canceled;
117 };
118
119 void ril_requests_tokens_init(void);
120 int ril_request_reg_id(RIL_Token token);
121 int ril_request_get_id(RIL_Token token);
122 RIL_Token ril_request_get_token(int id);
123 int ril_request_get_canceled(RIL_Token token);
124 void ril_request_set_canceled(RIL_Token token, int canceled);
125
126 void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
127
128 /**
129  * RIL tokens
130  */
131
132 struct ril_tokens {
133         RIL_Token radio_power;
134         RIL_Token pin_status;
135         RIL_Token get_imei;
136         RIL_Token get_imeisv;
137         RIL_Token baseband_version;
138
139         RIL_Token registration_state;
140         RIL_Token gprs_registration_state;
141         RIL_Token operator;
142
143 };
144
145 void ril_tokens_check(void);
146
147 /**
148  * RIL state
149  */
150  
151 typedef enum {
152         SIM_ABSENT                      = 0,
153         SIM_NOT_READY                   = 1,
154         SIM_READY                       = 2,
155         SIM_PIN                         = 3,
156         SIM_PUK                         = 4,
157         SIM_BLOCKED                     = 5,
158         SIM_NETWORK_PERSO               = 6,
159         SIM_NETWORK_SUBSET_PERSO        = 7,
160         SIM_CORPORATE_PERSO             = 8,
161         SIM_SERVICE_PROVIDER_PERSO      = 9,
162 } SIM_Status;
163
164 typedef enum {
165         POWER_MODE_LPM                  = 0,
166         POWER_MODE_NORMAL               = 2,
167         POWER_MODE_SIM_INIT_COMPLETE    = 4,
168 } Modem_PowerMode;
169
170 struct ril_state {
171         RIL_RadioState radio_state;
172         SIM_Status sim_status;
173         Modem_PowerMode power_mode;
174
175         struct ril_tokens tokens;
176
177         struct ipc_sec_pin_status_response sim_pin_status;
178         struct ipc_sec_sim_icc_type sim_type;
179
180         struct ipc_net_regist netinfo;
181         struct ipc_net_regist gprs_netinfo;
182         struct ipc_net_current_plmn plmndata;
183
184         struct ipc_call_status call_status;
185
186         int gprs_last_failed_cid;
187
188         unsigned char dtmf_tone;
189
190         unsigned char ussd_state;
191 };
192
193 void ril_globals_init(void);
194 void ril_state_lpm(void);
195 int ril_modem_check(void);
196
197 /**
198  * Clients dispatch functions
199  */
200
201 void ipc_fmt_dispatch(struct ipc_message_info *info);
202 void ipc_rfs_dispatch(struct ipc_message_info *info);
203 void srs_dispatch(int fd, struct srs_message *message);
204
205 /* GEN */
206
207 struct ipc_gen_phone_res_expect {
208         unsigned char aseq;
209         unsigned short command;
210         void (*func)(struct ipc_message_info *info);
211         int to_complete;
212         int to_abort;
213 };
214
215 void ipc_gen_phone_res_expects_init(void);
216 void ipc_gen_phone_res_expect_to_func(unsigned char aseq, unsigned short command, 
217                 void (*func)(struct ipc_message_info *info));
218 void ipc_gen_phone_res_expect_to_complete(unsigned char aseq, unsigned short command);
219 void ipc_gen_phone_res_expect_to_abort(unsigned char aseq, unsigned short command);
220 void ipc_gen_phone_res(struct ipc_message_info *info);
221
222 /* PWR */
223 void ipc_pwr_phone_pwr_up(void);
224 void ipc_pwr_phone_state(struct ipc_message_info *info);
225 void ril_request_radio_power(RIL_Token t, void *data, size_t datalen);
226
227 /* DISP */
228 void ril_request_signal_strength(RIL_Token t);
229 void ipc_disp_icon_info(struct ipc_message_info *info);
230 void ipc_disp_rssi_info(struct ipc_message_info *info);
231
232 /* MISC */
233 void ril_request_get_imei(RIL_Token t);
234 void ril_request_get_imeisv(RIL_Token t);
235 void ipc_misc_me_sn(struct ipc_message_info *info);
236 void ril_request_baseband_version(RIL_Token t);
237 void ipc_misc_me_version(struct ipc_message_info *info);
238 void ril_request_get_imsi(RIL_Token t);
239 void ipc_misc_me_imsi(struct ipc_message_info *info);
240 void ipc_misc_time_info(struct ipc_message_info *info);
241
242 /* SAT */
243 void respondSatProactiveCmd(struct ipc_message_info *request);
244 void requestSatSendTerminalResponse(RIL_Token t, void *data, size_t datalen);
245 void requestSatSendEnvelopeCommand(RIL_Token t, void *data, size_t datalen);
246 void respondSatEnvelopeCmd(struct ipc_message_info *request);
247
248 /* SS */
249
250 void ril_request_send_ussd(RIL_Token t, void *data, size_t datalen);
251 void ril_request_cancel_ussd(RIL_Token t, void *data, size_t datalen);
252 void ipc_ss_ussd(struct ipc_message_info *info);
253
254 /* SEC */
255 void ril_state_update(SIM_Status status);
256 void ipc_sec_pin_status(struct ipc_message_info *info);
257 void ril_request_get_sim_status(RIL_Token t);
258 void ril_request_sim_io(RIL_Token t, void *data, size_t datalen);
259 void ipc_sec_rsim_access(struct ipc_message_info *info);
260 void ipc_sec_pin_status_complete(struct ipc_message_info *info);
261 void ipc_sec_lock_info(struct ipc_message_info *info);
262 void ril_request_enter_sim_pin(RIL_Token t, void *data, size_t datalen);
263 void ril_request_change_sim_pin(RIL_Token t, void *data, size_t datalen);
264 void ril_request_enter_sim_puk(RIL_Token t, void *data, size_t datalen);
265 void ril_request_query_facility_lock(RIL_Token t, void *data, size_t datalen);
266 void ipc_sec_phone_lock(struct ipc_message_info *info);
267 void ipc_sec_phone_lock_complete(struct ipc_message_info *info);
268 void ril_request_set_facility_lock(RIL_Token t, void *data, size_t datalen);
269
270 /* NET */
271 void ril_plmn_split(char *plmn_data, char **plmn, unsigned int *mcc, unsigned int *mnc);
272 void ril_plmn_string(char *plmn_data, char *response[3]);
273 unsigned char ril_plmn_act_get(char *plmn_data);
274 void ril_request_operator(RIL_Token t);
275 void ipc_net_current_plmn(struct ipc_message_info *message);
276 void ril_request_registration_state(RIL_Token t);
277 void ril_request_gprs_registration_state(RIL_Token t);
278 void ipc_net_regist(struct ipc_message_info *message);
279 void ril_request_query_available_networks(RIL_Token t);
280 void ipc_net_plmn_list(struct ipc_message_info *info);
281 void ril_request_get_preferred_network_type(RIL_Token t);
282 void ril_request_set_preferred_network_type(RIL_Token t, void *data, size_t datalen);
283 void ipc_net_mode_sel(struct ipc_message_info *info);
284 void ril_request_query_network_selection_mode(RIL_Token t);
285 void ipc_net_plmn_sel(struct ipc_message_info *info);
286 void ril_request_set_network_selection_automatic(RIL_Token t);
287 void ril_request_set_network_selection_manual(RIL_Token t, void *data, size_t datalen);
288
289 /* SMS */
290 struct ril_request_sms {
291         char *pdu;
292         int pdu_len;
293         char *smsc;
294         int smsc_len;
295
296         unsigned char aseq;
297 };
298
299 void ril_request_sms_init(void);
300 void ril_request_sms_del(int id);
301 void ril_request_sms_clear(int id);
302 int ril_request_sms_add(unsigned char aseq,
303                         char *pdu, int pdu_len, 
304                         char *smsc, int smsc_len);
305 int ril_request_sms_get_id(unsigned char aseq);
306 int ril_request_sms_get_next(void);
307 int ril_request_sms_lock_acquire(void);
308 void ril_request_sms_lock_release(void);
309
310 void ril_request_send_sms(RIL_Token t, void *data, size_t datalen);
311 void ril_request_send_sms_expect_more(RIL_Token t, void *data, size_t datalen);
312 int ril_request_send_sms_next(void);
313 void ril_request_send_sms_complete(RIL_Token t, char *pdu, char *smsc);
314 void ipc_sms_send_msg_complete(struct ipc_message_info *info);
315 void ipc_sms_svc_center_addr(struct ipc_message_info *info);
316 void ipc_sms_send_msg(struct ipc_message_info *info);
317
318 void ipc_sms_tpid_queue_init(void);
319 void ipc_sms_tpid_queue_del(int id);
320 int ipc_sms_tpid_queue_add(unsigned char sms_tpid);
321 int ipc_sms_tpid_queue_get_next(void);
322
323 void ipc_sms_incoming_msg(struct ipc_message_info *info);
324 void ril_request_sms_acknowledge(RIL_Token t, void *data, size_t datalen);
325 void ipc_sms_deliver_report(struct ipc_message_info *info);
326
327 void ipc_sms_device_ready(struct ipc_message_info *info);
328
329 /* Call */
330 void ipc_call_incoming(struct ipc_message_info *info);
331 void ipc_call_status(struct ipc_message_info *info);
332 void ril_request_dial(RIL_Token t, void *data, size_t datalen);
333 void ril_request_get_current_calls(RIL_Token t);
334 void ipc_call_list(struct ipc_message_info *info);
335 void ril_request_hangup(RIL_Token t);
336 void ril_request_answer(RIL_Token t);
337 void ril_request_last_call_fail_cause(RIL_Token t);
338 void ril_request_dtmf(RIL_Token t, void *data, int length);
339 void ipc_call_burst_dtmf(struct ipc_message_info *info);
340 void ril_request_dtmf_start(RIL_Token t, void *data, int length);
341 void ril_request_dtmf_stop(RIL_Token t);
342
343 /* SND */
344
345 void ril_request_set_mute(RIL_Token t, void *data, size_t datalen);
346 void srs_snd_set_call_clock_sync(struct srs_message *message);
347 void srs_snd_set_call_volume(struct srs_message *message);
348 void srs_snd_set_call_audio_path(struct srs_message *message);
349
350 /* GPRS */
351
352 struct ril_gprs_connection {
353         int cid;
354         int enabled;
355         RIL_LastDataCallActivateFailCause fail_cause;
356         char *interface;
357
358         RIL_Token token;
359         struct ipc_gprs_pdp_context_set context;
360         struct ipc_gprs_define_pdp_context define_context;
361         struct ipc_gprs_ip_configuration ip_configuration;
362 };
363
364 void ril_gprs_connections_init(void);
365 int ril_gprs_connection_reg_id(void);
366 struct ril_gprs_connection *ril_gprs_connection_add(void);
367 void ril_gprs_connection_del(struct ril_gprs_connection *gprs_connection);
368 void ril_request_setup_data_call(RIL_Token t, void *data, int length);
369 void ril_request_deactivate_data_call(RIL_Token t, void *data, int length);
370 void ipc_gprs_ip_configuration(struct ipc_message_info *info);
371 void ipc_gprs_call_status(struct ipc_message_info *info);
372 void ril_request_last_data_call_fail_cause(RIL_Token t);
373 void ipc_gprs_pdp_context(struct ipc_message_info *info);
374 void ril_unsol_data_call_list_changed(void);
375 void ril_request_data_call_list(RIL_Token t);
376
377 /* RFS */
378
379 void ipc_rfs_nv_read_item(struct ipc_message_info *info);
380 void ipc_rfs_nv_write_item(struct ipc_message_info *info);
381
382 #endif