ControllableSwitch/ControllableSwitch.c

58 lines
1.6 KiB
C

//
// 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);
}