Skip to content
Commits on Source (14)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.codeling</groupId>
<artifactId>heater</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.codeling</groupId>
<artifactId>heater.mm</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package heater.impl;
import org.codeling.lang.heater.mm.Component;
import org.codeling.lang.heater.mm.component_feature.Statemachine;
@Component
public class Heater {
@Statemachine
HeaterStateMachine heaterStateMachine;
}
package heater.impl;
import org.codeling.lang.heater.mm.State;
import org.codeling.lang.heater.mm.StateMachine;
import org.codeling.lang.heater.mm.statemachine_feature.Initial;
import org.codeling.lang.heater.mm.statemachine_feature.Variable;
import heater.impl.states.TemperatureOK;
import heater.impl.states.TemperatureTooHigh;
import heater.impl.states.TemperatureTooLow;
@StateMachine
public class HeaterStateMachine {
@Variable(Variables.class)
Variables variables;
@Initial(TemperatureOK.class)
State initial;
@org.codeling.lang.heater.mm.statemachine_feature.State({
TemperatureOK.class,
TemperatureTooHigh.class,
TemperatureTooLow.class })
State[] states;
public void tick() {
}
}
package heater.impl;
import java.text.MessageFormat;
import java.util.Random;
import java.util.logging.Logger;
import org.codeling.lang.heater.mm.Variable;
public class Variables implements Variable {
private static final Logger log = Logger.getLogger(Variables.class.getSimpleName());
private float deltaCool;
private float deltaHeat;
private float lastMeasured;
private float measured;
private int sleepTime;
private float tolerance;
private float target;
private boolean heating = false;
private Random random = new Random();
public float getDeltaCool() {
return deltaCool;
}
public void setDeltaCool(float deltaCool) {
this.deltaCool = deltaCool;
}
public float getDeltaHeat() {
return deltaHeat;
}
public void setDeltaHeat(float deltaHeat) {
this.deltaHeat = deltaHeat;
}
public float getLastMeasured() {
return lastMeasured;
}
public void setLastMeasured(float lastMeasured) {
this.lastMeasured = lastMeasured;
}
public float getMeasured() {
return measured;
}
public void setMeasured(float measured) {
this.measured = measured;
}
public int getSleepTime() {
return sleepTime;
}
public void setSleepTime(int sleepTime) {
this.sleepTime = sleepTime;
}
public float getTolerance() {
return tolerance;
}
public void setTolerance(float tolerance) {
this.tolerance = tolerance;
}
public float getTarget() {
return target;
}
public void setTarget(float target) {
this.target = target;
}
public void sleep() {
try {
if(getSleepTime() < 0) {
log.info("There was an error in calculating the sleep time (is now "+getSleepTime()+"). Resetting it to 1 second.");
setSleepTime(1);
}
log.info("Sleeping for " + getSleepTime() + " seconds");
Thread.sleep(getSleepTime() * 1000);
} catch (InterruptedException e) {
}
}
public void measure() {
setLastMeasured(getMeasured());
float variance = random.nextFloat() + 2;
if (heating) {
setMeasured(lastMeasured + variance);
} else {
setMeasured(lastMeasured - variance);
}
log.info("Measured: " + getMeasured());
}
public void startHeating() {
heating = true;
}
public void stopHeating() {
heating = false;
}
}
package heater.impl.states;
import org.codeling.lang.heater.mm.State;
import org.codeling.lang.heater.mm.state_feature.Transitions;
import heater.impl.Variables;
import heater.impl.states.temperatureok.Guard_Ok;
import heater.impl.states.temperatureok.Guard_TooHigh;
import heater.impl.states.temperatureok.Guard_TooLow;
import heater.impl.states.temperatureok.Update_Ok;
import heater.impl.states.temperatureok.Update_TooHigh;
import heater.impl.states.temperatureok.Update_TooLow;
public class TemperatureOK implements State {
@Transitions( target = TemperatureOK.class,
guard = Guard_Ok.class,
update = Update_Ok.class)
public void ok(Variables variables) {
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooLow.class,
guard = Guard_TooLow.class,
update = Update_TooLow.class)
public void decrease(Variables variables) {
variables.startHeating();
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooHigh.class,
guard = Guard_TooHigh.class,
update = Update_TooHigh.class)
public void increase(Variables variables) {
variables.sleep();
variables.measure();
}
}
package heater.impl.states;
import org.codeling.lang.heater.mm.State;
import org.codeling.lang.heater.mm.state_feature.Transitions;
import heater.impl.Variables;
import heater.impl.states.temperaturetoohigh.Guard_Ok;
import heater.impl.states.temperaturetoohigh.Guard_TooHigh;
import heater.impl.states.temperaturetoohigh.Guard_TooLow;
import heater.impl.states.temperaturetoohigh.Update_Ok;
import heater.impl.states.temperaturetoohigh.Update_TooHigh;
import heater.impl.states.temperaturetoohigh.Update_TooLow;
public class TemperatureTooHigh implements State {
@Transitions( target = TemperatureTooHigh.class,
guard = Guard_Ok.class,
update = Update_Ok.class)
public void ok(Variables variables) {
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooLow.class,
guard = Guard_TooLow.class,
update = Update_TooLow.class)
public void decrease(Variables variables) {
variables.startHeating();
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooHigh.class,
guard = Guard_TooHigh.class,
update = Update_TooHigh.class)
public void increase(Variables variables) {
variables.sleep();
variables.measure();
}
}
package heater.impl.states;
import org.codeling.lang.heater.mm.State;
import org.codeling.lang.heater.mm.state_feature.Transitions;
import heater.impl.Variables;
import heater.impl.states.temperaturetoolow.Guard_Ok;
import heater.impl.states.temperaturetoolow.Guard_TooHigh;
import heater.impl.states.temperaturetoolow.Guard_TooLow;
import heater.impl.states.temperaturetoolow.Update_Ok;
import heater.impl.states.temperaturetoolow.Update_TooHigh;
import heater.impl.states.temperaturetoolow.Update_TooLow;
public class TemperatureTooLow implements State {
@Transitions( target = TemperatureTooHigh.class,
guard = Guard_Ok.class,
update = Update_Ok.class)
public void ok(Variables variables) {
variables.stopHeating();
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooLow.class,
guard = Guard_TooLow.class,
update = Update_TooLow.class)
public void decrease(Variables variables) {
variables.sleep();
variables.measure();
}
@Transitions( target = TemperatureTooHigh.class,
guard = Guard_TooHigh.class,
update = Update_TooHigh.class)
public void increase(Variables variables) {
variables.stopHeating();
variables.sleep();
variables.measure();
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_Ok implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() > variables.getTarget() - variables.getTolerance() &&
variables.getMeasured() < variables.getTarget() + variables.getTolerance();
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_TooHigh implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() >= variables.getTarget() + variables.getTolerance();
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_TooLow implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() <= variables.getTarget() - variables.getTolerance();
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_Ok implements Update {
public void evaluate(Variables variables) {
variables.setLastMeasured(variables.getMeasured());
variables.setDeltaCool((variables.getMeasured() - variables.getLastMeasured()) / variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getTolerance() - variables.getMeasured()) / variables.getDeltaCool()));
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_TooHigh implements Update {
public void evaluate(Variables variables) {
variables.setDeltaCool((variables.getMeasured()-variables.getLastMeasured())/variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getMeasured()) / variables.getDeltaCool()));
}
}
package heater.impl.states.temperatureok;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_TooLow implements Update {
public void evaluate(Variables variables) {
variables.setDeltaHeat((variables.getMeasured() - variables.getLastMeasured()) / variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getMeasured()) / variables.getDeltaHeat()));
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_Ok implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() > variables.getTarget() - variables.getTolerance() &&
variables.getMeasured() < variables.getTarget() + variables.getTolerance();
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_TooHigh implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() > variables.getTarget() + variables.getTolerance();
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_TooLow implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() < variables.getTarget() - variables.getTolerance();
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_Ok implements Update {
public void evaluate(Variables variables) {
variables.setDeltaCool((variables.getMeasured() - variables.getLastMeasured()) / variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getTolerance() - variables.getMeasured())
/ variables.getDeltaCool()));
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_TooHigh implements Update {
public void evaluate(Variables variables) {
variables.setDeltaCool((variables.getMeasured() - variables.getLastMeasured()) / variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getMeasured())
/ variables.getDeltaCool()));
}
}
package heater.impl.states.temperaturetoohigh;
import org.codeling.lang.heater.mm.Update;
import heater.impl.Variables;
public class Update_TooLow implements Update {
public void evaluate(Variables variables) {
variables.setDeltaCool((variables.getMeasured() - variables.getLastMeasured()) / variables.getSleepTime());
variables.setSleepTime((int) ((variables.getTarget() - variables.getMeasured()) / variables.getDeltaCool()));
}
}
package heater.impl.states.temperaturetoolow;
import org.codeling.lang.heater.mm.Guard;
import heater.impl.Variables;
public class Guard_Ok implements Guard {
public boolean evaluate(Variables variables) {
return variables.getMeasured() > variables.getTarget() - variables.getTolerance() &&
variables.getMeasured() < variables.getTarget() + variables.getTolerance();
}
}