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 Original line Diff line number Diff line
@@ -119,9 +119,10 @@ HearingAidAudioReceiver* audioReceiver;


/** Possible states for the Connection Update status */
/** Possible states for the Connection Update status */
typedef enum {
typedef enum {
  NONE,      // Connection Update not pending or has completed
  NONE,      // Not Connected
  AWAITING,  // Waiting for start the Connection Update operation
  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;
} connection_update_status_t;


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


    if (p_data) {
    if (p_data) {
      if ((p_data->conn_update.status == 0) &&
      if (p_data->conn_update.status == 0) {
          (hearingDevice->requested_connection_interval !=
        bool same_conn_interval =
           p_data->conn_update.interval)) {
            (hearingDevice->requested_connection_interval ==
        LOG(WARNING) << __func__ << ": Ignored. Different 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="
                           << p_data->conn_update.interval << ", expected="
                           << hearingDevice->requested_connection_interval
                           << 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;
              return;
            }
            }
      LOG(INFO) << __func__ << ": interval=" << p_data->conn_update.interval
            break;
                << ": status=" << loghex(p_data->conn_update.status)
          case AWAITING:
                << ", conn_id=" << conn_id;
          case NONE:
            break;
        }
        }

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


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


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


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