1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2023 Google LLC 2*cf78ab8cSAndroid Build Coastguard Worker // 3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*cf78ab8cSAndroid Build Coastguard Worker // 7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*cf78ab8cSAndroid Build Coastguard Worker // 9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License. 14*cf78ab8cSAndroid Build Coastguard Worker 15*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::frontend::ListDeviceResponse; 16*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::{ 17*cf78ab8cSAndroid Build Coastguard Worker self, 18*cf78ab8cSAndroid Build Coastguard Worker chip::ble_beacon::advertise_settings, 19*cf78ab8cSAndroid Build Coastguard Worker chip::ble_beacon::{AdvertiseData, AdvertiseSettings}, 20*cf78ab8cSAndroid Build Coastguard Worker }; 21*cf78ab8cSAndroid Build Coastguard Worker use protobuf::MessageField; 22*cf78ab8cSAndroid Build Coastguard Worker use std::fmt; 23*cf78ab8cSAndroid Build Coastguard Worker 24*cf78ab8cSAndroid Build Coastguard Worker const INDENT_WIDTH: usize = 2; 25*cf78ab8cSAndroid Build Coastguard Worker 26*cf78ab8cSAndroid Build Coastguard Worker /// Displayer for model protobufs. Implements fmt::Display. 27*cf78ab8cSAndroid Build Coastguard Worker /// # Invariants 28*cf78ab8cSAndroid Build Coastguard Worker /// Displayed values **do not** end in a newline. 29*cf78ab8cSAndroid Build Coastguard Worker pub struct Displayer<T> { 30*cf78ab8cSAndroid Build Coastguard Worker value: T, 31*cf78ab8cSAndroid Build Coastguard Worker verbose: bool, 32*cf78ab8cSAndroid Build Coastguard Worker indent: usize, 33*cf78ab8cSAndroid Build Coastguard Worker } 34*cf78ab8cSAndroid Build Coastguard Worker 35*cf78ab8cSAndroid Build Coastguard Worker impl<T> Displayer<T> { 36*cf78ab8cSAndroid Build Coastguard Worker /// Returns a new displayer for values of the provided type. new(value: T, verbose: bool) -> Self37*cf78ab8cSAndroid Build Coastguard Worker pub fn new(value: T, verbose: bool) -> Self { 38*cf78ab8cSAndroid Build Coastguard Worker Displayer { value, verbose, indent: 0 } 39*cf78ab8cSAndroid Build Coastguard Worker } 40*cf78ab8cSAndroid Build Coastguard Worker 41*cf78ab8cSAndroid Build Coastguard Worker /// Indent the displayed string by a given amount. Returns `self`. indent(&mut self, current_indent: usize) -> &Self42*cf78ab8cSAndroid Build Coastguard Worker pub fn indent(&mut self, current_indent: usize) -> &Self { 43*cf78ab8cSAndroid Build Coastguard Worker self.indent = current_indent + INDENT_WIDTH; 44*cf78ab8cSAndroid Build Coastguard Worker self 45*cf78ab8cSAndroid Build Coastguard Worker } 46*cf78ab8cSAndroid Build Coastguard Worker } 47*cf78ab8cSAndroid Build Coastguard Worker 48*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<ListDeviceResponse> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result49*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 50*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 51*cf78ab8cSAndroid Build Coastguard Worker 52*cf78ab8cSAndroid Build Coastguard Worker let mut devices = self.value.devices.iter().peekable(); 53*cf78ab8cSAndroid Build Coastguard Worker while let Some(device) = devices.next() { 54*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{}", "", Displayer::new(device, self.verbose))?; 55*cf78ab8cSAndroid Build Coastguard Worker if devices.peek().is_some() { 56*cf78ab8cSAndroid Build Coastguard Worker // We print the newline here instead of in the Device displayer because we don't want a newline before the very first device. 57*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 58*cf78ab8cSAndroid Build Coastguard Worker } 59*cf78ab8cSAndroid Build Coastguard Worker } 60*cf78ab8cSAndroid Build Coastguard Worker 61*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 62*cf78ab8cSAndroid Build Coastguard Worker } 63*cf78ab8cSAndroid Build Coastguard Worker } 64*cf78ab8cSAndroid Build Coastguard Worker 65*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Device> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result66*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 67*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 68*cf78ab8cSAndroid Build Coastguard Worker let width = 9; 69*cf78ab8cSAndroid Build Coastguard Worker 70*cf78ab8cSAndroid Build Coastguard Worker write!( 71*cf78ab8cSAndroid Build Coastguard Worker f, 72*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$} {}", 73*cf78ab8cSAndroid Build Coastguard Worker "", 74*cf78ab8cSAndroid Build Coastguard Worker self.value.name, 75*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(self.value.position.as_ref().unwrap_or_default(), self.verbose) 76*cf78ab8cSAndroid Build Coastguard Worker )?; 77*cf78ab8cSAndroid Build Coastguard Worker 78*cf78ab8cSAndroid Build Coastguard Worker for chip in self.value.chips.iter() { 79*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{}", "", Displayer::new(chip, self.verbose).indent(self.indent))?; 80*cf78ab8cSAndroid Build Coastguard Worker } 81*cf78ab8cSAndroid Build Coastguard Worker 82*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 83*cf78ab8cSAndroid Build Coastguard Worker } 84*cf78ab8cSAndroid Build Coastguard Worker } 85*cf78ab8cSAndroid Build Coastguard Worker 86*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Chip> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result87*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 88*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 89*cf78ab8cSAndroid Build Coastguard Worker let width = 9; 90*cf78ab8cSAndroid Build Coastguard Worker 91*cf78ab8cSAndroid Build Coastguard Worker match self.value.chip.as_ref() { 92*cf78ab8cSAndroid Build Coastguard Worker Some(model::chip::Chip::BleBeacon(ble_beacon)) => { 93*cf78ab8cSAndroid Build Coastguard Worker let radio = ble_beacon.bt.low_energy.as_ref().unwrap_or_default(); 94*cf78ab8cSAndroid Build Coastguard Worker let beacon_width = 16 + width; 95*cf78ab8cSAndroid Build Coastguard Worker 96*cf78ab8cSAndroid Build Coastguard Worker if self.verbose || !radio.state.unwrap_or_default() { 97*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 98*cf78ab8cSAndroid Build Coastguard Worker write!( 99*cf78ab8cSAndroid Build Coastguard Worker f, 100*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:beacon_width$} {}", 101*cf78ab8cSAndroid Build Coastguard Worker "", 102*cf78ab8cSAndroid Build Coastguard Worker format!("beacon-ble ({}):", self.value.name), 103*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(radio, self.verbose), 104*cf78ab8cSAndroid Build Coastguard Worker )?; 105*cf78ab8cSAndroid Build Coastguard Worker } 106*cf78ab8cSAndroid Build Coastguard Worker 107*cf78ab8cSAndroid Build Coastguard Worker if self.verbose { 108*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 109*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{}", Displayer::new(ble_beacon, self.verbose).indent(self.indent))?; 110*cf78ab8cSAndroid Build Coastguard Worker } 111*cf78ab8cSAndroid Build Coastguard Worker } 112*cf78ab8cSAndroid Build Coastguard Worker Some(model::chip::Chip::Bt(bt)) => { 113*cf78ab8cSAndroid Build Coastguard Worker if let Some(ble) = bt.low_energy.as_ref() { 114*cf78ab8cSAndroid Build Coastguard Worker if self.verbose || !ble.state.unwrap_or_default() { 115*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 116*cf78ab8cSAndroid Build Coastguard Worker write!( 117*cf78ab8cSAndroid Build Coastguard Worker f, 118*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}{}", 119*cf78ab8cSAndroid Build Coastguard Worker "", 120*cf78ab8cSAndroid Build Coastguard Worker "ble: ", 121*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(ble, self.verbose), 122*cf78ab8cSAndroid Build Coastguard Worker )?; 123*cf78ab8cSAndroid Build Coastguard Worker } 124*cf78ab8cSAndroid Build Coastguard Worker }; 125*cf78ab8cSAndroid Build Coastguard Worker 126*cf78ab8cSAndroid Build Coastguard Worker if let Some(classic) = bt.classic.as_ref() { 127*cf78ab8cSAndroid Build Coastguard Worker if self.verbose || !classic.state.unwrap_or_default() { 128*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 129*cf78ab8cSAndroid Build Coastguard Worker write!( 130*cf78ab8cSAndroid Build Coastguard Worker f, 131*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}{}", 132*cf78ab8cSAndroid Build Coastguard Worker "", 133*cf78ab8cSAndroid Build Coastguard Worker "classic: ", 134*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(classic, self.verbose), 135*cf78ab8cSAndroid Build Coastguard Worker )?; 136*cf78ab8cSAndroid Build Coastguard Worker } 137*cf78ab8cSAndroid Build Coastguard Worker }; 138*cf78ab8cSAndroid Build Coastguard Worker } 139*cf78ab8cSAndroid Build Coastguard Worker Some(model::chip::Chip::Wifi(wifi)) => { 140*cf78ab8cSAndroid Build Coastguard Worker if self.verbose || !wifi.state.unwrap_or_default() { 141*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 142*cf78ab8cSAndroid Build Coastguard Worker write!( 143*cf78ab8cSAndroid Build Coastguard Worker f, 144*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}{}", 145*cf78ab8cSAndroid Build Coastguard Worker "", 146*cf78ab8cSAndroid Build Coastguard Worker "wifi: ", 147*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(wifi, self.verbose) 148*cf78ab8cSAndroid Build Coastguard Worker )?; 149*cf78ab8cSAndroid Build Coastguard Worker } 150*cf78ab8cSAndroid Build Coastguard Worker } 151*cf78ab8cSAndroid Build Coastguard Worker Some(model::chip::Chip::Uwb(uwb)) => { 152*cf78ab8cSAndroid Build Coastguard Worker if self.verbose || !uwb.state.unwrap_or_default() { 153*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 154*cf78ab8cSAndroid Build Coastguard Worker write!( 155*cf78ab8cSAndroid Build Coastguard Worker f, 156*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}{}", 157*cf78ab8cSAndroid Build Coastguard Worker "", 158*cf78ab8cSAndroid Build Coastguard Worker "uwb: ", 159*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(uwb, self.verbose) 160*cf78ab8cSAndroid Build Coastguard Worker )?; 161*cf78ab8cSAndroid Build Coastguard Worker } 162*cf78ab8cSAndroid Build Coastguard Worker } 163*cf78ab8cSAndroid Build Coastguard Worker _ => { 164*cf78ab8cSAndroid Build Coastguard Worker if self.verbose { 165*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 166*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}Unknown chip", "")? 167*cf78ab8cSAndroid Build Coastguard Worker } 168*cf78ab8cSAndroid Build Coastguard Worker } 169*cf78ab8cSAndroid Build Coastguard Worker } 170*cf78ab8cSAndroid Build Coastguard Worker 171*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 172*cf78ab8cSAndroid Build Coastguard Worker } 173*cf78ab8cSAndroid Build Coastguard Worker } 174*cf78ab8cSAndroid Build Coastguard Worker 175*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::BleBeacon> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result176*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 177*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 178*cf78ab8cSAndroid Build Coastguard Worker let address_width = 16; 179*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}address: {:address_width$}", "", self.value.address)?; 180*cf78ab8cSAndroid Build Coastguard Worker 181*cf78ab8cSAndroid Build Coastguard Worker if self.value.settings.is_some() 182*cf78ab8cSAndroid Build Coastguard Worker && self.value.settings != MessageField::some(AdvertiseSettings::default()) 183*cf78ab8cSAndroid Build Coastguard Worker { 184*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 185*cf78ab8cSAndroid Build Coastguard Worker write!( 186*cf78ab8cSAndroid Build Coastguard Worker f, 187*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}advertise settings:{}", 188*cf78ab8cSAndroid Build Coastguard Worker "", 189*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(self.value.settings.as_ref().unwrap_or_default(), self.verbose) 190*cf78ab8cSAndroid Build Coastguard Worker .indent(self.indent) 191*cf78ab8cSAndroid Build Coastguard Worker )?; 192*cf78ab8cSAndroid Build Coastguard Worker } 193*cf78ab8cSAndroid Build Coastguard Worker 194*cf78ab8cSAndroid Build Coastguard Worker if self.value.adv_data.is_some() 195*cf78ab8cSAndroid Build Coastguard Worker && self.value.adv_data != MessageField::some(AdvertiseData::default()) 196*cf78ab8cSAndroid Build Coastguard Worker { 197*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 198*cf78ab8cSAndroid Build Coastguard Worker write!( 199*cf78ab8cSAndroid Build Coastguard Worker f, 200*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}advertise packet data:{}", 201*cf78ab8cSAndroid Build Coastguard Worker "", 202*cf78ab8cSAndroid Build Coastguard Worker Displayer::new(self.value.adv_data.as_ref().unwrap_or_default(), self.verbose) 203*cf78ab8cSAndroid Build Coastguard Worker .indent(self.indent) 204*cf78ab8cSAndroid Build Coastguard Worker )?; 205*cf78ab8cSAndroid Build Coastguard Worker } 206*cf78ab8cSAndroid Build Coastguard Worker 207*cf78ab8cSAndroid Build Coastguard Worker // TODO(jmes): Add scan response data. 208*cf78ab8cSAndroid Build Coastguard Worker 209*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 210*cf78ab8cSAndroid Build Coastguard Worker } 211*cf78ab8cSAndroid Build Coastguard Worker } 212*cf78ab8cSAndroid Build Coastguard Worker 213*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::Position> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result214*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 215*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 216*cf78ab8cSAndroid Build Coastguard Worker let precision = 2; 217*cf78ab8cSAndroid Build Coastguard Worker 218*cf78ab8cSAndroid Build Coastguard Worker if self.verbose 219*cf78ab8cSAndroid Build Coastguard Worker || (self.value.x != f32::default() 220*cf78ab8cSAndroid Build Coastguard Worker || self.value.y != f32::default() 221*cf78ab8cSAndroid Build Coastguard Worker || self.value.z != f32::default()) 222*cf78ab8cSAndroid Build Coastguard Worker { 223*cf78ab8cSAndroid Build Coastguard Worker write!( 224*cf78ab8cSAndroid Build Coastguard Worker f, 225*cf78ab8cSAndroid Build Coastguard Worker "{:indent$} position: {:.precision$}, {:.precision$}, {:.precision$}", 226*cf78ab8cSAndroid Build Coastguard Worker "", self.value.x, self.value.y, self.value.z, 227*cf78ab8cSAndroid Build Coastguard Worker )?; 228*cf78ab8cSAndroid Build Coastguard Worker } 229*cf78ab8cSAndroid Build Coastguard Worker 230*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 231*cf78ab8cSAndroid Build Coastguard Worker } 232*cf78ab8cSAndroid Build Coastguard Worker } 233*cf78ab8cSAndroid Build Coastguard Worker 234*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::ble_beacon::AdvertiseSettings> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result235*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 236*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 237*cf78ab8cSAndroid Build Coastguard Worker let width = 25; 238*cf78ab8cSAndroid Build Coastguard Worker 239*cf78ab8cSAndroid Build Coastguard Worker if let Some(tx_power) = self.value.tx_power.as_ref() { 240*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 241*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{}", "", Displayer::new(tx_power, self.verbose))?; 242*cf78ab8cSAndroid Build Coastguard Worker } 243*cf78ab8cSAndroid Build Coastguard Worker 244*cf78ab8cSAndroid Build Coastguard Worker if let Some(interval) = self.value.interval.as_ref() { 245*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 246*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{}", "", Displayer::new(interval, self.verbose))?; 247*cf78ab8cSAndroid Build Coastguard Worker } 248*cf78ab8cSAndroid Build Coastguard Worker 249*cf78ab8cSAndroid Build Coastguard Worker if self.value.scannable { 250*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 251*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {}", "", "scannable", self.value.scannable)?; 252*cf78ab8cSAndroid Build Coastguard Worker } 253*cf78ab8cSAndroid Build Coastguard Worker 254*cf78ab8cSAndroid Build Coastguard Worker if self.value.timeout != u64::default() { 255*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 256*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {} ms", "", "timeout", self.value.timeout)?; 257*cf78ab8cSAndroid Build Coastguard Worker } 258*cf78ab8cSAndroid Build Coastguard Worker 259*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 260*cf78ab8cSAndroid Build Coastguard Worker } 261*cf78ab8cSAndroid Build Coastguard Worker } 262*cf78ab8cSAndroid Build Coastguard Worker 263*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::ble_beacon::AdvertiseData> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result264*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 265*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 266*cf78ab8cSAndroid Build Coastguard Worker let width = 25; 267*cf78ab8cSAndroid Build Coastguard Worker 268*cf78ab8cSAndroid Build Coastguard Worker if self.value.include_device_name != bool::default() { 269*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 270*cf78ab8cSAndroid Build Coastguard Worker write!( 271*cf78ab8cSAndroid Build Coastguard Worker f, 272*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}: {}", 273*cf78ab8cSAndroid Build Coastguard Worker "", "include device name", self.value.include_device_name 274*cf78ab8cSAndroid Build Coastguard Worker )?; 275*cf78ab8cSAndroid Build Coastguard Worker } 276*cf78ab8cSAndroid Build Coastguard Worker 277*cf78ab8cSAndroid Build Coastguard Worker if self.value.include_tx_power_level != bool::default() { 278*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 279*cf78ab8cSAndroid Build Coastguard Worker write!( 280*cf78ab8cSAndroid Build Coastguard Worker f, 281*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}: {}", 282*cf78ab8cSAndroid Build Coastguard Worker "", "include tx power level", self.value.include_tx_power_level 283*cf78ab8cSAndroid Build Coastguard Worker )?; 284*cf78ab8cSAndroid Build Coastguard Worker } 285*cf78ab8cSAndroid Build Coastguard Worker 286*cf78ab8cSAndroid Build Coastguard Worker if self.value.manufacturer_data != Vec::<u8>::default() { 287*cf78ab8cSAndroid Build Coastguard Worker writeln!(f)?; 288*cf78ab8cSAndroid Build Coastguard Worker write!( 289*cf78ab8cSAndroid Build Coastguard Worker f, 290*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}: {}", 291*cf78ab8cSAndroid Build Coastguard Worker "", 292*cf78ab8cSAndroid Build Coastguard Worker "manufacturer data bytes", 293*cf78ab8cSAndroid Build Coastguard Worker self.value.manufacturer_data.len() 294*cf78ab8cSAndroid Build Coastguard Worker )?; 295*cf78ab8cSAndroid Build Coastguard Worker } 296*cf78ab8cSAndroid Build Coastguard Worker 297*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 298*cf78ab8cSAndroid Build Coastguard Worker } 299*cf78ab8cSAndroid Build Coastguard Worker } 300*cf78ab8cSAndroid Build Coastguard Worker 301*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&advertise_settings::Interval> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result302*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 303*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 304*cf78ab8cSAndroid Build Coastguard Worker let width = 25; 305*cf78ab8cSAndroid Build Coastguard Worker 306*cf78ab8cSAndroid Build Coastguard Worker match self.value { 307*cf78ab8cSAndroid Build Coastguard Worker advertise_settings::Interval::Milliseconds(interval) => { 308*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {} ms", "", "interval", interval) 309*cf78ab8cSAndroid Build Coastguard Worker } 310*cf78ab8cSAndroid Build Coastguard Worker advertise_settings::Interval::AdvertiseMode(mode) => { 311*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {:?}", "", "advertise mode", mode) 312*cf78ab8cSAndroid Build Coastguard Worker } 313*cf78ab8cSAndroid Build Coastguard Worker _ => Err(fmt::Error), 314*cf78ab8cSAndroid Build Coastguard Worker } 315*cf78ab8cSAndroid Build Coastguard Worker } 316*cf78ab8cSAndroid Build Coastguard Worker } 317*cf78ab8cSAndroid Build Coastguard Worker 318*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&advertise_settings::Tx_power> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result319*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 320*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 321*cf78ab8cSAndroid Build Coastguard Worker let width = 25; 322*cf78ab8cSAndroid Build Coastguard Worker 323*cf78ab8cSAndroid Build Coastguard Worker match self.value { 324*cf78ab8cSAndroid Build Coastguard Worker advertise_settings::Tx_power::Dbm(dbm) => { 325*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {} dBm", "", "tx power", dbm) 326*cf78ab8cSAndroid Build Coastguard Worker } 327*cf78ab8cSAndroid Build Coastguard Worker advertise_settings::Tx_power::TxPowerLevel(level) => { 328*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{:width$}: {:?}", "", "tx power level", level) 329*cf78ab8cSAndroid Build Coastguard Worker } 330*cf78ab8cSAndroid Build Coastguard Worker _ => Err(fmt::Error), 331*cf78ab8cSAndroid Build Coastguard Worker } 332*cf78ab8cSAndroid Build Coastguard Worker } 333*cf78ab8cSAndroid Build Coastguard Worker } 334*cf78ab8cSAndroid Build Coastguard Worker 335*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&model::chip::Radio> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result336*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 337*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 338*cf78ab8cSAndroid Build Coastguard Worker let count_width = 9; 339*cf78ab8cSAndroid Build Coastguard Worker write!(f, "{:indent$}{}", "", Displayer::new(&self.value.state, self.verbose),)?; 340*cf78ab8cSAndroid Build Coastguard Worker 341*cf78ab8cSAndroid Build Coastguard Worker if self.verbose { 342*cf78ab8cSAndroid Build Coastguard Worker write!( 343*cf78ab8cSAndroid Build Coastguard Worker f, 344*cf78ab8cSAndroid Build Coastguard Worker "| rx_count: {:count_width$} | tx_count: {:count_width$}", 345*cf78ab8cSAndroid Build Coastguard Worker self.value.rx_count, self.value.tx_count 346*cf78ab8cSAndroid Build Coastguard Worker )? 347*cf78ab8cSAndroid Build Coastguard Worker } 348*cf78ab8cSAndroid Build Coastguard Worker 349*cf78ab8cSAndroid Build Coastguard Worker Ok(()) 350*cf78ab8cSAndroid Build Coastguard Worker } 351*cf78ab8cSAndroid Build Coastguard Worker } 352*cf78ab8cSAndroid Build Coastguard Worker 353*cf78ab8cSAndroid Build Coastguard Worker impl fmt::Display for Displayer<&Option<bool>> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result354*cf78ab8cSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 355*cf78ab8cSAndroid Build Coastguard Worker let indent = self.indent; 356*cf78ab8cSAndroid Build Coastguard Worker let width = 9; 357*cf78ab8cSAndroid Build Coastguard Worker 358*cf78ab8cSAndroid Build Coastguard Worker write!( 359*cf78ab8cSAndroid Build Coastguard Worker f, 360*cf78ab8cSAndroid Build Coastguard Worker "{:indent$}{:width$}", 361*cf78ab8cSAndroid Build Coastguard Worker "", 362*cf78ab8cSAndroid Build Coastguard Worker match self.value { 363*cf78ab8cSAndroid Build Coastguard Worker Some(true) => "up", 364*cf78ab8cSAndroid Build Coastguard Worker Some(false) => "down", 365*cf78ab8cSAndroid Build Coastguard Worker None => "unknown", 366*cf78ab8cSAndroid Build Coastguard Worker } 367*cf78ab8cSAndroid Build Coastguard Worker ) 368*cf78ab8cSAndroid Build Coastguard Worker } 369*cf78ab8cSAndroid Build Coastguard Worker } 370