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
35 changes: 20 additions & 15 deletions drivers/gnss/gnss_nrf9x_emul.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,48 @@
#include <nrf_modem_gnss.h>
#include <modem/lte_lc.h>

#include <infuse/drivers/gnss/gnss_emul.h>

#define DT_DRV_COMPAT nordic_nrf9x_gnss_emul

#define SUPPORTED_SYSTEMS (GNSS_SYSTEM_GPS | GNSS_SYSTEM_QZSS)

static struct nrf9x_data {
struct nrf9x_data {
nrf_modem_gnss_event_handler_type_t handler;
struct nrf_modem_gnss_pvt_data_frame pvt_frame;
struct k_work_delayable worker;
gnss_systems_t systems;
k_ticks_t latest_timepulse;
uint64_t next_interrupt;
uint16_t interval;
} nrf9x_inst_data;
};

void emul_gnss_pvt_configure(const struct device *dev, int32_t latitude, int32_t longitude,
int32_t height, uint32_t h_acc, uint32_t v_acc, uint32_t t_acc,
uint16_t p_dop, uint8_t num_sv)
static struct nrf9x_data nrf9x_inst_data;

void emul_gnss_pvt_configure(const struct device *dev, struct gnss_pvt_emul_location *emul_location)
{
struct nrf_modem_gnss_pvt_data_frame *f = &nrf9x_inst_data.pvt_frame;

f->latitude = (double)latitude / 1e7;
f->longitude = (double)longitude / 1e7;
f->altitude = (float)height / 1e3f;
f->accuracy = (float)h_acc / 1e3f;
f->altitude_accuracy = (float)v_acc / 1e3f;
f->pdop = (float)p_dop / 10.0f;
f->hdop = (float)p_dop / 10.0f;
f->latitude = (double)emul_location->latitude / 1e7;
f->longitude = (double)emul_location->longitude / 1e7;
f->altitude = (float)emul_location->height / 1e3f;
f->accuracy = (float)emul_location->h_acc / 1e3f;
f->altitude_accuracy = (float)emul_location->v_acc / 1e3f;
f->pdop = (float)emul_location->p_dop / 10.0f;
f->hdop = (float)emul_location->p_dop / 10.0f;
/* Not a real conversion, but should work for our purposes */
f->tdop = (float)t_acc / 1000.0f;
f->tdop = (float)emul_location->t_acc / 1000.0f;

if (t_acc) {
if (emul_location->t_acc) {
f->datetime.year = 2025;
f->datetime.month = 2;
f->datetime.day = 1;
f->datetime.hour = 5;
}

for (int i = 0; i < ARRAY_SIZE(f->sv); i++) {
f->sv[i].flags = (i < num_sv) ? NRF_MODEM_GNSS_SV_FLAG_USED_IN_FIX : 0;
f->sv[i].flags =
(i < emul_location->num_sv) ? NRF_MODEM_GNSS_SV_FLAG_USED_IN_FIX : 0;
}
}

Expand Down Expand Up @@ -90,6 +93,8 @@ int32_t nrf_modem_gnss_event_handler_set(nrf_modem_gnss_event_handler_type_t han

int32_t nrf_modem_gnss_use_case_set(uint8_t use_case)
{
ARG_UNUSED(use_case);

return 0;
}

Expand Down
6 changes: 4 additions & 2 deletions drivers/gnss/gnss_u_blox_m10_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@ static int get_fix_rate_handler(uint8_t message_class, uint8_t message_id, const
uint32_t *fix_interval_ms = user_data;
const uint8_t *val_ptr = valget->cfg_data;
size_t val_len = payload_len - sizeof(*valget);
uint16_t meas = 0, nav = 0;
struct ubx_cfg_val cfg_val;
uint16_t meas = 0;
uint16_t nav = 0;

__ASSERT_NO_MSG(valget->version == 0x01);

Expand Down Expand Up @@ -400,7 +401,8 @@ static int ubx_m10_i2c_software_standby(const struct device *dev)
&data->common.mon_rxr_signal),
};
unsigned int signaled;
int result, rc;
int result;
int rc;

/* Reset previous events */
k_poll_signal_reset(&data->common.mon_rxr_signal);
Expand Down
33 changes: 18 additions & 15 deletions drivers/gnss/gnss_u_blox_m8_emul.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <infuse/gnss/ubx/modem.h>
#include <infuse/gnss/ubx/protocol.h>
#include <infuse/drivers/gnss/gnss_emul.h>

struct emul_config {
};
Expand All @@ -44,7 +45,9 @@ LOG_MODULE_REGISTER(ubx_m8_emul, LOG_LEVEL_INF);
static void message_dispatch(struct emul_data *data, uint8_t msg_class, uint8_t msg_id, void *msg,
size_t msg_len)
{
struct ubx_message_handler_ctx *curr, *tmp, *prev = NULL;
struct ubx_message_handler_ctx *curr;
struct ubx_message_handler_ctx *tmp;
struct ubx_message_handler_ctx *prev = NULL;
bool notify;
int rc;

Expand Down Expand Up @@ -123,22 +126,20 @@ struct ubx_modem_data *ubx_modem_data_get(const struct device *dev)
return dev->data;
}

void emul_gnss_pvt_configure(const struct device *dev, int32_t latitude, int32_t longitude,
int32_t height, uint32_t h_acc, uint32_t v_acc, uint32_t t_acc,
uint16_t p_dop, uint8_t num_sv)
void emul_gnss_pvt_configure(const struct device *dev, struct gnss_pvt_emul_location *emul_location)
{
struct emul_data *data = dev->data;

data->current_pvt.lat = latitude;
data->current_pvt.lon = longitude;
data->current_pvt.height = height;
data->current_pvt.h_acc = h_acc;
data->current_pvt.v_acc = v_acc;
data->current_pvt.t_acc = t_acc;
data->current_pvt.p_dop = p_dop;
data->current_pvt.num_sv = num_sv;
data->current_pvt.lat = emul_location->latitude;
data->current_pvt.lon = emul_location->longitude;
data->current_pvt.height = emul_location->height;
data->current_pvt.h_acc = emul_location->h_acc;
data->current_pvt.v_acc = emul_location->v_acc;
data->current_pvt.t_acc = emul_location->t_acc;
data->current_pvt.p_dop = emul_location->p_dop;
data->current_pvt.num_sv = emul_location->num_sv;

data->current_pvt.valid = t_acc < (2 * NSEC_PER_MSEC)
data->current_pvt.valid = emul_location->t_acc < (2 * NSEC_PER_MSEC)
? UBX_MSG_NAV_PVT_VALID_DATE | UBX_MSG_NAV_PVT_VALID_TIME
: 0;
}
Expand Down Expand Up @@ -291,12 +292,14 @@ static int emul_pm_control(const struct device *dev, enum pm_device_action actio
{
struct emul_data *data = dev->data;
int rc = data->pm_rc;
struct gnss_pvt_emul_location emul_loc = {
0, 0, 0, UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT16_MAX, 0,
};

switch (action) {
case PM_DEVICE_ACTION_RESUME:
/* Reset state on resume */
emul_gnss_pvt_configure(dev, 0, 0, 0, UINT32_MAX, UINT32_MAX, UINT32_MAX,
UINT16_MAX, 0);
emul_gnss_pvt_configure(dev, &emul_loc);
navigation_reschedule(data);
break;
case PM_DEVICE_ACTION_SUSPEND:
Expand Down
9 changes: 6 additions & 3 deletions drivers/gnss/gnss_u_blox_m8_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ static int get_gnss_handler(uint8_t message_class, uint8_t message_id, const voi
size_t payload_len, void *user_data)
{
const struct ubx_msg_cfg_gnss *gnss = payload;
gnss_systems_t out = 0, *systems = user_data;
gnss_systems_t *systems = user_data;
gnss_systems_t out = 0;

for (int i = 0; i < gnss->num_cfg_blocks; i++) {
uint8_t gnss_id = gnss->configs[i].gnss_id;
Expand Down Expand Up @@ -367,7 +368,8 @@ static int ubx_m8_spi_software_standby(const struct device *dev)
&data->common.mon_rxr_signal),
};
unsigned int signaled;
int result, rc;
int result;
int rc;

/* Reset previous events */
k_poll_signal_reset(&data->common.mon_rxr_signal);
Expand Down Expand Up @@ -406,7 +408,8 @@ static int ubx_m8_spi_software_resume(const struct device *dev)
&data->common.mon_rxr_signal),
};
unsigned int signaled;
int result, rc;
int result;
int rc;

/* Reset previous events */
k_poll_signal_reset(&data->common.mon_rxr_signal);
Expand Down
162 changes: 93 additions & 69 deletions drivers/gnss/gnss_ubx_modem.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,68 +31,66 @@ static void ubx_modem_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_eve
}
}

