aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Williams <dan@bigw.org>2025-02-19 21:23:22 +0000
committerDan Williams <dan@bigw.org>2025-02-19 21:23:22 +0000
commit286598388b129ec632998e5d72d58d847bd2892a (patch)
treec44a3204359a150ae37839975a4f941dce1c41e1 /src
parentab59eaee501b9a167022aa83972af5455de86bfd (diff)
parentb1e58e0f6e5acb46af83fb2b15b28337d0e447c0 (diff)
Merge request !1288 from 'add_dtmf_quectel'
src: plugins: quectel: add DTMF dbus notification support https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1288
Diffstat (limited to 'src')
-rw-r--r--src/plugins/quectel/mm-shared-quectel.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/plugins/quectel/mm-shared-quectel.c b/src/plugins/quectel/mm-shared-quectel.c
index 6226dacd..24278bb6 100644
--- a/src/plugins/quectel/mm-shared-quectel.c
+++ b/src/plugins/quectel/mm-shared-quectel.c
@@ -26,6 +26,7 @@
#include "mm-iface-modem.h"
#include "mm-iface-modem-firmware.h"
#include "mm-iface-modem-location.h"
+#include "mm-iface-modem-voice.h"
#include "mm-base-modem.h"
#include "mm-base-modem-at.h"
#include "mm-shared-quectel.h"
@@ -56,6 +57,7 @@ typedef struct {
MMModemLocationSource provided_sources;
MMModemLocationSource enabled_sources;
FeatureSupport qgps_supported;
+ GRegex *dtmf_regex;
GRegex *qgpsurc_regex;
GRegex *qlwurc_regex;
GRegex *rdy_regex;
@@ -64,6 +66,7 @@ typedef struct {
static void
private_free (Private *priv)
{
+ g_regex_unref (priv->dtmf_regex);
g_regex_unref (priv->qgpsurc_regex);
g_regex_unref (priv->qlwurc_regex);
g_regex_unref (priv->rdy_regex);
@@ -85,10 +88,12 @@ get_private (MMSharedQuectel *self)
priv->provided_sources = MM_MODEM_LOCATION_SOURCE_NONE;
priv->enabled_sources = MM_MODEM_LOCATION_SOURCE_NONE;
priv->qgps_supported = FEATURE_SUPPORT_UNKNOWN;
+ priv->dtmf_regex = g_regex_new ("\\r\\n\\+QTONEDET:\\s*(\\d+)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
priv->qgpsurc_regex = g_regex_new ("\\r\\n\\+QGPSURC:.*", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
priv->qlwurc_regex = g_regex_new ("\\r\\n\\+QLWURC:.*", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
priv->rdy_regex = g_regex_new ("\\r\\nRDY", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ g_assert (priv->dtmf_regex);
g_assert (priv->qgpsurc_regex);
g_assert (priv->qlwurc_regex);
g_assert (priv->rdy_regex);
@@ -158,6 +163,21 @@ rdy_handler (MMPortSerialAt *port,
}
/*****************************************************************************/
+
+/* DTMF unsolicited event handler */
+static void
+dtmf_handler (MMPortSerialAt *port,
+ GMatchInfo *match_info,
+ MMBroadbandModem *self)
+{
+ g_autofree gchar *dtmf = NULL;
+ dtmf = g_match_info_fetch (match_info, 1);
+
+ mm_obj_dbg (self, "received DTMF: %s", dtmf);
+ mm_iface_modem_voice_received_dtmf (MM_IFACE_MODEM_VOICE (self), 0, dtmf);
+}
+
+/*****************************************************************************/
/* Setup ports (Broadband modem class) */
void
@@ -203,6 +223,14 @@ mm_shared_quectel_setup_ports (MMBroadbandModem *self)
(MMPortSerialAtUnsolicitedMsgFn)rdy_handler,
self,
NULL);
+
+ /* Handle DTMF */
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ priv->dtmf_regex,
+ (MMPortSerialAtUnsolicitedMsgFn)dtmf_handler,
+ self,
+ NULL);
}
}