From b42d75210b749455c3715a39593365216ede2696 Mon Sep 17 00:00:00 2001
From: Lucas Stratmann <lucas.stratmann@student.reutlingen-university.de>
Date: Tue, 15 Sep 2020 16:09:19 +0200
Subject: [PATCH] If,Else, While,For Working Vars In Progress

---
 .../block/communication/SerialPrintBlock.java | 16 ++++++++
 .../translator/block/control/ElseBlock.java   | 16 ++++++--
 .../translator/block/control/ElseIfBlock.java | 37 ++++++++++++++-----
 .../translator/block/control/IfBlock.java     | 18 +++++++--
 .../translator/block/control/LoopBlock.java   | 11 ++----
 .../translator/block/control/RepeatBlock.java |  5 +++
 .../block/control/RepeatTimesBlock.java       | 24 ++++++++++++
 .../translator/block/control/WhileBlock.java  | 23 ++++++++++++
 .../translator/block/numbers/FalseBlock.java  |  6 +++
 .../numbers/SetterVariableDigitalBlock.java   |  6 +++
 .../translator/block/numbers/StringBlock.java |  8 ++++
 .../translator/block/numbers/TrueBlock.java   |  7 ++++
 .../block/numbers/VariableDigitalBlock.java   | 13 +++++++
 13 files changed, 165 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/ardublock/translator/block/communication/SerialPrintBlock.java b/src/main/java/com/ardublock/translator/block/communication/SerialPrintBlock.java
index 99fde87..786385d 100644
--- a/src/main/java/com/ardublock/translator/block/communication/SerialPrintBlock.java
+++ b/src/main/java/com/ardublock/translator/block/communication/SerialPrintBlock.java
@@ -2,9 +2,15 @@ package com.ardublock.translator.block.communication;
 
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.TranslatorBlock;
+import com.ardublock.translator.block.exception.BlockException;
 import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.comm.CodeSerialPrint;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeString;
+
 public class SerialPrintBlock extends TranslatorBlock
 {
 	public SerialPrintBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
@@ -43,4 +49,14 @@ public class SerialPrintBlock extends TranslatorBlock
 
 		return ret;
 	}
+	
+	public SimCode toSim() throws BlockException, SocketNullException {
+		TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0); //Code
+		SimTypeString data=new SimTypeString(translatorBlock.toSim());
+		translatorBlock = this.getRequiredTranslatorBlockAtSocket(1); //newLine?
+		SimTypeBool newLine= new SimTypeBool(translatorBlock.toSim());
+		
+		return new CodeSerialPrint(data,newLine);
+	}
+	
 }
diff --git a/src/main/java/com/ardublock/translator/block/control/ElseBlock.java b/src/main/java/com/ardublock/translator/block/control/ElseBlock.java
index b5c867f..3ee3991 100644
--- a/src/main/java/com/ardublock/translator/block/control/ElseBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/ElseBlock.java
@@ -12,6 +12,7 @@ import tec.letsgoing.ardublock.simulator.simcode.SimCode;
 import tec.letsgoing.ardublock.simulator.simcode.control.CodeElse;
 import tec.letsgoing.ardublock.simulator.simcode.control.CodeElseIf;
 import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeIf;
 
 public class ElseBlock extends TranslatorBlock
 {
@@ -33,18 +34,25 @@ public class ElseBlock extends TranslatorBlock
 		ret = ret + "}\n";
 		return ret;
 	}
-	@Override
-	public SimCode toSim() throws BlockException, SocketNullException {
-		//FIXME In jedem Block wo mehrere Blöcke enthalten sind, ist eine Abfrage nach If Else nötig... Auslagerung?.
+	
+	public SimTypeIf toIfSim() throws BlockException, SocketNullException {
+		
 		
 		Vector<SimCode> vector = new Vector<SimCode>();
 		TranslatorBlock translatorBlock = getTranslatorBlockAtSocket(0);
 		while (translatorBlock != null)
 		{
-			vector.add(translatorBlock.toSim());
+			if (translatorBlock.toSim()!=null) {
+				vector.add(translatorBlock.toSim());
+				}
 			translatorBlock = translatorBlock.nextTranslatorBlock();
 		}
 		
+		
 		return new CodeElse(vector); 
 	}
+	
+	public SimCode toSim() {
+		return null;
+	}
 }
