bluez5: backend-native: Add battery level indicator support

This connect to the UPower service and update the +CIND battchg indicator
This commit is contained in:
Frédéric Danis 2022-09-19 15:00:24 +02:00 committed by Wim Taymans
parent a37aeac273
commit 47700a2214
4 changed files with 371 additions and 4 deletions

View file

@ -52,6 +52,7 @@
#endif
#include "modemmanager.h"
#include "upower.h"
static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.bluez5.native");
#undef SPA_LOG_TOPIC_DEFAULT
@ -71,7 +72,7 @@ enum {
HFP_AG_INITIAL_CODEC_SETUP_WAIT
};
#define CIND_INDICATORS "(\"service\",(0-1)),(\"call\",(0-1)),(\"callsetup\",(0-3)),(\"callheld\",(0-2)),(\"signal\",(0-5)),(\"roam\",(0-1))"
#define CIND_INDICATORS "(\"service\",(0-1)),(\"call\",(0-1)),(\"callsetup\",(0-3)),(\"callheld\",(0-2)),(\"signal\",(0-5)),(\"roam\",(0-1)),\"battchg\",(0-5))"
enum {
CIND_SERVICE = 1,
CIND_CALL,
@ -79,6 +80,7 @@ enum {
CIND_CALLHELD,
CIND_SIGNAL,
CIND_ROAM,
CIND_BATTERY_LEVEL,
CIND_MAX
};
@ -115,9 +117,11 @@ struct impl {
unsigned int defer_setup_enabled:1;
struct modem modem;
unsigned int battery_level;
void *modemmanager;
struct spa_source *ring_timer;
void *upower;
};
struct transport_data {
@ -835,9 +839,9 @@ static bool rfcomm_hfp_ag(struct rfcomm *rfcomm, char* buf)
rfcomm_send_reply(rfcomm, "+CIND:%s", CIND_INDICATORS);
rfcomm_send_reply(rfcomm, "OK");
} else if (spa_strstartswith(buf, "AT+CIND?")) {
rfcomm_send_reply(rfcomm, "+CIND: %d,%d,%d,0,%d,%d", backend->modem.network_has_service,
rfcomm_send_reply(rfcomm, "+CIND: %d,%d,%d,0,%d,%d,%d", backend->modem.network_has_service,
backend->modem.active_call, backend->modem.call_setup, backend->modem.signal_strength,
backend->modem.network_is_roaming);
backend->modem.network_is_roaming, backend->battery_level);
rfcomm_send_reply(rfcomm, "OK");
} else if (spa_strstartswith(buf, "AT+CMER")) {
int mode, keyp, disp, ind;
@ -2530,6 +2534,16 @@ static void set_call_setup(enum call_setup value, void *user_data)
}
}
void set_battery_level(unsigned int level, void *user_data)
{
struct impl *backend = user_data;
if (backend->battery_level != level) {
backend->battery_level = level;
send_ciev_for_each_rfcomm(backend, CIND_BATTERY_LEVEL, level);
}
}
static void set_modem_operator_name(const char *name, void *user_data)
{
struct impl *backend = user_data;
@ -2611,6 +2625,11 @@ static int backend_native_free(void *data)
backend->modemmanager = NULL;
}
if (backend->upower) {
upower_unregister(backend->upower);
backend->upower = NULL;
}
if (backend->ring_timer)
spa_loop_utils_destroy_source(backend->loop_utils, backend->ring_timer);
@ -2740,6 +2759,7 @@ struct spa_bt_backend *backend_native_new(struct spa_bt_monitor *monitor,
#endif
backend->modemmanager = mm_register(backend->log, backend->conn, &mm_ops, backend);
backend->upower = upower_register(backend->log, backend->conn, set_battery_level, backend);
return &backend->this;