xmm: implement A-GPS support
This commit is contained in:
@@ -97,6 +97,10 @@ iface_modem_location_init (MMIfaceModemLocation *iface)
|
||||
iface->enable_location_gathering_finish = mm_shared_xmm_enable_location_gathering_finish;
|
||||
iface->disable_location_gathering = mm_shared_xmm_disable_location_gathering;
|
||||
iface->disable_location_gathering_finish = mm_shared_xmm_disable_location_gathering_finish;
|
||||
iface->load_supl_server = mm_shared_xmm_location_load_supl_server;
|
||||
iface->load_supl_server_finish = mm_shared_xmm_location_load_supl_server_finish;
|
||||
iface->set_supl_server = mm_shared_xmm_location_set_supl_server;
|
||||
iface->set_supl_server_finish = mm_shared_xmm_location_set_supl_server_finish;
|
||||
}
|
||||
|
||||
static MMBroadbandModemClass *
|
||||
|
||||
@@ -106,6 +106,10 @@ iface_modem_location_init (MMIfaceModemLocation *iface)
|
||||
iface->enable_location_gathering_finish = mm_shared_xmm_enable_location_gathering_finish;
|
||||
iface->disable_location_gathering = mm_shared_xmm_disable_location_gathering;
|
||||
iface->disable_location_gathering_finish = mm_shared_xmm_disable_location_gathering_finish;
|
||||
iface->load_supl_server = mm_shared_xmm_location_load_supl_server;
|
||||
iface->load_supl_server_finish = mm_shared_xmm_location_load_supl_server_finish;
|
||||
iface->set_supl_server = mm_shared_xmm_location_set_supl_server;
|
||||
iface->set_supl_server_finish = mm_shared_xmm_location_set_supl_server_finish;
|
||||
}
|
||||
|
||||
static MMBroadbandModemClass *
|
||||
|
||||
@@ -847,7 +847,9 @@ number_group_contains_value (const gchar *group,
|
||||
gboolean
|
||||
mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
gboolean *transport_protocol_invalid_supported,
|
||||
gboolean *transport_protocol_supl_supported,
|
||||
gboolean *standalone_position_mode_supported,
|
||||
gboolean *ms_assisted_based_position_mode_supported,
|
||||
gboolean *loc_response_type_nmea_supported,
|
||||
gboolean *gnss_type_gps_glonass_supported,
|
||||
GError **error)
|
||||
@@ -859,8 +861,8 @@ mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
/*
|
||||
* AT+XLCSLSR=?
|
||||
* +XLCSLSR:(0-2),(0-3), ,(0,1), ,(0,1),(0 -7200),(0-255),(0-1),(0-2),(1-256),(0,1)
|
||||
* transport_protocol: 2 (invalid)
|
||||
* pos_mode: 3 (standalone)
|
||||
* transport_protocol: 2 (invalid) or 1 (supl)
|
||||
* pos_mode: 3 (standalone) or 2 (ms assisted/based)
|
||||
* client_id: <empty>
|
||||
* client_id_type: <empty>
|
||||
* mlc_number: <empty>
|
||||
@@ -891,6 +893,15 @@ mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (transport_protocol_supl_supported) {
|
||||
*transport_protocol_supl_supported = number_group_contains_value (groups[0],
|
||||
"transport protocol",
|
||||
1, /* supl */
|
||||
&inner_error);
|
||||
if (inner_error)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (standalone_position_mode_supported) {
|
||||
*standalone_position_mode_supported = number_group_contains_value (groups[1],
|
||||
"position mode",
|
||||
@@ -900,6 +911,15 @@ mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ms_assisted_based_position_mode_supported) {
|
||||
*ms_assisted_based_position_mode_supported = number_group_contains_value (groups[1],
|
||||
"position mode",
|
||||
2, /* ms assisted/based */
|
||||
&inner_error);
|
||||
if (inner_error)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (loc_response_type_nmea_supported) {
|
||||
*loc_response_type_nmea_supported = number_group_contains_value (groups[9],
|
||||
"location response type",
|
||||
@@ -930,3 +950,64 @@ mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* AT+XLCSSLP? response parser */
|
||||
|
||||
gboolean
|
||||
mm_xmm_parse_xlcsslp_query_response (const gchar *response,
|
||||
gchar **supl_address,
|
||||
GError **error)
|
||||
{
|
||||
GRegex *r;
|
||||
GMatchInfo *match_info;
|
||||
GError *inner_error = NULL;
|
||||
gchar *address = NULL;
|
||||
guint port = 0;
|
||||
|
||||
/*
|
||||
* E.g.:
|
||||
* +XLCSSLP:1,"www.spirent-lcs.com",7275
|
||||
*/
|
||||
|
||||
r = g_regex_new ("\\+XLCSSLP:\\s*(\\d+),([^,]*),(\\d+)(?:\\r\\n)?",
|
||||
G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW, 0, NULL);
|
||||
g_assert (r != NULL);
|
||||
|
||||
g_regex_match_full (r, response, strlen (response), 0, 0, &match_info, &inner_error);
|
||||
if (!inner_error && g_match_info_matches (match_info)) {
|
||||
guint type;
|
||||
|
||||
/* We only support types 0 (IPv4) and 1 (FQDN) */
|
||||
mm_get_uint_from_match_info (match_info, 1, &type);
|
||||
if (type != 0 && type != 1) {
|
||||
inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
|
||||
"Unsupported SUPL server address type (%u) in response: %s", type, response);
|
||||
goto out;
|
||||
}
|
||||
|
||||
address = mm_get_string_unquoted_from_match_info (match_info, 2);
|
||||
mm_get_uint_from_match_info (match_info, 3, &port);
|
||||
if (!port) {
|
||||
inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
|
||||
"Invalid SUPL address port number in response: %s", response);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (r);
|
||||
|
||||
if (inner_error) {
|
||||
g_propagate_error (error, inner_error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (supl_address)
|
||||
*supl_address = g_strdup_printf ("%s:%u", address, port);
|
||||
g_free (address);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -58,9 +58,16 @@ gboolean mm_xmm_xcesq_response_to_signal_info (const gchar *response,
|
||||
/* AT+XLCSLSR=? response parser */
|
||||
gboolean mm_xmm_parse_xlcslsr_test_response (const gchar *response,
|
||||
gboolean *transport_protocol_invalid_supported,
|
||||
gboolean *transport_protocol_supl_supported,
|
||||
gboolean *standalone_position_mode_supported,
|
||||
gboolean *ms_assisted_based_position_mode_supported,
|
||||
gboolean *loc_response_type_nmea_supported,
|
||||
gboolean *gnss_type_gps_glonass_supported,
|
||||
GError **error);
|
||||
|
||||
/* AT+XLCSSLP? response parser */
|
||||
gboolean mm_xmm_parse_xlcsslp_query_response (const gchar *response,
|
||||
gchar **supl_address,
|
||||
GError **error);
|
||||
|
||||
#endif /* MM_MODEM_HELPERS_XMM_H */
|
||||
|
||||
+165
-13
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gio/gio.h>
|
||||
@@ -39,6 +40,7 @@ static GQuark private_quark;
|
||||
typedef enum {
|
||||
GPS_ENGINE_STATE_OFF,
|
||||
GPS_ENGINE_STATE_STANDALONE,
|
||||
GPS_ENGINE_STATE_ASSISTED,
|
||||
} GpsEngineState;
|
||||
|
||||
typedef struct {
|
||||
@@ -818,7 +820,9 @@ xlcslsr_test_ready (MMBaseModem *self,
|
||||
GError *error = NULL;
|
||||
Private *priv;
|
||||
gboolean transport_protocol_invalid_supported;
|
||||
gboolean transport_protocol_supl_supported;
|
||||
gboolean standalone_position_mode_supported;
|
||||
gboolean ms_assisted_based_position_mode_supported;
|
||||
gboolean loc_response_type_nmea_supported;
|
||||
gboolean gnss_type_gps_glonass_supported;
|
||||
|
||||
@@ -831,7 +835,9 @@ xlcslsr_test_ready (MMBaseModem *self,
|
||||
if (!response ||
|
||||
!mm_xmm_parse_xlcslsr_test_response (response,
|
||||
&transport_protocol_invalid_supported,
|
||||
&transport_protocol_supl_supported,
|
||||
&standalone_position_mode_supported,
|
||||
&ms_assisted_based_position_mode_supported,
|
||||
&loc_response_type_nmea_supported,
|
||||
&gnss_type_gps_glonass_supported,
|
||||
&error)) {
|
||||
@@ -841,7 +847,7 @@ xlcslsr_test_ready (MMBaseModem *self,
|
||||
!standalone_position_mode_supported ||
|
||||
!loc_response_type_nmea_supported ||
|
||||
!gnss_type_gps_glonass_supported) {
|
||||
mm_dbg ("XLCSLSR based GPS control unsupported: protocol %s, standalone %s, nmea %s, gps/glonass %s",
|
||||
mm_dbg ("XLCSLSR based GPS control unsupported: protocol invalid %s, standalone %s, nmea %s, gps/glonass %s",
|
||||
transport_protocol_invalid_supported ? "supported" : "unsupported",
|
||||
standalone_position_mode_supported ? "supported" : "unsupported",
|
||||
loc_response_type_nmea_supported ? "supported" : "unsupported",
|
||||
@@ -849,6 +855,16 @@ xlcslsr_test_ready (MMBaseModem *self,
|
||||
} else {
|
||||
mm_dbg ("XLCSLSR based GPS control supported");
|
||||
priv->supported_sources |= (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW);
|
||||
|
||||
if (transport_protocol_supl_supported && ms_assisted_based_position_mode_supported) {
|
||||
mm_dbg ("XLCSLSR based A-GPS control supported");
|
||||
priv->supported_sources |= MM_MODEM_LOCATION_SOURCE_AGPS;
|
||||
} else {
|
||||
mm_dbg ("XLCSLSR based A-GPS control unsupported: protocol supl %s, ms assisted/based %s",
|
||||
transport_protocol_supl_supported ? "supported" : "unsupported",
|
||||
ms_assisted_based_position_mode_supported ? "supported" : "unsupported");
|
||||
}
|
||||
|
||||
sources |= priv->supported_sources;
|
||||
}
|
||||
|
||||
@@ -1015,11 +1031,16 @@ xlcslsr_ready (MMBaseModem *self,
|
||||
static void
|
||||
gps_engine_start (GTask *task)
|
||||
{
|
||||
MMSharedXmm *self;
|
||||
Private *priv;
|
||||
GpsEngineState state;
|
||||
MMSharedXmm *self;
|
||||
Private *priv;
|
||||
guint transport_protocol = 0;
|
||||
guint pos_mode = 0;
|
||||
gchar *cmd;
|
||||
|
||||
self = g_task_get_source_object (task);
|
||||
priv = get_private (self);
|
||||
self = g_task_get_source_object (task);
|
||||
priv = get_private (self);
|
||||
state = GPOINTER_TO_UINT (g_task_get_task_data (task));
|
||||
|
||||
/* Look for an AT port to use for GPS. Prefer secondary port if there is one,
|
||||
* otherwise use primary */
|
||||
@@ -1035,10 +1056,24 @@ gps_engine_start (GTask *task)
|
||||
}
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case GPS_ENGINE_STATE_STANDALONE:
|
||||
transport_protocol = 2;
|
||||
pos_mode = 3;
|
||||
break;
|
||||
case GPS_ENGINE_STATE_ASSISTED:
|
||||
transport_protocol = 1;
|
||||
pos_mode = 2;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* AT+XLCSLSR
|
||||
* transport_protocol: 2 (invalid)
|
||||
* pos_mode: 3 (standalone)
|
||||
* transport_protocol: 2 (invalid) or 1 (supl)
|
||||
* pos_mode: 3 (standalone) or 2 (ms assisted+based)
|
||||
* client_id: <empty>
|
||||
* client_id_type: <empty>
|
||||
* mlc_number: <empty>
|
||||
@@ -1051,15 +1086,17 @@ gps_engine_start (GTask *task)
|
||||
* gnss_type: 0 (GPS or GLONASS)
|
||||
*/
|
||||
g_assert (priv->gps_port);
|
||||
cmd = g_strdup_printf ("AT+XLCSLSR=%u,%u,,,,,1,,,1,118,0", transport_protocol, pos_mode);
|
||||
mm_base_modem_at_command_full (MM_BASE_MODEM (self),
|
||||
priv->gps_port,
|
||||
"AT+XLCSLSR=2,3,,,,,1,,,1,118,0",
|
||||
cmd,
|
||||
3,
|
||||
FALSE,
|
||||
FALSE, /* raw */
|
||||
NULL, /* cancellable */
|
||||
(GAsyncReadyCallback)xlcslsr_ready,
|
||||
task);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1156,11 +1193,15 @@ static GpsEngineState
|
||||
gps_engine_state_get_expected (MMModemLocationSource sources)
|
||||
{
|
||||
/* If at lease one of GPS nmea/raw sources enabled, engine started */
|
||||
if (sources & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW))
|
||||
if (sources & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW)) {
|
||||
/* If A-GPS is enabled, ASSISTED mode */
|
||||
if (sources & MM_MODEM_LOCATION_SOURCE_AGPS)
|
||||
return GPS_ENGINE_STATE_ASSISTED;
|
||||
/* Otherwise, STANDALONE */
|
||||
return GPS_ENGINE_STATE_STANDALONE;
|
||||
|
||||
}
|
||||
/* If no GPS nmea/raw sources enabled, engine stopped */
|
||||
return GPS_ENGINE_STATE_OFF;
|
||||
return GPS_ENGINE_STATE_OFF;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -1250,7 +1291,9 @@ mm_shared_xmm_disable_location_gathering (MMIfaceModemLocation *self,
|
||||
}
|
||||
|
||||
/* We only expect GPS sources here */
|
||||
g_assert (source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW));
|
||||
g_assert (source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
|
||||
MM_MODEM_LOCATION_SOURCE_GPS_RAW |
|
||||
MM_MODEM_LOCATION_SOURCE_AGPS));
|
||||
|
||||
/* Update engine based on the expected sources */
|
||||
gps_engine_state_select (MM_SHARED_XMM (self),
|
||||
@@ -1340,7 +1383,9 @@ mm_shared_xmm_enable_location_gathering (MMIfaceModemLocation *self,
|
||||
}
|
||||
|
||||
/* We only expect GPS sources here */
|
||||
g_assert (source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA | MM_MODEM_LOCATION_SOURCE_GPS_RAW));
|
||||
g_assert (source & (MM_MODEM_LOCATION_SOURCE_GPS_NMEA |
|
||||
MM_MODEM_LOCATION_SOURCE_GPS_RAW |
|
||||
MM_MODEM_LOCATION_SOURCE_AGPS));
|
||||
|
||||
/* Update engine based on the expected sources */
|
||||
gps_engine_state_select (MM_SHARED_XMM (self),
|
||||
@@ -1349,6 +1394,113 @@ mm_shared_xmm_enable_location_gathering (MMIfaceModemLocation *self,
|
||||
task);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Location: Load SUPL server */
|
||||
|
||||
gchar *
|
||||
mm_shared_xmm_location_load_supl_server_finish (MMIfaceModemLocation *self,
|
||||
GAsyncResult *res,
|
||||
GError **error)
|
||||
{
|
||||
return g_task_propagate_pointer (G_TASK (res), error);
|
||||
}
|
||||
|
||||
static void
|
||||
xlcsslp_query_ready (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GTask *task)
|
||||
{
|
||||
const gchar *response;
|
||||
GError *error = NULL;
|
||||
gchar *supl_address;
|
||||
|
||||
response = mm_base_modem_at_command_finish (self, res, &error);
|
||||
if (!response || !mm_xmm_parse_xlcsslp_query_response (response, &supl_address, &error))
|
||||
g_task_return_error (task, error);
|
||||
else
|
||||
g_task_return_pointer (task, supl_address, g_free);
|
||||
g_object_unref (task);
|
||||
}
|
||||
|
||||
void
|
||||
mm_shared_xmm_location_load_supl_server (MMIfaceModemLocation *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
GTask *task;
|
||||
|
||||
task = g_task_new (self, NULL, callback, user_data);
|
||||
|
||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||
"+XLCSSLP?",
|
||||
3,
|
||||
FALSE,
|
||||
(GAsyncReadyCallback)xlcsslp_query_ready,
|
||||
task);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
gboolean
|
||||
mm_shared_xmm_location_set_supl_server_finish (MMIfaceModemLocation *self,
|
||||
GAsyncResult *res,
|
||||
GError **error)
|
||||
{
|
||||
return g_task_propagate_boolean (G_TASK (res), error);
|
||||
}
|
||||
|
||||
static void
|
||||
xlcsslp_set_ready (MMBaseModem *self,
|
||||
GAsyncResult *res,
|
||||
GTask *task)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (!mm_base_modem_at_command_finish (self, res, &error))
|
||||
g_task_return_error (task, error);
|
||||
else
|
||||
g_task_return_boolean (task, TRUE);
|
||||
g_object_unref (task);
|
||||
}
|
||||
|
||||
void
|
||||
mm_shared_xmm_location_set_supl_server (MMIfaceModemLocation *self,
|
||||
const gchar *supl,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
GTask *task;
|
||||
gchar *cmd = NULL;
|
||||
gchar *fqdn = NULL;
|
||||
guint32 ip;
|
||||
guint16 port;
|
||||
|
||||
task = g_task_new (self, NULL, callback, user_data);
|
||||
|
||||
mm_parse_supl_address (supl, &fqdn, &ip, &port, NULL);
|
||||
g_assert (port);
|
||||
if (fqdn)
|
||||
cmd = g_strdup_printf ("+XLCSSLP=1,%s,%u", fqdn, port);
|
||||
else if (ip) {
|
||||
struct in_addr a = { .s_addr = ip };
|
||||
gchar buf[INET_ADDRSTRLEN + 1] = { 0 };
|
||||
|
||||
/* we got 'ip' from inet_pton(), so this next step should always succeed */
|
||||
g_assert (inet_ntop (AF_INET, &a, buf, sizeof (buf) - 1));
|
||||
cmd = g_strdup_printf ("+XLCSSLP=0,%s,%u", buf, port);
|
||||
} else
|
||||
g_assert_not_reached ();
|
||||
|
||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||
cmd,
|
||||
3,
|
||||
FALSE,
|
||||
(GAsyncReadyCallback)xlcsslp_set_ready,
|
||||
task);
|
||||
g_free (cmd);
|
||||
g_free (fqdn);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void
|
||||
|
||||
@@ -166,5 +166,18 @@ void mm_shared_xmm_disable_location_gathering (MMIfaceMo
|
||||
gboolean mm_shared_xmm_disable_location_gathering_finish (MMIfaceModemLocation *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
void mm_shared_xmm_location_load_supl_server (MMIfaceModemLocation *self,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gchar *mm_shared_xmm_location_load_supl_server_finish (MMIfaceModemLocation *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
void mm_shared_xmm_location_set_supl_server (MMIfaceModemLocation *self,
|
||||
const gchar *supl,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
gboolean mm_shared_xmm_location_set_supl_server_finish (MMIfaceModemLocation *self,
|
||||
GAsyncResult *res,
|
||||
GError **error);
|
||||
|
||||
#endif /* MM_SHARED_XMM_H */
|
||||
|
||||
@@ -654,7 +654,9 @@ test_xcesq_response_to_signal (void)
|
||||
typedef struct {
|
||||
const gchar *response;
|
||||
gboolean expected_transport_protocol_invalid_supported;
|
||||
gboolean expected_transport_protocol_supl_supported;
|
||||
gboolean expected_standalone_position_mode_supported;
|
||||
gboolean expected_ms_assisted_based_position_mode_supported;
|
||||
gboolean expected_loc_response_type_nmea_supported;
|
||||
gboolean expected_gnss_type_gps_glonass_supported;
|
||||
} XlcslsrTest;
|
||||
@@ -662,15 +664,15 @@ typedef struct {
|
||||
static XlcslsrTest xlcslsr_tests[] = {
|
||||
{
|
||||
"+XLCSLSR:(0-2),(0-3), ,(0-1), ,(0-1),(0-7200),(0-255),(0-1),(0-2),(1-256),(0-1)",
|
||||
TRUE, TRUE, TRUE, TRUE
|
||||
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
|
||||
},
|
||||
{
|
||||
"+XLCSLSR:(0,1,2),(0,1,2,3), ,(0,1), ,(0,1),(0-7200),(0-255),(0,1),(0,1,2),(1-256),(0,1)",
|
||||
TRUE, TRUE, TRUE, TRUE
|
||||
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
|
||||
},
|
||||
{
|
||||
"+XLCSLSR:(0-1),(0-2), ,(0,1), ,(0,1),(0 -7200),(0-255),(0-1),(0),(1-256),(1)",
|
||||
FALSE, FALSE, FALSE, FALSE
|
||||
FALSE, TRUE, FALSE, TRUE, FALSE, FALSE
|
||||
},
|
||||
};
|
||||
|
||||
@@ -683,23 +685,69 @@ test_xlcslsr_test (void)
|
||||
GError *error = NULL;
|
||||
gboolean ret;
|
||||
gboolean transport_protocol_invalid_supported;
|
||||
gboolean transport_protocol_supl_supported;
|
||||
gboolean standalone_position_mode_supported;
|
||||
gboolean ms_assisted_based_position_mode_supported;
|
||||
gboolean loc_response_type_nmea_supported;
|
||||
gboolean gnss_type_gps_glonass_supported;
|
||||
|
||||
ret = mm_xmm_parse_xlcslsr_test_response (xlcslsr_tests[i].response,
|
||||
&transport_protocol_invalid_supported,
|
||||
&transport_protocol_supl_supported,
|
||||
&standalone_position_mode_supported,
|
||||
&ms_assisted_based_position_mode_supported,
|
||||
&loc_response_type_nmea_supported,
|
||||
&gnss_type_gps_glonass_supported,
|
||||
&error);
|
||||
g_assert_no_error (error);
|
||||
g_assert (ret);
|
||||
|
||||
g_assert (transport_protocol_invalid_supported == xlcslsr_tests[i].expected_transport_protocol_invalid_supported);
|
||||
g_assert (standalone_position_mode_supported == xlcslsr_tests[i].expected_standalone_position_mode_supported);
|
||||
g_assert (loc_response_type_nmea_supported == xlcslsr_tests[i].expected_loc_response_type_nmea_supported);
|
||||
g_assert (gnss_type_gps_glonass_supported == xlcslsr_tests[i].expected_gnss_type_gps_glonass_supported);
|
||||
g_assert (transport_protocol_invalid_supported == xlcslsr_tests[i].expected_transport_protocol_invalid_supported);
|
||||
g_assert (transport_protocol_supl_supported == xlcslsr_tests[i].expected_transport_protocol_supl_supported);
|
||||
g_assert (standalone_position_mode_supported == xlcslsr_tests[i].expected_standalone_position_mode_supported);
|
||||
g_assert (ms_assisted_based_position_mode_supported == xlcslsr_tests[i].expected_ms_assisted_based_position_mode_supported);
|
||||
g_assert (loc_response_type_nmea_supported == xlcslsr_tests[i].expected_loc_response_type_nmea_supported);
|
||||
g_assert (gnss_type_gps_glonass_supported == xlcslsr_tests[i].expected_gnss_type_gps_glonass_supported);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* AT+XLCSSLP? response parser */
|
||||
|
||||
typedef struct {
|
||||
const gchar *response;
|
||||
const gchar *expected;
|
||||
} XlcsslpQuery;
|
||||
|
||||
static XlcsslpQuery xlcsslp_queries[] = {
|
||||
{
|
||||
"+XLCSSLP:1,\"www.spirent-lcs.com\",7275",
|
||||
"www.spirent-lcs.com:7275"
|
||||
},
|
||||
{
|
||||
"+XLCSSLP:0,\"123.123.123.123\",7275",
|
||||
"123.123.123.123:7275"
|
||||
},
|
||||
};
|
||||
|
||||
static void
|
||||
test_xlcsslp_queries (void)
|
||||
{
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (xlcsslp_queries); i++) {
|
||||
GError *error = NULL;
|
||||
gchar *supl_server = NULL;
|
||||
gboolean ret;
|
||||
|
||||
ret = mm_xmm_parse_xlcsslp_query_response (xlcsslp_queries[i].response,
|
||||
&supl_server,
|
||||
&error);
|
||||
g_assert_no_error (error);
|
||||
g_assert (ret);
|
||||
|
||||
g_assert_cmpstr (supl_server, ==, xlcsslp_queries[i].expected);
|
||||
g_free (supl_server);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -745,5 +793,7 @@ int main (int argc, char **argv)
|
||||
|
||||
g_test_add_func ("/MM/xmm/xlcslsr/test", test_xlcslsr_test);
|
||||
|
||||
g_test_add_func ("/MM/xmm/xlcsslp/query", test_xlcsslp_queries);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user