Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Kconfig.defaults.nrf
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ configdefault LTE_PSM_REQ_RAT
# 1 1 1 value indicates that the timer is deactivated (NOTE 2).
configdefault LTE_PSM_REQ_RPTAU
default "00101100"
# When networks don't support PSM natively, use the Nordic proprietary PSM
# feature. Proprietary PSM can be used only in application use cases where
# the device always initiates the data connection. Infuse-IoT satisfies this
# requirement.
configdefault LTE_PROPRIETARY_PSM_REQ
default y

# WiFi defaults
configdefault WIFI_NRF700X
Expand Down
7 changes: 6 additions & 1 deletion include/infuse/lib/nrf_modem_monitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#ifndef INFUSE_SDK_INCLUDE_INFUSE_LIB_NRF_MODEM_MONITOR_H_
#define INFUSE_SDK_INCLUDE_INFUSE_LIB_NRF_MODEM_MONITOR_H_

#include <stdbool.h>

#include <modem/lte_lc.h>

#ifdef __cplusplus
Expand Down Expand Up @@ -46,11 +48,14 @@ void nrf_modem_monitor_network_state(struct nrf_modem_network_state *state);
*
* @param rsrp Reference signal received power
* @param rsrq Reference signal received quality
* @param cached Return cached signal quality from previous run if modem can
* no longer determine the parameters. Cached values are reset
* when the cell tower changes
*
* @retval 0 on success
* @retval -errno on error
*/
int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq);
int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq, bool cached);

/**
* @}
Expand Down
51 changes: 38 additions & 13 deletions lib/nrf_modem_lib/nrf_modem_monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,16 @@ LOG_MODULE_REGISTER(modem_monitor, LOG_LEVEL_INF);

static struct {
struct nrf_modem_network_state network_state;
int16_t rsrp_cached;
int8_t rsrq_cached;
/* `lte_reg_handler` runs from the system workqueue, and the modem AT commands wait forever
* on the response. This is problematic as the low level functions rely on malloc, which
* can fail. Running AT commands directly from the callback context therefore has the
* potential to deadlock the system workqueue, if multiple notifications occur at the same
* time. Workaround this by running the commands in a different context.
*/
struct k_work update_work;
struct k_work signal_quality_work;
} monitor;

void nrf_modem_monitor_network_state(struct nrf_modem_network_state *state)
Expand Down Expand Up @@ -117,29 +120,39 @@ static void network_info_update(struct k_work *work)
}
}

int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq)
static void signal_quality_update(struct k_work *work)
{
int16_t rsrp;
int8_t rsrq;

(void)nrf_modem_monitor_signal_quality(&rsrp, &rsrq, false);
}

