Compare commits

...

15 Commits

Author SHA1 Message Date
Juho Hamalainen
6976366051 Merge branch 'jb48911' into 'master'
Don't try to connect HFP AG if bluetooth service is not available.

See merge request mer-core/ofono!276
2020-11-12 08:15:36 +00:00
Juho Hämäläinen
d3d776837b [hfp_ag_bluez5] Don't try to connect if bluetooth service is not available. JB#48911
Trying to connect too soon will result in profile interface registration
failure with timeout error, effectively blocking for dbus timeout (25s
by default).
2020-11-12 10:13:44 +02:00
Slava Monich
f56c8a33b0 Merge branch 'jb50995' into 'master'
[ril] Calculate signal strength based on rsrp value correctly. JB#50995.

See merge request mer-core/ofono!275
2020-09-15 10:46:22 +00:00
Aleksei Berman
ed2f625b8b [ril] Calculate signal strength based on rsrp value correctly. JB#50995.
All the dBm values are converted to qdbm (multiply by 4) but rsrp which
results in incorrect signal strength representation on some devices.
2020-08-28 15:57:33 +03:00
Slava Monich
ed62d38632 Merge branch 'jb50608' into 'master'
[ril] Add config options for cell info update interval. JB#50608

See merge request mer-core/ofono!273
2020-07-27 22:12:17 +00:00
Denis Grigorev
3f433c97c5 [ril] Add config options for cell info update interval. JB#50608 2020-07-28 00:18:52 +03:00
Denis Grigorev
86d8149c79 [ril] Allow setting cell info update period to 0. JB#50608
According to ril.h, a value of 0 means invoke RIL_UNSOL_CELL_INFO_LIST when
any of the reported information changes.
2020-07-27 21:33:03 +03:00
Slava Monich
f3eb9b868b [aarch64] Print PLUGINDIR when compiling. JB#49681
It's not obvious where it actualy comes from, let's have it in the build log.
2020-07-22 14:46:21 +03:00
chriadam
4e067fa827 Merge branch 'jb50214' into 'master'
[ofono] Don't support '.' as a DTMF pause character. Contributes to JB#50214

See merge request mer-core/ofono!271
2020-07-13 00:36:38 +00:00
Chris Adams
2ee5e4c827 [ofono] Don't support '.' as a DTMF pause character. Contributes to JB#50214 2020-07-13 10:35:30 +10:00
Niels Breet
1366e426be Merge branch 'jb49681' into 'master'
[aarch64] Use macros for unitdir. Contributes to JB#49681

See merge request mer-core/ofono!272
2020-07-08 13:19:30 +00:00
Niels Breet
586c9b9262 [aarch64] Use macros for unitdir. Contributes to JB#49681 2020-07-08 13:19:30 +00:00
Slava Monich
83554e071a Merge branch 'cbs_retry' into 'master'
Tweak CBS request retry logic

See merge request mer-core/ofono!270
2020-06-25 21:12:01 +00:00
Slava Monich
dc41c2d003 [ril] Allow CBS PDU arrive from RIL as a plain blob. JB#5761
I swear I've seen such cases!
2020-06-25 20:21:09 +03:00
Slava Monich
550d41ae37 [ril] Tweaked CBS request retry logic. JB#5761
There's no need for RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG, since we
are not using its result anyway. Better just register for notifications
which would simply never arrive if CBS doesn't work at all.

Important requests, however, better be retried on RIL_E_INVALID_STATE.
2020-06-25 20:05:31 +03:00
15 changed files with 177 additions and 76 deletions

View File

