From 7f29d5a08f89af4b9387b4c88e84c28ef101fd4e Mon Sep 17 00:00:00 2001 From: JackTheRooster Date: Mon, 24 Mar 2025 23:47:37 -0500 Subject: [PATCH] jiggler settings now persist --- config.go | 7 +- jiggler.go | 13 ++-- jsonrpc.go | 2 +- ui/src/components/JigglerSetting.tsx | 71 +++++++++++--------- ui/src/routes/devices.$id.settings.mouse.tsx | 19 ++++-- 5 files changed, 60 insertions(+), 52 deletions(-) diff --git a/config.go b/config.go index a6d878e..cb1d35e 100644 --- a/config.go +++ b/config.go @@ -48,10 +48,9 @@ var defaultConfig = &Config{ DisplayDimAfterSec: 120, // 2 minutes DisplayOffAfterSec: 1800, // 30 minutes JigglerConfig: &JigglerConfig{ - ActiveAfterSeconds: 20, - JitterEnabled: false, - JitterPercentage: .25, - ScheduleCronTab: "*/5 * * * * *", + InactivityLimitSeconds: 20, + JitterPercentage: 0.0, + ScheduleCronTab: "*/5 * * * * *", }, TLSMode: "", UsbConfig: &usbgadget.Config{ diff --git a/jiggler.go b/jiggler.go index f35f2df..7a40271 100644 --- a/jiggler.go +++ b/jiggler.go @@ -7,10 +7,9 @@ import ( ) type JigglerConfig struct { - ActiveAfterSeconds int `json:"active_after_seconds"` - JitterEnabled bool `json:"jitter_enabled"` - JitterPercentage float64 `json:"jitter_percentage"` - ScheduleCronTab string `json:"schedule_cron_tab"` + InactivityLimitSeconds float64 `json:"inactivity_limit_seconds"` + JitterPercentage float64 `json:"jitter_percentage"` + ScheduleCronTab string `json:"schedule_cron_tab"` } var lastUserInput = time.Now() @@ -94,13 +93,13 @@ func runJigglerCronTab() error { func runJiggler() { if jigglerEnabled { - if config.JigglerConfig.JitterEnabled { + if config.JigglerConfig.JitterPercentage != 0 { jitter := calculateJitterDuration(jobDelta) logger.Infof("Jitter enabled, Sleeping for %v", jitter) time.Sleep(jitter) } - activeAfterSeconds := config.JigglerConfig.ActiveAfterSeconds - if time.Since(lastUserInput) > time.Duration(activeAfterSeconds)*time.Second { + inactivitySeconds := config.JigglerConfig.InactivityLimitSeconds + if time.Since(lastUserInput) > time.Duration(inactivitySeconds)*time.Second { //TODO: change to rel mouse err := rpcAbsMouseReport(1, 1, 0) if err != nil { diff --git a/jsonrpc.go b/jsonrpc.go index f5dd3b4..c9663ec 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -807,7 +807,7 @@ var rpcHandlers = map[string]RPCHandler{ "rpcMountBuiltInImage": {Func: rpcMountBuiltInImage, Params: []string{"filename"}}, "setJigglerState": {Func: rpcSetJigglerState, Params: []string{"enabled"}}, "getJigglerState": {Func: rpcGetJigglerState}, - "setJigglerConfig": {Func: rpcSetJigglerConfig, Params: []string{"setJigglerConfig"}}, + "setJigglerConfig": {Func: rpcSetJigglerConfig, Params: []string{"jigglerConfig"}}, "getJigglerConfig": {Func: rpcGetJigglerConfig}, "sendWOLMagicPacket": {Func: rpcSendWOLMagicPacket, Params: []string{"macAddress"}}, "getStreamQualityFactor": {Func: rpcGetStreamQualityFactor}, diff --git a/ui/src/components/JigglerSetting.tsx b/ui/src/components/JigglerSetting.tsx index 001c364..5a4c3e3 100644 --- a/ui/src/components/JigglerSetting.tsx +++ b/ui/src/components/JigglerSetting.tsx @@ -7,8 +7,7 @@ import { useJsonRpc } from "../hooks/useJsonRpc"; import notifications from "../notifications"; export interface JigglerConfig { - active_after_seconds: number; - jitter_enabled: boolean; + inactivity_limit_seconds: number; jitter_percentage: number; schedule_cron_tab: string; } @@ -18,26 +17,25 @@ export function JigglerSetting() { const [loading, setLoading] = useState(false); const [jigglerConfigState, setJigglerConfigState] = useState({ - active_after_seconds: 0, - jitter_enabled: false, - jitter_percentage: 0.0, - schedule_cron_tab: "*/20 * * * * *" + inactivity_limit_seconds: 20.0, + jitter_percentage: 0.0, + schedule_cron_tab: "*/20 * * * * *" }); - useEffect(() => { + const syncJigglerConfig = useCallback(() => { send("getJigglerConfig", {}, resp => { if ("error" in resp) return; setJigglerConfigState(resp.result as JigglerConfig); }); }, [send]); - // const handleJigglerActiveAfterSecondsChange = (value: number) => { - // setJigglerConfig({ ...jigglerConfig, active_after_seconds: value }); - // }; - // - // const handleJigglerJitterEnabledChange = (value: boolean) => { - // setJigglerConfig({ ...jigglerConfig, jitter_enabled: value }); - // }; + useEffect(() => { + syncJigglerConfig() + }, [send, syncJigglerConfig]); + + const handleJigglerInactivityLimitSecondsChange = (value: string) => { + setJigglerConfigState({ ...jigglerConfigState, inactivity_limit_seconds: Number(value) }); + }; // // const handleJigglerJitterPercentageChange = (value: number) => { // setJigglerConfig({ ...jigglerConfig, jitter_percentage: value }); @@ -48,24 +46,24 @@ export function JigglerSetting() { }; const handleJigglerConfigChange = useCallback( - (jigglerConfig: JigglerConfig) => { - setLoading(true); - send("setJigglerConfig", { jigglerConfig }, async resp => { - if ("error" in resp) { - notifications.error( - `Failed to set jiggler config: ${resp.error.data || "Unknown error"}`, - ); - setLoading(false); - return; - } - - setLoading(false); - notifications.success( - `Jiggler Config successfully updated`, + (jigglerConfig: JigglerConfig) => { + setLoading(true); + send("setJigglerConfig", { jigglerConfig }, async resp => { + if ("error" in resp) { + notifications.error( + `Failed to set jiggler config: ${resp.error.data || "Unknown error"}`, ); - }); - }, - [send], + setLoading(false); + return; + } + setLoading(false); + notifications.success( + `Jiggler Config successfully updated`, + ); + syncJigglerConfig(); + }); + }, + [send, syncJigglerConfig], ); return ( @@ -74,10 +72,17 @@ export function JigglerSetting() { handleJigglerScheduleCronTabChange(e.target.value)} /> + handleJigglerInactivityLimitSecondsChange(e.target.value)} + />