blob: bfbacc387beada18ead7a4a4e013f434f60ecd0d [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/mirroring/service/wifi_status_monitor.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
#include "components/mirroring/service/message_dispatcher.h"
namespace mirroring {
namespace {
// The interval to query the status.
constexpr base::TimeDelta kQueryInterval = base::TimeDelta::FromMinutes(2);
// The maximum number of recent status to be kept.
constexpr int kMaxRecords = 30;
} // namespace
WifiStatusMonitor::WifiStatusMonitor(MessageDispatcher* message_dispatcher)
: message_dispatcher_(message_dispatcher) {
DCHECK(message_dispatcher_);
message_dispatcher_->Subscribe(
ResponseType::STATUS_RESPONSE,
base::BindRepeating(&WifiStatusMonitor::RecordStatus,
base::Unretained(this)));
query_timer_.Start(FROM_HERE, kQueryInterval,
base::BindRepeating(&WifiStatusMonitor::QueryStatus,
base::Unretained(this)));
QueryStatus();
}
WifiStatusMonitor::~WifiStatusMonitor() {
message_dispatcher_->Unsubscribe(ResponseType::STATUS_RESPONSE);
}
std::vector<WifiStatus> WifiStatusMonitor::GetRecentValues() {
std::vector<WifiStatus> recent_status(recent_status_.begin(),
recent_status_.end());
recent_status_.clear();
return recent_status;
}
void WifiStatusMonitor::QueryStatus() {
base::Value query(base::Value::Type::DICTIONARY);
query.SetKey("type", base::Value("GET_STATUS"));
query.SetKey("seqNum", base::Value(message_dispatcher_->GetNextSeqNumber()));
base::Value::ListStorage status;
status.emplace_back(base::Value("wifiSnr"));
status.emplace_back(base::Value("wifiSpeed"));
query.SetKey("get_status", base::Value(status));
mojom::CastMessagePtr get_status_message = mojom::CastMessage::New();
get_status_message->message_namespace = mojom::kWebRtcNamespace;
const bool did_serialize_query =
base::JSONWriter::Write(query, &get_status_message->json_format_data);
DCHECK(did_serialize_query);
message_dispatcher_->SendOutboundMessage(std::move(get_status_message));
}
void WifiStatusMonitor::RecordStatus(const ReceiverResponse& response) {
if (!response.status || response.status->wifi_speed.size() != 4)
return;
if (recent_status_.size() == kMaxRecords)
recent_status_.pop_front();
WifiStatus received_status;
received_status.snr = response.status->wifi_snr;
// Only records the current speed.
received_status.speed = response.status->wifi_speed[3];
received_status.timestamp = base::Time::Now();
recent_status_.emplace_back(received_status);
}
} // namespace mirroring