-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
143 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import * as Rete from "rete"; | ||
import { NodeData, WorkerInputs } from "rete/types/core/data"; | ||
import { FrameLimiterConverter } from "../../converters/FrameLimiterConverter"; | ||
import { BackendInstanceManager } from "../backendInstanceManager"; | ||
import { ReteTask } from "../reteTask.interface"; | ||
|
||
interface FrameLimiterComponentParams { | ||
fps: number; | ||
} | ||
|
||
export class FrameLimiterComponentWorker extends Rete.Component { | ||
constructor(protected instMgr: BackendInstanceManager) { | ||
super("Frame Limiter"); | ||
} | ||
|
||
tasks: { [id: number]: ReteTask } = {}; | ||
|
||
[x: string]: any; // make Typescript happy (allow arbitrary member variables, as there is no definition file for Rete Tasks) | ||
task = { | ||
outputs: { frame: 'option' }, | ||
init: (task: ReteTask, node: NodeData) => { // gets called on engine.process | ||
this.tasks[node.id] = task; | ||
task.run(null); // init node instance with parameters from inputs (has to be done via the worker) | ||
} | ||
} | ||
|
||
async builder(node: Rete.Node) { | ||
// see node builder definition in webinterface/frontend/src/node-editor/components | ||
} | ||
|
||
initBackend = async (node: NodeData, inputs: WorkerInputs) => { | ||
// get node parameters | ||
const fps = (inputs['fps']?.length ? inputs['fps'][0] : node.data.fps) as number; | ||
|
||
// check for undefined parameters | ||
if (fps == undefined) { | ||
return; | ||
} | ||
|
||
const params: FrameLimiterComponentParams = { | ||
fps: fps | ||
}; | ||
|
||
this.instMgr.createOrReconfigureInstance(node, params, () => | ||
new FrameLimiterConverter(fps) | ||
); | ||
} | ||
|
||
async worker(node: NodeData, inputs: WorkerInputs, data: any) { | ||
// TODO: do parameter getting and precalculation only once during init | ||
if (data === null) { | ||
this.closed = ['frame']; // stop propagating event | ||
this.component.initBackend(node, inputs); // worker is run outside of current class context, so we need to acess initBackend via .component | ||
} | ||
else if (this.component.instMgr.getInstance(node)?.instance) { | ||
let frame = await this.component.instMgr.getInstance(node).instance.convert(data.frame); | ||
if (frame !== null) { | ||
this.closed = []; // enable propagating event again | ||
data.fromId = node.id; | ||
} | ||
else { | ||
this.closed = ['frame']; // stop propagating event | ||
} | ||
|
||
} | ||
else { | ||
this.closed = ['frame']; // stop propagating event | ||
} | ||
|
||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import { Frame } from "../common/frame.interface"; | ||
|
||
export class FrameLimiterConverter { | ||
lastFrame = 0; | ||
minimumFrameTime: number; // ms | ||
|
||
constructor(protected fps: number) { | ||
this.minimumFrameTime = 1000 / fps; | ||
} | ||
|
||
// returns null, if frame needs to be dropped | ||
async convert(frame: Frame): Promise<Frame> { | ||
if ((Date.now() - this.lastFrame) > this.minimumFrameTime) { | ||
this.lastFrame = Date.now(); | ||
return frame; | ||
} | ||
else { | ||
return null; | ||
} | ||
} | ||
|
||
} |
26 changes: 26 additions & 0 deletions
26
src/webinterface/frontend/src/node-editor/components/frameLimiterComponent.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
import * as Rete from "rete"; | ||
import { NodeData, WorkerInputs, WorkerOutputs } from "rete/types/core/data"; | ||
import { NumControl } from "../controls/numControl"; | ||
import { FrameSocket, NumSocket } from "../sockets/sockets"; | ||
|
||
export class FrameLimiterComponent extends Rete.Component { | ||
constructor() { | ||
super("Frame Limiter"); | ||
} | ||
|
||
async builder(node: Rete.Node) { | ||
const fps = new Rete.Input('fps', "FPS", NumSocket); | ||
const framesIn = new Rete.Input('frameIn', "Frame Input", FrameSocket); | ||
const frameOut = new Rete.Output('frame', "Frame", FrameSocket); | ||
|
||
fps.addControl(new NumControl(this.editor, 'fps', undefined, undefined, 0, undefined, 0.01)); | ||
|
||
node.addInput(fps); | ||
node.addInput(framesIn); | ||
node.addOutput(frameOut); | ||
} | ||
|
||
worker(node: NodeData, inputs: WorkerInputs, outputs: WorkerOutputs) { | ||
// do nothing for now | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 15 additions & 2 deletions
17
src/webinterface/frontend/src/node-editor/controls/numControl.vue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,7 @@ import { PixelMapComponentWorker } from "../common/worker/pixelMapComponentWorke | |
import { OPCMultiOutputComponentWorker } from "../common/worker/opcMultiOutputComponentWorker"; | ||
import { Tpm2NetInputComponentWorker } from "../common/worker/tpm2NetInputComponentWorker"; | ||
import { SerialOutputComponentWorker } from "../common/worker/SerialOutputComponentWorker"; | ||
import { FrameLimiterComponentWorker } from "../common/worker/frameLimiterComponentWorker"; | ||
|
||
|
||
export class NodeEngine { | ||
|
@@ -34,6 +35,7 @@ export class NodeEngine { | |
new OPCMultiOutputComponentWorker(this.instMgr), | ||
new Tpm2NetInputComponentWorker(this.instMgr), | ||
new SerialOutputComponentWorker(this.instMgr), | ||
new FrameLimiterComponentWorker(this.instMgr), | ||
]; | ||
this.engine = new Rete.Engine('[email protected]'); | ||
this.engine.use(TaskPlugin); | ||
|