jiggler settings now persist

This commit is contained in:
JackTheRooster 2025-03-24 23:47:37 -05:00
parent 5515d33b09
commit 7f29d5a08f
5 changed files with 60 additions and 52 deletions

View File

@ -48,9 +48,8 @@ var defaultConfig = &Config{
DisplayDimAfterSec: 120, // 2 minutes DisplayDimAfterSec: 120, // 2 minutes
DisplayOffAfterSec: 1800, // 30 minutes DisplayOffAfterSec: 1800, // 30 minutes
JigglerConfig: &JigglerConfig{ JigglerConfig: &JigglerConfig{
ActiveAfterSeconds: 20, InactivityLimitSeconds: 20,
JitterEnabled: false, JitterPercentage: 0.0,
JitterPercentage: .25,
ScheduleCronTab: "*/5 * * * * *", ScheduleCronTab: "*/5 * * * * *",
}, },
TLSMode: "", TLSMode: "",

View File

@ -7,8 +7,7 @@ import (
) )
type JigglerConfig struct { type JigglerConfig struct {
ActiveAfterSeconds int `json:"active_after_seconds"` InactivityLimitSeconds float64 `json:"inactivity_limit_seconds"`
JitterEnabled bool `json:"jitter_enabled"`
JitterPercentage float64 `json:"jitter_percentage"` JitterPercentage float64 `json:"jitter_percentage"`
ScheduleCronTab string `json:"schedule_cron_tab"` ScheduleCronTab string `json:"schedule_cron_tab"`
} }
@ -94,13 +93,13 @@ func runJigglerCronTab() error {
func runJiggler() { func runJiggler() {
if jigglerEnabled { if jigglerEnabled {
if config.JigglerConfig.JitterEnabled { if config.JigglerConfig.JitterPercentage != 0 {
jitter := calculateJitterDuration(jobDelta) jitter := calculateJitterDuration(jobDelta)
logger.Infof("Jitter enabled, Sleeping for %v", jitter) logger.Infof("Jitter enabled, Sleeping for %v", jitter)
time.Sleep(jitter) time.Sleep(jitter)
} }
activeAfterSeconds := config.JigglerConfig.ActiveAfterSeconds inactivitySeconds := config.JigglerConfig.InactivityLimitSeconds
if time.Since(lastUserInput) > time.Duration(activeAfterSeconds)*time.Second { if time.Since(lastUserInput) > time.Duration(inactivitySeconds)*time.Second {
//TODO: change to rel mouse //TODO: change to rel mouse
err := rpcAbsMouseReport(1, 1, 0) err := rpcAbsMouseReport(1, 1, 0)
if err != nil { if err != nil {

View File

@ -807,7 +807,7 @@ var rpcHandlers = map[string]RPCHandler{
"rpcMountBuiltInImage": {Func: rpcMountBuiltInImage, Params: []string{"filename"}}, "rpcMountBuiltInImage": {Func: rpcMountBuiltInImage, Params: []string{"filename"}},
"setJigglerState": {Func: rpcSetJigglerState, Params: []string{"enabled"}}, "setJigglerState": {Func: rpcSetJigglerState, Params: []string{"enabled"}},
"getJigglerState": {Func: rpcGetJigglerState}, "getJigglerState": {Func: rpcGetJigglerState},
"setJigglerConfig": {Func: rpcSetJigglerConfig, Params: []string{"setJigglerConfig"}}, "setJigglerConfig": {Func: rpcSetJigglerConfig, Params: []string{"jigglerConfig"}},
"getJigglerConfig": {Func: rpcGetJigglerConfig}, "getJigglerConfig": {Func: rpcGetJigglerConfig},
"sendWOLMagicPacket": {Func: rpcSendWOLMagicPacket, Params: []string{"macAddress"}}, "sendWOLMagicPacket": {Func: rpcSendWOLMagicPacket, Params: []string{"macAddress"}},
"getStreamQualityFactor": {Func: rpcGetStreamQualityFactor}, "getStreamQualityFactor": {Func: rpcGetStreamQualityFactor},

View File

@ -7,8 +7,7 @@ import { useJsonRpc } from "../hooks/useJsonRpc";
import notifications from "../notifications"; import notifications from "../notifications";
export interface JigglerConfig { export interface JigglerConfig {
active_after_seconds: number; inactivity_limit_seconds: number;
jitter_enabled: boolean;
jitter_percentage: number; jitter_percentage: number;
schedule_cron_tab: string; schedule_cron_tab: string;
} }
@ -18,26 +17,25 @@ export function JigglerSetting() {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [jigglerConfigState, setJigglerConfigState] = useState<JigglerConfig>({ const [jigglerConfigState, setJigglerConfigState] = useState<JigglerConfig>({
active_after_seconds: 0, inactivity_limit_seconds: 20.0,
jitter_enabled: false,
jitter_percentage: 0.0, jitter_percentage: 0.0,
schedule_cron_tab: "*/20 * * * * *" schedule_cron_tab: "*/20 * * * * *"
}); });
useEffect(() => { const syncJigglerConfig = useCallback(() => {
send("getJigglerConfig", {}, resp => { send("getJigglerConfig", {}, resp => {
if ("error" in resp) return; if ("error" in resp) return;
setJigglerConfigState(resp.result as JigglerConfig); setJigglerConfigState(resp.result as JigglerConfig);
}); });
}, [send]); }, [send]);
// const handleJigglerActiveAfterSecondsChange = (value: number) => { useEffect(() => {
// setJigglerConfig({ ...jigglerConfig, active_after_seconds: value }); syncJigglerConfig()
// }; }, [send, syncJigglerConfig]);
//
// const handleJigglerJitterEnabledChange = (value: boolean) => { const handleJigglerInactivityLimitSecondsChange = (value: string) => {
// setJigglerConfig({ ...jigglerConfig, jitter_enabled: value }); setJigglerConfigState({ ...jigglerConfigState, inactivity_limit_seconds: Number(value) });
// }; };
// //
// const handleJigglerJitterPercentageChange = (value: number) => { // const handleJigglerJitterPercentageChange = (value: number) => {
// setJigglerConfig({ ...jigglerConfig, jitter_percentage: value }); // setJigglerConfig({ ...jigglerConfig, jitter_percentage: value });
@ -58,14 +56,14 @@ export function JigglerSetting() {
setLoading(false); setLoading(false);
return; return;
} }
setLoading(false); setLoading(false);
notifications.success( notifications.success(
`Jiggler Config successfully updated`, `Jiggler Config successfully updated`,
); );
syncJigglerConfig();
}); });
}, },
[send], [send, syncJigglerConfig],
); );
return ( return (
@ -74,10 +72,17 @@ export function JigglerSetting() {
<InputFieldWithLabel <InputFieldWithLabel
required required
label="Jiggler Schedule" label="Jiggler Schedule"
placeholder="Enter Crontab" placeholder="*/20 * * * * * (Every 20 seconds)"
defaultValue={jigglerConfigState?.schedule_cron_tab} value={jigglerConfigState?.schedule_cron_tab}
onChange={e => handleJigglerScheduleCronTabChange(e.target.value)} onChange={e => handleJigglerScheduleCronTabChange(e.target.value)}
/> />
<InputFieldWithLabel
required
label="Inactivity Limit (Seconds)"
placeholder="20"
value={jigglerConfigState?.inactivity_limit_seconds}
onChange={e => handleJigglerInactivityLimitSecondsChange(e.target.value)}
/>
</div> </div>
<div className="mt-6 flex gap-x-2"> <div className="mt-6 flex gap-x-2">
<Button <Button

View File

@ -12,7 +12,8 @@ import { FeatureFlag } from "../components/FeatureFlag";
import { SelectMenuBasic } from "../components/SelectMenuBasic"; import { SelectMenuBasic } from "../components/SelectMenuBasic";
import { useFeatureFlag } from "../hooks/useFeatureFlag"; import { useFeatureFlag } from "../hooks/useFeatureFlag";
import { SettingsItem } from "./devices.$id.settings"; import { SettingsItem } from "./devices.$id.settings";
import {JigglerSetting} from "@components/JigglerSetting"; import { JigglerSetting } from "@components/JigglerSetting";
import { SettingsSectionHeader } from "@components/SettingsSectionHeader";
type ScrollSensitivity = "low" | "default" | "high"; type ScrollSensitivity = "low" | "default" | "high";
@ -130,12 +131,16 @@ export default function SettingsKeyboardMouseRoute() {
onChange={e => handleJigglerChange(e.target.checked)} onChange={e => handleJigglerChange(e.target.checked)}
/> />
</SettingsItem> </SettingsItem>
<SettingsItem
title="Jiggler Settings" {jiggler && (
description="Configure jiggler for advanced functionality" <>
> <SettingsSectionHeader
title="Jiggler Config"
description="Control the jiggler schedule"
/>
<JigglerSetting /> <JigglerSetting />
</SettingsItem> </>
)}
<div className="space-y-4"> <div className="space-y-4">
<SettingsItem title="Modes" description="Choose the mouse input mode" /> <SettingsItem title="Modes" description="Choose the mouse input mode" />
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">