58 lines
1.6 KiB
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);
|
|
}
|