@@ -24,6 +24,7 @@ struct ril_cbs {
GRilIoChannel *io; GRilIoChannel *io;
GRilIoQueue *q; GRilIoQueue *q;
char *log_prefix; char *log_prefix;
guint register_id;
gulong event_id; gulong event_id;
}; };
@@ -51,6 +52,12 @@ static struct ril_cbs_cbd *ril_cbs_cbd_new(struct ril_cbs *cd,
return cbd; return cbd;
} }
static gboolean ril_cbs_retry(GRilIoRequest *request, int ril_status,
const void *resp_data, guint resp_len, void *user_data)
{
return ril_status == RIL_E_INVALID_STATE;
}
static void ril_cbs_request_activation(struct ril_cbs *cd, static void ril_cbs_request_activation(struct ril_cbs *cd,
gboolean activate, GRilIoChannelResponseFunc response, gboolean activate, GRilIoChannelResponseFunc response,
GDestroyNotify destroy, void* user_data) GDestroyNotify destroy, void* user_data)
@@ -61,6 +68,9 @@ static void ril_cbs_request_activation(struct ril_cbs *cd,
grilio_request_append_int32(req, activate ? 0 :1); grilio_request_append_int32(req, activate ? 0 :1);
DBG_(cd, "%sactivating CB", activate ? "" : "de"); DBG_(cd, "%sactivating CB", activate ? "" : "de");
grilio_request_set_retry_func(req, ril_cbs_retry);
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
RIL_CBS_CHECK_RETRY_COUNT);
grilio_queue_send_request_full(cd->q, req, grilio_queue_send_request_full(cd->q, req,
RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION, RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
response, destroy, user_data); response, destroy, user_data);
@@ -97,6 +107,9 @@ static void ril_cbs_set_config(struct ril_cbs *cd, const char *topics,
} }
DBG_(cd, "configuring CB"); DBG_(cd, "configuring CB");
grilio_request_set_retry_func(req, ril_cbs_retry);
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
RIL_CBS_CHECK_RETRY_COUNT);
grilio_queue_send_request_full(cd->q, req, grilio_queue_send_request_full(cd->q, req,
RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG, RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG,
response, destroy, user_data); response, destroy, user_data);
@@ -152,28 +165,33 @@ static void ril_cbs_notify(GRilIoChannel *io, guint code,
if (grilio_parser_get_uint32(&rilp, &pdu_len)) { if (grilio_parser_get_uint32(&rilp, &pdu_len)) {
const void* pdu = grilio_parser_get_bytes(&rilp, pdu_len); const void* pdu = grilio_parser_get_bytes(&rilp, pdu_len);
if (pdu) { /*
* By default assume that it's a length followed by the
* binary PDU data.
*/
if (pdu && grilio_parser_bytes_remaining(&rilp) < 4) {
DBG_(cd, "%u bytes", pdu_len); DBG_(cd, "%u bytes", pdu_len);
ofono_cbs_notify(cd->cbs, pdu, pdu_len); ofono_cbs_notify(cd->cbs, pdu, pdu_len);
} else {
/*
* But I've seen cell broadcasts arriving without
* the length, simply as a blob.
*/
ofono_cbs_notify(cd->cbs, data, len);
} }
} }
} }
static void ril_cbs_probe_done_cb(GRilIoChannel *io, int status, static gboolean ril_cbs_register(void *user_data)
const void *data, guint len, void *user_data)
{ {
struct ril_cbs *cd = user_data; struct ril_cbs *cd = user_data;
if (status == RIL_E_SUCCESS) { DBG_(cd, "registering for CB");
DBG_(cd, "registering for CB"); cd->register_id = 0;
cd->event_id = grilio_channel_add_unsol_event_handler(cd->io, cd->event_id = grilio_channel_add_unsol_event_handler(cd->io,
ril_cbs_notify, RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, ril_cbs_notify, RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, cd);
cd); ofono_cbs_register(cd->cbs);
ofono_cbs_register(cd->cbs); return G_SOURCE_REMOVE;
} else {
DBG_(cd, "failed to query CB config");
ofono_cbs_remove(cd->cbs);
}
} }
static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor, static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
@@ -181,7 +199,6 @@ static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
{ {
struct ril_modem *modem = data; struct ril_modem *modem = data;
struct ril_cbs *cd = g_try_new0(struct ril_cbs, 1); struct ril_cbs *cd = g_try_new0(struct ril_cbs, 1);
GRilIoRequest* req = grilio_request_new();
ofono_cbs_set_data(cbs, cd); ofono_cbs_set_data(cbs, cd);
cd->log_prefix = (modem->log_prefix && modem->log_prefix[0]) ? cd->log_prefix = (modem->log_prefix && modem->log_prefix[0]) ?
@@ -191,20 +208,7 @@ static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
DBG_(cd, ""); DBG_(cd, "");
cd->io = grilio_channel_ref(ril_modem_io(modem)); cd->io = grilio_channel_ref(ril_modem_io(modem));
cd->q = grilio_queue_new(cd->io); cd->q = grilio_queue_new(cd->io);
cd->register_id = g_idle_add(ril_cbs_register, cd);
/*
* RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG often fails at startup
* especially if other RIL requests are running in parallel. We may
* have to retry a few times. Also, make it blocking in order to
* improve the chance of success.
*/
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
RIL_CBS_CHECK_RETRY_COUNT);
grilio_request_set_blocking(req, TRUE);
grilio_queue_send_request_full(cd->q, req,
RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG,
ril_cbs_probe_done_cb, NULL, cd);
grilio_request_unref(req);
return 0; return 0;
} }
@@ -213,6 +217,9 @@ static void ril_cbs_remove(struct ofono_cbs *cbs)
struct ril_cbs *cd = ofono_cbs_get_data(cbs); struct ril_cbs *cd = ofono_cbs_get_data(cbs);
DBG_(cd, ""); DBG_(cd, "");
if (cd->register_id) {
g_source_remove(cd->register_id);
}
ofono_cbs_set_data(cbs, NULL); ofono_cbs_set_data(cbs, NULL);
grilio_channel_remove_handler(cd->io, cd->event_id); grilio_channel_remove_handler(cd->io, cd->event_id);
grilio_channel_unref(cd->io); grilio_channel_unref(cd->io);

View File

