// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/device/bluetooth/le/ble_notification_logger.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "chromecast/device/bluetooth/bluetooth_util.h"
#include "chromecast/device/bluetooth/le/remote_characteristic.h"
#include "chromecast/device/bluetooth/le/remote_device.h"
namespace chromecast {
namespace bluetooth {
// static
constexpr base::TimeDelta BleNotificationLogger::kMinLogInterval;
BleNotificationLogger::BleNotificationLogger(GattClientManager* gcm)
: gcm_(gcm), weak_factory_(this) {
DCHECK(gcm);
gcm_->AddObserver(this);
}
BleNotificationLogger::~BleNotificationLogger() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
gcm_->RemoveObserver(this);
}
void BleNotificationLogger::OnCharacteristicNotification(
scoped_refptr<RemoteDevice> device,
scoped_refptr<RemoteCharacteristic> characteristic,
std::vector<uint8_t> value) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
++device_to_char_uuid_to_count_[device->addr()][characteristic->uuid()];
MaybeLogHistogramState();
}
void BleNotificationLogger::MaybeLogHistogramState() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (device_to_char_uuid_to_count_.empty()) {
return;
}
auto now = base::TimeTicks::Now();
base::TimeTicks next_time_can_log = last_log_time_ + kMinLogInterval;
if (now < next_time_can_log) {
auto time_till_next_log = next_time_can_log - now;
// Schedule a log at the next time we are allowed to.
log_timer_.Start(
FROM_HERE, time_till_next_log,
base::BindOnce(&BleNotificationLogger::MaybeLogHistogramState,
weak_factory_.GetWeakPtr()));
return;
}
LOG(INFO) << "BLE notifications: ";
for (const auto& device : device_to_char_uuid_to_count_) {
LOG(INFO) << util::AddrLastByteString(device.first);
for (const auto& characteristic : device.second) {
LOG(INFO) << " " << util::UuidToString(characteristic.first) << " "
<< characteristic.second;
}
}
device_to_char_uuid_to_count_.clear();
last_log_time_ = now;
}
} // namespace bluetooth
} // namespace chromecast