@@ -34,8 +34,9 @@ LOG_MODULE_REGISTER(modem_info);
34
34
#define AT_CMD_VBAT "AT%XVBAT"
35
35
#define AT_CMD_TEMP "AT%XTEMP"
36
36
#define AT_CMD_FW_VERSION "AT+CGMR"
37
+ #define AT_CMD_CRSM "AT+CRSM"
38
+ #define AT_CMD_ICCID "AT+CRSM=176,12258,0,0,10"
37
39
#define AT_CMD_SUCCESS_SIZE 5
38
-
39
40
#define RSRP_PARAM_INDEX 0
40
41
#define RSRP_PARAM_COUNT 2
41
42
#define RSRP_OFFSET_VAL 141
@@ -67,6 +68,9 @@ LOG_MODULE_REGISTER(modem_info);
67
68
#define FW_PARAM_INDEX 0
68
69
#define FW_PARAM_COUNT 1
69
70
71
+ #define ICCID_PARAM_INDEX 2
72
+ #define ICCID_PARAM_COUNT 3
73
+
70
74
#define CMD_SIZE (x ) (strlen(x) - 1)
71
75
72
76
static const char success [] = "OK" ;
@@ -148,6 +152,13 @@ static const struct modem_info_data fw_data = {
148
152
.data_type = AT_PARAM_TYPE_STRING ,
149
153
};
150
154
155
+ static const struct modem_info_data iccid_data = {
156
+ .cmd = AT_CMD_ICCID ,
157
+ .param_index = ICCID_PARAM_INDEX ,
158
+ .param_count = ICCID_PARAM_COUNT ,
159
+ .data_type = AT_PARAM_TYPE_STRING ,
160
+ };
161
+
151
162
static const struct modem_info_data * const modem_data [] = {
152
163
[MODEM_INFO_RSRP ] = & rsrp_data ,
153
164
[MODEM_INFO_BAND ] = & band_data ,
@@ -159,6 +170,7 @@ static const struct modem_info_data *const modem_data[] = {
159
170
[MODEM_INFO_BATTERY ] = & battery_data ,
160
171
[MODEM_INFO_TEMP ] = & temp_data ,
161
172
[MODEM_INFO_FW_VERSION ] = & fw_data ,
173
+ [MODEM_INFO_ICCID ] = & iccid_data ,
162
174
};
163
175
164
176
static const char * const modem_data_name [] = {
@@ -172,6 +184,7 @@ static const char *const modem_data_name[] = {
172
184
[MODEM_INFO_BATTERY ] = "BATTERY" ,
173
185
[MODEM_INFO_TEMP ] = "TEMP" ,
174
186
[MODEM_INFO_FW_VERSION ] = "FW" ,
187
+ [MODEM_INFO_ICCID ] = "ICCID" ,
175
188
};
176
189
177
190
static rsrp_cb_t modem_info_rsrp_cb ;
@@ -220,6 +233,42 @@ static bool is_cesq_notification(char *buf, size_t len)
220
233
return strstr (buf , AT_CMD_CESQ_RESP ) ? true : false;
221
234
}
222
235
236
+ static void flip_iccid_string (char * buf )
237
+ {
238
+ u8_t current_char ;
239
+ u8_t next_char ;
240
+
241
+ for (size_t i = 0 ; i < strlen (buf ); i = i + 2 ) {
242
+ current_char = buf [i ];
243
+ next_char = buf [i + 1 ];
244
+
245
+ buf [i ] = next_char ;
246
+ buf [i + 1 ] = current_char ;
247
+ }
248
+ }
249
+
250
+ static int modem_info_parse_iccid (const struct modem_info_data * modem_data ,
251
+ char * buf )
252
+ {
253
+ int err ;
254
+ u32_t param_index ;
255
+
256
+ err = at_parser_max_params_from_str (
257
+ & buf [CMD_SIZE (AT_CMD_CRSM )], & m_param_list ,
258
+ modem_data -> param_count );
259
+
260
+ if (err != 0 ) {
261
+ return err ;
262
+ }
263
+
264
+ param_index = at_params_valid_count_get (& m_param_list );
265
+ if (param_index != modem_data -> param_count ) {
266
+ return - EAGAIN ;
267
+ }
268
+
269
+ return err ;
270
+ }
271
+
223
272
static int modem_info_parse (const struct modem_info_data * modem_data , char * buf )
224
273
{
225
274
int err ;
@@ -328,7 +377,11 @@ int modem_info_string_get(enum modem_info info, char *buf)
328
377
return err ;
329
378
}
330
379
331
- err = modem_info_parse (modem_data [info ], recv_buf );
380
+ if (info == MODEM_INFO_ICCID ) {
381
+ err = modem_info_parse_iccid (modem_data [info ], recv_buf );
382
+ } else {
383
+ err = modem_info_parse (modem_data [info ], recv_buf );
384
+ }
332
385
333
386
if (err ) {
334
387
return err ;
@@ -351,6 +404,10 @@ int modem_info_string_get(enum modem_info info, char *buf)
351
404
MODEM_INFO_MAX_RESPONSE_SIZE );
352
405
}
353
406
407
+ if (info == MODEM_INFO_ICCID ) {
408
+ flip_iccid_string (buf );
409
+ }
410
+
354
411
return len <= 0 ? - ENOTSUP : len ;
355
412
}
356
413
0 commit comments