modem-helpers: new helper to parse +CESQ response into MMSignal objects

This commit is contained in:
Aleksander Morgado
2016-10-12 13:24:08 +02:00
parent df6f6d1f37
commit 7ab3d3e727
3 changed files with 277 additions and 71 deletions
+87 -36
View File
@@ -17,6 +17,7 @@
#include <glib-object.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <libmm-glib.h>
#include "mm-modem-helpers.h"
@@ -28,6 +29,9 @@
#define trace(...)
#endif
#define g_assert_cmpfloat_tolerance(val1, val2, tolerance) \
g_assert_cmpfloat (fabs (val1 - val2), <, tolerance)
/*****************************************************************************/
/* Test CMGL responses */
@@ -3081,7 +3085,6 @@ test_cgcontrdp_response (void)
}
/*****************************************************************************/
<<<<<<< HEAD
/* Test CFUN? response */
typedef struct {
@@ -3112,46 +3115,51 @@ test_cfun_response (void)
g_assert_no_error (error);
g_assert (success);
g_assert_cmpuint (cfun_query_tests[i].state, ==, state);
=======
}
}
/*****************************************************************************/
/* Test +CESQ responses */
typedef struct {
const gchar *str;
guint rxlev;
guint ber;
guint rscp;
guint ecn0;
guint rsrq;
guint rsrp;
gboolean gsm_info;
guint rxlev;
gdouble rssi;
guint ber;
gboolean umts_info;
guint rscp_level;
gdouble rscp;
guint ecn0_level;
gdouble ecio;
gboolean lte_info;
guint rsrq_level;
gdouble rsrq;
guint rsrp_level;
gdouble rsrp;
} CesqResponseTest;
static const CesqResponseTest cesq_response_tests[] = {
{
.str = "+CESQ: 99,99,255,255,20,80",
.rxlev = 99,
.ber = 99,
.rscp = 255,
.ecn0 = 255,
.rsrq = 20,
.rsrp = 80
.str = "+CESQ: 99,99,255,255,20,80",
.gsm_info = FALSE, .rxlev = 99, .ber = 99,
.umts_info = FALSE, .rscp_level = 255, .ecn0_level = 255,
.lte_info = TRUE, .rsrq_level = 20, .rsrq = -10.0, .rsrp_level = 80, .rsrp = -61.0,
},
{
.str = "+CESQ: 99,99,95,40,255,255",
.rxlev = 99,
.ber = 99,
.rscp = 95,
.ecn0 = 40,
.rsrq = 255,
.rsrp = 255
.str = "+CESQ: 99,99,95,40,255,255",
.gsm_info = FALSE, .rxlev = 99, .ber = 99,
.umts_info = TRUE, .rscp_level = 95, .rscp = -26.0, .ecn0_level = 40, .ecio = -4.5,
.lte_info = FALSE, .rsrq_level = 255, .rsrp_level = 255,
},
{
.str = "+CESQ: 10,6,255,255,255,255",
.rxlev = 10,
.ber = 6,
.rscp = 255,
.ecn0 = 255,
.rsrq = 255,
.rsrp = 255
.str = "+CESQ: 10,6,255,255,255,255",
.gsm_info = TRUE, .rxlev = 10, .rssi = -101.0, .ber = 6,
.umts_info = FALSE, .rscp_level = 255, .ecn0_level = 255,
.lte_info = FALSE, .rsrq_level = 255, .rsrp_level = 255,
}
};
@@ -3178,13 +3186,55 @@ test_cesq_response (void)
g_assert_no_error (error);
g_assert (success);
g_assert_cmpuint (cesq_response_tests[i].rxlev, ==, rxlev);
g_assert_cmpuint (cesq_response_tests[i].ber, ==, ber);
g_assert_cmpuint (cesq_response_tests[i].rscp, ==, rscp);
g_assert_cmpuint (cesq_response_tests[i].ecn0, ==, ecn0);
g_assert_cmpuint (cesq_response_tests[i].rsrq, ==, rsrq);
g_assert_cmpuint (cesq_response_tests[i].rsrp, ==, rsrp);
>>>>>>> fa0bc3bc... modem-helpers: new +CESQ response parser
g_assert_cmpuint (cesq_response_tests[i].rxlev, ==, rxlev);
g_assert_cmpuint (cesq_response_tests[i].ber, ==, ber);
g_assert_cmpuint (cesq_response_tests[i].rscp_level, ==, rscp);
g_assert_cmpuint (cesq_response_tests[i].ecn0_level, ==, ecn0);
g_assert_cmpuint (cesq_response_tests[i].rsrq_level, ==, rsrq);
g_assert_cmpuint (cesq_response_tests[i].rsrp_level, ==, rsrp);
}
}
static void
test_cesq_response_to_signal (void)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (cesq_response_tests); i++) {
GError *error = NULL;
gboolean success;
MMSignal *gsm = NULL;
MMSignal *umts = NULL;
MMSignal *lte = NULL;
success = mm_3gpp_cesq_response_to_signal_info (cesq_response_tests[i].str,
&gsm, &umts, &lte,
&error);
g_assert_no_error (error);
g_assert (success);
if (cesq_response_tests[i].gsm_info) {
g_assert (gsm);
g_assert_cmpfloat_tolerance (mm_signal_get_rssi (gsm), cesq_response_tests[i].rssi, 0.1);
g_object_unref (gsm);
} else
g_assert (!gsm);
if (cesq_response_tests[i].umts_info) {
g_assert (umts);
g_assert_cmpfloat_tolerance (mm_signal_get_rscp (umts), cesq_response_tests[i].rscp, 0.1);
g_assert_cmpfloat_tolerance (mm_signal_get_ecio (umts), cesq_response_tests[i].ecio, 0.1);
g_object_unref (umts);
} else
g_assert (!umts);
if (cesq_response_tests[i].lte_info) {
g_assert (lte);
g_assert_cmpfloat_tolerance (mm_signal_get_rsrq (lte), cesq_response_tests[i].rsrq, 0.1);
g_assert_cmpfloat_tolerance (mm_signal_get_rsrp (lte), cesq_response_tests[i].rsrp, 0.1);
g_object_unref (lte);
} else
g_assert (!lte);
}
}
@@ -3455,6 +3505,7 @@ int main (int argc, char **argv)
g_test_suite_add (suite, TESTCASE (test_cfun_generic_response, NULL));
g_test_suite_add (suite, TESTCASE (test_cesq_response, NULL));
g_test_suite_add (suite, TESTCASE (test_cesq_response_to_signal, NULL));
g_test_suite_add (suite, TESTCASE (test_parse_uint_list, NULL));