You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.8 KiB
72 lines
2.8 KiB
import type { State } from "./device"
|
|
|
|
export default interface Assignment {
|
|
id: string
|
|
deviceIds: string[]
|
|
effect: Effect
|
|
variables: Record<string, number>
|
|
}
|
|
|
|
export interface AssignmentInput {
|
|
match: string
|
|
effect: Effect
|
|
}
|
|
|
|
export type Effect =
|
|
| { manual: State }
|
|
| { solid: { states: State[], animationMs: number, interleave: number } }
|
|
| { gradient: { states: State[], animationMs: number, reverse: boolean, interpolate: boolean } }
|
|
| { pattern: { states: State[], animationMs: number } }
|
|
| { random: { states: State[], animationMs: number, interpolate: boolean } }
|
|
| { vrange: { states: State[], variable: string, min: number, max: number, interpolate: boolean } }
|
|
|
|
export function toEffectRaw(effect?: Effect): EffectRaw {
|
|
let effectRaw: EffectRaw = { kind: "manual", states: [{color: null, intensity: null, power: null, temperature: null}], animationMs: 0, reverse: false, interpolate: false, min: 30, max: 300, variable: "motion.min", interleave: 0 };
|
|
|
|
if (effect != null) {
|
|
if ("manual" in effect) {
|
|
effectRaw = { kind: "solid", states: [effect.manual], animationMs: 0, reverse: false, interpolate: true, min: 30, max: 300, variable: "motion.min", interleave: 0 }
|
|
} else if ("solid" in effect) {
|
|
effectRaw = { kind: "solid", ...effect.solid, min: 30, max: 300, variable: "motion.min", interpolate: true, reverse: false}
|
|
} else if ("gradient" in effect) {
|
|
effectRaw = { kind: "gradient", ...effect.gradient, min: 30, max: 300, variable: "motion.min", interleave: 0 }
|
|
} else if ("pattern" in effect) {
|
|
effectRaw = { kind: "pattern", ...effect.pattern, reverse: false, interpolate: true, min: 30, max: 300, variable: "motion.min", interleave: 0 }
|
|
} else if ("random" in effect) {
|
|
effectRaw = { kind: "random", ...effect.random, reverse: false, min: 30, max: 300, variable: "motion.min", interleave: 0 }
|
|
} else if ("vrange" in effect) {
|
|
effectRaw = { kind: "vrange", ...effect.vrange, animationMs: 0, reverse: false, interleave: 0 }
|
|
}
|
|
}
|
|
|
|
effectRaw.states.forEach(state => {
|
|
if (state.intensity !== null) {
|
|
state.intensity = Math.floor(state.intensity * 100) / 100;
|
|
}
|
|
})
|
|
|
|
return effectRaw;
|
|
}
|
|
|
|
export function fromEffectRaw(raw: EffectRaw): Effect {
|
|
switch (raw.kind) {
|
|
case "manual": return { manual: raw.states[0] };
|
|
case "solid": return { solid: {...raw} };
|
|
case "gradient": return { gradient: {...raw} };
|
|
case "pattern": return { pattern: {...raw} };
|
|
case "random": return { random: {...raw} };
|
|
case "vrange": return { vrange: {...raw} };
|
|
}
|
|
}
|
|
|
|
export interface EffectRaw {
|
|
kind: "manual" | "solid" | "gradient" | "pattern" | "random" | "vrange"
|
|
states: State[]
|
|
animationMs: number
|
|
reverse: boolean
|
|
interpolate: boolean
|
|
interleave: number
|
|
variable: string
|
|
min: number
|
|
max: number
|
|
}
|