mirror of https://github.com/jetkvm/kvm.git
jiggler settings now persist
This commit is contained in:
parent
5515d33b09
commit
7f29d5a08f
|
@ -48,10 +48,9 @@ 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: "",
|
||||||
UsbConfig: &usbgadget.Config{
|
UsbConfig: &usbgadget.Config{
|
||||||
|
|
13
jiggler.go
13
jiggler.go
|
@ -7,10 +7,9 @@ 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"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastUserInput = time.Now()
|
var lastUserInput = time.Now()
|
||||||
|
@ -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 {
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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 });
|
||||||
|
@ -48,24 +46,24 @@ export function JigglerSetting() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleJigglerConfigChange = useCallback(
|
const handleJigglerConfigChange = useCallback(
|
||||||
(jigglerConfig: JigglerConfig) => {
|
(jigglerConfig: JigglerConfig) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
send("setJigglerConfig", { jigglerConfig }, async resp => {
|
send("setJigglerConfig", { jigglerConfig }, async resp => {
|
||||||
if ("error" in resp) {
|
if ("error" in resp) {
|
||||||
notifications.error(
|
notifications.error(
|
||||||
`Failed to set jiggler config: ${resp.error.data || "Unknown error"}`,
|
`Failed to set jiggler config: ${resp.error.data || "Unknown error"}`,
|
||||||
);
|
|
||||||
setLoading(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLoading(false);
|
|
||||||
notifications.success(
|
|
||||||
`Jiggler Config successfully updated`,
|
|
||||||
);
|
);
|
||||||
});
|
setLoading(false);
|
||||||
},
|
return;
|
||||||
[send],
|
}
|
||||||
|
setLoading(false);
|
||||||
|
notifications.success(
|
||||||
|
`Jiggler Config successfully updated`,
|
||||||
|
);
|
||||||
|
syncJigglerConfig();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[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
|
||||||
|
|
|
@ -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
|
||||||
<JigglerSetting />
|
title="Jiggler Config"
|
||||||
</SettingsItem>
|
description="Control the jiggler schedule"
|
||||||
|
/>
|
||||||
|
<JigglerSetting />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
<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">
|
||||||
|
|
Loading…
Reference in New Issue