| // Copyright (c) 2012 The Chromium OS 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 "wimax_manager/network.h" |
| |
| #include <base/strings/stringprintf.h> |
| |
| #include "wimax_manager/network_dbus_adaptor.h" |
| |
| using std::string; |
| |
| namespace wimax_manager { |
| |
| // static |
| const int Network::kMaxCINR = 53; |
| const int Network::kMinCINR = -10; |
| const int Network::kMaxRSSI = -40; |
| const int Network::kMinRSSI = -123; |
| const Network::Identifier Network::kInvalidIdentifier = 0; |
| |
| Network::Network(Identifier identifier, const string &name, NetworkType type, |
| int cinr, int rssi) |
| : identifier_(identifier), |
| name_(name), |
| type_(type), |
| cinr_(cinr), |
| rssi_(rssi) { |
| } |
| |
| Network::~Network() { |
| } |
| |
| // static |
| int Network::DecodeCINR(int encoded_cinr) { |
| int cinr = encoded_cinr + kMinCINR; |
| if (cinr < kMinCINR) |
| return kMinCINR; |
| if (cinr > kMaxCINR) |
| return kMaxCINR; |
| return cinr; |
| } |
| |
| // static |
| int Network::DecodeRSSI(int encoded_rssi) { |
| int rssi = encoded_rssi + kMinRSSI; |
| if (rssi < kMinRSSI) |
| return kMinRSSI; |
| if (rssi > kMaxRSSI) |
| return kMaxRSSI; |
| return rssi; |
| } |
| |
| void Network::UpdateFrom(const Network &network) { |
| identifier_ = network.identifier_; |
| name_ = network.name_; |
| type_ = network.type_; |
| cinr_ = network.cinr_; |
| rssi_ = network.rssi_; |
| |
| if (dbus_adaptor()) |
| dbus_adaptor()->UpdateProperties(); |
| } |
| |
| int Network::GetSignalStrength() const { |
| // TODO(benchan): Derive a RSSI/CINR to signal strength mapping equation |
| // with finer granularity. |
| |
| // RSSI \ CINR | [-10..-3] | (-3..0] | (0..3] | (3.10] | (10..15] | (15..53] |
| // ------------+-----------+---------+--------+--------+----------+--------- |
| // [-123..-80] | 0 | 0 | 0 | 0 | 0 | 0 |
| // ( -80..-75] | 0 | 0 | 0 | 20 | 20 | 40 |
| // ( -75..-65] | 0 | 0 | 20 | 20 | 40 | 60 |
| // ( -65..-55] | 0 | 20 | 20 | 40 | 60 | 80 |
| // ( -55..-40] | 0 | 20 | 40 | 60 | 80 | 100 |
| static const int kSignalStrengthTable[5][6] = { |
| { 0, 0, 0, 0, 0, 0 }, |
| { 0, 0, 0, 20, 20, 40 }, |
| { 0, 0, 20, 20, 40, 60 }, |
| { 0, 20, 20, 40, 60, 80 }, |
| { 0, 20, 40, 60, 80, 100 }, |
| }; |
| |
| int row = 4; |
| if (rssi_ <= -80) { |
| row = 0; |
| } else if (rssi_ <= -75) { |
| row = 1; |
| } else if (rssi_ <= -65) { |
| row = 2; |
| } else if (rssi_ <= -55) { |
| row = 3; |
| } |
| |
| int column = 5; |
| if (cinr_ <= -3) { |
| column = 0; |
| } else if (cinr_ <= 0) { |
| column = 1; |
| } else if (cinr_ <= 3) { |
| column = 2; |
| } else if (cinr_ <= 10) { |
| column = 3; |
| } else if (cinr_ <= 15) { |
| column = 4; |
| } |
| |
| return kSignalStrengthTable[row][column]; |
| } |
| |
| string Network::GetNameWithIdentifier() const { |
| return name_.empty() ? |
| base::StringPrintf("network (0x%08x)", identifier_) : |
| base::StringPrintf("network '%s' (0x%08x)", name_.c_str(), identifier_); |
| } |
| |
| } // namespace wimax_manager |