restructure parsing
This commit is contained in:
parent
e13e57a66b
commit
7a03bc121b
2 changed files with 90 additions and 33 deletions
84
lights.js
84
lights.js
|
@ -37,24 +37,60 @@ export function set_pattern(pat) {
|
||||||
log.debug("pattern set");
|
log.debug("pattern set");
|
||||||
}
|
}
|
||||||
|
|
||||||
export const functions = {
|
export class Function {
|
||||||
random: (index, args, prev) => { return Math.floor(Math.random() * 256) },
|
func;
|
||||||
constant: (index, args, prev) => { return args; },
|
options;
|
||||||
modulo: (index, args, prev) => { return prev % args; },
|
|
||||||
move: (index, args, prev) => { targets[args] = prev; return prev; },
|
constructor(func, options) {
|
||||||
swap: (index, args, prev) => { let temp = targets[args]; targets[args] = prev; return temp; },
|
this.func = func;
|
||||||
add: (index, args, prev) => { return prev + args; },
|
this.options = options;
|
||||||
subtract: (index, args, prev) => { return prev - args; }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const reqs = {
|
export const functions = {
|
||||||
random: false,
|
random: new Function(
|
||||||
constant: true,
|
(index, arg1, arg2) => { return Math.floor(Math.random() * 256) },
|
||||||
modulo: true,
|
{
|
||||||
move: true,
|
requires_arg1: true,
|
||||||
swap: true,
|
requires_arg2: false
|
||||||
add: true,
|
}
|
||||||
subtract: true
|
),
|
||||||
|
constant: new Function(
|
||||||
|
(index, arg1, arg2) => { return args; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
}),
|
||||||
|
modulo: new Function(
|
||||||
|
(index, arg1, arg2) => { return arg1 % args; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
}),
|
||||||
|
move: new Function(
|
||||||
|
(index, arg1, arg2) => { targets[args] = arg1; return arg1; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
}),
|
||||||
|
swap: new Function(
|
||||||
|
(index, arg1, arg2) => { let temp = targets[args]; targets[args] = arg1; return temp; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
}),
|
||||||
|
add: new Function(
|
||||||
|
(index, arg1, arg2) => { return arg1 + args; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
}),
|
||||||
|
subtract: new Function(
|
||||||
|
(index, arg1, arg2) => { return arg1 - args; },
|
||||||
|
{
|
||||||
|
requires_arg1: true,
|
||||||
|
requires_arg2: true
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function tick_pattern() {
|
function tick_pattern() {
|
||||||
|
@ -64,23 +100,11 @@ function tick_pattern() {
|
||||||
if (Object.keys(pattern).length > 0) {
|
if (Object.keys(pattern).length > 0) {
|
||||||
for (let i = 0; i < cfg.leds; i++) {
|
for (let i = 0; i < cfg.leds; i++) {
|
||||||
for (let command of pattern) {
|
for (let command of pattern) {
|
||||||
if (command.valid) {
|
let name = command.command;
|
||||||
let instruction = command.instruction;
|
|
||||||
let name = instruction.name.toLowerCase();
|
|
||||||
if (functions[name]) {
|
if (functions[name]) {
|
||||||
for (let target of instruction.args) {
|
targets[command.arg1] = functions[name].func(i, targets[command.arg1], target.arg);
|
||||||
let channel = target.channel;
|
|
||||||
if (!targets[channel]) {
|
|
||||||
targets[channel] = 0;
|
|
||||||
}
|
|
||||||
log.debug("targets " + name + " " + channel + " " + target.arg);
|
|
||||||
targets[channel] =
|
|
||||||
functions[name](i, target.arg, targets[channel]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug(`next: ${targets["r"]}, ${targets["g"]}, ${targets["b"]}`);
|
log.debug(`next: ${targets["r"]}, ${targets["g"]}, ${targets["b"]}`);
|
||||||
next_pattern[i] = rgb_to_int(targets["r"] || 0, targets["g"] || 0, targets["b"] || 0);
|
next_pattern[i] = rgb_to_int(targets["r"] || 0, targets["g"] || 0, targets["b"] || 0);
|
||||||
targets["r"] = 0; targets["g"] = 0; targets["b"] = 0;
|
targets["r"] = 0; targets["g"] = 0; targets["b"] = 0;
|
||||||
|
|
37
parse.js
37
parse.js
|
@ -1,14 +1,47 @@
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import Logger, { levels } from './logger.js';
|
import Logger, { levels } from './logger.js';
|
||||||
|
import { functions } from './lights.js';
|
||||||
|
|
||||||
const cfg = JSON.parse(fs.readFileSync('./config.json'));
|
const cfg = JSON.parse(fs.readFileSync('./config.json'));
|
||||||
const log = new Logger("server", cfg.log_level ? levels[cfg.log_level] : levels.INFO);
|
const log = new Logger("server", cfg.log_level ? levels[cfg.log_level] : levels.INFO);
|
||||||
|
|
||||||
|
|
||||||
export default function parse(data) {
|
export default function parse(data) {
|
||||||
log.info(data)
|
let parsed = []
|
||||||
|
let errors = []
|
||||||
|
log.info(data);
|
||||||
|
// errors.push("not yet implemented");
|
||||||
|
data = JSON.parse(data);
|
||||||
|
let line = data.split("\n");
|
||||||
|
for (let lineNumber in line) {
|
||||||
|
let currentLine = line[lineNumber];
|
||||||
|
let split = currentLine.split(" ");
|
||||||
|
let command = split[0];
|
||||||
|
let arg1 = split[1];
|
||||||
|
let arg2 = split[2];
|
||||||
|
|
||||||
|
let match = functions[command];
|
||||||
|
if (match != undefined) {
|
||||||
|
if (
|
||||||
|
!(match.options["requires_arg1"] && arg1 != undefined) &&
|
||||||
|
!(match.options["requires_arg2"] && arg2 != undefined)
|
||||||
|
) {
|
||||||
|
parsed.push(
|
||||||
|
{
|
||||||
|
command: command,
|
||||||
|
arg1: arg1 || undefined,
|
||||||
|
arg2: arg2 || undefined
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
errors.push(`error parsing line ${lineNumber}, invalid number of args`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
|
parsed: parsed
|
||||||
data: data,
|
data: data,
|
||||||
errors: ["not yet implemented"]
|
errors: errors
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue