diff --git a/leds.py b/leds.py index 74bc79c..23d1d4b 100644 --- a/leds.py +++ b/leds.py @@ -71,6 +71,7 @@ def socket_loop(): pattern_data = sock.recv(length) logger.debug(pattern_data) pattern.parse(pattern_data.decode()) + this.color_state = 7 def loop(): diff --git a/pattern.py b/pattern.py index dd6c7df..4fb9d85 100644 --- a/pattern.py +++ b/pattern.py @@ -9,6 +9,11 @@ this.encoded = None this.pattern = None this.values = { "stack": 0, + "stack2": 0, + "stack3": 0, + "stack4": 0, + "stack5": 0, + "stack6": 0, "r": 0, "g": 0, "b": 0, @@ -17,52 +22,70 @@ this.values = { } -def constant(target, arg): - return arg +def constant(target, arg, index): + return (arg, index) -def add(target, arg): - return target + arg +def add(target, arg, index): + return (target + arg, index) -def sub(target, arg): - return target - arg +def sub(target, arg, index): + return (target - arg, index) -def mult(target, arg): - return target * arg +def mult(target, arg, index): + return (target * arg, index) -def div(target, arg): - return target / arg +def div(target, arg, index): + return (target / arg, index) -def mod(target, arg): +def mod(target, arg, index): if arg <= 0: return target - return target % arg + return (target % arg, index) def rand(target, arg): return random.randrange(0, 255) -def _apply(target, arg, func): +def jnz(target, arg, index): + if target != 0: + return (target, arg) + else: + return (target, index) + + +def jez(target, arg, index): + if target == 0: + return (target, arg) + else: + return (target, index) + + +def _apply(index, target, arg, func): if type(arg) is int: - return func(target, arg) + return func(target, arg, index) elif type(arg) is str and arg in this.values: - return func(target, this.values[arg]) + return func(target, this.values[arg], index) -def apply(targets, args, func): +def apply(index, targets, args, func): for target in range(len(targets)): if this.values[targets[target]['channel']] != None: if target < len(args): - this.values[targets[target]['channel']] = _apply( - this.values[targets[target]['channel']], args[target], func) + val, jump = _apply( + index, this.values[targets[target]['channel']], args[target], func) + if val != this.values[targets[target]['channel']]: + this.values[targets[target]['channel']] = val else: - this.values[targets[target]['channel']] = _apply( - this.values[targets[target]['channel']], 0, func) + val, jump = _apply( + index, this.values[targets[target]['channel']], 0, func) + if val != this.values[targets[target]['channel']]: + this.values[targets[target]['channel']] = val logger.debug("{} : {}".format( targets[target]['channel'], this.values[targets[target]['channel']] @@ -76,7 +99,9 @@ this.instructions = { "MULTIPLY": mult, "DIVIDE": div, "MODULO": mod, - "RANDOM": rand + "RANDOM": rand, + "JNZ": jnz, + "JEZ": jez } @@ -96,7 +121,9 @@ def pat(index, tick, previous_values): if 'args' in this.pattern[i]['instruction']: args = this.pattern[i]['instruction']['args'] if this.instructions[name] != None: - apply(targets, args, this.instructions[name]) + jump = apply(index, targets, args, this.instructions[name]) + if jump != i and jump < len(this.pattern) - 1: + i = jump - 1 r = this.values["r"] g = this.values["g"] b = this.values["b"]