diff --git a/src/main/java/com/ardublock/translator/block/control/ElseIfBlock.java b/src/main/java/com/ardublock/translator/block/control/ElseIfBlock.java
index 97ae3f7..dd8ab53 100644
--- a/src/main/java/com/ardublock/translator/block/control/ElseIfBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/ElseIfBlock.java
@@ -12,6 +12,7 @@ import tec.letsgoing.ardublock.simulator.simcode.SimCode;
 import tec.letsgoing.ardublock.simulator.simcode.control.CodeElseIf;
 import tec.letsgoing.ardublock.simulator.simcode.control.CodeIf;
 import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeIf;
 
 public class ElseIfBlock extends TranslatorBlock
 {
@@ -39,16 +40,32 @@ public class ElseIfBlock extends TranslatorBlock
 	
 	@Override
 	public SimCode toSim() throws BlockException, SocketNullException {
-		//FIXME In jedem Block wo mehrere Blöcke enthalten sind, ist eine Abfrage nach If Else nötig... Auslagerung?.
-		SimTypeBool condition=new SimTypeBool(this.getRequiredTranslatorBlockAtSocket(0).toSim());
-		Vector<SimCode> vector = new Vector<SimCode>();
-		TranslatorBlock translatorBlock = getTranslatorBlockAtSocket(1);
-		while (translatorBlock != null)
-		{
-			vector.add(translatorBlock.toSim());
-			translatorBlock = translatorBlock.nextTranslatorBlock();
-		}
+		return null;
+	}
+	
+	public SimTypeIf toIfSim() throws BlockException, SocketNullException {
 		
-		return new CodeElseIf(condition,vector); 
+				SimTypeBool condition=new SimTypeBool(this.getRequiredTranslatorBlockAtSocket(0).toSim());
+				Vector<SimCode> vector = new Vector<SimCode>();
+				TranslatorBlock translatorBlock = getTranslatorBlockAtSocket(1);
+				while (translatorBlock != null)
+				{
+					if (translatorBlock.toSim()!=null) {
+						vector.add(translatorBlock.toSim());
+						}
+					translatorBlock = translatorBlock.nextTranslatorBlock();
+				}
+				SimTypeIf followCode=null;
+				TranslatorBlock followBlock=this.nextTranslatorBlock();
+				if (followBlock instanceof ElseIfBlock) {
+					followCode=((ElseIfBlock)followBlock).toIfSim();
+				} else if (followBlock instanceof ElseBlock) {
+					followCode=((ElseBlock)followBlock).toIfSim();
+
+				}
+
+				
+				return new CodeElseIf(followCode,condition,vector); 
 	}
+	
 }
diff --git a/src/main/java/com/ardublock/translator/block/control/IfBlock.java b/src/main/java/com/ardublock/translator/block/control/IfBlock.java
index afe074c..b2e1e72 100644
--- a/src/main/java/com/ardublock/translator/block/control/IfBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/IfBlock.java
@@ -9,8 +9,11 @@ import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
 import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.control.CodeElse;
+import tec.letsgoing.ardublock.simulator.simcode.control.CodeElseIf;
 import tec.letsgoing.ardublock.simulator.simcode.control.CodeIf;
 import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeIf;
 
 
 public class IfBlock extends TranslatorBlock
@@ -39,17 +42,26 @@ public class IfBlock extends TranslatorBlock
 	
 	@Override
 	public SimCode toSim() throws BlockException, SocketNullException {
-		//FIXME In jedem Block wo mehrere Blöcke enthalten sind, ist eine Abfrage nach If Else nötig... Auslagerung?.
 		SimTypeBool condition=new SimTypeBool(this.getRequiredTranslatorBlockAtSocket(0).toSim());
 		Vector<SimCode> vector = new Vector<SimCode>();
 		TranslatorBlock translatorBlock = getTranslatorBlockAtSocket(1);
 		while (translatorBlock != null)
 		{
+			if (translatorBlock.toSim()!=null) {
 			vector.add(translatorBlock.toSim());
+			}
 			translatorBlock = translatorBlock.nextTranslatorBlock();
 		}
-		
-		return new CodeIf(condition,vector); 
+		SimTypeIf followCode=null;
+		TranslatorBlock followBlock=this.nextTranslatorBlock();
+		if (followBlock instanceof ElseIfBlock) {
+			followCode=((ElseIfBlock)followBlock).toIfSim();
+		} else if (followBlock instanceof ElseBlock) {
+			followCode=((ElseBlock)followBlock).toIfSim();
+
+		}
+
+		return new CodeIf(followCode,condition,vector); 
 	}
 	
 	
