diff --git a/processor.py b/processor.py index fbf2b1f..7cb6a95 100644 --- a/processor.py +++ b/processor.py @@ -135,8 +135,10 @@ def set_immidiate(framecount, channels, update, params): async def handle_state_change(old, new): global effect_chain global framecount - effect_chain = deserialize_chain(new["chain"]) - await state.mutate(serialize_internal_state()) + deserialized = deserialize_chain(new["chain"]) + effect_chain = deserialized + serialized = serialize_internal_state() + await state.mutate(serialized) async def main(target_ips): global effect_chain diff --git a/state.py b/state.py index 72ac190..00bf1fe 100644 --- a/state.py +++ b/state.py @@ -1,8 +1,10 @@ import asyncio import copy -from deepmerge import always_merger +import time +from random import random +from deepmerge import always_merger, Merger -STATE = {"initialized": 0} +STATE = {"initialized": 0, "generation": "invalid"} ON_INPUT_CALLBACKS = [] ON_CHANGE_CALLBACKS = [] @@ -21,12 +23,23 @@ def register_on_input_callback(callback): def unregister_on_input_callback(callback): ON_INPUT_CALLBACK = [ x for x in ON_INPUT_CALLBACKS if x != callback ] +# TODO: FIX ENTRIES HERE BY UNIQUE EFFECT ID OR SOMETHING async def mutate(delta): global STATE + my_merger = Merger( + [ + (list, ["override"]), + (dict, ["merge"]) + ], + ["override"], + ["override"] + ) + old_state = copy.deepcopy(STATE) - STATE = always_merger.merge(STATE, delta) + STATE = my_merger.merge(STATE, delta) + STATE["generation"] = calculate_checksum() for callback in ON_CHANGE_CALLBACKS: - await callback(old_state, delta) + await callback(old_state, STATE) async def propagate(delta): global STATE @@ -38,6 +51,9 @@ def get_data(): global STATE return STATE +def calculate_checksum(): + return f"{time.time()}-${random()}" + async def inc_initialized(): global STATE await mutate({"initialized": STATE["initialized"]+1 })