Network: Added Signal Strength, SIM: Added missing SIM IO header and call
[hayes-ril.git] / network.c
1 /*
2  * This file is part of hayes-ril.
3  *
4  * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
5  *
6  * Parts of this code are based on htcgeneric-ril, reference-ril:
7  * Copyright 2006-2011, htcgeneric-ril contributors
8  * Copyright 2006, The Android Open Source Project
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *     http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  */
22
23 #define LOG_TAG "RIL-NET"
24 #include <utils/Log.h>
25 #include <telephony/ril.h>
26
27 #include <hayes-ril.h>
28
29 void at2ril_signal_strength(RIL_SignalStrength *ss, int *values)
30 {
31         const int dbm_table[8] = {135,125,115,105,95,85,75,70};
32         const int edbm_table[8] = {120,110,100,90,80,75,70,65};
33         const int ecio_table[8] = {200,150,130,120,110,100,90,80};
34
35         memset(ss, 0, sizeof(RIL_SignalStrength));
36
37         if(ril_device->type == DEV_GSM) {
38                 ss->GW_SignalStrength.signalStrength = values[0];
39                 ss->GW_SignalStrength.bitErrorRate = values[1];
40         } else {
41                 /* 1st # is CDMA, 2nd is EVDO */
42                 ss->CDMA_SignalStrength.dbm = dbm_table[values[0]];
43                 ss->CDMA_SignalStrength.ecio = ecio_table[values[0]];
44                 ss->EVDO_SignalStrength.dbm = edbm_table[values[1]];
45                 ss->EVDO_SignalStrength.ecio = ecio_table[values[1]];
46                 ss->EVDO_SignalStrength.signalNoiseRatio = values[1];
47         }
48 }
49
50 int at_csq_expect(struct at_response *response, void *data, RIL_Token t)
51 {
52         struct at_response_data **response_data = NULL;
53         int response_data_count = 0;
54
55         RIL_SignalStrength ss;
56         int values[2] = { 0 };
57
58         if(response->status == AT_STATUS_UNDEF)
59                 return AT_RESPONSE_UNHANDELD_REASON_STATUS;
60
61         if(response->data == NULL || response->data_count <= 0) {
62                 LOGE("No data given to AT+CSQ response!");
63                 return AT_RESPONSE_HANDLED_ERROR;
64         }
65
66         LOGE("Caught valid AT+CSQ response!");
67
68         response_data_count = at_response_data_process(&response_data, response->data[0], strlen(response->data[0]));
69         if(response_data_count < 2)
70                 goto error_data;
71
72         if(response_data[0]->type != AT_RESPONSE_DATA_NUMERIC)
73                 goto error_data;
74         values[0] = response_data[0]->value.n;
75
76         if(response_data[1]->type != AT_RESPONSE_DATA_NUMERIC)
77                 goto error_data;
78         values[1] = response_data[1]->value.n;
79
80         at2ril_signal_strength(&ss, values);
81
82         RIL_onRequestComplete(t, RIL_E_SUCCESS, &ss, sizeof(RIL_SignalStrength));
83
84         at_response_data_free(response_data, response_data_count);
85
86         return AT_RESPONSE_HANDLED_OK;
87
88 error_data:
89         LOGE("No valid data fiven to AT+CSQ response!");
90
91         at_response_data_free(response_data, response_data_count);
92         return AT_RESPONSE_HANDLED_ERROR;
93 }
94
95 void ril_request_signal_strength(RIL_Token t, void *data, size_t length)
96 {
97         at_send_expect_to_func("AT+CSQ", NULL, NULL, t, at_csq_expect);
98 }