diff --git a/src/main/java/com/ardublock/translator/block/control/LoopBlock.java b/src/main/java/com/ardublock/translator/block/control/LoopBlock.java
index a32c136..c307cf6 100644
--- a/src/main/java/com/ardublock/translator/block/control/LoopBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/LoopBlock.java
@@ -42,20 +42,15 @@ public class LoopBlock extends TranslatorBlock
 	public SimCode toSim() throws BlockException, SocketNullException {
 		Vector<SimCode> vec =new Vector<SimCode>();
 		TranslatorBlock translatorBlock = getTranslatorBlockAtSocket(0);
-		SimCode prevSimCode=null;
 		while (translatorBlock != null)
 		{
 			SimCode newSimCode = translatorBlock.toSim();
-			
 			translatorBlock = translatorBlock.nextTranslatorBlock();
-			if (newSimCode instanceof CodeElseIf ||  newSimCode instanceof CodeElse) {
-				((SimTypeIf)prevSimCode).setFollowBlock((SimTypeIf) newSimCode);
-			} else {
+			if (newSimCode != null) {
 				vec.add(newSimCode);
 			}
-			if (newSimCode instanceof SimTypeIf) {
-				prevSimCode=newSimCode;
-			}
+			
+			
 		}
 		SimCodeFunction loop =new SimCodeFunction("loop",vec);
 		return loop;
diff --git a/src/main/java/com/ardublock/translator/block/control/RepeatBlock.java b/src/main/java/com/ardublock/translator/block/control/RepeatBlock.java
index 23416ad..1b0a469 100644
--- a/src/main/java/com/ardublock/translator/block/control/RepeatBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/RepeatBlock.java
@@ -11,6 +11,9 @@ import com.ardublock.translator.block.numbers.LocalVariableNumberBlock;
 import com.ardublock.translator.block.numbers.NumberBlock;
 import com.ardublock.translator.block.numbers.VariableNumberBlock;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.control.CodeWhile;
+
 public class RepeatBlock extends TranslatorBlock
 {
 
@@ -78,5 +81,7 @@ public class RepeatBlock extends TranslatorBlock
 		ret = ret + "}\n";
 		return ret;
 	}
+	
+	
 
 }
diff --git a/src/main/java/com/ardublock/translator/block/control/RepeatTimesBlock.java b/src/main/java/com/ardublock/translator/block/control/RepeatTimesBlock.java
index df84ffe..a5fe524 100644
--- a/src/main/java/com/ardublock/translator/block/control/RepeatTimesBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/RepeatTimesBlock.java
@@ -1,10 +1,17 @@
 package com.ardublock.translator.block.control;
 
+import java.util.Vector;
+
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.TranslatorBlock;
+import com.ardublock.translator.block.exception.BlockException;
 import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.control.CodeFor;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeInt;
+
 public class RepeatTimesBlock extends TranslatorBlock
 {
 
@@ -32,5 +39,22 @@ public class RepeatTimesBlock extends TranslatorBlock
 		ret = ret + "}\n";
 		return ret;
 	}
+	
+	public SimCode toSim() throws BlockException, SocketNullException {
+		TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0);
+		SimTypeInt times=new SimTypeInt(translatorBlock.toSim());
+		translatorBlock = getTranslatorBlockAtSocket(1);
+		Vector<SimCode> vector= new Vector<SimCode>();
+		while (translatorBlock != null)
+		{
+			SimCode block=translatorBlock.toSim();
+			if (block!=null) {
+				vector.add(block);
+			}
+			translatorBlock = translatorBlock.nextTranslatorBlock();
+		}
+		
+		return new CodeFor(times,vector);
+	}
 
 }
diff --git a/src/main/java/com/ardublock/translator/block/control/WhileBlock.java b/src/main/java/com/ardublock/translator/block/control/WhileBlock.java
index c3b71c5..e0feaef 100644
--- a/src/main/java/com/ardublock/translator/block/control/WhileBlock.java
+++ b/src/main/java/com/ardublock/translator/block/control/WhileBlock.java
@@ -1,10 +1,17 @@
 package com.ardublock.translator.block.control;
 
+import java.util.Vector;
+
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.TranslatorBlock;
+import com.ardublock.translator.block.exception.BlockException;
 import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.control.CodeWhile;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+
 public class WhileBlock extends TranslatorBlock
 {
 
@@ -29,5 +36,21 @@ public class WhileBlock extends TranslatorBlock
 		ret = ret + "}\n";
 		return ret;
 	}
+	
+	public SimCode toSim() throws BlockException, SocketNullException {
+		TranslatorBlock translatorBlock = this.getRequiredTranslatorBlockAtSocket(0);
+		SimTypeBool condition=new SimTypeBool(translatorBlock.toSim());
+		translatorBlock = getTranslatorBlockAtSocket(1);
+		Vector<SimCode> vector= new Vector<SimCode>();
+		while (translatorBlock != null)
+		{
+			SimCode block=translatorBlock.toSim();
+			if (block!=null) {
+				vector.add(block);
+			}
+			translatorBlock = translatorBlock.nextTranslatorBlock();
+		}
+		return new CodeWhile(condition,vector);
+	}
 
 }