@@ -373,7 +373,7 @@ static void ril_cell_info_query(struct ril_cell_info *self)
static void ril_cell_info_set_rate(struct ril_cell_info *self) static void ril_cell_info_set_rate(struct ril_cell_info *self)
{ {
GRilIoRequest *req = grilio_request_array_int32_new(1, GRilIoRequest *req = grilio_request_array_int32_new(1,
(self->update_rate_ms > 0) ? self->update_rate_ms : INT_MAX); (self->update_rate_ms >= 0) ? self->update_rate_ms : INT_MAX);
grilio_request_set_retry(req, RIL_RETRY_MS, MAX_RETRIES); grilio_request_set_retry(req, RIL_RETRY_MS, MAX_RETRIES);
grilio_request_set_retry_func(req, ril_cell_info_retry); grilio_request_set_retry_func(req, ril_cell_info_retry);

View File

@@ -34,33 +34,29 @@ struct ril_devmon {
GRilIoChannel *channel, struct sailfish_cell_info *cell_info); GRilIoChannel *channel, struct sailfish_cell_info *cell_info);
}; };
/* Cell info update intervals */
#define RIL_CELL_INFO_INTERVAL_SHORT_MS (2000) /* 2 sec */
#define RIL_CELL_INFO_INTERVAL_LONG_MS (30000) /* 30 sec */
/* /*
* Legacy Device Monitor uses RIL_REQUEST_SCREEN_STATE to tell * Legacy Device Monitor uses RIL_REQUEST_SCREEN_STATE to tell
* the modem when screen turns on and off. * the modem when screen turns on and off.
*/ */
struct ril_devmon *ril_devmon_ss_new(void); struct ril_devmon *ril_devmon_ss_new(const struct ril_slot_config *config);
/* /*
* This Device Monitor uses RIL_REQUEST_SEND_DEVICE_STATE to let * This Device Monitor uses RIL_REQUEST_SEND_DEVICE_STATE to let
* the modem choose the right power saving strategy. It basically * the modem choose the right power saving strategy. It basically
* mirrors the logic of Android's DeviceStateMonitor class. * mirrors the logic of Android's DeviceStateMonitor class.
*/ */
struct ril_devmon *ril_devmon_ds_new(void); struct ril_devmon *ril_devmon_ds_new(const struct ril_slot_config *config);
/* /*
* This Device Monitor implementation controls network state updates * This Device Monitor implementation controls network state updates
* by sending SET_UNSOLICITED_RESPONSE_FILTER. * by sending SET_UNSOLICITED_RESPONSE_FILTER.
*/ */
struct ril_devmon *ril_devmon_ur_new(void); struct ril_devmon *ril_devmon_ur_new(const struct ril_slot_config *config);
/* /*
* This one selects the type based on the RIL version. * This one selects the type based on the RIL version.
*/ */
struct ril_devmon *ril_devmon_auto_new(void); struct ril_devmon *ril_devmon_auto_new(const struct ril_slot_config *config);
/* /*
* This one combines several methods. Takes ownership of ril_devmon objects. * This one combines several methods. Takes ownership of ril_devmon objects.

View File

@@ -65,7 +65,7 @@ static void ril_devmon_auto_free(struct ril_devmon *devmon)
g_free(self); g_free(self);
} }
struct ril_devmon *ril_devmon_auto_new() struct ril_devmon *ril_devmon_auto_new(const struct ril_slot_config *config)
{ {
DevMon *self = g_new0(DevMon, 1); DevMon *self = g_new0(DevMon, 1);
@@ -78,8 +78,8 @@ struct ril_devmon *ril_devmon_auto_new()
*/ */
self->pub.free = ril_devmon_auto_free; self->pub.free = ril_devmon_auto_free;
self->pub.start_io = ril_devmon_auto_start_io; self->pub.start_io = ril_devmon_auto_start_io;
self->ss = ril_devmon_ss_new(); self->ss = ril_devmon_ss_new(config);
self->ds = ril_devmon_ds_new(); self->ds = ril_devmon_ds_new(config);
return &self->pub; return &self->pub;
} }

View File

