// // Created by xemon on 15.12.22. // #include "ControllableSwitch.h" #include "stdint.h" void ControllableSwitch_Init( tControllableSwitch *env, void *invalidatorEnv, void *invalidator ) { env->env = invalidatorEnv; env->invalidator = invalidator; env->hasCurrentState = false; env->hasHardTarget = false; env->hasSoftTarget = false; } #define ControllableSwitch_Invalidate(STATE, TARGET) (STATE)->invalidator((STATE)->env,(STATE)->currentState,TARGET) uint32_t ControllableSwitch_Check(tControllableSwitch *env) { if (env->hasHardTarget) { if ((env->hardTarget != env->currentState) || !env->hasCurrentState) { return ControllableSwitch_Invalidate(env, env->hardTarget); } } else if (env->hasSoftTarget) { if ((env->softTarget != env->currentState) || !env->hasCurrentState) { return ControllableSwitch_Invalidate(env, env->softTarget); } } return env->currentState; } void ControllableSwitch_Set(tControllableSwitch *env, bool value) { env->softTarget = value; env->hasSoftTarget = true; env->currentState = ControllableSwitch_Check(env); env->hasCurrentState = true; } void ControllableSwitch_SetHard(tControllableSwitch *env, int32_t value) { env->hardTarget = value; env->hasHardTarget = true; env->currentState = ControllableSwitch_Check(env); env->hasCurrentState = true; } void ControllableSwitch_ClearHard(tControllableSwitch *env) { env->hasHardTarget = false; env->currentState = ControllableSwitch_Check(env); }