drivers: gnss: LCX6G use modem chat runtime API

Update the Quectel LCX6G device driver to use the modem chat
runtime API to modify the dynamic pair chat script.

This change makes the driver safer and more readible by
ensuring safe modification of the members of the modem chat
structures.

Signed-off-by: Bjarki Arge Andreasen <bjarki@arge-andreasen.me>
This commit is contained in:
Bjarki Arge Andreasen 2024-02-29 12:50:53 +01:00 committed by Alberto Escolar
parent 000784b91d
commit 51bcc5d20d

View file

@ -59,13 +59,12 @@ struct quectel_lcx6g_data {
uint8_t chat_delimiter[2];
uint8_t *chat_argv[32];
/* Dynamic chat script */
uint8_t dynamic_match_buf[32];
uint8_t dynamic_separators_buf[2];
uint8_t dynamic_request_buf[32];
struct modem_chat_match dynamic_match;
struct modem_chat_script_chat dynamic_script_chat;
struct modem_chat_script dynamic_script;
/* Pair chat script */
uint8_t pair_request_buf[32];
uint8_t pair_match_buf[32];
struct modem_chat_match pair_match;
struct modem_chat_script_chat pair_script_chat;
struct modem_chat_script pair_script;
/* Allocation for responses from GNSS modem */
union {
@ -141,23 +140,29 @@ static int quectel_lcx6g_configure_pps(const struct device *dev)
break;
}
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR752,%u,%u", pps_mode, config->pps_pulse_width);
if (ret < 0) {
return ret;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
return ret;
}
ret = gnss_nmea0183_snprintk(data->dynamic_match_buf, sizeof(data->dynamic_match_buf),
ret = gnss_nmea0183_snprintk(data->pair_match_buf, sizeof(data->pair_match_buf),
"PAIR001,752,0");
if (ret < 0) {
return ret;
}
data->dynamic_match.match_size = ret;
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
return ret;
}
return modem_chat_run_script(&data->chat, &data->dynamic_script);
return modem_chat_run_script(&data->chat, &data->pair_script);
}
static void quectel_lcx6g_lock(const struct device *dev)
@ -312,23 +317,29 @@ static int quectel_lcx6g_set_fix_rate(const struct device *dev, uint32_t fix_int
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR050,%u", fix_interval_ms);
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_match_buf, sizeof(data->dynamic_match_buf),
ret = gnss_nmea0183_snprintk(data->pair_match_buf, sizeof(data->pair_match_buf),
"PAIR001,050,0");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_match.match_size = ret;
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
if (ret < 0) {
goto unlock_return;
}
@ -362,20 +373,26 @@ static int quectel_lcx6g_get_fix_rate(const struct device *dev, uint32_t *fix_in
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR051");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
strncpy(data->dynamic_match_buf, "$PAIR051,", sizeof(data->dynamic_match_buf));
data->dynamic_match.match_size = sizeof("$PAIR051,") - 1;
data->dynamic_match.callback = quectel_lcx6g_get_fix_rate_callback;
strncpy(data->pair_match_buf, "$PAIR051,", sizeof(data->pair_match_buf));
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
data->dynamic_match.callback = NULL;
modem_chat_match_set_callback(&data->pair_match, quectel_lcx6g_get_fix_rate_callback);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
modem_chat_match_set_callback(&data->pair_match, NULL);
if (ret < 0) {
goto unlock_return;
}
@ -414,23 +431,29 @@ static int quectel_lcx6g_set_navigation_mode(const struct device *dev,
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR080,%u", navigation_mode);
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_match_buf, sizeof(data->dynamic_match_buf),
ret = gnss_nmea0183_snprintk(data->pair_match_buf, sizeof(data->pair_match_buf),
"PAIR001,080,0");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_match.match_size = ret;
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
if (ret < 0) {
goto unlock_return;
}
@ -440,8 +463,8 @@ unlock_return:
return ret;
}
static void quectel_lcx6g_get_navigation_mode_callback(struct modem_chat *chat, char **argv,
uint16_t argc, void *user_data)
static void quectel_lcx6g_get_nav_mode_callback(struct modem_chat *chat, char **argv,
uint16_t argc, void *user_data)
{
struct quectel_lcx6g_data *data = user_data;
int32_t tmp;
@ -481,20 +504,26 @@ static int quectel_lcx6g_get_navigation_mode(const struct device *dev,
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR081");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
strncpy(data->dynamic_match_buf, "$PAIR081,", sizeof(data->dynamic_match_buf));
data->dynamic_match.match_size = sizeof("$PAIR081,") - 1;
data->dynamic_match.callback = quectel_lcx6g_get_navigation_mode_callback;
strncpy(data->pair_match_buf, "$PAIR081,", sizeof(data->pair_match_buf));
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
data->dynamic_match.callback = NULL;
modem_chat_match_set_callback(&data->pair_match, quectel_lcx6g_get_nav_mode_callback);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
modem_chat_match_set_callback(&data->pair_match, NULL);
if (ret < 0) {
goto unlock_return;
}
@ -521,7 +550,7 @@ static int quectel_lcx6g_set_enabled_systems(const struct device *dev, gnss_syst
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR066,%u,%u,%u,%u,%u,0",
(0 < (systems & GNSS_SYSTEM_GPS)),
(0 < (systems & GNSS_SYSTEM_GLONASS)),
@ -532,38 +561,50 @@ static int quectel_lcx6g_set_enabled_systems(const struct device *dev, gnss_syst
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_match_buf, sizeof(data->dynamic_match_buf),
ret = gnss_nmea0183_snprintk(data->pair_match_buf, sizeof(data->pair_match_buf),
"PAIR001,066,0");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_match.match_size = ret;
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = modem_chat_run_script(&data->chat, &data->pair_script);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR410,%u", (0 < (systems & GNSS_SYSTEM_SBAS)));
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_match_buf, sizeof(data->dynamic_match_buf),
ret = gnss_nmea0183_snprintk(data->pair_match_buf, sizeof(data->pair_match_buf),
"PAIR001,410,0");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_match.match_size = ret;
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
if (ret < 0) {
goto unlock_return;
}
@ -614,38 +655,50 @@ static int quectel_lcx6g_get_enabled_systems(const struct device *dev, gnss_syst
quectel_lcx6g_lock(dev);
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR067");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
strncpy(data->dynamic_match_buf, "$PAIR067,", sizeof(data->dynamic_match_buf));
data->dynamic_match.match_size = sizeof("$PAIR067,") - 1;
data->dynamic_match.callback = quectel_lcx6g_get_search_mode_callback;
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
data->dynamic_match.callback = NULL;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->dynamic_request_buf, sizeof(data->dynamic_request_buf),
strncpy(data->pair_match_buf, "$PAIR067,", sizeof(data->pair_match_buf));
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
modem_chat_match_set_callback(&data->pair_match, quectel_lcx6g_get_search_mode_callback);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
modem_chat_match_set_callback(&data->pair_match, NULL);
if (ret < 0) {
goto unlock_return;
}
ret = gnss_nmea0183_snprintk(data->pair_request_buf, sizeof(data->pair_request_buf),
"PAIR411");
if (ret < 0) {
goto unlock_return;
}
data->dynamic_script_chat.request_size = ret;
ret = modem_chat_script_chat_set_request(&data->pair_script_chat, data->pair_request_buf);
if (ret < 0) {
goto unlock_return;
}
strncpy(data->dynamic_match_buf, "$PAIR411,", sizeof(data->dynamic_match_buf));
data->dynamic_match.match_size = sizeof("$PAIR411,") - 1;
data->dynamic_match.callback = quectel_lcx6g_get_sbas_status_callback;
strncpy(data->pair_match_buf, "$PAIR411,", sizeof(data->pair_match_buf));
ret = modem_chat_match_set_match(&data->pair_match, data->pair_match_buf);
if (ret < 0) {
goto unlock_return;
}
ret = modem_chat_run_script(&data->chat, &data->dynamic_script);
data->dynamic_match.callback = NULL;
modem_chat_match_set_callback(&data->pair_match, quectel_lcx6g_get_sbas_status_callback);
ret = modem_chat_run_script(&data->chat, &data->pair_script);
modem_chat_match_set_callback(&data->pair_match, NULL);
if (ret < 0) {
goto unlock_return;
}
@ -726,28 +779,22 @@ static int quectel_lcx6g_init_chat(const struct device *dev)
return modem_chat_init(&data->chat, &chat_config);
}
static void quectel_lcx6g_init_dynamic_script(const struct device *dev)
static void quectel_lcx6g_init_pair_script(const struct device *dev)
{
struct quectel_lcx6g_data *data = dev->data;
data->dynamic_match.match = data->dynamic_match_buf;
data->dynamic_match.separators = data->dynamic_separators_buf;
data->dynamic_match.separators_size = sizeof(data->dynamic_separators_buf);
data->dynamic_match.wildcards = false;
data->dynamic_match.partial = false;
modem_chat_match_init(&data->pair_match);
modem_chat_match_set_separators(&data->pair_match, ",*");
data->dynamic_script_chat.request = data->dynamic_request_buf;
data->dynamic_script_chat.response_matches = &data->dynamic_match;
data->dynamic_script_chat.response_matches_size = 1;
data->dynamic_script_chat.timeout = 0;
modem_chat_script_chat_init(&data->pair_script_chat);
modem_chat_script_chat_set_response_matches(&data->pair_script_chat,
&data->pair_match, 1);
data->dynamic_script.name = "pair";
data->dynamic_script.script_chats = &data->dynamic_script_chat;
data->dynamic_script.script_chats_size = 1;
data->dynamic_script.abort_matches = NULL;
data->dynamic_script.abort_matches_size = 0;
data->dynamic_script.callback = NULL;
data->dynamic_script.timeout = 10;
modem_chat_script_init(&data->pair_script);
modem_chat_script_set_name(&data->pair_script, "pair");
modem_chat_script_set_script_chats(&data->pair_script, &data->pair_script_chat, 1);
modem_chat_script_set_abort_matches(&data->pair_script, NULL, 0);
modem_chat_script_set_timeout(&data->pair_script, 10);
}
static int quectel_lcx6g_init(const struct device *dev)
@ -769,7 +816,7 @@ static int quectel_lcx6g_init(const struct device *dev)
return ret;
}
quectel_lcx6g_init_dynamic_script(dev);
quectel_lcx6g_init_pair_script(dev);
quectel_lcx6g_pm_changed(dev);
@ -798,7 +845,6 @@ static int quectel_lcx6g_init(const struct device *dev)
\
static struct quectel_lcx6g_data LCX6G_INST_NAME(inst, data) = { \
.chat_delimiter = {'\r', '\n'}, \
.dynamic_separators_buf = {',', '*'}, \
}; \
\
PM_DEVICE_DT_INST_DEFINE(inst, quectel_lcx6g_pm_action); \