Files
SpotMicroESP32-Leika/app/src/routes/peripherals/servo/servos.svelte
T
2026-01-03 22:15:00 +01:00

86 lines
2.6 KiB
Svelte

<script lang="ts">
import { ServoPWMData, ServoStateData } from '$lib/platform_shared/message'
import { socket } from '$lib/stores'
import { Throttler } from '$lib/utilities'
let { servoId = $bindable(0), pwm = $bindable(306) } = $props()
let active = $state(false)
let allServos = $state(false)
const throttler = new Throttler()
const activateServo = () => {
socket.emit(ServoStateData, ServoStateData.create({ active: true }))
}
const deactivateServo = () => {
socket.emit(ServoStateData, ServoStateData.create({ active: false }))
}
const updatePWM = () => {
throttler.throttle(() => {
socket.emit(ServoPWMData, ServoPWMData.create({ servoId: servoId, servoPwm: pwm }))
}, 10)
}
const toggleMode = () => {
servoId = allServos ? -1 : 0
}
</script>
<div class="flex flex-col gap-6 p-4 bg-base-200 rounded-xl">
<div class="flex flex-col gap-2">
<h2 class="text-lg font-semibold">PWM Control</h2>
<div class="flex items-center justify-between">
<span class="text-sm opacity-70">PWM Value</span>
<span class="text-2xl font-mono font-bold text-primary">{pwm}</span>
</div>
<input
type="range"
min="80"
max="600"
bind:value={pwm}
oninput={updatePWM}
class="range range-primary"
/>
</div>
<div class="divider my-0"></div>
<div class="flex flex-col gap-3">
<h2 class="text-lg font-semibold">Servo Selection</h2>
<label class="flex items-center justify-between cursor-pointer">
<span>All servos</span>
<input
type="checkbox"
class="toggle toggle-primary"
bind:checked={allServos}
onchange={toggleMode}
/>
</label>
<label class="flex items-center justify-between cursor-pointer">
<span>Active</span>
<input
type="checkbox"
class="toggle toggle-success"
bind:checked={active}
onchange={active ? activateServo : deactivateServo}
/>
</label>
<label class="flex items-center justify-between">
<span>Servo {servoId}</span>
<input
type="range"
min="0"
max="11"
step="1"
bind:value={servoId}
class="range range-sm w-32"
disabled={allServos}
/>
</label>
</div>
</div>