Skip to content

Commit

Permalink
chore(serpenta-app): shortcut engine
Browse files Browse the repository at this point in the history
  • Loading branch information
Zakrok09 committed Aug 29, 2024
1 parent d842aeb commit d8a84ef
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 45 deletions.
4 changes: 2 additions & 2 deletions packages/serpenta-app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/serpenta-app/template/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
},
"type": "module",
"dependencies": {
"@delft-hyperloop/serpenta": "0.3.1",
"@delft-hyperloop/serpenta": "0.4.1",
"@tauri-apps/api": "^1.6.0",
"zod": "^3.23.4"
}
Expand Down
126 changes: 85 additions & 41 deletions packages/serpenta-app/template/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,103 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use rand::{Rng, thread_rng};
use tauri::WindowEvent;

#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, PartialOrd, Ord)]
pub enum Datatype {
Datatype1,
Datatype2,
Datatype3,
Datatype4,
Datatype5,
Datatype6,
Datatype7,
Datatype1,
Datatype2,
Datatype3,
Datatype4,
Datatype5,
Datatype6,
Datatype7,
}

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Datapoint {
pub datatype: Datatype,
pub value: u64,
pub timestamp: u64,
pub datatype: Datatype,
pub value: u64,
pub timestamp: u64,
}

#[tauri::command]
fn generate_test_data() -> Vec<Datapoint> {
let mut rng = thread_rng();
let mut datapoints = Vec::new();

let value: u64 = rng.gen_range(0..101);
let value2: u64 = rng.gen_range(0..101);
let value3: u64 = rng.gen_range(0..101);
let value4: u64 = rng.gen_range(0..300);

let datapoint = Datapoint { value, datatype: Datatype::Datatype3, timestamp: 0 };
let datapoint2 = Datapoint { value: value2, datatype: Datatype::Datatype4, timestamp: 0 };
let datapoint3 = Datapoint { value: 1, datatype: Datatype::Datatype5, timestamp: 0 };
let datapoint4 = Datapoint { value: 2, datatype: Datatype::Datatype6, timestamp: 0 };
let datapoint5 = Datapoint { value: 3, datatype: Datatype::Datatype7, timestamp: 0 };
let datapoint6 =
Datapoint { value: value3, datatype: Datatype::Datatype1, timestamp: 0 };
let datapoint7 =
Datapoint { value: value4, datatype: Datatype::Datatype2, timestamp: 0 };

datapoints.push(datapoint);
datapoints.push(datapoint2);
datapoints.push(datapoint3);
datapoints.push(datapoint4);
datapoints.push(datapoint5);
datapoints.push(datapoint6);
datapoints.push(datapoint7);

datapoints
let mut rng = thread_rng();
let mut datapoints = Vec::new();

let value: u64 = rng.gen_range(0..101);
let value2: u64 = rng.gen_range(0..101);
let value3: u64 = rng.gen_range(0..101);
let value4: u64 = rng.gen_range(0..300);

let datapoint = Datapoint { value, datatype: Datatype::Datatype3, timestamp: 0 };
let datapoint2 = Datapoint { value: value2, datatype: Datatype::Datatype4, timestamp: 0 };
let datapoint3 = Datapoint { value: 1, datatype: Datatype::Datatype5, timestamp: 0 };
let datapoint4 = Datapoint { value: 2, datatype: Datatype::Datatype6, timestamp: 0 };
let datapoint5 = Datapoint { value: 3, datatype: Datatype::Datatype7, timestamp: 0 };
let datapoint6 =
Datapoint { value: value3, datatype: Datatype::Datatype1, timestamp: 0 };
let datapoint7 =
Datapoint { value: value4, datatype: Datatype::Datatype2, timestamp: 0 };

datapoints.push(datapoint);
datapoints.push(datapoint2);
datapoints.push(datapoint3);
datapoints.push(datapoint4);
datapoints.push(datapoint5);
datapoints.push(datapoint6);
datapoints.push(datapoint7);

datapoints
}

fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![generate_test_data])
.run(tauri::generate_context!())
.expect("error while running tauri application");
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![generate_test_data])
.run(tauri::generate_context!())
.setup(move |app| {
let app_handle = app.handle();
let window = app_handle.get_window("main").unwrap();

let s = app_handle.clone();
let shortcuts = app_handle.global_shortcut_manager();

window.on_window_event(move |event| {
let mut sh = shortcuts.clone();
match event {
WindowEvent::Focused(true) => {
// Register shortcuts when window is focused
let ss = s.clone();
sh.register("Space", move || {
/*
@todo SEND A COMMAND FOR EMERGENCY BRAKE TO POD
send_command("EmergencyBrake".into(), 0);
*/
ss.emit_all("status_channel", "Emergency Brake triggered!;red").unwrap();
ss.emit_all("error_channel", "Emergency Brake triggered!").unwrap()
})
.expect("Could not register shortcut");

let ss = s.clone();
sh.register("Esc", move || {
/*
@todo SEND A COMMAND FOR EMERGENCY BRAKE TO POD
send_command("EmergencyBrake".into(), 0);
*/
ss.emit_all("error_channel", "Emergency Brake triggered!").unwrap();
ss.emit_all("status_channel", "Emergency Brake triggered!;red").unwrap();
})
.expect("Could not register shortcut");
}
WindowEvent::Focused(false) => {
// Unregister shortcuts when window loses focus
sh.unregister("Esc").expect("Could not unregister shortcut");
sh.unregister("Space").expect("Could not unregister shortcut");
}
_ => {}
}
});
})
.expect("error while running tauri application");
}
22 changes: 21 additions & 1 deletion packages/serpenta-app/template/src/routes/+layout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
import { GrandDataDistributor } from "$lib/util/GrandDataDistributor";
import { WindowCreator } from "$lib/util/WindowControl";
import { CommandInvoker } from "$lib/util/CommandInvoker";
import { listen } from "@tauri-apps/api/event";
import { invoke } from "@tauri-apps/api/tauri";
import { onDestroy } from "svelte";
const gdd = GrandDataDistributor.getInstance();
gdd.registerStore("Datatype1", 0, undefined, "V");
Expand All @@ -35,11 +38,28 @@
pod_name: "Helios III",
// @todo: see if you will use the default grand data distributor - K.P.
grand_data_distributor: gdd,
data_distributor: gdd,
window_engine: wm,
command_invocation: ci,
latest_timestamp: latestTimestamp
});
// shortcut engine
const unlisten = listen('shortcut_channel', (event: { payload: string }) => parseShortCut(event.payload));
const parseShortCut = async (shortcut:string):Promise<void> => {
const tabMatch = shortcut.match(/^tab_(\d)$/);
if (shortcut === "emergency_brake") {
console.log("Emergency brake");
await invoke('send_command', {cmdName: "EmergencyBrake", val: 0});
} else if (shortcut === "heartbeat") {
await invoke('send_command', {cmdName: "FrontendHeartbeat", val: 0});
}
}
onDestroy(() => unlisten);
//
</script>

<SerpentaShell config={config}>
Expand Down

0 comments on commit d8a84ef

Please sign in to comment.