xmm7modem: adding netmon changes for reporting neighbouring cell
Added netmon changes for xmm7modem driver to fetch neighbouring cell information.
This commit is contained in:
		
				
					committed by
					
						
						Denis Kenzior
					
				
			
			
				
	
			
			
			
						parent
						
							90c312484f
						
					
				
				
					commit
					686e3fba83
				
			@@ -47,6 +47,7 @@ static const char *xmci_prefix[] = { "+XMCI:", NULL };
 | 
			
		||||
 | 
			
		||||
struct netmon_driver_data {
 | 
			
		||||
	GAtChat *chat;
 | 
			
		||||
	int xmci_mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum xmci_ofono_type_info {
 | 
			
		||||
@@ -85,6 +86,7 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	struct cb_data *cbd = user_data;
 | 
			
		||||
	struct ofono_netmon *netmon = cbd->data;
 | 
			
		||||
	struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon);
 | 
			
		||||
	ofono_netmon_cb_t cb = cbd->cb;
 | 
			
		||||
	struct ofono_error error;
 | 
			
		||||
	GAtResultIter iter;
 | 
			
		||||
@@ -96,6 +98,11 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
	int ecn0 = -1;
 | 
			
		||||
	int rsrq = -1;
 | 
			
		||||
	int tech = -1;
 | 
			
		||||
	int type = -1;
 | 
			
		||||
	int ci = -1;
 | 
			
		||||
	const char *cell_id;
 | 
			
		||||
	char mcc[3];
 | 
			
		||||
	char mnc[3];
 | 
			
		||||
 | 
			
		||||
	DBG("ok %d", ok);
 | 
			
		||||
 | 
			
		||||
@@ -109,18 +116,23 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
	g_at_result_iter_init(&iter, result);
 | 
			
		||||
 | 
			
