Commit Graph
6073 Commits
Author SHA1 Message Date
Aleksander Morgado f065105f17 broadband-modem: implement HoldAndAccept() with +CHLD=2 2019-07-11 23:20:59 +02:00
Aleksander Morgado c713c2c5f9 api,voice: new HoldAndAccept() method
This method will put the currently active call on hold, and right away
accept the next available call.

The user of the API does not need to specify explicitly which is the
next call to accept, because that is decided automatically:
  * If there is any waiting call, it will accept it right away.
  * If there is no waiting call but there is a held call, it will make
  the held call active again.
2019-07-11 23:20:59 +02:00
Aleksander Morgado 5de3c4893f broadband-modem: implement HangupAndAccept() with +CHLD=1 2019-07-11 23:20:59 +02:00
Aleksander Morgado d56d1b2656 api,voice: new HangupAndAccept() method
This method will hangup the currently active call and right away
accept the next available call.

The user of the API does not need to specify explicitly which is the
next call to accept, because that is decided automatically:
  * If there is any waiting call, it will accept it right away.
  * If there is no waiting call but there is a held call, it will make
    the held call active again.
2019-07-11 23:20:59 +02:00
Aleksander Morgado f994982cce base-call: support hanging up specific calls
E.g. we can hangup a waiting call without interfering with the active
one.
2019-07-11 23:01:30 +02:00
Aleksander Morgado 4b2f9e7d3e broadband-modem: implement call list polling with +CLCC 2019-07-11 23:01:30 +02:00
Aleksander Morgado f699308958 cinterion: disable call list polling if ^SLCC is supported
Early detect that ^SLCC is supported, and disable the call list
polling in the interface if so.
2019-07-11 23:01:29 +02:00
Aleksander Morgado d0c0e925b6 iface-modem-voice: setup full call list polling logic
If the modem supports call list polling, we'll setup a timeout to poll
for the full call list periodically, in order to get detailed call
states.

The timeout is setup as soon as a new call is created, and it will be
kept enabled as long as there is a call being established (i.e. not
unknown, not terminated, not active).
2019-07-11 23:01:08 +02:00
Aleksander Morgado faaaf20276 cinterion: when ^SLCC is supported, detailed call state updates are implicit 2019-07-11 23:01:08 +02:00
Aleksander Morgado b22f90c4c4 broadband-modem: if +CLCC is supported, call supports detailed events 2019-07-11 23:01:08 +02:00
Aleksander Morgado 47dd9fffac cinterion: support ^SLCC URCs as part of voice management
This command will give us URCs whenever the extended list of current
calls changes, which includes information about the actual state of
each call, even for calls in waiting state.

Therefore, as this is a URC that applies to all calls, it's enabled
and disabled as part of the modem voice interface, instead of doing it
as part of the call object itself (i.e. not treated as an in-call URC).
2019-07-11 23:01:08 +02:00
Aleksander Morgado e931c0ae9c cinterion: implement reset 2019-07-11 23:00:50 +02:00
Aleksander Morgado 0f8580f36e cinterion: port type hints for the PLS8
The first two ports are AT control ports (application/modem). We rely
on AT^SQPORT to decide which one is which.

The last two ports are unknown and we explicitly ignore them to make
port probing much quicker.
2019-07-11 23:00:50 +02:00
Aleksander Morgado ca88cdb9f7 iface-modem-voice: allow reporting the state of all ongoing calls
E.g. as per the AT+CLCC output.
2019-07-11 23:00:50 +02:00
Aleksander Morgado 1cc31df425 helpers: new '+CLCC' test response parser 2019-07-11 23:00:50 +02:00
Aleksander Morgado 67cc999266 base-call: if incoming call is reported terminated, cleanup timeout 2019-07-11 23:00:50 +02:00
Aleksander Morgado cd2e851b8c base-call: allow skipping the timeout in incoming calls
E.g. if the modem supports reporting incoming call updates explicitly.
2019-07-11 23:00:50 +02:00
Aleksander Morgado 3873fda83f base-call: allow keeping ongoing call index for easy call matching 2019-07-11 23:00:50 +02:00
Aleksander Morgado a006ed0744 base-call: add simple getters for the MmGdbusCall properties 2019-07-11 23:00:50 +02:00
Aleksander Morgado 8d267228cf call-list: allow iterating elements 2019-07-11 23:00:50 +02:00
Aleksander Morgado dca00271ce broadband-modem: implement +CCWA URC handling 2019-07-11 23:00:50 +02:00
Aleksander Morgado d9a7b403ee iface-modem-voice: allow creating incoming calls in waiting state 2019-07-11 23:00:50 +02:00
Aleksander Morgado d3ef177f53 broadband-modem,voice: enable/disable call waiting indications 2019-07-11 23:00:50 +02:00
Aleksander Morgado ed7be29111 broadband-modem,voice: disable unsolicited events 2019-07-11 23:00:50 +02:00
Aleksander Morgado aa4ad45907 broadband-modem,voice: rework enabling of unsolicited events
The previous logic would end up returning an error if either +CLIP or
+CRC reported an error, and we should really avoid that, because our
setup is able to manage the voice calls even without those settings.

