Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f6498e9 authored by Stanley Tng's avatar Stanley Tng
Browse files

Make sure Hearing Aids' Connection Intervals is unchanged

Make sure that the connection interval of the LE Connection remains the
desired one and reset it if this interval gets changed.

Test: Manual with Hearing Aids device and repeated
connection/disconnection
Bug: 117886712
Change-Id: Id11d1d2e7901bfbbc9c452b94aba968afbc52ee0
parent 032498c1
Loading
Loading
Loading
Loading
+61 −27
Original line number Diff line number Diff line
@@ -119,9 +119,10 @@ HearingAidAudioReceiver* audioReceiver;

/** Possible states for the Connection Update status */
typedef enum {
  NONE,      // Connection Update not pending or has completed
  NONE,      // Not Connected
  AWAITING,  // Waiting for start the Connection Update operation
  STARTED    // Connection Update has started
  STARTED,   // Connection Update has started
  COMPLETED  // Connection Update is completed successfully
} connection_update_status_t;

struct HearingDevice {
@@ -459,31 +460,64 @@ class HearingAidImpl : public HearingAid {
    }

    if (p_data) {
      if ((p_data->conn_update.status == 0) &&
          (hearingDevice->requested_connection_interval !=
           p_data->conn_update.interval)) {
        LOG(WARNING) << __func__ << ": Ignored. Different connection interval="
      if (p_data->conn_update.status == 0) {
        bool same_conn_interval =
            (hearingDevice->requested_connection_interval ==
             p_data->conn_update.interval);

        switch (hearingDevice->connection_update_status) {
          case COMPLETED:
            if (!same_conn_interval) {
              LOG(WARNING) << __func__
                           << ": Unexpected change. Redo. connection interval="
                           << p_data->conn_update.interval << ", expected="
                           << hearingDevice->requested_connection_interval
                     << ", conn_id=" << conn_id;
                           << ", conn_id=" << conn_id
                           << ", connection_update_status="
                           << hearingDevice->connection_update_status;
              // Redo this connection interval change.
              hearingDevice->connection_update_status = AWAITING;
            }
            break;
          case STARTED:
            if (same_conn_interval) {
              LOG(INFO) << __func__
                        << ": Connection update completed. conn_id=" << conn_id
                        << ", device=" << hearingDevice->address;
              hearingDevice->connection_update_status = COMPLETED;
            } else {
              LOG(WARNING) << __func__
                           << ": Ignored. Different connection interval="
                           << p_data->conn_update.interval << ", expected="
                           << hearingDevice->requested_connection_interval
                           << ", conn_id=" << conn_id
                           << ", connection_update_status="
                           << hearingDevice->connection_update_status;
              // Wait for the right Connection Update Completion.
              return;
            }
      LOG(INFO) << __func__ << ": interval=" << p_data->conn_update.interval
                << ": status=" << loghex(p_data->conn_update.status)
                << ", conn_id=" << conn_id;
            break;
          case AWAITING:
          case NONE:
            break;
        }

    if (hearingDevice->connection_update_status != STARTED) {
      // TODO: We may get extra connection updates during service discovery and
      // these updates are not accounted for.
      } else {
        LOG(INFO) << __func__
                << ": Unexpected connection update complete. Expecting "
                   "state=STARTED but current="
                << hearingDevice->connection_update_status
                  << ": error status=" << loghex(p_data->conn_update.status)
                  << ", conn_id=" << conn_id
                << ", device=" << hearingDevice->address;
                  << ", device=" << hearingDevice->address
                  << ", connection_update_status="
                  << hearingDevice->connection_update_status;

        if (hearingDevice->connection_update_status == STARTED) {
          // Redo this connection interval change.
          LOG(ERROR) << __func__ << ": Redo Connection Interval change";
          hearingDevice->connection_update_status = AWAITING;
        }
      }
    } else {
      hearingDevice->connection_update_status = NONE;
    }

    for (auto& device : hearingDevices.devices) {
      if (device.conn_id && (device.connection_update_status == AWAITING)) {
@@ -1231,7 +1265,7 @@ class HearingAidImpl : public HearingAid {
  }

  void DoDisconnectCleanUp(HearingDevice* hearingDevice) {
    if (hearingDevice->connection_update_status != NONE) {
    if (hearingDevice->connection_update_status != COMPLETED) {
      LOG(INFO) << __func__ << ": connection update not completed. Current="
                << hearingDevice->connection_update_status
                << ", device=" << hearingDevice->address;
@@ -1239,8 +1273,8 @@ class HearingAidImpl : public HearingAid {
      if (hearingDevice->connection_update_status == STARTED) {
        OnConnectionUpdateComplete(hearingDevice->conn_id, NULL);
      }
      hearingDevice->connection_update_status = NONE;
    }
    hearingDevice->connection_update_status = NONE;

    if (hearingDevice->conn_id) {
      BtaGattQueue::Clean(hearingDevice->conn_id);