diff --git a/src/main/java/com/ardublock/translator/block/numbers/FalseBlock.java b/src/main/java/com/ardublock/translator/block/numbers/FalseBlock.java
index e97c4aa..6ee30c3 100644
--- a/src/main/java/com/ardublock/translator/block/numbers/FalseBlock.java
+++ b/src/main/java/com/ardublock/translator/block/numbers/FalseBlock.java
@@ -3,6 +3,9 @@ package com.ardublock.translator.block.numbers;
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.ConstBlock;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+
 public class FalseBlock extends ConstBlock
 {
 	public FalseBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
@@ -10,4 +13,7 @@ public class FalseBlock extends ConstBlock
 		super(blockId, translator, codePrefix, codeSuffix, label);
 		this.setCode("false");
 	}
+	public SimCode toSim() {
+		return new SimTypeBool(false);
+	}
 }
diff --git a/src/main/java/com/ardublock/translator/block/numbers/SetterVariableDigitalBlock.java b/src/main/java/com/ardublock/translator/block/numbers/SetterVariableDigitalBlock.java
index 4942c9c..7997196 100644
--- a/src/main/java/com/ardublock/translator/block/numbers/SetterVariableDigitalBlock.java
+++ b/src/main/java/com/ardublock/translator/block/numbers/SetterVariableDigitalBlock.java
@@ -8,6 +8,8 @@ import com.ardublock.translator.block.exception.BlockException;
 import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+
 public class SetterVariableDigitalBlock extends TranslatorBlock
 {
 	private static ResourceBundle uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock");
@@ -70,5 +72,9 @@ public class SetterVariableDigitalBlock extends TranslatorBlock
 		
 		return variableName + " = " + value + suffix + ";\n";
 	}
+	public SimCode toSim() {
+		
+		return null;
+	}
 
 }
diff --git a/src/main/java/com/ardublock/translator/block/numbers/StringBlock.java b/src/main/java/com/ardublock/translator/block/numbers/StringBlock.java
index 4cf6c12..f8e4b25 100644
--- a/src/main/java/com/ardublock/translator/block/numbers/StringBlock.java
+++ b/src/main/java/com/ardublock/translator/block/numbers/StringBlock.java
@@ -5,6 +5,10 @@ import com.ardublock.translator.block.TranslatorBlock;
 import com.ardublock.translator.block.exception.SocketNullException;
 import com.ardublock.translator.block.exception.SubroutineNotDeclaredException;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeString;
+
 public class StringBlock extends TranslatorBlock
 {
 	public StringBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
@@ -32,4 +36,8 @@ public class StringBlock extends TranslatorBlock
 		return codePrefix + "\"" + label + "\"" + codeSuffix;
 		
 	}
+	
+	public SimCode toSim() {
+		return new SimTypeString(label);
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/com/ardublock/translator/block/numbers/TrueBlock.java b/src/main/java/com/ardublock/translator/block/numbers/TrueBlock.java
index 269e617..512a4c5 100644
--- a/src/main/java/com/ardublock/translator/block/numbers/TrueBlock.java
+++ b/src/main/java/com/ardublock/translator/block/numbers/TrueBlock.java
@@ -3,6 +3,9 @@ package com.ardublock.translator.block.numbers;
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.ConstBlock;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeBool;
+
 public class TrueBlock extends ConstBlock
 {
 	public TrueBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
@@ -10,4 +13,8 @@ public class TrueBlock extends ConstBlock
 		super(blockId, translator, codePrefix, codeSuffix, label);
 		this.setCode("true");
 	}
+	
+	public SimCode toSim() {
+		return new SimTypeBool(true);
+	}
 }
diff --git a/src/main/java/com/ardublock/translator/block/numbers/VariableDigitalBlock.java b/src/main/java/com/ardublock/translator/block/numbers/VariableDigitalBlock.java
index 5eb6f33..c18e4f3 100644
--- a/src/main/java/com/ardublock/translator/block/numbers/VariableDigitalBlock.java
+++ b/src/main/java/com/ardublock/translator/block/numbers/VariableDigitalBlock.java
@@ -3,6 +3,10 @@ package com.ardublock.translator.block.numbers;
 import com.ardublock.translator.Translator;
 import com.ardublock.translator.block.TranslatorBlock;
 
+import tec.letsgoing.ardublock.simulator.simcode.SimCode;
+import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeString;
+import tec.letsgoing.ardublock.simulator.simcode.vars.CodeBoolGet;
+
 public class VariableDigitalBlock extends TranslatorBlock
 {
 	public VariableDigitalBlock(Long blockId, Translator translator, String codePrefix, String codeSuffix, String label)
@@ -26,4 +30,13 @@ public class VariableDigitalBlock extends TranslatorBlock
 		return codePrefix + newInternalName + codeSuffix;
 	}
 
+	
+	public String toString() {
+		return label;
+	}
+	
+	public SimCode toSim() {
+		return new CodeBoolGet(new SimTypeString(label));
+		//FIXME Setter has to decide if it is new. Add here to Label and Setter makes set or 
+	}
 }
-- 
GitLab