@@ -65,6 +65,8 @@ typedef struct ril_devmon_ds {
MceBattery *battery; MceBattery *battery;
MceCharger *charger; MceCharger *charger;
MceDisplay *display; MceDisplay *display;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMon; } DevMon;
typedef struct ril_devmon_ds_io { typedef struct ril_devmon_ds_io {
@@ -86,6 +88,8 @@ typedef struct ril_devmon_ds_io {
gulong charger_event_id[CHARGER_EVENT_COUNT]; gulong charger_event_id[CHARGER_EVENT_COUNT];
gulong display_event_id[DISPLAY_EVENT_COUNT]; gulong display_event_id[DISPLAY_EVENT_COUNT];
guint req_id; guint req_id;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMonIo; } DevMonIo;
#define DBG_(self,fmt,args...) DBG("%s: " fmt, (self)->io->name, ##args) #define DBG_(self,fmt,args...) DBG("%s: " fmt, (self)->io->name, ##args)
@@ -201,8 +205,8 @@ static void ril_devmon_ds_io_set_cell_info_update_interval(DevMonIo *self)
(ril_devmon_ds_display_on(self->display) && (ril_devmon_ds_display_on(self->display) &&
(ril_devmon_ds_charging(self->charger) || (ril_devmon_ds_charging(self->charger) ||
ril_devmon_ds_battery_ok(self->battery))) ? ril_devmon_ds_battery_ok(self->battery))) ?
RIL_CELL_INFO_INTERVAL_SHORT_MS : self->cell_info_interval_short_ms :
RIL_CELL_INFO_INTERVAL_LONG_MS); self->cell_info_interval_long_ms);
} }
static void ril_devmon_ds_io_connman_cb(struct ril_connman *connman, static void ril_devmon_ds_io_connman_cb(struct ril_connman *connman,
@@ -303,6 +307,11 @@ static struct ril_devmon_io *ril_devmon_ds_start_io(struct ril_devmon *devmon,
mce_display_add_state_changed_handler(self->display, mce_display_add_state_changed_handler(self->display,
ril_devmon_ds_io_display_cb, self); ril_devmon_ds_io_display_cb, self);
self->cell_info_interval_short_ms =
ds->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
ds->cell_info_interval_long_ms;
ril_devmon_ds_io_update_low_data(self); ril_devmon_ds_io_update_low_data(self);
ril_devmon_ds_io_update_charging(self); ril_devmon_ds_io_update_charging(self);
ril_devmon_ds_io_set_cell_info_update_interval(self); ril_devmon_ds_io_set_cell_info_update_interval(self);
@@ -320,7 +329,7 @@ static void ril_devmon_ds_free(struct ril_devmon *devmon)
g_free(self); g_free(self);
} }
struct ril_devmon *ril_devmon_ds_new() struct ril_devmon *ril_devmon_ds_new(const struct ril_slot_config *config)
{ {
DevMon *self = g_new0(DevMon, 1); DevMon *self = g_new0(DevMon, 1);
@@ -330,6 +339,10 @@ struct ril_devmon *ril_devmon_ds_new()
self->battery = mce_battery_new(); self->battery = mce_battery_new();
self->charger = mce_charger_new(); self->charger = mce_charger_new();
self->display = mce_display_new(); self->display = mce_display_new();
self->cell_info_interval_short_ms =
config->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
config->cell_info_interval_long_ms;
return &self->pub; return &self->pub;
} }

View File

@@ -50,6 +50,8 @@ typedef struct ril_devmon_ss {
MceBattery *battery; MceBattery *battery;
MceCharger *charger; MceCharger *charger;
MceDisplay *display; MceDisplay *display;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMon; } DevMon;
typedef struct ril_devmon_ss_io { typedef struct ril_devmon_ss_io {
@@ -65,6 +67,8 @@ typedef struct ril_devmon_ss_io {
gulong charger_event_id[CHARGER_EVENT_COUNT]; gulong charger_event_id[CHARGER_EVENT_COUNT];
gulong display_event_id[DISPLAY_EVENT_COUNT]; gulong display_event_id[DISPLAY_EVENT_COUNT];
guint req_id; guint req_id;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMonIo; } DevMonIo;
inline static DevMon *ril_devmon_ss_cast(struct ril_devmon *pub) inline static DevMon *ril_devmon_ss_cast(struct ril_devmon *pub)
@@ -130,8 +134,8 @@ static void ril_devmon_ss_io_set_cell_info_update_interval(DevMonIo *self)
sailfish_cell_info_set_update_interval(self->cell_info, sailfish_cell_info_set_update_interval(self->cell_info,
(self->display_on && (ril_devmon_ss_charging(self->charger) || (self->display_on && (ril_devmon_ss_charging(self->charger) ||
ril_devmon_ss_battery_ok(self->battery))) ? ril_devmon_ss_battery_ok(self->battery))) ?
RIL_CELL_INFO_INTERVAL_SHORT_MS : self->cell_info_interval_short_ms :
RIL_CELL_INFO_INTERVAL_LONG_MS); self->cell_info_interval_long_ms);
} }
static void ril_devmon_ss_io_battery_cb(MceBattery *battery, void *user_data) static void ril_devmon_ss_io_battery_cb(MceBattery *battery, void *user_data)
@@ -212,6 +216,11 @@ static struct ril_devmon_io *ril_devmon_ss_start_io(struct ril_devmon *devmon,
mce_display_add_state_changed_handler(self->display, mce_display_add_state_changed_handler(self->display,
ril_devmon_ss_io_display_cb, self); ril_devmon_ss_io_display_cb, self);
self->cell_info_interval_short_ms =
ss->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
ss->cell_info_interval_long_ms;
ril_devmon_ss_io_send_screen_state(self); ril_devmon_ss_io_send_screen_state(self);
ril_devmon_ss_io_set_cell_info_update_interval(self); ril_devmon_ss_io_set_cell_info_update_interval(self);
return &self->pub; return &self->pub;
@@ -227,7 +236,7 @@ static void ril_devmon_ss_free(struct ril_devmon *devmon)
g_free(self); g_free(self);
} }
struct ril_devmon *ril_devmon_ss_new() struct ril_devmon *ril_devmon_ss_new(const struct ril_slot_config *config)
{ {
DevMon *self = g_new0(DevMon, 1); DevMon *self = g_new0(DevMon, 1);
@@ -236,6 +245,10 @@ struct ril_devmon *ril_devmon_ss_new()
self->battery = mce_battery_new(); self->battery = mce_battery_new();
self->charger = mce_charger_new(); self->charger = mce_charger_new();
self->display = mce_display_new(); self->display = mce_display_new();
self->cell_info_interval_short_ms =
config->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
config->cell_info_interval_long_ms;
return &self->pub; return &self->pub;
} }

View File

