This commit is contained in:
Kai Vogelgesang 2021-11-10 00:57:05 +01:00
parent 1bc7c6ab27
commit abb0476a17
Signed by: kai
GPG Key ID: 0A95D3B6E62C0879
4 changed files with 42 additions and 42 deletions

View File

@ -4,10 +4,13 @@ import { blackout } from '../patterns/blackout';
import { Pattern, PatternOutput, Time } from '../patterns/proto';
import { TestPattern } from '../patterns/test';
import rust, { BeatTrackerHandle, MovingHeadState, OutputHandle } from 'rust_native_module';
import { ChaserPattern } from '../patterns/chaser';
type AppState = {
patterns: { [key: string]: PatternOutput },
selectedPattern: string | null,
beatProgress: number | null,
};
class Backend {
@ -16,8 +19,10 @@ class Backend {
dmxOutput: OutputHandle;
patterns: Map<string, Pattern>;
patternOutputs: Map<string, PatternOutput>;
selectedPattern: string;
// patternOutputs: Map<string, PatternOutput>;
// selectedPattern: string;
state: AppState;
constructor() {
@ -50,61 +55,60 @@ class Backend {
this.patterns = new Map();
this.patterns.set("test", new TestPattern());
this.patterns.set("chaser", new ChaserPattern());
this.patternOutputs = new Map();
this.selectedPattern = "test";
this.state = {
patterns: {},
selectedPattern: null,
beatProgress: null,
}
let time: Time = {
absolute: 0,
beat_relative: null
beatRelative: this.state.beatProgress,
}
for (let [patternId, pattern] of this.patterns.entries()) {
this.patternOutputs.set(patternId, pattern.render(time));
let patternOutput = pattern.render(time);
this.state.patterns[patternId] = patternOutput;
}
ipcMain.handle('poll', async (_) => {
return this.getState();
});
}
getState(): AppState {
let result: AppState = {
patterns: {},
selectedPattern: this.selectedPattern,
}
for (let [patternId, patternOutput] of this.patternOutputs) {
result.patterns[patternId] = patternOutput;
}
return result;
return this.state;
}
update() {
let beatProgress = this.beatTracker.getProgress();
if (beatProgress.type == 'some') {
this.state.beatProgress = beatProgress.value;
} else {
this.state.beatProgress = null;
}
let date = new Date();
let time: Time = {
absolute: date.getTime() / 1000,
beat_relative: null,
beatRelative: this.state.beatProgress,
}
// render all patterns
if (!this.patterns) {
console.log("big oof?");
throw new Error("???");
}
for (let [patternId, pattern] of this.patterns.entries()) {
this.patternOutputs.set(patternId, pattern.render(time));
}
// write selected pattern
// render all patterns and write selected pattern to DMX
let output: Array<MovingHeadState> = blackout;
if (this.selectedPattern !== null) {
let selectedPatternOutput = this.patternOutputs.get(this.selectedPattern)
for (let [patternId, pattern] of this.patterns.entries()) {
let patternOutput = pattern.render(time);
this.state.patterns[patternId] = patternOutput;
if (selectedPatternOutput) {
output = selectedPatternOutput;
if (patternId === this.state.selectedPattern && patternOutput) {
output = patternOutput;
}
}

View File

@ -11,7 +11,7 @@
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import path from 'path';
import { app, BrowserWindow, ipcMain, shell } from 'electron';
import { app, BrowserWindow, shell } from 'electron';
import { resolveHtmlPath } from './util';
import Backend from './backend';
@ -19,10 +19,6 @@ let backend = new Backend();
let mainLoop = setInterval(() => { backend.update(); }, 20);
ipcMain.handle('poll', () => {
return backend.getState();
});
let mainWindow: BrowserWindow | null = null;
const createWindow = async () => {

View File

@ -4,11 +4,11 @@ import { Pattern, PatternOutput, Time } from './proto';
export class ChaserPattern implements Pattern {
render(time: Time): PatternOutput {
if (time.beat_relative === null) {
if (time.beatRelative === null) {
return null;
}
let head_number = Math.ceil(time.beat_relative) % 4;
let head_number = Math.ceil(time.beatRelative) % 4;
let template: MovingHeadState = {
startAddress: 0,
@ -26,7 +26,7 @@ export class ChaserPattern implements Pattern {
let result = [];
for (let [i, startAddress] of [1, 15, 29, 43].entries()) {
result[i] = template;
result[i] = { ...template};
result[i].startAddress = startAddress;
if (i === head_number) {

View File

@ -2,7 +2,7 @@ import { MovingHeadState } from "rust_native_module";
export type Time = {
absolute: number,
beat_relative: number | null,
beatRelative: number | null,
};
export type PatternOutput = Array<MovingHeadState> | null;