So, convert the logic into a small state machine and try to configure
the settings both in the primary and secondary ports, instead of just
in the primary one.
2019-07-11 11:42:01 +02:00
Aleksander Morgado 45c548c4dd docs: add missing MMCallStateReason documentation 2019-07-11 09:41:31 +00:00
Aleksander Morgado 4132052965 docs: add missing MMCallDirection documentation 2019-07-11 09:41:31 +00:00
Aleksander Morgado 220a4cbf43 docs: add missing short description for compat section 2019-07-11 09:41:31 +00:00
Aleksander Morgado c96b03d3a9 docs: add missing MM_CHECK_VERSION documentation 2019-07-11 09:41:31 +00:00
Ben Chan 8d8b3a722a misc: use g_regex_match() for simplicity
This CL converts a few g_regex_match_full() expressions to their
equivalent g_regex_match() in order to simplify the code, i.e.

  g_regex_match_full (regex, str, strlen (str), 0, 0, &match_info, NULL)

is equivalent to:

  g_regex_match_full (regex, str, -1, 0, 0, &match_info, NULL)

or simply:

  g_regex_match (regex, str, 0, &match_info)
2019-07-10 14:48:22 -07:00
Aleksander Morgado ea93aad8a4 base-sms: wait up to 60s when sending SMS messages
The operation sending the raw data of the SMS may timeout because the
current value of 10s is too low.

When this happens, we may end up marking the modem as invalid if the
operation takes much longer, as in
https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/133

  <debug> [1561707204.192676] (ttyUSB3): --> 'AT+CMGS=22<CR>'
  <debug> [1561707204.207212] (ttyUSB3): <-- '<CR><LF>> '
  <debug> [1561707204.207562] (ttyUSB3) device open count is 3 (open)
  <debug> [1561707204.207695] (ttyUSB3) device open count is 2 (close)
  <debug> [1561707204.207841] (ttyUSB3): --> '0021000B9164xxxxxxxxFx00000AEDF6989D06D1CB733A\26'
  <debug> [1561707204.261028] (ttyUSB3): <-- '<CR><LF>'
  <debug> [1561707205.197464] (ttyUSB3) device open count is 3 (open)
  <debug> [1561707207.197763] loading signal quality...
  <debug> [1561707207.197990] (ttyUSB3) device open count is 4 (open)
  <debug> [1561707210.199337] (ttyUSB3) device open count is 5 (open)
  <debug> [1561707214.197198] (ttyUSB3) device open count is 4 (close)
  <debug> [1561707214.197443] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <debug> [1561707215.196530] (ttyUSB3) device open count is 5 (open)
  <warn>  [1561707217.196750] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707217.196928] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707217.197065] (tty/ttyUSB3) at port timed out 2 consecutive times
  <debug> [1561707217.197187] (ttyUSB3): --> 'AT+CIND?<CR>'
  <debug> [1561707220.198180] (ttyUSB3) device open count is 5 (open)
  <debug> [1561707222.196792] (ttyUSB3) device open count is 6 (open)
  <debug> [1561707222.196983] (ttyUSB3) device open count is 5 (close)
  <warn>  [1561707222.197125] (tty/ttyUSB3) at port timed out 3 consecutive times
  <debug> [1561707222.197257] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <debug> [1561707225.198384] (ttyUSB3) device open count is 6 (open)
  <warn>  [1561707225.198616] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707225.198703] (ttyUSB3) device open count is 5 (close)
  <warn>  [1561707225.198814] (tty/ttyUSB3) at port timed out 4 consecutive times
  <debug> [1561707225.199437] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <warn>  [1561707228.196747] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707228.196915] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707228.197050] (tty/ttyUSB3) at port timed out 5 consecutive times
  <debug> [1561707228.197175] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <debug> [1561707230.197709] (ttyUSB3) device open count is 5 (open)
  <warn>  [1561707231.197089] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707231.197256] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707231.197387] (tty/ttyUSB3) at port timed out 6 consecutive times
  <debug> [1561707231.197519] (ttyUSB3): --> 'AT+CSQ<CR>'
  <debug> [1561707234.199671] Couldn't refresh signal quality: 'Serial command timed out'
  <debug> [1561707234.199897] (ttyUSB3) device open count is 5 (open)
  <debug> [1561707234.200038] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707234.200161] (tty/ttyUSB3) at port timed out 7 consecutive times
  <debug> [1561707234.200291] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <debug> [1561707235.197071] (ttyUSB3) device open count is 5 (open)
  <debug> [1561707237.198460] Signal quality value not updated in 60s, marking as not being recent
  <warn>  [1561707237.198846] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707237.198949] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707237.199060] (tty/ttyUSB3) at port timed out 8 consecutive times
  <debug> [1561707237.199636] (ttyUSB3): --> 'AT+CGACT?<CR>'
  <debug> [1561707240.198778] (ttyUSB3) device open count is 5 (open)
  <warn>  [1561707240.199031] checking if connected failed: Couldn't check current list of active PDP contexts: Serial command timed out
  <debug> [1561707240.199127] (ttyUSB3) device open count is 4 (close)
  <warn>  [1561707240.199244] (tty/ttyUSB3) at port timed out 9 consecutive times
  <debug> [1561707240.199363] (ttyUSB3): --> 'AT+CNSMOD?<CR>'
  <debug> [1561707243.198163] Couldn't refresh access technologies: 'Serial command timed out'
  <debug> [1561707243.198294] Periodic signal quality checks scheduled in 30s
  <debug> [1561707243.198402] (ttyUSB3) device open count is 3 (close)
  <error> [1561707243.198528] (tty/ttyUSB3) at port timed out 10 consecutive times, marking modem '/org/freedesktop/ModemManager1/Modem/0' as invalid
  <debug> [1561707243.198699] (ttyUSB3): --> 'AT+CGACT?<CR>'