@@ -55,6 +55,8 @@ typedef struct ril_devmon_ur {
MceBattery *battery; MceBattery *battery;
MceCharger *charger; MceCharger *charger;
MceDisplay *display; MceDisplay *display;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMon; } DevMon;
typedef struct ril_devmon_ur_io { typedef struct ril_devmon_ur_io {
@@ -70,6 +72,8 @@ typedef struct ril_devmon_ur_io {
gulong charger_event_id[CHARGER_EVENT_COUNT]; gulong charger_event_id[CHARGER_EVENT_COUNT];
gulong display_event_id[DISPLAY_EVENT_COUNT]; gulong display_event_id[DISPLAY_EVENT_COUNT];
guint req_id; guint req_id;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
} DevMonIo; } DevMonIo;
#define DBG_(self,fmt,args...) DBG("%s: " fmt, (self)->io->name, ##args) #define DBG_(self,fmt,args...) DBG("%s: " fmt, (self)->io->name, ##args)
@@ -136,8 +140,8 @@ static void ril_devmon_ur_io_set_cell_info_update_interval(DevMonIo *self)
sailfish_cell_info_set_update_interval(self->cell_info, sailfish_cell_info_set_update_interval(self->cell_info,
(self->display_on && (ril_devmon_ur_charging(self->charger) || (self->display_on && (ril_devmon_ur_charging(self->charger) ||
ril_devmon_ur_battery_ok(self->battery))) ? ril_devmon_ur_battery_ok(self->battery))) ?
RIL_CELL_INFO_INTERVAL_SHORT_MS : self->cell_info_interval_short_ms :
RIL_CELL_INFO_INTERVAL_LONG_MS); self->cell_info_interval_long_ms);
} }
static void ril_devmon_ur_io_battery_cb(MceBattery *battery, void *user_data) static void ril_devmon_ur_io_battery_cb(MceBattery *battery, void *user_data)
@@ -218,6 +222,11 @@ static struct ril_devmon_io *ril_devmon_ur_start_io(struct ril_devmon *devmon,
mce_display_add_state_changed_handler(self->display, mce_display_add_state_changed_handler(self->display,
ril_devmon_ur_io_display_cb, self); ril_devmon_ur_io_display_cb, self);
self->cell_info_interval_short_ms =
ur->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
ur->cell_info_interval_long_ms;
ril_devmon_ur_io_set_unsol_response_filter(self); ril_devmon_ur_io_set_unsol_response_filter(self);
ril_devmon_ur_io_set_cell_info_update_interval(self); ril_devmon_ur_io_set_cell_info_update_interval(self);
return &self->pub; return &self->pub;
@@ -233,7 +242,7 @@ static void ril_devmon_ur_free(struct ril_devmon *devmon)
g_free(self); g_free(self);
} }
struct ril_devmon *ril_devmon_ur_new() struct ril_devmon *ril_devmon_ur_new(const struct ril_slot_config *config)
{ {
DevMon *self = g_new0(DevMon, 1); DevMon *self = g_new0(DevMon, 1);
@@ -242,6 +251,10 @@ struct ril_devmon *ril_devmon_ur_new()
self->battery = mce_battery_new(); self->battery = mce_battery_new();
self->charger = mce_charger_new(); self->charger = mce_charger_new();
self->display = mce_display_new(); self->display = mce_display_new();
self->cell_info_interval_short_ms =
config->cell_info_interval_short_ms;
self->cell_info_interval_long_ms =
config->cell_info_interval_long_ms;
return &self->pub; return &self->pub;
} }

View File

@@ -503,7 +503,7 @@ static int ril_netreg_get_signal_strength(struct ril_netreg *nd,
signal.qdbm = -4 * tdscdma_dbm; signal.qdbm = -4 * tdscdma_dbm;
} else if (signal.lte == 99 && rsrp >= 44 && rsrp <= 140) { } else if (signal.lte == 99 && rsrp >= 44 && rsrp <= 140) {
/* RSRP range: 44 to 140 dBm per 3GPP TS 36.133 */ /* RSRP range: 44 to 140 dBm per 3GPP TS 36.133 */
signal.qdbm = -rsrp; signal.qdbm = -4 * rsrp;
} }
} }

View File

