diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java index 4232c115a636b898d5e20d9bf14500bdf380b7b0..7511077e7cced71b152501ee467e6f6deb3925d7 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java @@ -252,7 +252,7 @@ public class ExpressionGenerator { } else if(node instanceof RecordFieldAccessNode) { return visitRecordFieldAccessNode((RecordFieldAccessNode) node); } - throw new RuntimeException("Given node is not implemented: " + node.getClass()); + throw new RuntimeException("Given node is not implemented: " + node.getClass() + " at line " + node.getSourceCodePosition().getStartLine()); } /* diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java index 8a61e33895cf7c266bf3705bd86db701d12029fd..6be74b61920da48c8153a9333818713a80abf68c 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java @@ -104,7 +104,9 @@ public class OperationGenerator { return ""; } } else { - TemplateHandler.add(operation, "body", machineGenerator.visitSubstitutionNode(node.getSubstitution(), null)); + if(!node.getName().startsWith("EXTERNAL_")) { + TemplateHandler.add(operation, "body", machineGenerator.visitSubstitutionNode(node.getSubstitution(), null)); + } } TemplateHandler.add(operation, "lastStateCount", machineGenerator.getCurrentStateCount()); return operation.render(); diff --git a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator.mch b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator.mch new file mode 100644 index 0000000000000000000000000000000000000000..f3d895782431bbb10831bcf41420e0f7102d1a4a --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator.mch @@ -0,0 +1,228 @@ +MACHINE DroneCommunicator// USES LibraryZMQ_RPC +DEFINITIONS + "LibraryZMQ_RPC.def"; + "LibraryReals.def"; + SET_PREF_MAX_OPERATIONS == 0; +CONSTANTS DRONE_URL +PROPERTIES DRONE_URL:STRING & DRONE_URL = "radio://0/80/2M/5700B500F4" +VARIABLES init, socket, cycle +INVARIANT + init:BOOL & + socket:INTEGER & + cycle:INTEGER +INITIALISATION + init := FALSE; + socket := 0; + cycle := 1 + +OPERATIONS + EXTERNAL_Init = + SELECT init = FALSE THEN + socket := ZMQ_RPC_INIT("tcp://localhost:22272"); + init := TRUE + END; + + EXTERNAL_open_link = + SELECT init = TRUE THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "open_link", {("url" |-> RpcString(DRONE_URL)), ("reinit" |-> RpcBoolean(TRUE))})) + END + END; + + /* + Available commanders: + "motion" - cflib.positioning.motion_commander.MotionCommander + "high_level" - cflib.crazyflie.high_level_commander.HighLevelCommander + "position_high_level" (the default) - cflib.positioning.position_hl_commander.PositionHlCommander + */ + EXTERNAL_open_link_with_commander_type(commander) = + SELECT + init = TRUE + & commander : STRING + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "open_link", {("url" |-> RpcString(DRONE_URL)), ("reinit" |-> RpcBoolean(TRUE)), ("commander" |-> RpcString(commander))})) + END + END; + + EXTERNAL_close_link = + SELECT init = TRUE THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "close_link", {("url" |-> RpcString(DRONE_URL))})) + END + END; + + EXTERNAL_register_sensors = + SELECT init = TRUE THEN + VAR res1, res2, res3 IN + res1 := RpcSuccess~(ZMQ_RPC_SEND(socket, "register_log", { + ("url" |-> RpcString(DRONE_URL)), + ("name" |-> RpcString("Telemetry")), + ("variables" |-> RpcArray([ + RpcString("stateEstimate.x"), + RpcString("stateEstimate.y"), + RpcString("stateEstimate.z"), + RpcString("stateEstimate.roll"), + RpcString("stateEstimate.pitch"), + RpcString("stateEstimate.yaw") + ]))})); + res2 := RpcSuccess~(ZMQ_RPC_SEND(socket, "register_log", { + ("url" |-> RpcString(DRONE_URL)), + ("name" |-> RpcString("Power")), + ("variables" |-> RpcArray([ + RpcString("pm.batteryLevel") + ]))})); + res3 := RpcSuccess~(ZMQ_RPC_SEND(socket, "register_log", { + ("url" |-> RpcString(DRONE_URL)), + ("name" |-> RpcString("Ranging")), + ("variables" |-> RpcArray([ + RpcString("range.front"), + RpcString("range.back"), + RpcString("range.up"), + RpcString("range.left"), + RpcString("range.right"), + RpcString("range.zrange") + ]))})) + END + END; + + EXTERNAL_Drone_Takeoff = + SELECT init = TRUE THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "takeoff", {("url" |-> RpcString(DRONE_URL))})) + END + END; + + EXTERNAL_Drone_Land = + SELECT init = TRUE THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "land", {("url" |-> RpcString(DRONE_URL))})) + END + END; + + EXTERNAL_Drone_Left(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "left", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + EXTERNAL_Drone_Right(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "right", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + EXTERNAL_Drone_Up(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "up", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + EXTERNAL_Drone_Down(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "down", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + EXTERNAL_Drone_Forward(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "forward", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + EXTERNAL_Drone_Backward(dist) = + SELECT + init = TRUE & + dist : 0..2000 + THEN + VAR res IN + res := RpcSuccess~(ZMQ_RPC_SEND(socket, "backward", {("url" |-> RpcString(DRONE_URL)), ("distance" |-> RpcFloat(RDIV(real(dist), real(1000))))})) + END + END; + + out <-- EXTERNAL_Drone_GetX = + SELECT init = TRUE THEN + out := floor(RMUL(1000.0, RpcFloat~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("stateEstimate.x"))}))))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetY = + SELECT init = TRUE THEN + out := floor(RMUL(1000.0, RpcFloat~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("stateEstimate.y"))}))))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetZ = + SELECT init = TRUE THEN + out := floor(RMUL(1000.0, RpcFloat~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("stateEstimate.z"))}))))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetBattery = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("pm.batteryLevel"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetFrontDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.front"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetBackDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.back"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetUpDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.up"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetDownDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.zrange"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetLeftDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.left"))}))); + cycle := cycle + 1 + END; + + out <-- EXTERNAL_Drone_GetRightDistance = + SELECT init = TRUE THEN + out := RpcInteger~(RpcSuccess~(ZMQ_RPC_SEND(socket, "get_log_var", {("url" |-> RpcString(DRONE_URL)), ("name" |-> RpcString("range.right"))}))); + cycle := cycle + 1 + END; + + EXTERNAL_Destroy = + SELECT init = TRUE THEN + ZMQ_RPC_DESTROY(socket); + init := FALSE + END +END diff --git a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch index 0ada38950496d633255f2ec7b5d885c14a6badd0..4e0334891b112db547790b57c8330a72121687a5 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch @@ -1,4 +1,8 @@ MACHINE DroneCommunicator_Mockup +DEFINITIONS + "LibraryZMQ_RPC.def"; + "LibraryReals.def"; + SET_PREF_MAX_OPERATIONS == 0; CONSTANTS DRONE_URL PROPERTIES DRONE_URL:STRING & DRONE_URL = "radio://0/80/2M/5700B500F4" VARIABLES init, socket, cycle diff --git a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneMainController.mch b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneMainController.mch index 7733c48bb01205a5926b77a80a3726c6eec4d76e..11d756c2750f8359328b9f861f06c0355316c4c5 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneMainController.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneMainController.mch @@ -1,5 +1,5 @@ MACHINE DroneMainController -INCLUDES DroneSafetyController, DroneCommunicator_Mockup +INCLUDES DroneSafetyController, DroneCommunicator OPERATIONS diff --git a/src/test/resources/de/hhu/stups/codegenerator/liftbenchmarks/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/liftbenchmarks/Lift.mch index bc57c76fd4177c464e0c77a80ea34e3999654352..5c5658de9cee6bcac99efed7951ce10a4f14cbb7 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/liftbenchmarks/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/liftbenchmarks/Lift.mch @@ -1,15 +1,15 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; + inc = PRE level<100 THEN level := level + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END + dec = PRE level>0 THEN level := level - 1 END END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/project10/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project10/Lift.mch index 177693d12a75feb3e843ae651fe76ff6ca910ea3..b8b78f4fa1eb79983da852b97e778ff29d9f07ed 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project10/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project10/Lift.mch @@ -1,14 +1,14 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/project5/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project5/Lift.mch index 177693d12a75feb3e843ae651fe76ff6ca910ea3..b8b78f4fa1eb79983da852b97e778ff29d9f07ed 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project5/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project5/Lift.mch @@ -1,14 +1,14 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/project6/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project6/Lift.mch index c8d98c5aa24aae96fa6a118f6e910244cc7d763f..7f994d0316bf12eca8520028f9db25492db203de 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project6/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project6/Lift.mch @@ -1,15 +1,15 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END; + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END; open_door = skip; close_door = skip diff --git a/src/test/resources/de/hhu/stups/codegenerator/project6/Lift2.mch b/src/test/resources/de/hhu/stups/codegenerator/project6/Lift2.mch index e497996fe26e96ce940343ffce86c2824c52fd9d..53e1dca6757533e0ff022b6d7935a495e73ee28e 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project6/Lift2.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project6/Lift2.mch @@ -2,16 +2,16 @@ REFINEMENT Lift2 REFINES Lift -VARIABLES floor, door_open +VARIABLES level, door_open -INVARIANT floor : 0..100 & door_open : BOOL +INVARIANT level : 0..100 & door_open : BOOL -INITIALISATION floor := 0 || door_open := FALSE +INITIALISATION level := 0 || door_open := FALSE OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END; + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END; open_door = PRE door_open=FALSE THEN door_open := TRUE END ; close_door = PRE door_open=TRUE THEN door_open := FALSE END diff --git a/src/test/resources/de/hhu/stups/codegenerator/project7/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project7/Lift.mch index c8d98c5aa24aae96fa6a118f6e910244cc7d763f..7f994d0316bf12eca8520028f9db25492db203de 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project7/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project7/Lift.mch @@ -1,15 +1,15 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END; + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END; open_door = skip; close_door = skip diff --git a/src/test/resources/de/hhu/stups/codegenerator/project8/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project8/Lift.mch index 177693d12a75feb3e843ae651fe76ff6ca910ea3..b8b78f4fa1eb79983da852b97e778ff29d9f07ed 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project8/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project8/Lift.mch @@ -1,14 +1,14 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/project9/Lift.mch b/src/test/resources/de/hhu/stups/codegenerator/project9/Lift.mch index 177693d12a75feb3e843ae651fe76ff6ca910ea3..b8b78f4fa1eb79983da852b97e778ff29d9f07ed 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/project9/Lift.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/project9/Lift.mch @@ -1,14 +1,14 @@ MACHINE Lift -VARIABLES floor +VARIABLES level -INVARIANT floor : 0..100 /* NAT */ +INVARIANT level : 0..100 /* NAT */ -INITIALISATION floor := 0 +INITIALISATION level := 0 OPERATIONS - inc = PRE floor<100 THEN floor := floor + 1 END ; - dec = PRE floor>0 THEN floor := floor - 1 END + inc = PRE level<100 THEN level := level + 1 END ; + dec = PRE level>0 THEN level := level - 1 END END \ No newline at end of file