Or we may end up aborting other actions that the modem is doing...

  <debug> [1560473069.956036] (ttyACM2): --> 'AT+CMGS=70<CR>'
  <debug> [1560473069.963667] Added CALL at '/org/freedesktop/ModemManager1/Call/1'
  <debug> [1560473069.977937] (ttyACM2): <-- '<CR><LF>> '
  <debug> [1560473069.978558] (ttyACM2) device open count is 3 (open)
  <debug> [1560473069.978812] (ttyACM2) device open count is 2 (close)
  <debug> [1560473069.979152] (ttyACM2): --> '0001000D8......................\26'
  <debug> [1560473080.317049] (ttyACM2): --> 'ATD123456789;<CR>'
  <debug> [1560473092.293458] (ttyACM2): <-- '<CR><LF>+CMGS: 1<CR><LF><CR><LF>OK<CR><LF>'
  <warn>  [1560473092.293854] Couldn't start call : 'Couldn't start the call: Unhandled response '+CMGS: 1''
  <info>  [1560473092.293936] Call state changed: dialing -> terminated (unknown)
  <debug> [1560473092.293987] Cleaning up in-call unsolicited events...

So, update the raw data sending timeout to a much longer value.
2019-07-09 16:55:48 +02:00
Aleksander Morgado 3e3dfc784d docs: add deprecated items to sections file 2019-07-02 18:40:23 +02:00
Aleksander Morgado 2d171207bb api,location: fix A-GPS MSA/MSB documentation links 2019-07-02 18:40:17 +02:00
wi24rd addc53a0d3 po: Add zh_CN translation 2019-07-02 09:47:48 +02:00
Aleksander Morgado f62e5009a2 introspection,voice: fix documentation of CallAdded() signal 2019-06-28 09:49:44 +02:00
Aleksander Morgado 312e5dd623 modem-helpers: ignore format of unneeded fields in +CLIP URC
The regex was expecting empty values in several of the fields, which
is wrong. Instead of matching empty fields, just ignore all fields
that we don't require in our logic.
2019-06-28 09:48:28 +02:00
Aleksander Morgado 4656b5b606 broadband-modem: fix logging whether enabling or disabling URCs 2019-06-28 09:48:06 +02:00
Aleksander Morgado d1b716abaf iface-modem-3gpp: use correct finish() method to complete user registration
https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/131
2019-06-24 10:41:20 +02:00
Aleksander Morgado 1d52e5c24d cinterion: make custom +CIEV parser much more generic
The custom +CIEV parser configured for Cinterion modems was
exclusively matching the "psinfo" indicator updates, which were the
ones really used afterwards.

But, in order to avoid having undesired URCs mixed with other command
responses, we should anyway match any +CIEV indicator reported, not
only "psinfo".

