diff --git a/AlgebraicDataflowArchitectureModel/models/GameEngine.model b/AlgebraicDataflowArchitectureModel/models/GameEngine.model index 8d05235..1e23e9b 100644 --- a/AlgebraicDataflowArchitectureModel/models/GameEngine.model +++ b/AlgebraicDataflowArchitectureModel/models/GameEngine.model @@ -1,3 +1,10 @@ +init { + enemy := { + "position": {"x": 0.0, "y": 0.0, "z": 0.0}, + "id": "001" + } +} + native channel SceneUpdateEvent { out scene.time(time: Long, updateEvent(dt: Long)) = time + dt } @@ -42,6 +49,22 @@ in scene.entities.{eid}.mesh(curMesh: Json, updateSprite(spritePath: Str)) = {"type": "sprite", "sprite": spritePath} } +native channel TimersUpdated { + in timers(curTimers: Map, update(curTimers, nextTimers)) = nextTimers +} + +native channel TimerEvent(tid: Str) { + out timers.{tid}.count(count: Long, tick()) = count + 1 +} + +channel StartTimer { + out timers(timers: Map, startTimer(tid: Str, interval: Long)) = insert(timers, tid, {"interval": interval, "count": 0}) +} + +channel ClearTimer { + out timers(timers: Map, clearTimer(tid: Str)) = delete(timers, tid) +} + channel AddSprite { out scene.entities(entityDB: Map, addSprite(eid: Str, spritePath: Str)) = insert(entityDB, eid, { "transform": { @@ -60,3 +83,14 @@ channel RotateEntity(eid: Str) { out scene.entities.{eid}.transform.rotation(curRot: Json, rotate(x: Double, y: Double, z: Double)) = {"x": x, "y": y, "z": z} } + +channel UpdateEnemy(tid: Str) { + in timers.{tid}.count(curCount: Long, updateEnemy(nextCount)) = nextCount + out enemy.position(curPos: Json, updateEnemy(nextCount)) = {"x": curPos.x, "y": curPos.y + 1, "z": curPos.z} +} + +channel ViewEnemy { + in enemy.position(curPos: Json, viewEnemy(nextPos, nextId)) = nextPos + in enemy.id(curId: Str, viewEnemy(nextPos, nextId)) = nextId + out scene.entities.{nextId}.transform.position(curPos: Json, viewEnemy(nextPos, nextId)) = nextPos +} diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowGameSimulatorAction.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowGameSimulatorAction.java index dab89e9..97373e8 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowGameSimulatorAction.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/actions/ShowGameSimulatorAction.java @@ -8,6 +8,7 @@ import gameEngine.views.Window; import simulator.Simulator; import simulator.interfaces.gameEngine.GameEnginePresenter; +import simulator.interfaces.timers.TimerService; public class ShowGameSimulatorAction extends AbstractAction { private Simulator simulator; @@ -25,6 +26,7 @@ public void run() { window.init(); GameEnginePresenter presenter = new GameEnginePresenter(window.getScene(), simulator); + TimerService timerService = new TimerService(simulator); window.run(); } }; diff --git a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java index df55c5d..3362f4f 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java @@ -430,37 +430,83 @@ stream.next(); } else if (operator.equals(DOT)) { // json accessor - Expression exp = expressions.remove(0); - stream.next(); // DOT - if (stream.checkNext() == null) throw new WrongJsonExpression(stream.getLine()); - String literalOrLeftCurlyBracket = stream.next(); - Expression paramTerm = null; - if (literalOrLeftCurlyBracket.equals(LEFT_CURLY_BRACKET)) { - // parameter - paramTerm = parseTerm(stream, model); - String rightCurlyBracket = stream.next(); - if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) throw new WrongJsonExpression(stream.getLine()); + while (operator.equals(DOT)) { + Expression exp = expressions.remove(0); + stream.next(); // DOT + if (stream.checkNext() == null) throw new WrongJsonExpression(stream.getLine()); + String literalOrLeftCurlyBracket = stream.next(); + Expression paramTerm = null; + if (literalOrLeftCurlyBracket.equals(LEFT_CURLY_BRACKET)) { + // parameter + paramTerm = parseTerm(stream, model); + String rightCurlyBracket = stream.next(); + if (rightCurlyBracket == null || !rightCurlyBracket.equals(RIGHT_CURLY_BRACKET)) throw new WrongJsonExpression(stream.getLine()); + } else { + // literal + paramTerm = new Constant(literalOrLeftCurlyBracket, DataTransferModel.typeString); + } + Type paramType = null; + if (paramTerm instanceof Variable) { + paramType = ((Variable) paramTerm).getType(); + } else if (paramTerm instanceof Term) { + paramType = ((Term) paramTerm).getType(); + } + Term term = null; + if (paramType != null && DataConstraintModel.typeInt.isAncestorOf(paramType)) { + term = new JsonAccessor(DataConstraintModel.dotParam); + } else { + term = new JsonAccessor(DataConstraintModel.dot); + } + term.addChild(exp); + term.addChild(paramTerm); + expressions.add(term); + operator = stream.checkNext(); + if (operator == null) break; + } + if (operator == null) { + break; + } else if (operator.equals(ADD)) { + operators.add(DataTransferModel.add); + stream.next(); + } else if (operator.equals(MUL)) { + operators.add(DataTransferModel.mul); + stream.next(); + } else if (operator.equals(SUB)) { + operators.add(DataTransferModel.sub); // not minus + stream.next(); + } else if (operator.equals(DIV)) { + operators.add(DataTransferModel.div); + stream.next(); + } else if (operator.equals(MOD)) { + operators.add(DataTransferModel.mod); + stream.next(); + } else if (operator.equals(EQ)) { + operators.add(DataTransferModel.eq); + stream.next(); + } else if (operator.equals(NEQ)) { + operators.add(DataTransferModel.neq); + stream.next(); + } else if (operator.equals(GT)) { + operators.add(DataTransferModel.gt); + stream.next(); + } else if (operator.equals(LT)) { + operators.add(DataTransferModel.lt); + stream.next(); + } else if (operator.equals(GE)) { + operators.add(DataTransferModel.ge); + stream.next(); + } else if (operator.equals(LE)) { + operators.add(DataTransferModel.le); + stream.next(); + } else if (operator.equals(AND)) { + operators.add(DataTransferModel.and); + stream.next(); + } else if (operator.equals(OR)) { + operators.add(DataTransferModel.or); + stream.next(); } else { - // literal - paramTerm = new Constant(literalOrLeftCurlyBracket, DataTransferModel.typeString); + break; } - Type paramType = null; - if (paramTerm instanceof Variable) { - paramType = ((Variable) paramTerm).getType(); - } else if (paramTerm instanceof Term) { - paramType = ((Term) paramTerm).getType(); - } - Term term = null; - if (paramType != null && DataConstraintModel.typeInt.isAncestorOf(paramType)) { - term = new JsonAccessor(DataConstraintModel.dotParam); - } else { - term = new JsonAccessor(DataConstraintModel.dot); - } - term.addChild(exp); - term.addChild(paramTerm); - expressions.add(term); - operator = stream.checkNext(); - if (operator == null || !operator.equals(DOT)) break; } else { break; } @@ -755,7 +801,7 @@ if (!fFirstToken) { newTokens.add(new Token(DOUBLE_QUOT, true)); } - if (token.length() > 0) { + if (!fFirstToken || token.length() > 0) { if (i % 2 == 0) { for (String t: token.split("[ \t]")) { newTokens.add(new Token(t)); @@ -767,6 +813,9 @@ } fFirstToken = false; } + if (line.endsWith(DOUBLE_QUOT)) { + newTokens.add(new Token(DOUBLE_QUOT, true)); + } return newTokens; } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java index 643be88..58a9df8 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java @@ -373,9 +373,11 @@ ResourceIdentifier resId = ResourceIdentifier.createFrom(inputResPath); for (Map.Entry chParamEnt: channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); - Integer paramIdx = channelSelectorToInputResourcePathParam.get(sel).get(inputResPath); - if (paramIdx != null) { - resId.setPathParam(paramIdx, chParamEnt.getValue()); + if (channelSelectorToInputResourcePathParam.get(sel) != null) { + Integer paramIdx = channelSelectorToInputResourcePathParam.get(sel).get(inputResPath); + if (paramIdx != null) { + resId.setPathParam(paramIdx, chParamEnt.getValue()); + } } } for (Expression var: dependingParameters.keySet()) { @@ -391,9 +393,11 @@ ResourceIdentifier resId = ResourceIdentifier.createFrom(outputResPath); for (Map.Entry chParamEnt: channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); - Integer paramIdx = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); - if (paramIdx != null) { - resId.setPathParam(paramIdx, chParamEnt.getValue()); + if (channelSelectorToOutputResourcePathParam.get(sel) != null) { + Integer paramIdx = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); + if (paramIdx != null) { + resId.setPathParam(paramIdx, chParamEnt.getValue()); + } } } for (Expression var: dependingParameters.keySet()) { diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java index 14e30bb..ac2c94b 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Resource.java @@ -32,14 +32,18 @@ || DataConstraintModel.typeList.isAncestorOf(resType) || DataConstraintModel.typeMap.isAncestorOf(resType) || DataConstraintModel.typeJson.isAncestorOf(resType)) { - if (DataConstraintModel.typeList.isAncestorOf(resType)) { + if (resType != null && DataConstraintModel.typeList.isAncestorOf(resType)) { // List resource state = new ListResourceState(); - } else if (DataConstraintModel.typeMap.isAncestorOf(resType)) { + } else if (resType != null && DataConstraintModel.typeMap.isAncestorOf(resType)) { // Map resource state = new MapResourceState(); } else { // Json resource + if (resType == null) { + resType = DataConstraintModel.typeJson; + resourceHierarchy.setResourceStateType(resType); + } state = new JsonResourceState(); children = new LinkedHashMap<>(); for (ResourceHierarchy child: resourceHierarchy.getChildren()) { diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java index e935244..4d95497 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java @@ -124,14 +124,14 @@ if (value instanceof JsonTerm) { JsonTerm widget = (JsonTerm) value; Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); - Expression type = widget.get("\"type\""); + Expression type = widget.get("type"); if (type.toString().equals("\"button\"")) { // Add a button component. - Expression text = widget.get("\"text\""); - Expression x = widget.get("\"x\""); - Expression y = widget.get("\"y\""); - Expression width = widget.get("\"width\""); - Expression height = widget.get("\"height\""); + Expression text = widget.get("text"); + Expression x = widget.get("x"); + Expression y = widget.get("y"); + Expression width = widget.get("width"); + Expression height = widget.get("height"); JButton button = new JButton(text.toString().replace("\"", "")); if (x != null && y != null) { button.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); @@ -163,7 +163,7 @@ } resources.put(newWid, widgetResource); - Resource widgetXResource = widgetResource.getChildrenMap().get("\"x\""); + Resource widgetXResource = widgetResource.getChildrenMap().get("x"); if (widgetXResource != null) { ComponentXReceiver nativeXReceiver = new ComponentXReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeXReceiver, setXChannel, widgetXResource); @@ -175,7 +175,7 @@ resources.put(newWid, widgetXResource); } - Resource widgetYResource = widgetResource.getChildrenMap().get("\"y\""); + Resource widgetYResource = widgetResource.getChildrenMap().get("y"); if (widgetYResource != null) { ComponentYReceiver nativeYReceiver = new ComponentYReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeYReceiver, setYChannel, widgetYResource); @@ -187,7 +187,7 @@ resources.put(newWid, widgetYResource); } - Resource widgetWidthResource = widgetResource.getChildrenMap().get("\"width\""); + Resource widgetWidthResource = widgetResource.getChildrenMap().get("width"); if (widgetWidthResource != null) { ComponentWidthReceiver nativeWidthReceiver = new ComponentWidthReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeWidthReceiver, setWidthChannel, widgetWidthResource); @@ -199,7 +199,7 @@ resources.put(newWid, widgetWidthResource); } - Resource widgetHeightResource = widgetResource.getChildrenMap().get("\"height\""); + Resource widgetHeightResource = widgetResource.getChildrenMap().get("height"); if (widgetHeightResource != null) { ComponentHeightReceiver nativeHeightReceiver = new ComponentHeightReceiver(button); // widgetResource => button simulator.addNativeReceiver(nativeHeightReceiver, setHeightChannel, widgetHeightResource); @@ -212,11 +212,11 @@ } } else if (type.toString().equals("\"label\"")) { // Add a label component. - Expression text = widget.get("\"text\""); - Expression x = widget.get("\"x\""); - Expression y = widget.get("\"y\""); - Expression width = widget.get("\"width\""); - Expression height = widget.get("\"height\""); + Expression text = widget.get("text"); + Expression x = widget.get("x"); + Expression y = widget.get("y"); + Expression width = widget.get("width"); + Expression height = widget.get("height"); JLabel label = new JLabel(text.toString().replace("\"", "")); if (x != null && y != null) { label.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); @@ -295,10 +295,10 @@ } } else if (type.toString().equals("\"textInput\"")) { // Add a text input component. - Expression x = widget.get("\"x\""); - Expression y = widget.get("\"y\""); - Expression width = widget.get("\"width\""); - Expression height = widget.get("\"height\""); + Expression x = widget.get("x"); + Expression y = widget.get("y"); + Expression width = widget.get("width"); + Expression height = widget.get("height"); JTextField textField = new JTextField(10); if (x != null && y != null) { textField.setLocation(Integer.parseInt(x.toString()), Integer.parseInt(y.toString())); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java index 70d6b51..1ef8061 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/timers/TimerService.java @@ -68,7 +68,7 @@ JsonTerm timerValue = (JsonTerm) value; Resource timerResource = timersResource.getChildrenMap().get(tid); // Add a timer. - Expression intervalExp = timerValue.get("\"interval\""); + Expression intervalExp = timerValue.get("interval"); long interval = Long.parseLong(((Constant) intervalExp).toString()); ScheduledThreadPoolExecutor timer = new ScheduledThreadPoolExecutor(0); timers.put(tid, timer);