gsm: indicate CREG vs. CGREG

This commit is contained in:
Dan Williams
2010-03-05 14:08:40 -08:00
parent e4350152c8
commit ad7bbb2f16
3 changed files with 47 additions and 15 deletions

View File

@@ -319,6 +319,7 @@ mm_gsm_parse_creg_response (GMatchInfo *info,
gulong *out_lac, gulong *out_lac,
gulong *out_ci, gulong *out_ci,
gint *out_act, gint *out_act,
gboolean *out_greg,
GError **error) GError **error)
{ {
gboolean success = FALSE, foo; gboolean success = FALSE, foo;
@@ -326,12 +327,14 @@ mm_gsm_parse_creg_response (GMatchInfo *info,
gulong stat = 0, lac = 0, ci = 0; gulong stat = 0, lac = 0, ci = 0;
guint istat = 0, ilac = 0, ici = 0, iact = 0; guint istat = 0, ilac = 0, ici = 0, iact = 0;
char *str; char *str;
const char *orig_str;
g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (info != NULL, FALSE);
g_return_val_if_fail (out_reg_state != NULL, FALSE); g_return_val_if_fail (out_reg_state != NULL, FALSE);
g_return_val_if_fail (out_lac != NULL, FALSE); g_return_val_if_fail (out_lac != NULL, FALSE);
g_return_val_if_fail (out_ci != NULL, FALSE); g_return_val_if_fail (out_ci != NULL, FALSE);
g_return_val_if_fail (out_act != NULL, FALSE); g_return_val_if_fail (out_act != NULL, FALSE);
g_return_val_if_fail (out_greg != NULL, FALSE);
/* Normally the number of matches could be used to determine what each /* Normally the number of matches could be used to determine what each
* item is, but we have overlap in one case. * item is, but we have overlap in one case.
@@ -413,6 +416,9 @@ mm_gsm_parse_creg_response (GMatchInfo *info,
act = -1; act = -1;
} }
orig_str = g_match_info_get_string (info);
*out_greg = !!strstr (orig_str, "+CGREG");
*out_reg_state = (guint32) stat; *out_reg_state = (guint32) stat;
if (stat != 4) { if (stat != 4) {
/* Don't fill in lac/ci/act if the device's state is unknown */ /* Don't fill in lac/ci/act if the device's state is unknown */

View File

@@ -36,6 +36,7 @@ gboolean mm_gsm_parse_creg_response (GMatchInfo *info,
gulong *out_lac, gulong *out_lac,
gulong *out_ci, gulong *out_ci,
gint *out_act, gint *out_act,
gboolean *out_greg,
GError **error); GError **error);
#endif /* MM_MODEM_HELPERS_H */ #endif /* MM_MODEM_HELPERS_H */

View File

@@ -465,6 +465,7 @@ typedef struct {
gint act; gint act;
guint regex_num; guint regex_num;
gboolean cgreg;
} CregResult; } CregResult;
static void static void
@@ -480,7 +481,7 @@ test_creg_match (const char *test,
gulong lac = 0, ci = 0; gulong lac = 0, ci = 0;
gint access_tech = -1; gint access_tech = -1;
GError *error = NULL; GError *error = NULL;
gboolean success; gboolean success, cgreg = FALSE;
guint regex_num = 0; guint regex_num = 0;
GPtrArray *array; GPtrArray *array;
@@ -508,13 +509,14 @@ test_creg_match (const char *test,
g_assert (info != NULL); g_assert (info != NULL);
g_assert (regex_num == result->regex_num); g_assert (regex_num == result->regex_num);
success = mm_gsm_parse_creg_response (info, &state, &lac, &ci, &access_tech, &error); success = mm_gsm_parse_creg_response (info, &state, &lac, &ci, &access_tech, &cgreg, &error);
g_assert (success); g_assert (success);
g_assert (error == NULL); g_assert (error == NULL);
g_assert (state == result->state); g_assert (state == result->state);
g_assert (lac == result->lac); g_assert (lac == result->lac);
g_assert (ci == result->ci); g_assert (ci == result->ci);
g_assert (access_tech == result->act); g_assert (access_tech == result->act);
g_assert (cgreg == result->cgreg);
} }
static void static void
@@ -522,7 +524,7 @@ test_creg1_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 1,3"; const char *reply = "+CREG: 1,3";
const CregResult result = { 3, 0, 0, -1 , 2}; const CregResult result = { 3, 0, 0, -1 , 2, FALSE};
test_creg_match ("CREG=1", TRUE, reply, data, &result); test_creg_match ("CREG=1", TRUE, reply, data, &result);
} }
@@ -532,7 +534,7 @@ test_creg1_unsolicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CREG: 3\r\n"; const char *reply = "\r\n+CREG: 3\r\n";
const CregResult result = { 3, 0, 0, -1 , 1}; const CregResult result = { 3, 0, 0, -1 , 1, FALSE};
test_creg_match ("CREG=1", FALSE, reply, data, &result); test_creg_match ("CREG=1", FALSE, reply, data, &result);
} }
@@ -542,7 +544,7 @@ test_creg2_mercury_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 0,1,84CD,00D30173"; const char *reply = "+CREG: 0,1,84CD,00D30173";
const CregResult result = { 1, 0x84cd, 0xd30173, -1 , 4}; const CregResult result = { 1, 0x84cd, 0xd30173, -1 , 4, FALSE};
test_creg_match ("Sierra Mercury CREG=2", TRUE, reply, data, &result); test_creg_match ("Sierra Mercury CREG=2", TRUE, reply, data, &result);
} }
@@ -552,7 +554,7 @@ test_creg2_mercury_unsolicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CREG: 1,84CD,00D30156\r\n"; const char *reply = "\r\n+CREG: 1,84CD,00D30156\r\n";
const CregResult result = { 1, 0x84cd, 0xd30156, -1 , 3}; const CregResult result = { 1, 0x84cd, 0xd30156, -1 , 3, FALSE};
test_creg_match ("Sierra Mercury CREG=2", FALSE, reply, data, &result); test_creg_match ("Sierra Mercury CREG=2", FALSE, reply, data, &result);
} }
@@ -562,7 +564,7 @@ test_creg2_sek850i_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 2,1,\"CE00\",\"01CEAD8F\""; const char *reply = "+CREG: 2,1,\"CE00\",\"01CEAD8F\"";
const CregResult result = { 1, 0xce00, 0x01cead8f, -1 , 4}; const CregResult result = { 1, 0xce00, 0x01cead8f, -1 , 4, FALSE};
test_creg_match ("Sony Ericsson K850i CREG=2", TRUE, reply, data, &result); test_creg_match ("Sony Ericsson K850i CREG=2", TRUE, reply, data, &result);
} }
@@ -572,7 +574,7 @@ test_creg2_sek850i_unsolicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CREG: 1,\"CE00\",\"00005449\"\r\n"; const char *reply = "\r\n+CREG: 1,\"CE00\",\"00005449\"\r\n";
const CregResult result = { 1, 0xce00, 0x5449, -1 , 3}; const CregResult result = { 1, 0xce00, 0x5449, -1 , 3, FALSE};
test_creg_match ("Sony Ericsson K850i CREG=2", FALSE, reply, data, &result); test_creg_match ("Sony Ericsson K850i CREG=2", FALSE, reply, data, &result);
} }
@@ -582,7 +584,7 @@ test_creg2_e160g_solicited_unregistered (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 2,0,00,0"; const char *reply = "+CREG: 2,0,00,0";
const CregResult result = { 0, 0, 0, -1 , 4}; const CregResult result = { 0, 0, 0, -1 , 4, FALSE};
test_creg_match ("Huawei E160G unregistered CREG=2", TRUE, reply, data, &result); test_creg_match ("Huawei E160G unregistered CREG=2", TRUE, reply, data, &result);
} }
@@ -592,7 +594,7 @@ test_creg2_e160g_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 2,1,8BE3,2BAF"; const char *reply = "+CREG: 2,1,8BE3,2BAF";
const CregResult result = { 1, 0x8be3, 0x2baf, -1 , 4}; const CregResult result = { 1, 0x8be3, 0x2baf, -1 , 4, FALSE};
test_creg_match ("Huawei E160G CREG=2", TRUE, reply, data, &result); test_creg_match ("Huawei E160G CREG=2", TRUE, reply, data, &result);
} }
@@ -602,7 +604,7 @@ test_creg2_e160g_unsolicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CREG: 2,8BE3,2BAF\r\n"; const char *reply = "\r\n+CREG: 2,8BE3,2BAF\r\n";
const CregResult result = { 2, 0x8be3, 0x2baf, -1 , 3}; const CregResult result = { 2, 0x8be3, 0x2baf, -1 , 3, FALSE};
test_creg_match ("Huawei E160G CREG=2", FALSE, reply, data, &result); test_creg_match ("Huawei E160G CREG=2", FALSE, reply, data, &result);
} }
@@ -612,7 +614,7 @@ test_creg2_tm506_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CREG: 2,1,\"8BE3\",\"00002BAF\""; const char *reply = "+CREG: 2,1,\"8BE3\",\"00002BAF\"";
const CregResult result = { 1, 0x8BE3, 0x2BAF, -1 , 4}; const CregResult result = { 1, 0x8BE3, 0x2BAF, -1 , 4, FALSE};
/* Test leading zeros in the CI */ /* Test leading zeros in the CI */
test_creg_match ("Sony Ericsson TM-506 CREG=2", TRUE, reply, data, &result); test_creg_match ("Sony Ericsson TM-506 CREG=2", TRUE, reply, data, &result);
@@ -623,17 +625,37 @@ test_creg2_xu870_unsolicited_unregistered (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CREG: 2,,\r\n"; const char *reply = "\r\n+CREG: 2,,\r\n";
const CregResult result = { 2, 0, 0, -1 , 3}; const CregResult result = { 2, 0, 0, -1 , 3, FALSE};
test_creg_match ("Novatel XU870 unregistered CREG=2", FALSE, reply, data, &result); test_creg_match ("Novatel XU870 unregistered CREG=2", FALSE, reply, data, &result);
} }
static void
test_cgreg1_solicited (void *f, gpointer d)
{
TestData *data = (TestData *) d;
const char *reply = "+CGREG: 1,3";
const CregResult result = { 3, 0, 0, -1 , 2, TRUE};
test_creg_match ("CGREG=1", TRUE, reply, data, &result);
}
static void
test_cgreg1_unsolicited (void *f, gpointer d)
{
TestData *data = (TestData *) d;
const char *reply = "\r\n+CGREG: 3\r\n";
const CregResult result = { 3, 0, 0, -1 , 1, TRUE};
test_creg_match ("CGREG=1", FALSE, reply, data, &result);
}
static void static void
test_cgreg2_f3607gw_solicited (void *f, gpointer d) test_cgreg2_f3607gw_solicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "+CGREG: 2,1,\"8BE3\",\"00002B5D\",3"; const char *reply = "+CGREG: 2,1,\"8BE3\",\"00002B5D\",3";
const CregResult result = { 1, 0x8BE3, 0x2B5D, 3 , 6}; const CregResult result = { 1, 0x8BE3, 0x2B5D, 3 , 6, TRUE};
test_creg_match ("Ericsson F3607gw CGREG=2", TRUE, reply, data, &result); test_creg_match ("Ericsson F3607gw CGREG=2", TRUE, reply, data, &result);
} }
@@ -643,7 +665,7 @@ test_cgreg2_f3607gw_unsolicited (void *f, gpointer d)
{ {
TestData *data = (TestData *) d; TestData *data = (TestData *) d;
const char *reply = "\r\n+CGREG: 1,\"8BE3\",\"00002B5D\",3\r\n"; const char *reply = "\r\n+CGREG: 1,\"8BE3\",\"00002B5D\",3\r\n";
const CregResult result = { 1, 0x8BE3, 0x2B5D, 3 , 5}; const CregResult result = { 1, 0x8BE3, 0x2B5D, 3 , 5, TRUE};
test_creg_match ("Ericsson F3607gw CGREG=2", FALSE, reply, data, &result); test_creg_match ("Ericsson F3607gw CGREG=2", FALSE, reply, data, &result);
} }
@@ -725,6 +747,9 @@ int main (int argc, char **argv)
g_test_suite_add (suite, TESTCASE (test_creg2_e160g_unsolicited, data)); g_test_suite_add (suite, TESTCASE (test_creg2_e160g_unsolicited, data));
g_test_suite_add (suite, TESTCASE (test_creg2_tm506_solicited, data)); g_test_suite_add (suite, TESTCASE (test_creg2_tm506_solicited, data));
g_test_suite_add (suite, TESTCASE (test_creg2_xu870_unsolicited_unregistered, data)); g_test_suite_add (suite, TESTCASE (test_creg2_xu870_unsolicited_unregistered, data));
g_test_suite_add (suite, TESTCASE (test_cgreg1_solicited, data));
g_test_suite_add (suite, TESTCASE (test_cgreg1_unsolicited, data));
g_test_suite_add (suite, TESTCASE (test_cgreg2_f3607gw_solicited, data)); g_test_suite_add (suite, TESTCASE (test_cgreg2_f3607gw_solicited, data));
g_test_suite_add (suite, TESTCASE (test_cgreg2_f3607gw_unsolicited, data)); g_test_suite_add (suite, TESTCASE (test_cgreg2_f3607gw_unsolicited, data));