Tizen 2.1 base
[platform/core/telephony/tel-plugin-imc.git] / src / desc.c
1 /*
2  * tel-plugin-imc
3  *
4  * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Hayoon Ko <hayoon.ko@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/utsname.h>
25 #include <glib.h>
26 #include <tcore.h>
27 #include <plugin.h>
28 #include <hal.h>
29 #include <server.h>
30 #include <at.h>
31 #include <core_object.h>
32
33 #include "s_common.h"
34 #include "s_network.h"
35 #include "s_modem.h"
36 #include "s_sim.h"
37 #include "s_sap.h"
38 #include "s_ps.h"
39 #include "s_call.h"
40 #include "s_ss.h"
41 #include "s_sms.h"
42 #include "s_sat.h"
43 #include "s_phonebook.h"
44 #include "s_gps.h"
45
46 static char *cp_name;
47 static int cp_count = 0;
48
49 #define MAX_CP_QUERY_COUNT 60
50
51 static gboolean _query_cp_state(gpointer data)
52 {
53         gboolean power_state = FALSE;
54         TcorePlugin *p = NULL;
55         CoreObject* obj = NULL;
56         TcoreHal* h = NULL;
57
58         p = (TcorePlugin*)data;
59
60         if(cp_count > MAX_CP_QUERY_COUNT){
61                 dbg("cp query counter exceeds MAX_CP_QUERY_COUNT");
62                 return FALSE;
63         }
64         obj = tcore_plugin_ref_core_object(p, "modem");
65         h = tcore_object_get_hal(obj);
66         power_state = tcore_hal_get_power_state(h);
67
68         if(TRUE == power_state){
69                 dbg("CP READY");
70                 s_modem_send_poweron(p);
71                 return FALSE;
72         }
73         else{
74                 dbg("CP NOT READY, cp_count :%d", cp_count);
75                 cp_count++;
76                 return TRUE;
77         }
78 }
79
80 static enum tcore_hook_return on_hal_send(TcoreHal *hal, unsigned int data_len, void *data, void *user_data)
81 {
82         hook_hex_dump(TX, data_len, data);
83         return TCORE_HOOK_RETURN_CONTINUE;
84 }
85
86 static void on_hal_recv(TcoreHal *hal, unsigned int data_len, const void *data, void *user_data)
87 {
88         msg("=== RX data DUMP =====");
89         util_hex_dump("          ", data_len, data);
90         msg("=== RX data DUMP =====");
91 }
92
93 static gboolean on_load()
94 {
95         dbg("i'm load!");
96
97         return TRUE;
98 }
99
100 static int _get_cp_name(char **name)
101 {
102         struct utsname u;
103
104         char *svnet1_models[] = {
105                 "F1", "S1", "M2", "H2", "H2_SDK",
106                 "CRESPO", "STEALTHV", "SLP45", "Kessler", "P1P2",
107                 "U1SLP", "U1HD", "SLP7_C210", "SLP10_C210", NULL
108         };
109
110         char *svnet2_models[] = { "SMDK4410", "SMDK4212", "TRATS2", "SLP_PQ_LTE", "SLP_NAPLES", "REDWOOD", "TRATS", NULL };
111
112         char *tty_models[] = { "QCT MSM8X55 SURF", "QCT MSM7x27a FFA", NULL };
113
114         int i = 0;
115
116         if (*name) {
117                 dbg("[ error ] name is not empty");
118                 return FALSE;
119         }
120
121         memset(&u, '\0', sizeof(struct utsname));
122
123         uname(&u);
124
125         dbg("u.nodename : [ %s ]", u.nodename);
126
127         for (i = 0; svnet1_models[i]; i++) {
128                 if (!strcmp(u.nodename, svnet1_models[i])) {
129                         *name = g_new0(char, 5);
130                         strcpy(*name, "6260");
131                         return 5;
132                 }
133         }
134
135         for (i = 0; svnet2_models[i]; i++) {
136                 if (!strcmp(u.nodename, svnet2_models[i])) {
137                         *name = g_new0(char, 5);
138                         strcpy(*name, "6262");
139                         return 5;
140                 }
141         }
142
143         for (i = 0; tty_models[i]; i++) {
144                 if (!strcmp(u.nodename, tty_models[i])) {
145                         *name = g_new0(char, 6);
146                         strcpy(*name, "dpram");
147                         return 6;
148                 }
149         }
150
151         dbg("[ error ] unknown model : (%s)", u.nodename);
152
153         return 0;
154 }
155
156 static gboolean on_init(TcorePlugin *p)
157 {
158         TcoreHal *h;
159         struct global_data *gd;
160         // char *cp_name = 0;
161         int len = 0;
162
163         if (!p)
164                 return FALSE;
165
166         gd = calloc(sizeof(struct global_data), 1);
167         if (!gd)
168                 return FALSE;
169
170         dbg("i'm init!");
171
172         gd->msg_auto_id_current = 0;
173         gd->msg_auto_id_start = 1;
174         gd->msg_auto_id_end = 255;
175
176         len = _get_cp_name(&cp_name);
177         if (!len) {
178                 dbg("[ error ] unsupport cp (name : %s)", cp_name);
179                 free(gd);
180                 return FALSE;
181         }
182
183         /* FIXME: HAL will reside in Co-object.
184          * This HAL is just used as default before MUX setup.
185          * Each HAL has AT pasre functionality.
186          */
187         h = tcore_server_find_hal(tcore_plugin_ref_server(p), cp_name);
188         if (!h) {
189                 g_free(cp_name);
190                 free(gd);
191                 return FALSE;
192         }
193
194         // set physical hal into plugin's userdata
195         gd->hal = h;
196
197         tcore_plugin_link_user_data(p, gd);
198
199         tcore_hal_add_send_hook(h, on_hal_send, p);
200         tcore_hal_add_recv_callback(h, on_hal_recv, p);
201
202         s_modem_init(p, h);
203         s_sim_init(p, h);
204         s_sat_init(p, h);
205         s_network_init(p, h);
206         s_ps_init(p, h);
207         s_call_init(p, h);
208         s_ss_init(p, h);
209         s_sms_init(p, h);
210         s_phonebook_init(p, h);
211         s_sap_init(p, h);
212
213         g_free(cp_name);
214
215         tcore_hal_set_power(h, TRUE);
216         //wait until CP is ready
217         g_timeout_add_full(G_PRIORITY_HIGH,500,_query_cp_state, p, 0 );
218         return TRUE;
219 }
220
221 static void on_unload(TcorePlugin *p)
222 {
223         struct global_data *gd;
224
225         if (!p)
226                 return;
227
228         dbg("i'm unload");
229
230         gd = tcore_plugin_ref_user_data(p);
231         if (gd) {
232                 free(gd);
233         }
234 }
235
236 struct tcore_plugin_define_desc plugin_define_desc = {
237         .name = "IMC",
238         .priority = TCORE_PLUGIN_PRIORITY_MID,
239         .version = 1,
240         .load = on_load,
241         .init = on_init,
242         .unload = on_unload
243 };