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

Commit 7c4487a2 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Make sure Hearing Aids' Connection Intervals is unchanged"

parents b73b6cd5 8f6498e9
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);