@@ -100,6 +100,8 @@
#define RILMODEM_DEFAULT_USE_DATA_PROFILES FALSE #define RILMODEM_DEFAULT_USE_DATA_PROFILES FALSE
#define RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID RIL_DATA_PROFILE_IMS #define RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID RIL_DATA_PROFILE_IMS
#define RILMODEM_DEFAULT_SLOT_FLAGS SAILFISH_SLOT_NO_FLAGS #define RILMODEM_DEFAULT_SLOT_FLAGS SAILFISH_SLOT_NO_FLAGS
#define RILMODEM_DEFAULT_CELL_INFO_INTERVAL_SHORT_MS (2000) /* 2 sec */
#define RILMODEM_DEFAULT_CELL_INFO_INTERVAL_LONG_MS (30000) /* 30 sec */
/* RIL socket transport name and parameters */ /* RIL socket transport name and parameters */
#define RIL_TRANSPORT_MODEM "modem" #define RIL_TRANSPORT_MODEM "modem"
@@ -158,6 +160,8 @@
#define RILCONF_USE_DATA_PROFILES "useDataProfiles" #define RILCONF_USE_DATA_PROFILES "useDataProfiles"
#define RILCONF_MMS_DATA_PROFILE_ID "mmsDataProfileId" #define RILCONF_MMS_DATA_PROFILE_ID "mmsDataProfileId"
#define RILCONF_DEVMON "deviceStateTracking" #define RILCONF_DEVMON "deviceStateTracking"
#define RILCONF_CELL_INFO_INTERVAL_SHORT_MS "cellInfoIntervalShortMs"
#define RILCONF_CELL_INFO_INTERVAL_LONG_MS "cellInfoIntervalLongMs"
/* Modem error ids */ /* Modem error ids */
#define RIL_ERROR_ID_RILD_RESTART "rild-restart" #define RIL_ERROR_ID_RILD_RESTART "rild-restart"
@@ -1230,6 +1234,10 @@ static ril_slot *ril_plugin_slot_new_take(char *transport,
RILMODEM_DEFAULT_FORCE_GSM_WHEN_RADIO_OFF; RILMODEM_DEFAULT_FORCE_GSM_WHEN_RADIO_OFF;
config->use_data_profiles = RILMODEM_DEFAULT_USE_DATA_PROFILES; config->use_data_profiles = RILMODEM_DEFAULT_USE_DATA_PROFILES;
config->mms_data_profile_id = RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID; config->mms_data_profile_id = RILMODEM_DEFAULT_MMS_DATA_PROFILE_ID;
config->cell_info_interval_short_ms =
RILMODEM_DEFAULT_CELL_INFO_INTERVAL_SHORT_MS;
config->cell_info_interval_long_ms =
RILMODEM_DEFAULT_CELL_INFO_INTERVAL_LONG_MS;
slot->timeout = RILMODEM_DEFAULT_TIMEOUT; slot->timeout = RILMODEM_DEFAULT_TIMEOUT;
slot->sim_flags = RILMODEM_DEFAULT_SIM_FLAGS; slot->sim_flags = RILMODEM_DEFAULT_SIM_FLAGS;
slot->slot_flags = RILMODEM_DEFAULT_SLOT_FLAGS; slot->slot_flags = RILMODEM_DEFAULT_SLOT_FLAGS;
@@ -1241,8 +1249,7 @@ static ril_slot *ril_plugin_slot_new_take(char *transport,
RILMODEM_DEFAULT_DATA_CALL_RETRY_LIMIT; RILMODEM_DEFAULT_DATA_CALL_RETRY_LIMIT;
slot->data_opt.data_call_retry_delay_ms = slot->data_opt.data_call_retry_delay_ms =
RILMODEM_DEFAULT_DATA_CALL_RETRY_DELAY; RILMODEM_DEFAULT_DATA_CALL_RETRY_DELAY;
slot->devmon = ril_devmon_auto_new(config);
slot->devmon = ril_devmon_auto_new();
slot->watch = ofono_watch_new(dbus_path); slot->watch = ofono_watch_new(dbus_path);
slot->watch_event_id[WATCH_EVENT_MODEM] = slot->watch_event_id[WATCH_EVENT_MODEM] =
ofono_watch_add_modem_changed_handler(slot->watch, ofono_watch_add_modem_changed_handler(slot->watch,
@@ -1742,6 +1749,26 @@ static ril_slot *ril_plugin_parse_config_group(GKeyFile *file,
slot->legacy_imei_query ? "on" : "off"); slot->legacy_imei_query ? "on" : "off");
} }
/* cellInfoIntervalShortMs */
if (ril_config_get_integer(file, group,
RILCONF_CELL_INFO_INTERVAL_SHORT_MS,
&config->cell_info_interval_short_ms)) {
DBG("%s: " RILCONF_CELL_INFO_INTERVAL_SHORT_MS " %d", group,
config->cell_info_interval_short_ms);
}
/* cellInfoIntervalLongMs */
if (ril_config_get_integer(file, group,
RILCONF_CELL_INFO_INTERVAL_LONG_MS,
&config->cell_info_interval_long_ms)) {
DBG("%s: " RILCONF_CELL_INFO_INTERVAL_LONG_MS " %d",
group, config->cell_info_interval_long_ms);
}
/* Replace devmon with a new one with applied settings */
ril_devmon_free(slot->devmon);
slot->devmon = NULL;
/* deviceStateTracking */ /* deviceStateTracking */
if (ril_config_get_mask(file, group, RILCONF_DEVMON, &ival, if (ril_config_get_mask(file, group, RILCONF_DEVMON, &ival,
"ds", RIL_DEVMON_DS, "ds", RIL_DEVMON_DS,
@@ -1750,11 +1777,16 @@ static ril_slot *ril_plugin_parse_config_group(GKeyFile *file,
int n = 0; int n = 0;
struct ril_devmon *devmon[3]; struct ril_devmon *devmon[3];
if (ival & RIL_DEVMON_DS) devmon[n++] = ril_devmon_ds_new(); if (ival & RIL_DEVMON_DS) {
if (ival & RIL_DEVMON_SS) devmon[n++] = ril_devmon_ss_new(); devmon[n++] = ril_devmon_ds_new(config);
if (ival & RIL_DEVMON_UR) devmon[n++] = ril_devmon_ur_new(); }
if (ival & RIL_DEVMON_SS) {
devmon[n++] = ril_devmon_ss_new(config);
}
if (ival & RIL_DEVMON_UR) {
devmon[n++] = ril_devmon_ur_new(config);
}
DBG("%s: " RILCONF_DEVMON " 0x%x", group, ival); DBG("%s: " RILCONF_DEVMON " 0x%x", group, ival);
ril_devmon_free(slot->devmon);
slot->devmon = ril_devmon_combine(devmon, n); slot->devmon = ril_devmon_combine(devmon, n);
} else { } else {
/* Try special values */ /* Try special values */
@@ -1762,13 +1794,14 @@ static ril_slot *ril_plugin_parse_config_group(GKeyFile *file,
if (sval) { if (sval) {
if (!g_ascii_strcasecmp(sval, "none")) { if (!g_ascii_strcasecmp(sval, "none")) {
DBG("%s: " RILCONF_DEVMON " %s", group, sval); DBG("%s: " RILCONF_DEVMON " %s", group, sval);
ril_devmon_free(slot->devmon);
slot->devmon = NULL;
} else if (!g_ascii_strcasecmp(sval, "auto")) { } else if (!g_ascii_strcasecmp(sval, "auto")) {
DBG("%s: " RILCONF_DEVMON " %s", group, sval); DBG("%s: " RILCONF_DEVMON " %s", group, sval);
/* This is the default */ slot->devmon = ril_devmon_auto_new(config);
} }
g_free(sval); g_free(sval);
} else {
/* This is the default */
slot->devmon = ril_devmon_auto_new(config);
} }
} }

View File

@@ -339,3 +339,29 @@ socket=/dev/socket/rild
# Default true (false for MTK RILs) # Default true (false for MTK RILs)
# #
#forceGsmWhenRadioOff=true #forceGsmWhenRadioOff=true
# Configures a period between RIL_UNSOL_CELL_INFO_LIST events when the device
# is awake. Possible values are:
#
# 0 = invoke RIL_UNSOL_CELL_INFO_LIST when any of the reported information
# changes
# 1..INT_MAX-1 (2147483646) = sets update period in milliseconds
# negative value or INT_MAX = never issue a RIL_UNSOL_CELL_INFO_LIST
#
# On MediaTek devices the period of RIL_UNSOL_CELL_INFO_LIST events can't be
# configured. The parameter RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE has
# non-standard meaning:
#
# 0 = enable RIL_UNSOL_CELL_INFO_LIST
# any other value = disable RIL_UNSOL_CELL_INFO_LIST
#
# Default 2000
#
#cellInfoIntervalShortMs=2000
# Configures period between RIL_UNSOL_CELL_INFO_LIST events when the device is
# in a power saving mode. For possible values, look cellInfoIntervalShortMs.
#
# Default 30000
#
#cellInfoIntervalLongMs=30000

View File

@@ -79,6 +79,8 @@ struct ril_slot_config {
guint mms_data_profile_id; guint mms_data_profile_id;
GUtilInts *local_hangup_reasons; GUtilInts *local_hangup_reasons;
GUtilInts *remote_hangup_reasons; GUtilInts *remote_hangup_reasons;
int cell_info_interval_short_ms;
int cell_info_interval_long_ms;
}; };
#endif /* RIL_TYPES_H */ #endif /* RIL_TYPES_H */

View File

@@ -545,8 +545,8 @@ static int hfp_ag_init(void)
{ {
DBusConnection *conn = ofono_dbus_get_connection(); DBusConnection *conn = ofono_dbus_get_connection();
hfp_ag_enable(conn); /* g_dbus_add_service_watch immediately checks for bluetooth service
* and calls connect callback if the service exists. */
service_watch_id = g_dbus_add_service_watch(conn, "org.bluez", service_watch_id = g_dbus_add_service_watch(conn, "org.bluez",
bluez_connect_cb, bluez_connect_cb,
bluez_disconnect_cb, bluez_disconnect_cb,

View File

@@ -30,6 +30,8 @@
#include "ofono.h" #include "ofono.h"
#pragma message("PLUGINDIR="PLUGINDIR)
static GSList *plugins = NULL; static GSList *plugins = NULL;
struct ofono_plugin { struct ofono_plugin {

View File

@@ -349,12 +349,12 @@ static int tone_queue(struct ofono_voicecall *vc, const char *tone_str,
/* /*
* Tones can be 0-9, *, #, A-D according to 27.007 C.2.11, * Tones can be 0-9, *, #, A-D according to 27.007 C.2.11,
* and p for Pause. * and p for Pause (also , for Pause as per ITU-T V.250 6.3.1.2).
*/ */
for (i = 0; tone_str[i]; i++) for (i = 0; tone_str[i]; i++)
if (!g_ascii_isdigit(tone_str[i]) && tone_str[i] != 'p' && if (!g_ascii_isdigit(tone_str[i]) && tone_str[i] != 'p' &&
tone_str[i] != 'P' && tone_str[i] != '*' && tone_str[i] != 'P' && tone_str[i] != '*' &&
tone_str[i] != '.' && tone_str[i] != ',' && tone_str[i] != ',' &&
tone_str[i] != '#' && (tone_str[i] < 'A' || tone_str[i] != '#' && (tone_str[i] < 'A' ||
tone_str[i] > 'D')) tone_str[i] > 'D'))
return -EINVAL; return -EINVAL;
@@ -4389,7 +4389,7 @@ static void tone_request_cb(const struct ofono_error *error, void *data)
goto done; goto done;
} }
len = strspn(entry->left, "pP.,"); len = strspn(entry->left, "pP,");
entry->left += len; entry->left += len;
done: done:
@@ -4423,7 +4423,7 @@ static gboolean tone_request_run(gpointer user_data)
if (entry == NULL) if (entry == NULL)
return FALSE; return FALSE;
len = strcspn(entry->left, "pP.,"); len = strcspn(entry->left, "pP,");
if (len) { if (len) {
if (len > 8) /* Arbitrary length limit per request */ if (len > 8) /* Arbitrary length limit per request */

View File

@@ -2,7 +2,6 @@ Name: ofono
Summary: Open Source Telephony Summary: Open Source Telephony
Version: 1.23 Version: 1.23
Release: 1 Release: 1
Group: Communications/Connectivity Adaptation
License: GPLv2 License: GPLv2
URL: https://git.sailfishos.org/mer-core/ofono URL: https://git.sailfishos.org/mer-core/ofono
Source: %{name}-%{version}.tar.bz2 Source: %{name}-%{version}.tar.bz2
@@ -38,13 +37,13 @@ BuildRequires: pkgconfig(mobile-broadband-provider-info)
BuildRequires: libtool BuildRequires: libtool
BuildRequires: automake BuildRequires: automake
BuildRequires: autoconf BuildRequires: autoconf
BuildRequires: systemd
%description %description
Telephony stack Telephony stack
%package devel %package devel
Summary: Headers for oFono Summary: Headers for oFono
Group: Development/Libraries
Requires: %{name} = %{version}-%{release} Requires: %{name} = %{version}-%{release}
%description devel %description devel
@@ -52,7 +51,6 @@ Development headers and libraries for oFono
%package tests %package tests
Summary: Test Scripts for oFono Summary: Test Scripts for oFono
Group: Development/Libraries
Requires: %{name} = %{version}-%{release} Requires: %{name} = %{version}-%{release}
Requires: dbus-python3 Requires: dbus-python3
Requires: python3-gobject Requires: python3-gobject
@@ -64,7 +62,6 @@ Scripts for testing oFono and its functionality
%package configs-mer %package configs-mer
Summary: Package to provide default configs for ofono Summary: Package to provide default configs for ofono
Group: Development/Tools
Provides: ofono-configs Provides: ofono-configs
%description configs-mer %description configs-mer
@@ -72,7 +69,6 @@ This package provides default configs for ofono
%package doc %package doc
Summary: Documentation for %{name} Summary: Documentation for %{name}
Group: Documentation
Requires: %{name} = %{version}-%{release} Requires: %{name} = %{version}-%{release}
%description doc %description doc
@@ -98,9 +94,9 @@ autoreconf --force --install
--disable-add-remove-context \ --disable-add-remove-context \
--disable-isimodem \ --disable-isimodem \
--disable-qmimodem \ --disable-qmimodem \
--with-systemdunitdir="/%{_lib}/systemd/system" --with-systemdunitdir=%{_unitdir}
make %{_smp_mflags} %make_build
%check %check
# run unit tests # run unit tests
@@ -111,9 +107,9 @@ rm -rf %{buildroot}
%make_install %make_install
mkdir -p %{buildroot}/%{_sysconfdir}/ofono/push_forwarder.d mkdir -p %{buildroot}/%{_sysconfdir}/ofono/push_forwarder.d
mkdir -p %{buildroot}/%{_lib}/systemd/system/network.target.wants mkdir -p %{buildroot}%{_unitdir}/network.target.wants
mkdir -p %{buildroot}/var/lib/ofono mkdir -p %{buildroot}/var/lib/ofono
ln -s ../ofono.service %{buildroot}/%{_lib}/systemd/system/network.target.wants/ofono.service ln -s ../ofono.service %{buildroot}%{_unitdir}/network.target.wants/ofono.service
mkdir -p %{buildroot}%{_docdir}/%{name}-%{version} mkdir -p %{buildroot}%{_docdir}/%{name}-%{version}
install -m0644 -t %{buildroot}%{_docdir}/%{name}-%{version} \ install -m0644 -t %{buildroot}%{_docdir}/%{name}-%{version} \
@@ -139,8 +135,8 @@ systemctl daemon-reload ||:
%license COPYING %license COPYING
%config %{_sysconfdir}/dbus-1/system.d/*.conf %config %{_sysconfdir}/dbus-1/system.d/*.conf
%{_sbindir}/* %{_sbindir}/*
/%{_lib}/systemd/system/network.target.wants/ofono.service %{_unitdir}/network.target.wants/ofono.service
/%{_lib}/systemd/system/ofono.service %{_unitdir}/ofono.service
%dir %{_sysconfdir}/ofono/ %dir %{_sysconfdir}/ofono/
%dir %{_sysconfdir}/ofono/push_forwarder.d %dir %{_sysconfdir}/ofono/push_forwarder.d
# This file is part of phonesim and not needed with ofono. # This file is part of phonesim and not needed with ofono.