		||||
	while (g_at_result_iter_next(&iter, "+XMCI:")) {
 | 
			
		||||
		if (!g_at_result_iter_next_number(&iter, &number))
 | 
			
		||||
		if (!g_at_result_iter_next_number(&iter, &type))
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		tech = xmm7modem_map_radio_access_technology(number);
 | 
			
		||||
		tech = xmm7modem_map_radio_access_technology(type);
 | 
			
		||||
 | 
			
		||||
		switch (number) {
 | 
			
		||||
		switch (type) {
 | 
			
		||||
		case XMCI_GSM_NEIGH_CELL:
 | 
			
		||||
		case XMCI_GSM_SERV_CELL:
 | 
			
		||||
			/* skip <MCC>,<MNC>,<LAC>,<CI>,<BSIC> */
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			/* <MCC>,<MNC>,<LAC>,<CI>,<BSIC> */
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mcc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mnc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_next_string(&iter, &cell_id);
 | 
			
		||||
			sscanf(&cell_id[2], "%x", &number);
 | 
			
		||||
			ci = number != -1 ? number : 0;
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
@@ -129,15 +141,20 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			ber = number != 99 ? number : ber;
 | 
			
		||||
			break;
 | 
			
		||||
		case XMCI_UMTS_NEIGH_CELL:
 | 
			
		||||
		case XMCI_UMTS_SERV_CELL:
 | 
			
		||||
			/*
 | 
			
		||||
			 * skip <MCC>,<MNC>,<LAC>,<CI><PSC>,<DLUARFNC>,
 | 
			
		||||
			 * <MCC>,<MNC>,<LAC>,<CI><PSC>,<DLUARFNC>,
 | 
			
		||||
			 * <ULUARFCN>,<PATHLOSS>,<RSSI>
 | 
			
		||||
			 */
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mcc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mnc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_next_string(&iter, &cell_id);
 | 
			
		||||
			sscanf(&cell_id[2], "%x", &number);
 | 
			
		||||
			ci = number != -1 ? number : 0;
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
@@ -150,15 +167,20 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			ecn0 = number != 255 ? number : ecn0;
 | 
			
		||||
			break;
 | 
			
		||||
		case XMCI_LTE_NEIGH_CELL:
 | 
			
		||||
		case XMCI_LTE_SERV_CELL:
 | 
			
		||||
			/*
 | 
			
		||||
			 * skip <MCC>,<MNC>,<TAC>,<CI>,<PCI>,<DLUARFNC>,
 | 
			
		||||
			 * <MCC>,<MNC>,<TAC>,<CI>,<PCI>,<DLUARFNC>,
 | 
			
		||||
			 * <ULUARFCN>,<PATHLOSS_LTE>
 | 
			
		||||
			 */
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mcc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_next_number(&iter, &number);
 | 
			
		||||
			snprintf(mnc, 3, "%d", number);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_next_string(&iter, &cell_id);
 | 
			
		||||
			sscanf(&cell_id[2], "%x", &number);
 | 
			
		||||
			ci = number != -1 ? number : 0;
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
			g_at_result_iter_skip_next(&iter);
 | 
			
		||||
@@ -174,7 +196,27 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ofono_netmon_serving_cell_notify(netmon,
 | 
			
		||||
		if ((nmd->xmci_mode == 0) &&
 | 
			
		||||
				(type == XMCI_GSM_NEIGH_CELL ||
 | 
			
		||||
				type == XMCI_UMTS_NEIGH_CELL ||
 | 
			
		||||
				type == XMCI_LTE_NEIGH_CELL)) {
 | 
			
		||||
			ofono_netmon_neighbouring_cell_notify(netmon,
 | 
			
		||||
						tech,
 | 
			
		||||
						OFONO_NETMON_INFO_MCC, mcc,
 | 
			
		||||
						OFONO_NETMON_INFO_MNC, mnc,
 | 
			
		||||
						OFONO_NETMON_INFO_CI, ci,
 | 
			
		||||
						OFONO_NETMON_INFO_RXLEV, rxlev,
 | 
			
		||||
						OFONO_NETMON_INFO_BER, ber,
 | 
			
		||||
						OFONO_NETMON_INFO_RSCP, rscp,
 | 
			
		||||
						OFONO_NETMON_INFO_ECN0, ecn0,
 | 
			
		||||
						OFONO_NETMON_INFO_RSRQ, rsrq,
 | 
			
		||||
						OFONO_NETMON_INFO_RSRP, rsrp,
 | 
			
		||||
						OFONO_NETMON_INFO_INVALID);
 | 
			
		||||
		} else if ((nmd->xmci_mode == 1) &&
 | 
			
		||||
				(type == XMCI_GSM_SERV_CELL ||
 | 
			
		||||
				type == XMCI_UMTS_SERV_CELL ||
 | 
			
		||||
				type == XMCI_LTE_SERV_CELL)) {
 | 
			
		||||
			ofono_netmon_serving_cell_notify(netmon,
 | 
			
		||||
						tech,
 | 
			
		||||
						OFONO_NETMON_INFO_RXLEV, rxlev,
 | 
			
		||||
						OFONO_NETMON_INFO_BER, ber,
 | 
			
		||||
@@ -183,10 +225,12 @@ static void xmci_cb(gboolean ok, GAtResult *result, gpointer user_data)
 | 
			
		||||
						OFONO_NETMON_INFO_RSRQ, rsrq,
 | 
			
		||||
						OFONO_NETMON_INFO_RSRP, rsrp,
 | 
			
		||||
						OFONO_NETMON_INFO_INVALID);
 | 
			
		||||
 | 
			
		||||
		CALLBACK_WITH_SUCCESS(cb, cbd->data);
 | 
			
		||||
		break;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CALLBACK_WITH_SUCCESS(cb, cbd->data);
 | 
			
		||||
	nmd->xmci_mode = -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon,
 | 
			
		||||
@@ -194,6 +238,7 @@ static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon,
 | 
			
		||||
{
 | 
			
		||||
	struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon);
 | 
			
		||||
	struct cb_data *cbd = cb_data_new(cb, data);
 | 
			
		||||
	nmd->xmci_mode = 1;
 | 
			
		||||
 | 
			
		||||
	DBG("xmm7modem netmon request update");
 | 
			
		||||
 | 
			
		||||
@@ -205,6 +250,23 @@ static void xmm7modem_netmon_request_update(struct ofono_netmon *netmon,
 | 
			
		||||
	CALLBACK_WITH_FAILURE(cb, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xmm7modem_neighbouring_cell_update(struct ofono_netmon *netmon,
 | 
			
		||||
					ofono_netmon_cb_t cb, void *data)
 | 
			
		||||
{
 | 
			
		||||
	struct netmon_driver_data *nmd = ofono_netmon_get_data(netmon);
 | 
			
		||||
	struct cb_data *cbd = cb_data_new(cb, data);
 | 
			
		||||
	nmd->xmci_mode = 0;
 | 
			
		||||
 | 
			
		||||
	DBG("xmm7modem netmon request neighbouring cell update");
 | 
			
		||||
 | 
			
		||||
	if (g_at_chat_send(nmd->chat, "AT+XMCI=0", xmci_prefix,
 | 
			
		||||
			xmci_cb, cbd, g_free) > 0)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	g_free(cbd);
 | 
			
		||||
	CALLBACK_WITH_FAILURE(cb, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean ril_delayed_register(gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
	struct ofono_netmon *netmon = user_data;
 | 
			
		||||
@@ -224,6 +286,7 @@ static int xmm7modem_netmon_probe(struct ofono_netmon *netmon,
 | 
			
		||||
 | 
			
		||||
	nmd = g_new0(struct netmon_driver_data, 1);
 | 
			
		||||
	nmd->chat = g_at_chat_clone(chat);
 | 
			
		||||
	nmd->xmci_mode = -1;
 | 
			
		||||
 | 
			
		||||
	ofono_netmon_set_data(netmon, nmd);
 | 
			
		||||
 | 
			
		||||
@@ -250,6 +313,7 @@ static const struct ofono_netmon_driver driver = {
 | 
			
		||||
	.probe			= xmm7modem_netmon_probe,
 | 
			
		||||
	.remove			= xmm7modem_netmon_remove,
 | 
			
		||||
	.request_update		= xmm7modem_netmon_request_update,
 | 
			
		||||
	.neighbouring_cell_update = xmm7modem_neighbouring_cell_update,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void xmm_netmon_init(void)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user