backend-native: get battery status via HFP

This commit is contained in:
Dmitry Sharshakov 2021-03-08 09:42:38 +03:00 committed by Wim Taymans
parent 196fe8b51b
commit 0078b3b73e
2 changed files with 30 additions and 1 deletions

View file

@ -324,6 +324,7 @@ static bool rfcomm_hfp_ag(struct spa_source *source, char* buf)
struct spa_bt_backend *backend = rfcomm->backend;
unsigned int features;
unsigned int gain;
unsigned int len, k, v;
unsigned int selected_codec;
if (sscanf(buf, "AT+BRSF=%u", &features) == 1) {
@ -459,6 +460,30 @@ static bool rfcomm_hfp_ag(struct spa_source *source, char* buf)
spa_log_debug(backend->log, NAME": RFCOMM receive unsupported VGS gain: %s", buf);
rfcomm_send_reply(source, "ERROR");
}
} else if (strncmp(buf, "AT+XAPL=", 8) == 0) {
// We expect battery status only (bitmask 10)
rfcomm_send_reply(source, "+XAPL: iPhone,2");
rfcomm_send_reply(source, "OK");
} else if (sscanf(buf, "AT+IPHONEACCEV=%d", &len) == 1) {
if (len < 1) {
return false;
}
for (unsigned int i = 1; i <= len; i++) {
buf = strchr(buf, ',') + 1;
if (sscanf(buf, "%d", &k) != 1) return false;
buf = strchr(buf, ',') + 1;
if (sscanf(buf, "%d", &v) != 1) return false;
if (k == SPA_BT_HFP_HF_IPHONEACCEV_KEY_BATTERY) {
// Battery level is reported in range of 0-9, convert to 0-100%
rfcomm->transport->battery = (v + 1) * 10;
spa_log_debug(backend->log, NAME": battery level: %d%%", rfcomm->transport->battery);
}
}
} else if (strncmp(buf, "AT+APLSIRI?", 11) == 0) {
// This command is sent when we activate Apple extensions
rfcomm_send_reply(source, "OK");
} else {
return false;
}

View file

@ -446,6 +446,9 @@ struct spa_bt_transport_implementation {
int (*destroy) (void *data);
};
// Key for getting battery state
#define SPA_BT_HFP_HF_IPHONEACCEV_KEY_BATTERY 1
struct spa_bt_transport {
struct spa_list link;
struct spa_bt_monitor *monitor;
@ -457,6 +460,7 @@ struct spa_bt_transport {
enum spa_bt_transport_state state;
const struct a2dp_codec *a2dp_codec;
unsigned int codec;
uint8_t battery;
void *configuration;
int configuration_len;