static void ubx_msg_handle(struct ubx_modem_data *modem, struct ubx_frame *frame,
uint16_t payload_len)
static void ubx_msg_handle_ack(struct ubx_modem_data *modem, struct ubx_frame *frame,
uint16_t payload_len)
{
struct ubx_message_handler_ctx *curr, *tmp;
struct ubx_message_handler_ctx *to_run[CONFIG_GNSS_UBX_MODEM_MAX_CALLBACKS] = {0};
int num_to_run, rc;
bool notify;
struct ubx_message_handler_ctx *curr;
struct ubx_message_handler_ctx *tmp;
int rc;

#ifdef CONFIG_GNSS_UBX_RAW_FRAME_HANDLER
{
uint16_t total_len = sizeof(*frame) + payload_len + sizeof(uint16_t);
/* ACK-ACK and ACK-NAK have the same payload structures */
const struct ubx_msg_id_ack_ack *ack = (const void *)frame->payload_and_checksum;

ubx_modem_raw_frame_handler(frame, total_len);
/* Iterate over all one shot handlers */
k_sem_take(&modem->handlers_sem, K_FOREVER);
SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&modem->handlers, curr, tmp, _node) {
/* Only consider handlers expecting an ACK */
if (!(curr->flags & (UBX_HANDLING_ACK | UBX_HANDLING_RSP_ACK))) {
continue;
}
/* Check message that was acked against handler */
if ((ack->message_class == curr->message_class) &&
(ack->message_id == curr->message_id)) {
/* Remove from handler list */
sys_slist_find_and_remove(&modem->handlers, &curr->_node);
/* Store the one-shot handler that should be run */
to_run[0] = curr;
break;
}
}
#endif /* CONFIG_GNSS_UBX_RAW_FRAME_HANDLER*/

if (frame->message_class == UBX_MSG_CLASS_ACK) {
/* ACK-ACK and ACK-NAK have the same payload structures */
const struct ubx_msg_id_ack_ack *ack = (const void *)frame->payload_and_checksum;
k_sem_give(&modem->handlers_sem);

/* Iterate over all one shot handlers */
k_sem_take(&modem->handlers_sem, K_FOREVER);
SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&modem->handlers, curr, tmp, _node) {
/* Only consider handlers expecting an ACK */
if (!(curr->flags & (UBX_HANDLING_ACK | UBX_HANDLING_RSP_ACK))) {
continue;
}
/* Check message that was acked against handler */
if ((ack->message_class == curr->message_class) &&
(ack->message_id == curr->message_id)) {
/* Remove from handler list */
sys_slist_find_and_remove(&modem->handlers, &curr->_node);
/* Store the one-shot handler that should be run */
to_run[0] = curr;
break;
}
if (to_run[0]) {
/* If UBX_HANDLING_RSP_ACK, handler was for the main response */
ubx_message_handler_t cb = curr->flags & UBX_HANDLING_RSP_ACK
? ubx_modem_ack_handler
: curr->message_cb;
/* Run callback */
rc = cb(frame->message_class, frame->message_id, frame->payload_and_checksum,
payload_len, curr->user_data);
/* Raise signal if provided */
if (curr->signal) {
k_poll_signal_raise(curr->signal, rc);
}
k_sem_give(&modem->handlers_sem);

if (to_run[0]) {
/* If UBX_HANDLING_RSP_ACK, handler was for the main response */
ubx_message_handler_t cb = curr->flags & UBX_HANDLING_RSP_ACK
? ubx_modem_ack_handler
: curr->message_cb;
/* Run callback */
rc = cb(frame->message_class, frame->message_id,
frame->payload_and_checksum, payload_len, curr->user_data);
/* Raise signal if provided */
if (curr->signal) {
k_poll_signal_raise(curr->signal, rc);
}
} else {
if (!IS_ENABLED(CONFIG_GNSS_UBX_RAW_FRAME_HANDLER)) {
LOG_WRN("Unhandled ACK for %02x:%02x", ack->message_class,
ack->message_id);
}
} else {
if (!IS_ENABLED(CONFIG_GNSS_UBX_RAW_FRAME_HANDLER)) {
LOG_WRN("Unhandled ACK for %02x:%02x", ack->message_class, ack->message_id);
}
return;
}
}

static void ubx_msg_handle_non_ack(struct ubx_modem_data *modem, struct ubx_frame *frame,
uint16_t payload_len)
{
struct ubx_message_handler_ctx *to_run[CONFIG_GNSS_UBX_MODEM_MAX_CALLBACKS] = {0};
struct ubx_message_handler_ctx *curr;
struct ubx_message_handler_ctx *tmp;
int num_to_run = 0;
bool notify;
int rc;

/* Iterate over all pending message callbacks */
num_to_run = 0;
k_sem_take(&modem->handlers_sem, K_FOREVER);
SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&modem->handlers, curr, tmp, _node) {
/* Notify if:
Expand Down Expand Up @@ -137,6 +135,47 @@ static void ubx_msg_handle(struct ubx_modem_data *modem, struct ubx_frame *frame
}
}

static void ubx_msg_handle(struct ubx_modem_data *modem, struct ubx_frame *frame,
uint16_t payload_len)
{
#ifdef CONFIG_GNSS_UBX_RAW_FRAME_HANDLER
{
uint16_t total_len = sizeof(*frame) + payload_len + sizeof(uint16_t);

ubx_modem_raw_frame_handler(frame, total_len);
}
#endif /* CONFIG_GNSS_UBX_RAW_FRAME_HANDLER*/

if (frame->message_class == UBX_MSG_CLASS_ACK) {
ubx_msg_handle_ack(modem, frame, payload_len);
} else {
ubx_msg_handle_non_ack(modem, frame, payload_len);
}
}

static bool fifo_read_to_sync(struct ubx_modem_data *modem, struct ubx_frame *frame)
{
/* Pull single bytes until sync bytes found */
while (modem->rx_buffer_pending < 2) {
if (modem_pipe_receive(modem->pipe, modem->rx_buffer + modem->rx_buffer_pending,
1) <= 0) {
return true;
}

if ((modem->rx_buffer_pending) == 0 &&
(frame->preamble_sync_char_1 != UBX_PREAMBLE_SYNC_CHAR_1)) {
continue;
}
if ((modem->rx_buffer_pending) == 1 &&
(frame->preamble_sync_char_2 != UBX_PREAMBLE_SYNC_CHAR_2)) {
modem->rx_buffer_pending = 0;
continue;
}
modem->rx_buffer_pending++;
}
return false;
}

static void fifo_read_runner(struct k_work *work)
{
struct ubx_modem_data *modem = CONTAINER_OF(work, struct ubx_modem_data, fifo_read_worker);
Expand All @@ -147,24 +186,9 @@ static void fifo_read_runner(struct k_work *work)
int received;

while (true) {
/* Pull single bytes until sync bytes found */
while (modem->rx_buffer_pending < 2) {
if (modem_pipe_receive(modem->pipe,
modem->rx_buffer + modem->rx_buffer_pending,
1) <= 0) {
return;
}

if ((modem->rx_buffer_pending) == 0 &&
(frame->preamble_sync_char_1 != UBX_PREAMBLE_SYNC_CHAR_1)) {
continue;
}
if ((modem->rx_buffer_pending) == 1 &&
(frame->preamble_sync_char_2 != UBX_PREAMBLE_SYNC_CHAR_2)) {
modem->rx_buffer_pending = 0;
continue;
}
modem->rx_buffer_pending++;
/* Read until we see SYNC bytes */
if (fifo_read_to_sync(modem, frame)) {
return;
}

/* Pull remainder of frame header */
Expand Down
6 changes: 3 additions & 3 deletions drivers/imu/lis2dw12/lis2dw12.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,9 +425,9 @@ static int run_test_sequence(const struct device *dev, struct lis2dw12_fifo_fram

/* Output in milli-gs */
one_g = imu_accelerometer_1g(4);
average->x = (1000 * (int32_t)sum_x / 5) / one_g;
average->y = (1000 * (int32_t)sum_y / 5) / one_g;
average->z = (1000 * (int32_t)sum_z / 5) / one_g;
average->x = (1000 * sum_x / 5) / one_g;
average->y = (1000 * sum_y / 5) / one_g;
average->z = (1000 * sum_z / 5) / one_g;
return 0;
}

Expand Down
Loading