int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq, bool cached)
{
uint8_t rsrp_idx, rsrq_idx;
int rc;

*rsrp = INT16_MIN;
*rsrq = INT8_MIN;
*rsrp = cached ? monitor.rsrp_cached : INT16_MIN;
*rsrq = cached ? monitor.rsrq_cached : INT8_MIN;

/* Query state from the modem */
rc = nrf_modem_at_scanf("AT+CESQ", "+CESQ: %*d,%*d,%*d,%*d,%" SCNu8 ",%" SCNu8, &rsrp_idx,
&rsrq_idx);
if (rc == 2) {
/* Convert from index to physical units if known */
if (rsrp_idx != 255) {
*rsrp = RSRP_IDX_TO_DBM(rsrp_idx);
}
if (rsrq_idx != 255) {
*rsrq = RSRQ_IDX_TO_DB(rsrq_idx);
}
return 0;
if (rc != 2) {
return -EAGAIN;
}

return -EAGAIN;
/* Convert from index to physical units if known */
if (rsrp_idx != 255) {
*rsrp = RSRP_IDX_TO_DBM(rsrp_idx);
monitor.rsrp_cached = *rsrp;
}
if (rsrq_idx != 255) {
*rsrq = RSRQ_IDX_TO_DB(rsrq_idx);
monitor.rsrq_cached = *rsrq;
}
return 0;
}

static void lte_reg_handler(const struct lte_lc_evt *const evt)
Expand Down Expand Up @@ -169,6 +182,10 @@ static void lte_reg_handler(const struct lte_lc_evt *const evt)
LOG_DBG("RRC_UPDATE");
LOG_DBG(" State: %s", evt->rrc_mode == LTE_LC_RRC_MODE_IDLE ? "Idle" : "Active");
monitor.network_state.rrc_mode = evt->rrc_mode;
if (evt->rrc_mode == LTE_LC_RRC_MODE_CONNECTED) {
/* Update cached knowledge of signal strength */
k_work_submit_to_queue(QUERY_WORKQ, &monitor.signal_quality_work);
}
break;
case LTE_LC_EVT_CELL_UPDATE:
LOG_DBG("CELL_UPDATE");
Expand All @@ -177,8 +194,13 @@ static void lte_reg_handler(const struct lte_lc_evt *const evt)
/* Set cell info */
monitor.network_state.cell.tac = evt->cell.tac;
monitor.network_state.cell.id = evt->cell.id;
/* Reset cached signal strength */
monitor.rsrp_cached = INT16_MIN;
monitor.rsrq_cached = INT8_MIN;
/* Request update of knowledge of network info */
k_work_submit_to_queue(QUERY_WORKQ, &monitor.update_work);
/* Update cached knowledge of signal strength */
k_work_submit_to_queue(QUERY_WORKQ, &monitor.signal_quality_work);
break;
case LTE_LC_EVT_LTE_MODE_UPDATE:
LOG_DBG("LTE_MODE_UPDATE");
Expand Down Expand Up @@ -257,9 +279,12 @@ void lte_net_if_modem_fault_app_handler(struct nrf_modem_fault_info *fault_info)
int nrf_modem_monitor_init(void)
{
k_work_init(&monitor.update_work, network_info_update);
k_work_init(&monitor.signal_quality_work, signal_quality_update);
/* Initial state */
monitor.network_state.edrx_cfg.edrx = -1.0f;
monitor.network_state.edrx_cfg.ptw = -1.0f;
monitor.rsrp_cached = INT16_MIN;
monitor.rsrq_cached = INT8_MIN;
/* Register handler */
lte_lc_register_handler(lte_reg_handler);
return 0;
Expand Down
2 changes: 1 addition & 1 deletion subsys/rpc/commands/lte_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ static void nrf_modem_lte_state(struct rpc_struct_lte_state *lte)
lte->edrx_paging_window = state.edrx_cfg.ptw;

/* Current signal state */
(void)nrf_modem_monitor_signal_quality(&rsrp, &rsrq);
(void)nrf_modem_monitor_signal_quality(&rsrp, &rsrq, false);
lte->rsrp = rsrp;
lte->rsrq = rsrq;
}
Expand Down
2 changes: 1 addition & 1 deletion subsys/task_runner/tasks/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ if TASK_RUNNER_TASK_GNSS_UBX

config TASK_RUNNER_GNSS_MINIMUM_ACCURACY_M
int "Accuracies worse than this threshold are reported as (-181,-91)"
default 10000
default 100000

config TASK_RUNNER_GNSS_TIME_RESYNC_PERIOD_SEC
int "Resynchronise time from GNSS every N seconds"
Expand Down
2 changes: 1 addition & 1 deletion subsys/task_runner/tasks/task_tdf_logger.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ static void log_network_connection(uint8_t loggers, uint64_t timestamp)
tdf.earfcn = state.cell.earfcn;
tdf.rsrp = UINT8_MAX;
tdf.rsrq = INT8_MIN;
if (nrf_modem_monitor_signal_quality(&rsrp, &rsrq) == 0) {
if (nrf_modem_monitor_signal_quality(&rsrp, &rsrq, true) == 0) {
if (rsrp != INT16_MIN) {
tdf.rsrp = 0 - rsrp;
}
Expand Down
2 changes: 1 addition & 1 deletion tests/subsys/task_runner/tasks/tdf_logger/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ void nrf_modem_monitor_network_state(struct nrf_modem_network_state *state)
*state = (struct nrf_modem_network_state){0};
}

int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq)
int nrf_modem_monitor_signal_quality(int16_t *rsrp, int8_t *rsrq, bool cached)
{
*rsrp = signal_qual.rsrp;
*rsrq = signal_qual.rsrq;
Expand Down
Loading