The text indicator ids used in +CIEV seem to bee specific to Cinterion
devices when they're configured via AT^SIND, so we do a generic match
for any lowercase ascii text as indicator id.
2019-06-13 18:43:06 +02:00
Aleksander Morgado ca5f2e8b3e ublox,tests: expect error if empty band list when parsing UACT? 2019-06-13 11:28:26 +02:00
Aleksander Morgado 20c5d7fd92 ublox: return error when no bands are parsed
If load_current_bands_finish() returns a NULL GArray, we must set the
GError or otherwise the daemon will segfault when the caller
dereferences the GError:

    current_bands = MM_IFACE_MODEM_GET_INTERFACE (self)->load_current_bands_finish (self, res, &error);
    if (!current_bands) {
        /* Errors when getting current bands won't be critical */
        mm_warn ("couldn't load current Bands: '%s'", error->message);
        g_error_free (error);
    }

This may happen with an empty but balid +UACT response, e.g.:
   AT+UACT?
   +UACT: ,,,
   OK

Or when it replies a full empty string:
   AT+UACT?
   OK
2019-06-13 10:26:53 +02:00
Aleksander Morgado d197380095 modem-helpers: minor coding style fixes 2019-06-11 16:28:06 +02:00
Aleksander Morgado 72bdb1b365 port-serial-at: raw commands always run next
We use the raw commands exclusively when we're sending SMS data to the
device. Until this change, all raw commands were added at the tail of
the queue of pending commands, and that meant that if any unrelated AT
command was interleaved between e.g. our AT+CGMS and the actual SMS
data sent, the operation would have failed.

With this fix, we're making sure that all raw commands are added at
the head of the queue, so we're making sure that the next command
picked after e.g. CGMS is actually the raw SMS data to be sent.

We would be avoiding issues like this one, where an outgoing voice
call attempt gets in the way before we send the SMS data:

  [1556246081.786284] (ttyACM2): --> 'AT+CMGS=70<CR>'
  [1556246081.814861] (ttyACM2): <-- '<CR><LF>> '
  [1556246081.819382] (ttyACM2): --> 'ATD1234567890;<CR>'
  [1556246081.839685] (ttyACM2): <-- '<CR><LF>> '
  [1556246081.840123] Couldn't start call : 'Couldn't start the call: Unhandled response '> ''
  [1556246081.856254] (ttyACM2): --> '0001000D810..............
  [1556246081.922470] (ttyACM2): <-- '<CR><LF>+CME ERROR: 4<CR><LF>'
2019-06-03 03:50:22 +00:00
Aleksander Morgado 8092e301fc port-serial: allow deciding whether the command is queued last or run next
By default all the commands we were sending through the serial port
were added at the tail of the pending queue, but we may want to queue
them at the head in very specific cases (e.g. while sending an SMS).
2019-06-03 03:50:22 +00:00
Aleksander Morgado c78ba5ea0a build: allow unconditionally enabling Modem.Command() method
If ModemManager is being used in a custom system, make it easy to
unconditionally enable the Modem.Command() method, in case the modem
needs to be configured in some way that is not supported via standard
modem interfaces.
2019-06-01 10:27:57 +02:00
Aleksander Morgado 8ec9789e3c quectel: add port type hints for the Quectel LTE-A EG06
ttyUSB0 (if #0): QCDM/DIAG port
 ttyUSB1 (if #1): GPS data port
 ttyUSB2 (if #2): AT primary port
 ttyUSB3 (if #3): AT secondary port
2019-05-30 17:28:13 +02:00
Aleksander Morgado aa22387937 iface-modem: fix reporting state while registration is denied
When registration is denied, we should be reporting the modem with
'enabled' state instead of 'registered'. This was not happening
because the logic to build the consolidated state (for 3GPP+3GPP2
modems) was using as default initial state the current old state, and
so if the old one was 'registered' it never allowed getting a
consolidated state of 'enabled', because 'registered' > 'enabled'.

Instead of using the old initial state, the consolidated modem state
should use 'enabled' as default initial value, which is the lowest
among 'enabled, 'searching' and 'registered'.
2019-05-30 13:18:32 +00:00
Aleksander Morgado 7f822fbc50 xmm,shared: don't assume parent object implements location support
E.g. when MM is built without QMI support, the MBIM modem won't have
any location support, as the only location implementation is based on
QMI over MBIM.

https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/125
2019-05-28 22:56:54 +02:00
Aleksander Morgado fd1a26fc36 plugin: ignore unwanted net ports
* For QMI modems, make sure we only grab QMI data ports (flag the
   rest as ignored).
 * For MBIM modems, make sure we only grab MBIM data ports (flag the
   rest as ignored).
 * For other plugins that use NET ports in their logic, make sure we
   only grab non-QMI and non-MBIM data ports.
2019-05-23 11:16:00 +02:00
Aleksander Morgado 6dc6a825b3 base-modem-at: don't ignore allow_cached flag in first command in sequence 2019-05-18 16:00:28 +02:00