Reduce periodic network activity to 1 request instead of 5

This commit is contained in:
NGnius (Graham) 2023-08-07 17:08:24 -04:00
parent 324b290d35
commit 3cbde30e09
4 changed files with 84 additions and 6 deletions

View file

@ -321,3 +321,57 @@ pub fn force_apply(
vec![true.into()]
}
}
/// Generate get periodicals aggregate method
pub fn get_periodicals(sender: Sender<ApiMessage>) -> impl AsyncCallable {
let sender = Arc::new(Mutex::new(sender)); // Sender is not Sync; this is required for safety
let getter = move || {
let sender2 = sender.clone();
move || {
let (rx_curr, callback_curr) = build_comms("battery current callback send failed");
let (rx_charge_now, callback_charge_now) = build_comms("battery charge now callback send failed");
let (rx_charge_full, callback_charge_full) = build_comms("battery charge full callback send failed");
let (rx_charge_power, callback_charge_power) = build_comms("battery charge power callback send failed");
let (rx_path, callback_path) = build_comms("general get path (periodical) send failed");
let sender_locked = sender2
.lock()
.unwrap();
let curr = wait_for_response(&*sender_locked, rx_curr,
ApiMessage::Battery(super::handler::BatteryMessage::ReadCurrentNow(callback_curr)), "battery current");
let charge_now = wait_for_response(&*sender_locked, rx_charge_now,
ApiMessage::Battery(super::handler::BatteryMessage::ReadChargeNow(callback_charge_now)), "battery charge now");
let charge_full = wait_for_response(&*sender_locked, rx_charge_full,
ApiMessage::Battery(super::handler::BatteryMessage::ReadChargeFull(callback_charge_full)), "battery charge full");
let charge_power = wait_for_response(&*sender_locked, rx_charge_power,
ApiMessage::Battery(super::handler::BatteryMessage::ReadChargePower(callback_charge_power)), "battery charge power");
let settings_path = wait_for_response(&*sender_locked, rx_path,
ApiMessage::General(GeneralMessage::GetPath(callback_path)), "general get path");
vec![
super::utility::map_optional(curr),
super::utility::map_optional(charge_now),
super::utility::map_optional(charge_full),
super::utility::map_optional(charge_power),
super::utility::map_optional(settings_path.to_str()),
]
}
};
super::async_utils::AsyncIshGetter {
set_get: getter,
trans_getter: |result| result,
}
}
fn build_comms<'a, T: Send + 'a>(msg: &'static str) -> (mpsc::Receiver<T>, Box<dyn FnOnce(T) + Send + 'a>) {
let (tx, rx) = mpsc::channel();
let callback = move |t: T| tx.send(t).expect(msg);
(rx, Box::new(callback))
}
fn wait_for_response<T>(sender: &Sender<ApiMessage>, rx: mpsc::Receiver<T>, api_msg: ApiMessage, op: &str) -> T {
sender.send(api_msg).expect(&format!("{} send failed", op));
rx.recv().expect(&format!("{} callback recv failed", op))
}

View file

@ -287,6 +287,10 @@ fn main() -> Result<(), ()> {
"GENERAL_on_unplugged",
api::battery::on_unplugged(api_sender.clone()),
)
.register_async(
"GENERAL_get_periodicals",
api::general::get_periodicals(api_sender.clone())
)
.register_async("MESSAGE_get", message_getter)
.register_async("MESSAGE_dismiss", message_dismisser);

View file

@ -325,3 +325,22 @@ export async function getMessages(since: number | null): Promise<Message[]> {
export async function dismissMessage(id: number): Promise<boolean> {
return (await call_backend("MESSAGE_dismiss", [id]))[0];
}
export type Periodicals = {
battery_current: number | null,
battery_charge_now: number | null,
battery_charge_full: number | null,
battery_charge_power: number | null,
settings_path: string | null,
};
export async function getPeriodicals(): Promise<Periodicals> {
const result: any[] = await call_backend("GENERAL_get_periodicals", []);
return {
battery_current: result[0],
battery_charge_now: result[1],
battery_charge_full: result[2],
battery_charge_power: result[3],
settings_path: result[4],
};
}

View file

@ -206,19 +206,20 @@ const reload = function() {
})();
const periodicals = function() {
backend.resolve(backend.getBatteryCurrent(), (rate: number) => { set_value(CURRENT_BATT, rate) });
backend.resolve(backend.getBatteryChargeNow(), (rate: number) => { set_value(CHARGE_NOW_BATT, rate) });
backend.resolve(backend.getBatteryChargeFull(), (rate: number) => { set_value(CHARGE_FULL_BATT, rate) });
backend.resolve(backend.getBatteryChargePower(), (rate: number) => { set_value(CHARGE_POWER_BATT, rate) });
backend.resolve(backend.getPeriodicals(), (periodicals) => {
set_value(CURRENT_BATT, periodicals.battery_current);
set_value(CHARGE_NOW_BATT, periodicals.battery_charge_now);
set_value(CHARGE_FULL_BATT, periodicals.battery_charge_full);
set_value(CHARGE_POWER_BATT, periodicals.battery_charge_power);
backend.resolve(backend.getGeneralSettingsPath(), (path: string) => {
const path = periodicals.settings_path;
const oldValue = get_value(PATH_GEN);
set_value(PATH_GEN, path);
if (path != oldValue) {
backend.log(backend.LogLevel.Info, "Frontend values reload triggered by path change: " + oldValue + " -> " + path);
reload();
}
});
})
};
const Content: VFC<{ serverAPI: ServerAPI }> = ({}) => {