Krolyxon
Commit e9c4031

Branches

Refs →

budctlcratesbudctl-coresrcstatus.rs

99 lines · 2.9 KB · Rust

1//! What a session reports, in device-neutral terms. Front ends print these, and `--json`
2//! serializes them as they are.
3
4use serde::{Serialize, Serializer};
5
6/// Bumped whenever the JSON shape changes incompatibly.
7pub const JSON_SCHEMA: u32 = 1;
8
9#[derive(Debug, Default, Serialize)]
10pub struct Status {
11 pub battery: Battery,
12 pub noise_control: Option<NoiseControl>,
13 /// Name of the current EQ preset.
14 pub eq: Option<String>,
15 pub bass_level: Option<i8>,
16 /// On/off settings, serialized as `{"game": false, …}`.
17 #[serde(serialize_with = "switches_as_map")]
18 pub switches: Vec<Switch>,
19 /// Audio codec of the link the buds report.
20 pub codec: Option<String>,
21 pub firmware: Option<String>,
22 /// Reads that failed. The rest of the status is still valid.
23 pub warnings: Vec<String>,
24}
25
26#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize)]
27pub struct Battery {
28 pub left: Option<Charge>,
29 pub right: Option<Charge>,
30 pub case: Option<Charge>,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
34pub struct Charge {
35 /// Percent.
36 pub level: u8,
37 pub charging: bool,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
41pub struct NoiseControl {
42 /// `off`, `transparency` or `anc`, or `unknown (…)` for a value the device module cannot name.
43 pub mode: String,
44 /// The noise-cancelling level, when the device reports one.
45 pub level: Option<String>,
46}
47
48/// A noise-control mode to set. Levels come with W2.
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50pub enum NoiseMode {
51 Off,
52 Transparency,
53 Anc,
54}
55
56impl NoiseMode {
57 /// The name [`NoiseControl::mode`] uses for it.
58 pub fn name(self) -> &'static str {
59 match self {
60 NoiseMode::Off => "off",
61 NoiseMode::Transparency => "transparency",
62 NoiseMode::Anc => "anc",
63 }
64 }
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
68pub struct Switch {
69 /// Stable name used on the command line and in JSON (`game`, `dual`…).
70 pub key: &'static str,
71 /// Human name (`Game mode`).
72 pub label: &'static str,
73 pub on: bool,
74}
75
76#[derive(Debug, Default, Serialize)]
77pub struct TouchControls {
78 pub gestures: Vec<Gesture>,
79 /// Noise-control modes a hold steps through, when the device has that setting.
80 pub hold_cycle: Option<Vec<String>>,
81 pub warnings: Vec<String>,
82}
83
84#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
85pub struct Gesture {
86 /// `left`, `right` or `both`.
87 pub side: String,
88 /// `double-tap`, `triple-tap`, `hold`…
89 pub gesture: String,
90 /// `play-pause`, `next`, `none`…
91 pub action: String,
92 /// Raw button group, for entries outside the main gestures (calls). `None` for the main group.
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub group: Option<u8>,
95}
96
97fn switches_as_map<S: Serializer>(switches: &[Switch], serializer: S) -> Result<S::Ok, S::Error> {
98 serializer.collect_map(switches.iter().map(|s| (s.key, s.on)))
99}