From 7ccd99bd754da2291c7847a81955b6f01405b344 Mon Sep 17 00:00:00 2001 From: Anderson Antunes Date: Thu, 3 Apr 2014 01:52:54 -0300 Subject: [PATCH] =?UTF-8?q?Mais=20uma=20enxugada=20na=20interface.=20Erros?= =?UTF-8?q?=20amigaveis,=20console=20n=C3=A3o=20trava=20mais,=20clique=20d?= =?UTF-8?q?uplo=20fantasma=20arrumado=20(testar),=20modo=20'lento'=20funci?= =?UTF-8?q?ona=20melhor,=20icone=20feio=20(fazer=20outro),=20x++=20funcion?= =?UTF-8?q?a=20(como=20statement=20apenas,=20++x=20ainda=20n=C3=A3o),=20e?= =?UTF-8?q?=20mais.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/AlienMoveResposta.proj | Bin 0 -> 1270 bytes examples/Percurso.proj | Bin 0 -> 1792 bytes examples/alienRotResposta.proj | Bin 0 -> 1333 bytes examples/xismaismais.proj | Bin 0 -> 640 bytes nbproject/private/private.properties | 2 +- nbproject/private/private.xml | 36 +- src/resources/jifi_icon.png | Bin 0 -> 3740 bytes src/resources/wut.png | Bin 0 -> 13008 bytes .../algorithm/parser/decoder/.classpath | 6 + .../algorithm/parser/decoder/.project | 17 + .../algorithm/parser/decoder/Decoder.java | 35 +- .../algorithm/parser/decoder/Function.jj | 2 +- .../parser/parameterparser/Argument.java | 5 + .../algorithm/procedure/DummyBlock.java | 2 +- .../algorithm/procedure/Function.java | 7 +- .../algorithm/procedure/If.java | 2 +- .../algorithm/procedure/Procedure.java | 21 +- .../algorithm/procedure/While.java | 2 - src/robotinterface/drawable/DrawingPanel.java | 9 + .../swing/MutableWidgetContainer.java | 1 + src/robotinterface/gui/GUI.form | 127 +-- src/robotinterface/gui/GUI.java | 234 +++-- .../gui/panels/FlowchartPanel.java | 45 +- .../gui/panels/robot/RobotControlPanel.java | 2 +- .../gui/panels/robot/RobotManager.java | 4 +- .../interpreter/Interpreter.java | 28 +- .../plugin/cmdpack/begginer/ReadDevice.java | 3 +- src/robotinterface/plugin/cmdpack/plugin.txt | 3 +- .../plugin/cmdpack/util/PrintString.java | 12 +- .../plugin/cmdpack/util/StepMode.java | 89 ++ src/robotinterface/robot/Robot.java | 42 +- .../robot/connection/Serial.java | 88 +- .../robot/connection/Serial2.java | 887 +++++++++--------- .../robot/device/ReflectanceSensorArray.java | 2 +- .../robot/simulation/Environment.java | 39 +- 35 files changed, 1085 insertions(+), 667 deletions(-) create mode 100644 examples/AlienMoveResposta.proj create mode 100644 examples/Percurso.proj create mode 100644 examples/alienRotResposta.proj create mode 100644 examples/xismaismais.proj create mode 100644 src/resources/jifi_icon.png create mode 100644 src/resources/wut.png create mode 100644 src/robotinterface/algorithm/parser/decoder/.classpath create mode 100644 src/robotinterface/algorithm/parser/decoder/.project create mode 100644 src/robotinterface/plugin/cmdpack/util/StepMode.java diff --git a/examples/AlienMoveResposta.proj b/examples/AlienMoveResposta.proj new file mode 100644 index 0000000000000000000000000000000000000000..1a2805850c019335db0dcd987120d0fd41de9ba2 GIT binary patch literal 1270 zcmWIWW@Zs#;Nak3$nPq0VL$@hK(>BbX{{~#1En|z08+ZPf{=q zEi~A(Th~4L^?_Kvx_Y6EIKSq+?BdMt*A^Iymv}w-@bJyGDv{7gvA?Iv=Tu&8^p9Wr#ouf ze_1v?=SVlY__bxy+Y{#sFU?-5wodr}XUz?BSv3OtImLb~Icha!!oAhvoBpeE-M4-` zPbvD>8V1?=mapkS?@zGHS^Q@Lg^5|%+a1S&KAz6V01P8s!O06$p`V&pmRXdamz$bb zLQ;TA12rS-MPlm#*|}33^Bx=UxPG^6ZOpN9i1JwE;mMv6&iah!q(V2-JeC<^mtTkT zdA9cK^<48l{nhL4OLbLy|NQ?^zW0x9{Jv!zyvdDWPMw*z-haFN{_^wdAJ5nPd$aiN z_riJeJK~%ye9o)h{g?eXv8VfAx1_$@GKp0`Jrwmm+acnh>h@%<&I_1Ye0+iWffAcV^EMpdcPHU ztgC^?*E|6;o#bo16TZbfUsijpT4_(^+U*N`g5@UN{0q*SZ7DZ*G6M5v2|FkmGBSxU zpyq2>wgu&DRDhJr(KRBcZBVX80BazVKpsao45S(63Q%@H0DoZCLCGBGT9G{m$_xn5 e1JsI?9gs}{WsLxDRyL4g79ivTD!s-G;sF3p^2_W1 literal 0 HcmV?d00001 diff --git a/examples/Percurso.proj b/examples/Percurso.proj new file mode 100644 index 0000000000000000000000000000000000000000..c9ae5776402608af1ed069bf8d43a8da0a239cc3 GIT binary patch literal 1792 zcmb7^do-JO7{`N@sLOgZQkryQC|YGIC7RAiF+?;dTGLjDTPul>5*2MWrIfhDgrb{! zQP)Xb>Neuix(r3Dw51iyv{cCmjV?K7JyK`=W8e3@=REKGdp^JSectn)4;C#21Oq@I z5I~C+YzYvHoUk_Vy-f6`1dxa!22ublS_ULqm;AR0`&kqs?ARtL!MKY)6q3H^&bOF; z#dbA$Gmi5JR1--z$$v&m@ueslspAlP6_)gMhfi)6PF}d<2g}7bIosNCzQ3tpv>wuJ zI`dXqCbZR%6@*4EXL3+EWkmI58>sH3zCmjfM?9*s0(V5En;zwN)IR6^j6dSt;VJDu zc#9RW*}EZ5cV1{&uEA6?N(e4FK3Y?jry5&x=UrTNTSWt@C*DFbgs(d#JU>5>f^gNq zhZq_VOd=9|h?M{JHK0ORoE59}g>_^Gh6py?W4&f-g?>thGd#A|Bs`-#R3&>P18g+S zgCbv((*$YVxY5;Ks9QszTi6PfM&qvt<`#OB=F%r+8kBUD_u0qIQfbr^Ei?gdbAE!y zcWaJV-=s9R#Lq?UGW1K3N8uQLL4>#xIniI)JHoG0>ArWN6uSTmA{uUOl z{Xu?erRfzi-$kd`>~o&-Ob(<7+yu-Gtw&&{e!O;egQk~lVNadlK4NnL>eLfV`bOhA z$&M*Ekg#+rk47>iYybi-)`IoOH^W?lyX-?vv(?Yb$1Aq?IQNOmwb>l5$-%v?Z{^?9n7{n4oOLmp{+D z5-HeR-q5u;yLZXX8`oD{tL)-V5!wrs10VKEDY0xge0i)!z?i1&5*7t=N`&fm*KurR^?Ikx0wIs3 zb*bs)ZW`)=oeA$X+P%KcM*B%6fE&UhuBtJlV>?HxY`3nyfdfkhtq;NUy{N3;$cH>? zv$El3%+#Ct1)gd3ymdg_B@h!0eW=AkkQcD1vEWzFr%pS7CTwsTx?`G+vU3G8e<~#x zGCFP>HkzS>?NEr2ymJoRt-TJcX&B=tlgIPbkw++tnZwW%IhnOXT+EZ=Auu5`?d8kl zgW(xUt!h1sNZF)$R8|+q*)=n-xU(G6t3(Ow_^Z)!fS@_ic04*arAf{6Ib<9j9_tIk z3>T$gumMRtS-o~%Psni zO=`H(9FEsRw?*5gN$FVrHOO}t90K9{jpMj(RhP>P1{yiDn^f+Nk;BFScUHt3_Ilbv z2P7XCu~wax3oc{MgnLa6R@wRD<6Lwg0fHNJ{7?^IBIB7=kirdkOb>1^nbk1xbDeRz zPl{L4G`^*(#=qj|wQyjoYFtyrXjN6t*_L};i{!5B%ShkcoK6*NDhd5`#rwD_yYB~q zy+>s>R~L+vv>HFhRh3Wfb3j|0C2Psiay|S+2*(Hy9W~El1!Q3x){Blb|B)6k>tzB+F0N^xOBsU33FyK?we>AyB^`Aye z{5wH$V~Rw-9i*`QZ|(2gL&SW1xX7*Bk(bzE+MTHQOd_*x$5x1nxmDcPBF|#cyQD?U OK;a=FY@OdFy7~v$F4VRF literal 0 HcmV?d00001 diff --git a/examples/alienRotResposta.proj b/examples/alienRotResposta.proj new file mode 100644 index 0000000000000000000000000000000000000000..9a56ded8badda36353c9d4f30aa3777d2c10102b GIT binary patch literal 1333 zcmWIWW@Zs#;Nak3$Z0QfVL$@hK(>BbXso9AC`^@;IO-aNr~ zF2}l;GE36K^w)GGCh_OBJ>~J-rXsI-yI)$hI%)TzHTU1o+A;Izt>T33907}VtNwGf z_`K~*z>6CGPK|KZ`z1?@t(5Yw=e+t@obhO<>;2VlGEZ0lCM`6ygogWUZUL!J1Acb|!?C?~^ zfM&*keqlYI<(h4*n>RH~S&|(i?(|bf;kB($c?kde`^8V@eyy-jI_I!qwUZ#LsP7hm z`D!ACrDq)zo<6xUuXWs)RrGmO581e(j*sR{MX)b-1K_ip*RW ztVx-oSj;?AMtyczg^p3%hd0h|CN20f$FkgOOIYe&`B3)tzuaD53BIrRYU{Tfdspsy zXEMt?lU<5Ajq8?6(7|(BUi~>49H~n#Et;}s^~$qrB%}McoVBy~kaEO!>i(})6K4LY zyS?r9^`E)BeeCb8uQf5hxhJFYSFfJx)UwsG=U3Xyo3re1g}kI`)snWU<0p=2@uP9mYvoy?dgRuzSRjQ zu6y+z5%^VX0Mt0;NK{KwO~H+KOe%}-G;iAV#QBE-M?m$a3`K<*HT)U3dF&T`K6v;Yoml4TV>K~$@!1y}yaH>tMD?*gWjAn}8>7b^HtD2p@)v$kQuV)A zoTLg&ra#$0NtKaFgaNf!faQ8nv49GY3JG+L$mt(cC?J3}kV&A3KsOAe8RiO5mO+3l sMzjost`*sHpbUcm%Yj;vvJ7%I1ZAH9Z&qM(!Au7%>2A!eP)ILZ*~rlJQGw=08Xt^Kotm` zxv8ZAMfvGPiMfe-AW?7av)*ARe06y>PWkJ5o$^g*K`R0_gc@vl_Grz8 zYiyHPU1wIRN_nkH^|Im;opmi{YfKE-3EIhOPS!vRKp3|Zc!9F|sd;6YMfrKTsd*(N zxnCNn8Cfq9TMx(%4l6jTeOl+#`P05 - file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/robot/RobotControlPanel.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/interpreter/Interpreter.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/util/trafficsimulator/Clock.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/Block.java file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/robot/RobotManager.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/console/LimitLinesDocumentListener.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/If.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/begginer/Move.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/Command.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/robot/Robot.java file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/swing/DrawableProcedureBlock.java file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/GUI.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/parser/parameterparser/Argument.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/swing/MutableWidgetContainer.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/begginer/Rotate.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/sidepanel/SidePanel.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/swing/component/WidgetLine.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/swing/WidgetContainer.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/SimulationPanel.java file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/Procedure.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/console/MessageConsole.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/util/PrintString.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/begginer/ReadDevice.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/FlowchartBlock.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/util/StepMode.java file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/Comment.java - file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/begginer/Wait.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/DrawingPanel.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/BreakLoop.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/FlowchartPanel.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/gui/panels/robot/RobotControlPanel.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/DummyBlock.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/If.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/interpreter/ResourceNotFoundException.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/drawable/swing/MutableWidgetContainer.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/interpreter/ExecutionException.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/plugin.txt + file:/home/andy/Projects/RobotInterface/src/robotinterface/interpreter/Expression.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/algorithm/procedure/Function.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/plugin/cmdpack/util/PrintString.java + file:/home/andy/Projects/RobotInterface/src/robotinterface/robot/simulation/Environment.java diff --git a/src/resources/jifi_icon.png b/src/resources/jifi_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c294d7026a2f3b69ce840cd359f9b477a6b55c5 GIT binary patch literal 3740 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 Q?+Hj=T1Bcx!X)_r09_i)!T + + + + + diff --git a/src/robotinterface/algorithm/parser/decoder/.project b/src/robotinterface/algorithm/parser/decoder/.project new file mode 100644 index 0000000..c2f9029 --- /dev/null +++ b/src/robotinterface/algorithm/parser/decoder/.project @@ -0,0 +1,17 @@ + + + JIFIJavaCC + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/robotinterface/algorithm/parser/decoder/Decoder.java b/src/robotinterface/algorithm/parser/decoder/Decoder.java index 1a1586b..90b9123 100644 --- a/src/robotinterface/algorithm/parser/decoder/Decoder.java +++ b/src/robotinterface/algorithm/parser/decoder/Decoder.java @@ -986,10 +986,21 @@ final public void ifStatement(Block b) throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ELSE: jj_consume_token(ELSE); - block(bFalse, false); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LBRACE: + block(bFalse, false); + break; + case IF: + ifStatement(bFalse); + break; + default: + jj_la1[39] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } break; default: - jj_la1[39] = jj_gen; + jj_la1[40] = jj_gen; ; } i.addLineArg(0, Argument.EXPRESSION, ex); @@ -1548,7 +1559,7 @@ private boolean jj_3R_61() { private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[40]; + final private int[] jj_la1 = new int[41]; static private int[] jj_la1_0; static private int[] jj_la1_1; static { @@ -1556,10 +1567,10 @@ private boolean jj_3R_61() { jj_la1_init_1(); } private static void jj_la1_init_0() { - jj_la1_0 = new int[] {0x80,0x0,0x0,0x2000000,0x688000,0x0,0x688000,0x688000,0x0,0x0,0x0,0x0,0x0,0x90000000,0x90000000,0x6c000000,0x6c000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x688000,0x0,0x688000,0x0,0x0,0x0,0x288000,0x400000,0x288000,0x0,0x688000,0x689ae0,0x689ae0,0x0,0x688000,0x400,}; + jj_la1_0 = new int[] {0x80,0x0,0x0,0x2000000,0x688000,0x0,0x688000,0x688000,0x0,0x0,0x0,0x0,0x0,0x90000000,0x90000000,0x6c000000,0x6c000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x688000,0x0,0x688000,0x0,0x0,0x0,0x288000,0x400000,0x288000,0x0,0x688000,0x689ae0,0x689ae0,0x0,0x688000,0x200,0x400,}; } private static void jj_la1_init_1() { - jj_la1_1 = new int[] {0x0,0x80000,0x10000,0x0,0x301103c,0x80000,0x301103c,0x300103c,0x1,0x2,0x200,0x400,0x100,0x0,0x0,0x0,0x0,0xe00000,0xe00000,0x30,0x30,0x8c0,0x8c0,0x30,0x300103c,0x3000000,0x3001000,0xc,0xc,0x110000,0x0,0x1000,0x0,0x110000,0x0,0x304503c,0x304503c,0x80000,0x300103c,0x0,}; + jj_la1_1 = new int[] {0x0,0x80000,0x10000,0x0,0x301103c,0x80000,0x301103c,0x300103c,0x1,0x2,0x200,0x400,0x100,0x0,0x0,0x0,0x0,0xe00000,0xe00000,0x30,0x30,0x8c0,0x8c0,0x30,0x300103c,0x3000000,0x3001000,0xc,0xc,0x110000,0x0,0x1000,0x0,0x110000,0x0,0x304503c,0x304503c,0x80000,0x300103c,0x4000,0x0,}; } final private JJCalls[] jj_2_rtns = new JJCalls[4]; private boolean jj_rescan = false; @@ -1576,7 +1587,7 @@ public Decoder(java.io.InputStream stream, String encoding) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1591,7 +1602,7 @@ public void ReInit(java.io.InputStream stream, String encoding) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1602,7 +1613,7 @@ public Decoder(java.io.Reader stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1613,7 +1624,7 @@ public void ReInit(java.io.Reader stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1623,7 +1634,7 @@ public Decoder(DecoderTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1633,7 +1644,7 @@ public void ReInit(DecoderTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 40; i++) jj_la1[i] = -1; + for (int i = 0; i < 41; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -1750,7 +1761,7 @@ public ParseException generateParseException() { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 40; i++) { + for (int i = 0; i < 41; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1< ";" { block.add(new BreakLoop()); } | { m = mark(); } variableDeclaration() //alterar para statementExpression() para permitir a++ { if (block != null) { if (last == null || last.getClass() != Procedure.class) { last = new Procedure(getString(m)); block.add(last); } else { last.append(getString(m)); } } } } void functionCall(Block block) : { int m = 0; Stack < Integer > argType = new Stack < Integer > (); Stack < String > argEx = new Stack < String > (); Token tmpToken; Token functionID; } { functionID = < IDENTIFIER > "(" [ { m = mark(); tmpToken = token; } expression() { argType.push(((tmpToken.next.image == token.image) ? token.kind : - 1)); argEx.push(getString(m)); } ( "," { m = mark(); tmpToken = token; } expression() { argType.push(((tmpToken.next.image == token.image) ? token.kind : - 1)); argEx.push(getString(m)); } )* ] { boolean error = true; for (FunctionToken ftoken : EditorPanel.getFunctionTokens()) { if (ftoken.getToken().equals(functionID.toString())) { Argument [ ] args = ParameterParser.parse(functionID.toString(), argType, argEx, - 1 /*ftoken.getParameters()*/, token); block.add(ftoken.createInstance(args)); //parameters = parameters.trim(); //block.add(ftoken.createInstance(parameters)); error = false; functionCall = true; last = null; break; } } jep.initFunTab(); // clear the contents of the function table - jep.addStandardFunctions(); for (Object o : jep.getFunctionTable().keySet()) { if (o.toString().equals(functionID.toString())) { error = false; break; } } if (error) { throw new ParseException(token, new int [ ] [ ] {} , new String [ ] { "Função \"" + functionID.toString() + "\" inválida" } ); } } ")" } void ifStatement(Block b) : { String ex; If i = new If(); last = i; Block bTrue = i.getBlockTrue(), bFalse = i.getBlockFalse(); } { < IF > "(" { int m = mark(); } expression() { ex = getString(m); } ")" block(bTrue, false) [ < ELSE > block(bFalse, false) ] { i.addLineArg(0, Argument.EXPRESSION, ex); b.add(i); localBlock = b; } } void whileStatement(Block b) : { While w = new While(); last = w; String ex; } { < WHILE > "(" { int m = mark(); } expression() { ex = getString(m); } ")" block(w, false) { + jep.addStandardFunctions(); for (Object o : jep.getFunctionTable().keySet()) { if (o.toString().equals(functionID.toString())) { error = false; break; } } if (error) { throw new ParseException(token, new int [ ] [ ] {} , new String [ ] { "Função \"" + functionID.toString() + "\" inválida" } ); } } ")" } void ifStatement(Block b) : { String ex; If i = new If(); last = i; Block bTrue = i.getBlockTrue(), bFalse = i.getBlockFalse(); } { < IF > "(" { int m = mark(); } expression() { ex = getString(m); } ")" block(bTrue, false) [ < ELSE > (block(bFalse, false) | ifStatement(bFalse)) ] { i.addLineArg(0, Argument.EXPRESSION, ex); b.add(i); localBlock = b; } } void whileStatement(Block b) : { While w = new While(); last = w; String ex; } { < WHILE > "(" { int m = mark(); } expression() { ex = getString(m); } ")" block(w, false) { w.addLineArg(0, Argument.EXPRESSION, ex); b.add(w); localBlock = b; } } \ No newline at end of file diff --git a/src/robotinterface/algorithm/parser/parameterparser/Argument.java b/src/robotinterface/algorithm/parser/parameterparser/Argument.java index 5b2e0cf..020d63b 100644 --- a/src/robotinterface/algorithm/parser/parameterparser/Argument.java +++ b/src/robotinterface/algorithm/parser/parameterparser/Argument.java @@ -202,6 +202,11 @@ public final Widget setValueOf(Widget... ws) { throw new Error("JComponent not found : " + type + ", widgets found: " + ws.length + " : " + ((ws.length > 0) ? (ws[0].getJComponent().getClass().getSimpleName()) : "null")); } + + @Deprecated + public String getStatement(){ + return statement; + } @Override public final String toString() { diff --git a/src/robotinterface/algorithm/procedure/DummyBlock.java b/src/robotinterface/algorithm/procedure/DummyBlock.java index bc230da..98ba35f 100644 --- a/src/robotinterface/algorithm/procedure/DummyBlock.java +++ b/src/robotinterface/algorithm/procedure/DummyBlock.java @@ -47,7 +47,7 @@ public void splitBoxLabel(String original, Collection splitted) { @Override public GraphicObject getDrawableResource() { if (resource == null) { - resource = createSimpleBlock(" vazio ", Color.LIGHT_GRAY, Color.LIGHT_GRAY); + resource = createSimpleBlock(" - ", Color.LIGHT_GRAY, Color.LIGHT_GRAY); } return resource; } diff --git a/src/robotinterface/algorithm/procedure/Function.java b/src/robotinterface/algorithm/procedure/Function.java index 98996fc..f01fb2d 100644 --- a/src/robotinterface/algorithm/procedure/Function.java +++ b/src/robotinterface/algorithm/procedure/Function.java @@ -74,7 +74,7 @@ protected FunctionEnd() { @Override public GraphicObject getDrawableResource() { if (resource == null) { - resource = createSimpleBlock(" fim ", Color.black, Color.black); + resource = createSimpleBlock(" END ", Color.black, Color.decode("#631864")); } return resource; } @@ -89,7 +89,7 @@ public void toString(String ident, StringBuilder sb) { } } - private String name = "meuPrograma"; + private String name = "prog"; private ArrayList args; public Function() { @@ -465,7 +465,8 @@ public String getBoxLabel() { @Override public GraphicObject getDrawableResource() { if (resource == null) { - resource = createDrawableFunction(this); + //resource = createDrawableFunction(this); + resource = createSimpleBlock(" BEGIN ", Color.black, Color.decode("#631864")); } return resource; } diff --git a/src/robotinterface/algorithm/procedure/If.java b/src/robotinterface/algorithm/procedure/If.java index 4216093..8d78ea0 100644 --- a/src/robotinterface/algorithm/procedure/If.java +++ b/src/robotinterface/algorithm/procedure/If.java @@ -819,7 +819,7 @@ public void drawLines(Graphics2D g) { GraphicFlowchart.GF_K); //true - g.drawString("V", (int) bTrueStart.getCenterX() - 3, (int) bThis.getCenterY() - 4); + g.drawString("T", (int) bTrueStart.getCenterX() - 3, (int) bThis.getCenterY() - 4); path.moveTo(bThis.getCenterX(), bThis.getCenterY()); path.lineTo(bTrueStart.getCenterX(), bThis.getCenterY()); diff --git a/src/robotinterface/algorithm/procedure/Procedure.java b/src/robotinterface/algorithm/procedure/Procedure.java index 4382b97..a076a80 100644 --- a/src/robotinterface/algorithm/procedure/Procedure.java +++ b/src/robotinterface/algorithm/procedure/Procedure.java @@ -34,6 +34,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JTextField; @@ -70,6 +72,7 @@ public class Procedure extends Command implements Classifiable { private ArrayList myArgs; private String procedure; private boolean varArgs; + private Pattern p = Pattern.compile("(\\S+)(\\+\\+)"); public Procedure() { //tornar private varArgs = true; @@ -176,9 +179,23 @@ protected final Object execute(String procedure, ResourceManager rm) throws Exec } for (String str : procedure.split(";")) { - if (!str.startsWith("var")) { + str = str.trim(); + if (!(str.startsWith("var") || str.isEmpty())) { + + Matcher m = p.matcher(str); + if (m.find()) { + String valid = m.group(1) + " = " + m.group(1) + " + 1"; + if (this.procedure.equals(procedure)) { + this.procedure = procedure.replace(str, valid); + } + str = valid; + } + parser.parseExpression(str); o = parser.getValueAsObject(); + if (parser.hasError()) { + throw new ExecutionException(parser.getErrorInfo() + " in \"" + str + "\""); + } } } @@ -269,7 +286,7 @@ public Argument addLineArg(int index, int type, Object data) { } } Argument arg = myArgs.get(index); - if (data != nill){ + if (data != nill) { arg.set(data, type); } return arg; diff --git a/src/robotinterface/algorithm/procedure/While.java b/src/robotinterface/algorithm/procedure/While.java index e25f2c5..c343d15 100644 --- a/src/robotinterface/algorithm/procedure/While.java +++ b/src/robotinterface/algorithm/procedure/While.java @@ -69,8 +69,6 @@ public Command step(ResourceManager rm) throws ExecutionException { if (evaluate(rm)) { return start; - } else { - System.out.println("fail: " + super.getProcedure()); } return super.step(rm); } diff --git a/src/robotinterface/drawable/DrawingPanel.java b/src/robotinterface/drawable/DrawingPanel.java index 6060029..135e68f 100644 --- a/src/robotinterface/drawable/DrawingPanel.java +++ b/src/robotinterface/drawable/DrawingPanel.java @@ -163,6 +163,10 @@ public DrawingPanel(Clock c, boolean autoFullSize) { public DrawingPanel() { this(new Clock()); } + + public Clock getClock(){ + return clock; + } private void addListeners() { this.addMouseListener(this); @@ -936,6 +940,11 @@ public Point getMouseDrag() { public int getMouseWheelRotation() { return mouseWheelRotation; } + + public void getMouseClickConsume() { + mouseClickCount = 0; + mouseClick = false; + } } public static void main(String[] args) { diff --git a/src/robotinterface/drawable/swing/MutableWidgetContainer.java b/src/robotinterface/drawable/swing/MutableWidgetContainer.java index bf995cc..f0f56cf 100644 --- a/src/robotinterface/drawable/swing/MutableWidgetContainer.java +++ b/src/robotinterface/drawable/swing/MutableWidgetContainer.java @@ -262,6 +262,7 @@ public void draw(Graphics2D g, DrawingPanel.GraphicAttributes ga, DrawingPanel.I if (widgetsEnabled & in.mouseClicked() && in.getMouseClickCount() == 2) { setWidgetVisible(!isWidgetVisible()); shapeBounds.setRect(0, 0, 0, 0); + in.getMouseClickConsume(); } //sombra diff --git a/src/robotinterface/gui/GUI.form b/src/robotinterface/gui/GUI.form index 577bd68..16ad3aa 100644 --- a/src/robotinterface/gui/GUI.form +++ b/src/robotinterface/gui/GUI.form @@ -10,6 +10,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -49,6 +76,14 @@ + + + + + + + + @@ -170,6 +205,9 @@ + + + @@ -353,12 +391,11 @@ - + - @@ -409,7 +446,7 @@ - + @@ -421,81 +458,47 @@ - - - - - - - - - + - + - - - - - + - - + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/robotinterface/gui/GUI.java b/src/robotinterface/gui/GUI.java index eaafbe6..883a180 100644 --- a/src/robotinterface/gui/GUI.java +++ b/src/robotinterface/gui/GUI.java @@ -22,6 +22,8 @@ import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; @@ -35,6 +37,7 @@ import java.util.EventListener; import java.util.HashMap; import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Level; @@ -45,12 +48,14 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; +import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; @@ -89,7 +94,7 @@ * * @author antunes */ -public class GUI extends javax.swing.JFrame implements ComponentListener { +public class GUI extends JFrame implements ComponentListener { private static Logger logger = null; private static GUI INSTANCE = null; @@ -103,8 +108,51 @@ public class GUI extends javax.swing.JFrame implements ComponentListener { private final boolean allowMainTabbedPaneStateChanged; private final JSplitPane simulationSplitPanel; private boolean splitView = false; - private JTextPane console; + private static JTextArea console; public boolean LOG = false; + private static ConsoleManagerThread cmt = null; + private Interpreter mainInterpreter = new Interpreter(); + private Interpreter interpreter; + + private static class ConsoleManagerThread extends Thread { + + public ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + + @Override + public void run() { + int size; + while (true) { + size = queue.size(); + if (size != 0) { + console.setText(console.getText() + "\n" + queue.poll()); + console.selectAll(); + if (size > 20) { + System.err.println("Console Queue Overflow :/"); + console.setText("Console Queue Overflow :/\n" + queue.poll()); + queue.clear(); + } + } + try { + Thread.sleep(1); + } catch (InterruptedException ex) { + } + } + } + + public void enqueue(String str) { + queue.offer(str); + } + + } + + public static void print(String str) { + if (cmt == null || !cmt.isAlive()) { + cmt = new ConsoleManagerThread(); + cmt.start(); + } + + cmt.enqueue(str); + } private GUI() { @@ -113,22 +161,25 @@ private GUI() { initComponents(); setLocationRelativeTo(null); + setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); // secondarySplitPane.setDividerLocation(.5); stepButton.setVisible(false); + deleteButton.setVisible(false); + jSeparator5.setVisible(false); //muito importante para fazer o KeyListener funcionar //o NetBeans mentiu quando disse que o JFrame era focusable! =( setFocusable(true); - console = new JTextPane(); + console = new JTextArea(); consolePanel.setLayout(new GridLayout()); consolePanel.setName("Console"); consolePanel.add(new JScrollPane(console)); - dynamicTabbedPane.add(consolePanel); - MessageConsole mc = new MessageConsole(console); - mc.redirectOut(Color.BLACK, System.out); - mc.redirectErr(Color.RED, System.err); - mc.setMessageLines(100); +// dynamicTabbedPane.add(consolePanel); +// MessageConsole mc = new MessageConsole(console); +// mc.redirectOut(Color.BLACK, System.out); +// mc.redirectErr(Color.RED, System.err); +// mc.setMessageLines(100); final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem menuItem = new JMenuItem("Limpar"); menuItem.addActionListener(new ActionListener() { @@ -164,18 +215,17 @@ public void mouseExited(MouseEvent e) { } }); - jSpinner1.setModel(new SpinnerNumberModel(0, 0, 9999, 10)); - jSpinner1.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - int i = (int) jSpinner1.getValue(); - if (interpreter != null) { - interpreter.setTimestep(i); - } - } - }); - autoUpdateValue(jSpinner1); - +// jSpinner1.setModel(new SpinnerNumberModel(0, 0, 9999, 10)); +// jSpinner1.addChangeListener(new ChangeListener() { +// @Override +// public void stateChanged(ChangeEvent e) { +// int i = (int) jSpinner1.getValue(); +// if (interpreter != null) { +// interpreter.setTimestep(i); +// } +// } +// }); +// autoUpdateValue(jSpinner1); jSpinner1.setVisible(false); robotComboBox.setVisible(false); timestepTButton.addChangeListener(new ChangeListener() { @@ -252,6 +302,56 @@ public String getDescription() { super.addComponentListener(this); console.setText(""); + addDebugMenu(); + super.setIconImage(new ImageIcon(getClass().getResource("/resources/jifi_icon.png")).getImage()); + + this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent we) { + String ObjButtons[] = {"Fechar", "Cancelar"}; + int PromptResult = JOptionPane.showOptionDialog(null, "Tem certeza que deseja fechar o programa?\nTodas as alterações não salvas serão perdidas.", "JIFI", JOptionPane.NO_OPTION, JOptionPane.WARNING_MESSAGE, null, ObjButtons, ObjButtons[1]); + if (PromptResult == JOptionPane.YES_OPTION) { + System.exit(0); + } + } + }); + + //simplificando.... + addNewCodePanel.setVisible(false); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + { + //adicionando um novo fluxograma + FlowchartPanel fp = new FlowchartPanel(new Function(), mainInterpreter); + mainProject.getFunctions().add(fp.getFunction()); + mapFC.add(fp); + add(fp, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);//-2 + } + } + }); + + } + + @Deprecated + public final void addDebugMenu() { + menuDev.add(newItem("Print lib dir", new ActionListener() { + public void actionPerformed(ActionEvent e) { + String str = "natives/" + JniNamer.os() + "/" + JniNamer.arch(); + JOptionPane.showMessageDialog(null, str, "Print lib dir", JOptionPane.INFORMATION_MESSAGE); + } + })); + } + + @Deprecated + public final JMenuItem newItem(String name, ActionListener action) { + JMenuItem item = new JMenuItem(); + item.setText(name); + item.addActionListener(action); + return item; } public SimulationPanel getSimulationPanel() { @@ -331,7 +431,7 @@ public void updateTabNames() { Component c = mainTabbedPane.getComponentAt(i); if (c instanceof FlowchartPanel) { Function f = ((FlowchartPanel) c).getFunction(); - mainTabbedPane.setTitleAt(i, "fx : " + f.getName()); + mainTabbedPane.setTitleAt(i, "Fluxograma"); } } } @@ -346,6 +446,8 @@ public void updateTabNames() { private void initComponents() { dynamicToolBar = new javax.swing.JToolBar(); + secondarySplitPane = new javax.swing.JSplitPane(); + staticTabbedPane = new javax.swing.JTabbedPane(); toolBar = new javax.swing.JToolBar(); newFileButton = new javax.swing.JButton(); openButton = new javax.swing.JButton(); @@ -370,21 +472,29 @@ private void initComponents() { mainTabbedPane = new javax.swing.JTabbedPane(); simulationPanel = new robotinterface.gui.panels.SimulationPanel(); addNewCodePanel = new javax.swing.JPanel(); - secondarySplitPane = new javax.swing.JSplitPane(); - staticTabbedPane = new javax.swing.JTabbedPane(); - jScrollPane3 = new javax.swing.JScrollPane(); dynamicTabbedPane = new javax.swing.JTabbedPane(); consolePanel = new javax.swing.JPanel(); + jScrollPane3 = new javax.swing.JScrollPane(); jToolBar1 = new javax.swing.JToolBar(); menuBar = new javax.swing.JMenuBar(); menuFile = new javax.swing.JMenu(); jMenuItem3 = new javax.swing.JMenuItem(); jMenuItem1 = new javax.swing.JMenuItem(); jMenuItem2 = new javax.swing.JMenuItem(); + menuDev = new javax.swing.JMenu(); dynamicToolBar.setFloatable(false); dynamicToolBar.setRollover(true); + secondarySplitPane.setBorder(null); + secondarySplitPane.setDividerLocation(220); + secondarySplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + secondarySplitPane.setEnabled(false); + + staticTabbedPane.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT); + staticTabbedPane.setEnabled(false); + secondarySplitPane.setLeftComponent(staticTabbedPane); + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("JIFI - Java Interactive Flowchart Interpreter"); @@ -443,6 +553,8 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { } }); toolBar.add(closeProjectButton); + closeProjectButton.getAccessibleContext().setAccessibleDescription("Limpar Simulação"); + toolBar.add(jSeparator2); timestepTButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/tango/32x32/actions/appointment-new.png"))); // NOI18N @@ -562,10 +674,9 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { splitViewButton.getAccessibleContext().setAccessibleDescription("Dividir Janela"); primarySplitPane.setBorder(null); - primarySplitPane.setDividerLocation(180); + primarySplitPane.setDividerLocation(200); primarySplitPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); primarySplitPane.setDoubleBuffered(true); - primarySplitPane.setEnabled(false); mainTabbedPane.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT); mainTabbedPane.addChangeListener(new javax.swing.event.ChangeListener() { @@ -579,7 +690,7 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { addNewCodePanel.setLayout(addNewCodePanelLayout); addNewCodePanelLayout.setHorizontalGroup( addNewCodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 758, Short.MAX_VALUE) + .addGap(0, 726, Short.MAX_VALUE) ); addNewCodePanelLayout.setVerticalGroup( addNewCodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -592,33 +703,21 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { mainTabbedPane.getAccessibleContext().setAccessibleName(""); mainTabbedPane.getAccessibleContext().setAccessibleDescription(""); - secondarySplitPane.setBorder(null); - secondarySplitPane.setDividerLocation(220); - secondarySplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); - secondarySplitPane.setEnabled(false); - - staticTabbedPane.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT); - staticTabbedPane.setEnabled(false); - staticTabbedPane.addTab("Robôs", jScrollPane3); - - secondarySplitPane.setLeftComponent(staticTabbedPane); - javax.swing.GroupLayout consolePanelLayout = new javax.swing.GroupLayout(consolePanel); consolePanel.setLayout(consolePanelLayout); consolePanelLayout.setHorizontalGroup( consolePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 160, Short.MAX_VALUE) + .addGap(0, 0, Short.MAX_VALUE) ); consolePanelLayout.setVerticalGroup( consolePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 361, Short.MAX_VALUE) + .addGap(0, 0, Short.MAX_VALUE) ); - dynamicTabbedPane.addTab("tab1", consolePanel); - - secondarySplitPane.setRightComponent(dynamicTabbedPane); + dynamicTabbedPane.addTab("Console", consolePanel); + dynamicTabbedPane.addTab("Conexões", jScrollPane3); - primarySplitPane.setLeftComponent(secondarySplitPane); + primarySplitPane.setLeftComponent(dynamicTabbedPane); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); @@ -653,6 +752,10 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { menuBar.add(menuFile); + menuDev.setText(" "); + menuBar.add(menuDev); + menuDev.getAccessibleContext().setAccessibleName("."); + setJMenuBar(menuBar); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); @@ -681,7 +784,7 @@ public void setSimulationMode() { System.out.println("set"); } - Interpreter interpreter = null; +// Interpreter interpreter = null; private void mainTabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_mainTabbedPaneStateChanged if (!allowMainTabbedPaneStateChanged) { @@ -700,19 +803,18 @@ private void mainTabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GE dynamicToolBar.removeAll(); - for (Component cc : dynamicTabbedPane.getComponents()) { - if (cc != consolePanel) {//jPanel5 - dynamicTabbedPane.remove(cc); - } - } - +// for (Component cc : dynamicTabbedPane.getComponents()) { +// if (cc != consolePanel) {//jPanel5 +// dynamicTabbedPane.remove(cc); +// } +// } if (cmp == addNewCodePanel) { //adicionando uma nova aba - FlowchartPanel fp = new FlowchartPanel(new Function()); + FlowchartPanel fp = new FlowchartPanel(new Function(), mainInterpreter); mainProject.getFunctions().add(fp.getFunction()); mapFC.add(fp); add(fp, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);//-2 return; } else { if (cmp instanceof TabController) { @@ -796,7 +898,7 @@ private void runButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIR if (interpreter != null) { if (setDefaultRobot(interpreter, true)) { interpreter.setInterpreterState(Interpreter.PLAY); - if (console != null){ + if (console != null) { console.setText(""); } } else { @@ -868,10 +970,10 @@ private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FI } } } - FlowchartPanel fcp = new FlowchartPanel(f); + FlowchartPanel fcp = new FlowchartPanel(f, mainInterpreter); add(fcp, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); mapFC.add(fcp); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);//-2 } }//GEN-LAST:event_openButtonActionPerformed @@ -942,7 +1044,7 @@ private void switchCodeButtonActionPerformed(java.awt.event.ActionEvent evt) {// cep.getTextArea().setCaretPosition(0); add(cep, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);// - 2 mainTabbedPane.remove(fcp); fcp.getInterpreter().setInterpreterState(Interpreter.STOP); @@ -1036,14 +1138,14 @@ private void switchCodeButtonActionPerformed(java.awt.event.ActionEvent evt) {// mainProject.getFunctions().remove(fcp.getFunction()); fcp.setFunction(f); } else { - fcp = new FlowchartPanel(f); + fcp = new FlowchartPanel(f, mainInterpreter); mapFC.add(fcp); } mainProject.getFunctions().add(f); add(fcp, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() -1);//-2 mainTabbedPane.remove(cep); // switchCodeButton.setIcon(flowchartIcon); fcp.getInterpreter().setInterpreterState(Interpreter.STOP); @@ -1248,9 +1350,10 @@ public void run() { } }; simulationSplitPanel.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, propertyChangeListener); - mainTabbedPane.add(simulationSplitPanel, new ImageIcon(getClass().getResource("/resources/tango/16x16/apps/preferences-system-windows.png"))); - mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); + //mainTabbedPane.add(simulationSplitPanel, new ImageIcon(getClass().getResource("/resources/tango/16x16/apps/preferences-system-windows.png"))); + mainTabbedPane.addTab("Simulação + Fluxograma", new ImageIcon(getClass().getResource("/resources/tango/16x16/apps/preferences-system-windows.png")), simulationSplitPanel); +// mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);//-2 SwingUtilities.invokeLater(new Runnable() { @Override @@ -1269,8 +1372,8 @@ public void run() { ((FlowchartPanel) bottomComponent).hideSidePanel(false); } mainTabbedPane.add(bottomComponent, new ImageIcon(getClass().getResource("/resources/tango/16x16/categories/applications-other.png"))); - mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); - mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 2); +// mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); + mainTabbedPane.setSelectedIndex(mainTabbedPane.getTabCount() - 1);//-2 splitView = false; if (evt != null && cmp != simulationSplitPanel && simulationSplitPanel.getBottomComponent() != cmp) { mainTabbedPane.setSelectedComponent(cmp); @@ -1290,7 +1393,7 @@ public void add(JComponent panel, ImageIcon icon) { if (panel instanceof ComponentListener) { mainTabbedPane.addComponentListener((ComponentListener) panel); } - mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); +// mainTabbedPane.addTab(addNewCodePanel.getName(), new ImageIcon(getClass().getResource("/resources/tango/16x16/actions/list-add.png")), addNewCodePanel); } public void updateControlBar(Interpreter interpreter) { @@ -1488,6 +1591,7 @@ public void run() { private javax.swing.JToolBar jToolBar1; private javax.swing.JTabbedPane mainTabbedPane; private javax.swing.JMenuBar menuBar; + private javax.swing.JMenu menuDev; private javax.swing.JMenu menuFile; private javax.swing.JButton newFileButton; private javax.swing.JButton openButton; diff --git a/src/robotinterface/gui/panels/FlowchartPanel.java b/src/robotinterface/gui/panels/FlowchartPanel.java index 42fa22a..f8f04c9 100644 --- a/src/robotinterface/gui/panels/FlowchartPanel.java +++ b/src/robotinterface/gui/panels/FlowchartPanel.java @@ -17,7 +17,9 @@ import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Stack; +import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.SwingUtilities; import robotinterface.algorithm.Command; import robotinterface.algorithm.GraphicFlowchart; import robotinterface.algorithm.procedure.Block; @@ -44,6 +46,7 @@ public class FlowchartPanel extends DrawingPanel implements Interpertable { private final Color selectionColor = new Color(0, .2f, .5f, .5f); private final Color executionColor = new Color(0, 1, 0, .5f); + private final Color errorColor = new Color(1, 0, 0, .5f); public ArrayList tabs = new ArrayList<>(); private final ArrayList selection = new ArrayList<>(); private final ArrayList copy = new ArrayList<>(); @@ -58,10 +61,23 @@ public class FlowchartPanel extends DrawingPanel implements Interpertable { private int clickDrop = 0; private GraphicObject executionCommand = null; - public FlowchartPanel(Function function) { + public FlowchartPanel(Function function, final Interpreter interpreter) { sidePanel = new SidePanel() { @Override protected void ItemSelected(Item item, Object ref) { + if (interpreter.getInterpreterState() == Interpreter.PLAY) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(null, "Atenção: A edição do fluxograma está suspensa\naté que o código termine ou seja pausado.", "Atenção", JOptionPane.WARNING_MESSAGE); + if (itemSelected != null) { + itemSelected.setSelected(false); + itemSelected = null; + } + } + }); + } + try { if (itemSelected != null) { itemSelected.setSelected(false); @@ -80,9 +96,12 @@ protected void ItemSelected(Item item, Object ref) { add(sidePanel); - interpreter = new Interpreter(); - interpreter.start(); + this.interpreter = interpreter; + if (!interpreter.isAlive()) { + this.interpreter.start(); + } setFunction(function); + super.setName("Fluxograma"); } public void hideSidePanel(boolean b) { @@ -244,6 +263,7 @@ private boolean addCommand(Point p) { public void drawTopLayer(Graphics2D g, GraphicAttributes ga, InputState in) { Command cmd = interpreter.getCurrentCommand(); + if (interpreter.getInterpreterState() == Interpreter.STOP) { executionCommand = null; // } else if (interpreter.getTimestep() < 20) { @@ -257,7 +277,22 @@ public void drawTopLayer(Graphics2D g, GraphicAttributes ga, InputState in) { } } - if (executionCommand != null) { + Command error = interpreter.getErrorCommand(); + + if (error != null) { + GraphicObject errorCommand = ((GraphicResource) error).getDrawableResource(); + AffineTransform o = g.getTransform(); + AffineTransform n = ga.getT(o); + ga.applyGlobalPosition(n); + ga.applyZoom(n); + g.setTransform(n); + g.setColor(errorColor); + g.setStroke(new BasicStroke(5)); + g.fill(errorCommand.getObjectShape()); + g.draw(errorCommand.getObjectShape()); + g.setTransform(o); + ga.done(n); + } else if (executionCommand != null) { AffineTransform o = g.getTransform(); AffineTransform n = ga.getT(o); ga.applyGlobalPosition(n); @@ -631,7 +666,7 @@ private boolean isValidSelection() { public static void main(String[] args) { QuickFrame.applyLookAndFeel(); - FlowchartPanel p = new FlowchartPanel(Interpreter.newTestFunction()); + FlowchartPanel p = new FlowchartPanel(Interpreter.newTestFunction(), new Interpreter()); QuickFrame.create(p, "Teste FlowcharPanel").addComponentListener(p); } diff --git a/src/robotinterface/gui/panels/robot/RobotControlPanel.java b/src/robotinterface/gui/panels/robot/RobotControlPanel.java index a23f206..59a7c36 100644 --- a/src/robotinterface/gui/panels/robot/RobotControlPanel.java +++ b/src/robotinterface/gui/panels/robot/RobotControlPanel.java @@ -166,7 +166,7 @@ public void putMessage(ByteBuffer data, Robot robot) { initComponents(); border = javax.swing.BorderFactory.createTitledBorder("Robô " + INSTANCE); - setBorder(border); +// setBorder(border); robotManager = rm; connectionStatusGraph.setVisible(false); removeButton.setVisible(false); diff --git a/src/robotinterface/gui/panels/robot/RobotManager.java b/src/robotinterface/gui/panels/robot/RobotManager.java index cba9c6b..9cd9f98 100644 --- a/src/robotinterface/gui/panels/robot/RobotManager.java +++ b/src/robotinterface/gui/panels/robot/RobotManager.java @@ -28,9 +28,9 @@ public class RobotManager extends JPanel implements Iterable public RobotManager(final GUI gui) { this.gui = gui; - super.setLayout(new GridBagLayout()); +// super.setLayout(new GridBagLayout()); cons = new GridBagConstraints(); - cons.fill = GridBagConstraints.HORIZONTAL; + cons.fill = GridBagConstraints.VERTICAL; cons.weightx = 1; cons.gridx = 0; diff --git a/src/robotinterface/interpreter/Interpreter.java b/src/robotinterface/interpreter/Interpreter.java index c2d172c..15338f2 100644 --- a/src/robotinterface/interpreter/Interpreter.java +++ b/src/robotinterface/interpreter/Interpreter.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.JOptionPane; import robotinterface.algorithm.Command; import robotinterface.algorithm.procedure.Function; import robotinterface.algorithm.procedure.If; @@ -64,6 +65,7 @@ public class Interpreter extends Thread { private ResourceManager resourceManager; private Function mainFunction; private Command currentCmd = null; + private Command errorCmd = null; private int state; private int timestep = 0; private boolean running = false; @@ -72,11 +74,12 @@ public Interpreter() { super("Interpreter"); parser = new JEP(); clock = new Clock(); - + resourceManager = new ResourceManager(); resourceManager.setResource(clock); resourceManager.setResource(parser); - + resourceManager.setResource(this); + state = STOP; } @@ -169,6 +172,10 @@ public Command getCurrentCommand() { return currentCmd; } + public Command getErrorCommand() { + return errorCmd; + } + public void setTimestep(int timestep) { this.timestep = timestep; } @@ -179,6 +186,7 @@ public int getTimestep() { public boolean step() { if (currentCmd == null) { + GUI.print(" > FIM < "); return false; } @@ -198,9 +206,17 @@ public boolean step() { } } currentCmd = currentCmd.step(resourceManager); + } catch (ExecutionException e) { - System.out.println("Erro"); - e.printStackTrace(); + //GUI.print("Erro: " + e.getMessage()); + errorCmd = currentCmd; + String msg = "Houve um problema ao executar o código atual.\nO bloco que originou o erro foi destacado.\nFavor corrigir e tentar novamente."; + String ObjButtons[] = {"Continuar", "Mais detalhes"}; + int PromptResult = JOptionPane.showOptionDialog(null, msg, "Erro", JOptionPane.NO_OPTION, JOptionPane.ERROR_MESSAGE, null, ObjButtons, ObjButtons[1]); + if (PromptResult == JOptionPane.NO_OPTION) { + JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE); + } + System.err.println(e.getMessage()); return false; } return true; @@ -211,12 +227,15 @@ public void run() { try { while (true) { if (state == PLAY) { + errorCmd = null; if (!step()) { state = STOP; reset(); GUI.getInstance().updateControlBar(this); } + if (currentCmd != null && currentCmd.getDrawableResource() != null) { + robot.disableMove(true); if (timestep > 50 && Robot.UPDATE_ALL_DEVICES.getTimeout() <= 50) { for (int i = 0; i < timestep; i += 50) { robot.updatePerception(); @@ -225,6 +244,7 @@ public void run() { } else { Thread.sleep(timestep); } + robot.disableMove(false); } running = true; } else { diff --git a/src/robotinterface/plugin/cmdpack/begginer/ReadDevice.java b/src/robotinterface/plugin/cmdpack/begginer/ReadDevice.java index c150f0c..5f88407 100644 --- a/src/robotinterface/plugin/cmdpack/begginer/ReadDevice.java +++ b/src/robotinterface/plugin/cmdpack/begginer/ReadDevice.java @@ -119,7 +119,7 @@ public boolean perform(ResourceManager rm) throws ExecutionException { try { if (device != null && device.isValidRead()) { String deviceState = device.stateToString(); - if (!deviceState.isEmpty()) { + if (!(deviceState.isEmpty() || arg1.getVariableName().isEmpty())) { execute(arg1.getVariableName() + " = " + deviceState, rm); } return true; @@ -198,6 +198,7 @@ public void updateStructure() { return dcb; } + @Override public void toString(String ident, StringBuilder sb) { //reutiliza o metodo da classe pai diff --git a/src/robotinterface/plugin/cmdpack/plugin.txt b/src/robotinterface/plugin/cmdpack/plugin.txt index 72679d1..8bf5617 100644 --- a/src/robotinterface/plugin/cmdpack/plugin.txt +++ b/src/robotinterface/plugin/cmdpack/plugin.txt @@ -5,4 +5,5 @@ robotinterface.plugin.cmdpack.begginer.Move robotinterface.plugin.cmdpack.begginer.Rotate robotinterface.plugin.cmdpack.begginer.Wait robotinterface.plugin.cmdpack.util.PrintString -robotinterface.algorithm.procedure.Comment \ No newline at end of file +robotinterface.algorithm.procedure.Comment +#robotinterface.plugin.cmdpack.util.StepMode diff --git a/src/robotinterface/plugin/cmdpack/util/PrintString.java b/src/robotinterface/plugin/cmdpack/util/PrintString.java index 3deefc7..4732c56 100644 --- a/src/robotinterface/plugin/cmdpack/util/PrintString.java +++ b/src/robotinterface/plugin/cmdpack/util/PrintString.java @@ -38,6 +38,7 @@ import robotinterface.drawable.swing.component.TextLabel; import robotinterface.drawable.swing.component.Widget; import robotinterface.drawable.util.QuickFrame; +import robotinterface.gui.GUI; import robotinterface.gui.panels.sidepanel.Item; import robotinterface.interpreter.ExecutionException; import robotinterface.interpreter.ResourceManager; @@ -80,6 +81,9 @@ public void begin(ResourceManager rm) throws ExecutionException { for (int i = 1; i < getArgSize(); i++) { arg = getArg(i); arg.parse(parser); + if (parser.hasError()) { + throw new ExecutionException(parser.getErrorInfo() + " in \"" + arg.getStatement() + "\""); + } int padpi = out.indexOf(padps); //printAllDecimalPlacesIndex int ptdpi = out.indexOf(ptdps); //printTwoDecimalPlacesIndex boolean printTwoDecimalPlaces = ((padpi == -1) ? true @@ -95,7 +99,8 @@ public void begin(ResourceManager rm) throws ExecutionException { } } - System.out.println(out); + GUI.print(out); + //System.out.println(out); timer.reset(); clock.addTimer(timer); } @@ -156,7 +161,7 @@ public static MutableWidgetContainer createDrawablePrintString(final PrintString @Override public void createRow(Collection components, final MutableWidgetContainer container, int index) { Argument a = p.addLineArg(index, Argument.SINGLE_VARIABLE); - createGenericField(p, a, "v" + index + ":", 80, 25, components, container,WidgetLine.ARG_COMBOBOX | WidgetLine.ARG_TEXTFIELD, false); + createGenericField(p, a, "v" + index + ":", 80, 25, components, container, WidgetLine.ARG_COMBOBOX | WidgetLine.ARG_TEXTFIELD, false); //components.add(new LineBreak(false)); } @@ -203,7 +208,8 @@ public void changedUpdate(DocumentEvent e) { }); JButton bTmp = new JButton(new ImageIcon(getClass().getResource("/resources/fugue/asterisk.png"))); - bTmp.setToolTipText("Adicionar"); + components.add(new Widget(bTmp, 25, 25)); + bTmp.setToolTipText("Adicionar referencia"); bTmp.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/src/robotinterface/plugin/cmdpack/util/StepMode.java b/src/robotinterface/plugin/cmdpack/util/StepMode.java new file mode 100644 index 0000000..e7750d4 --- /dev/null +++ b/src/robotinterface/plugin/cmdpack/util/StepMode.java @@ -0,0 +1,89 @@ +package robotinterface.plugin.cmdpack.util; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Polygon; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import robotinterface.algorithm.Command; +import static robotinterface.algorithm.procedure.DummyBlock.createSimpleBlock; +import robotinterface.algorithm.procedure.Procedure; +import robotinterface.drawable.GraphicObject; +import robotinterface.gui.panels.sidepanel.Item; +import robotinterface.interpreter.ExecutionException; +import robotinterface.interpreter.Interpreter; +import robotinterface.interpreter.ResourceManager; +import robotinterface.util.trafficsimulator.Clock; + +/** + * + * @author antunes2 + */ +public class StepMode extends Procedure { + + private static Color myColor = Color.decode("#631864"); + + public StepMode() { + + } + + private GraphicObject resource = null; + + @Override + public GraphicObject getDrawableResource() { + if (resource == null) { + resource = createSimpleBlock(" (toggle step mode) ", Color.black, myColor); + } + return resource; + } + + @Override + public void begin(ResourceManager rm) throws ExecutionException { + Interpreter interpreter = rm.getResource(Interpreter.class); + interpreter.setTimestep((interpreter.getTimestep() == 0)? 200 : 0); + } + + @Override + public Item getItem() { + + Area myShape = new Area(); + Polygon tmpPoly = new Polygon(); + tmpPoly.addPoint(10, 0); + tmpPoly.addPoint(20, 10); + tmpPoly.addPoint(10, 20); + tmpPoly.addPoint(0, 10); + myShape.add(new Area(tmpPoly)); + myShape.subtract(new Area(new Ellipse2D.Double(5, 5, 10, 10))); + + tmpPoly.reset(); + tmpPoly.addPoint(18, 0); + tmpPoly.addPoint(20, 2); + tmpPoly.addPoint(2, 20); + tmpPoly.addPoint(0, 18); + myShape.add(new Area(tmpPoly)); + + myShape.add(new Area(new Ellipse2D.Double(7, 7, 6, 6))); + return new Item("Modo passo-a-passo", myShape, myColor); + } + + @Override + public void drawLines(Graphics2D g) { + + } + + @Override + public Object createInstance() { + return new StepMode(); + } + + @Override + public void toString(String ident, StringBuilder sb) { + + } +} diff --git a/src/robotinterface/robot/Robot.java b/src/robotinterface/robot/Robot.java index b5dba1c..fec890b 100644 --- a/src/robotinterface/robot/Robot.java +++ b/src/robotinterface/robot/Robot.java @@ -16,6 +16,7 @@ import java.awt.geom.Rectangle2D; import static java.lang.Math.cos; import static java.lang.Math.sin; +import java.nio.BufferOverflowException; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -66,6 +67,12 @@ public class Robot implements Observer, GraphicObject { public static final Action RESET_SYSTEM = new ResetSystem(); public static final Action UPDATE_ALL_DEVICES = new UpdateAllDevices(); public static final AddNewDevice ADD_NEW_DEVICE = new AddNewDevice(); + private boolean DEBUG; + private boolean moveDisabled = false; + + public void disableMove(boolean d) { + moveDisabled = d; + } public class InternalClock extends Device { @@ -134,15 +141,16 @@ public void reset() { } stop(); } + @Deprecated//hbridge para o robo na função stopAll() public void stop() { rightWheelSpeed = 0; leftWheelSpeed = 0; for (Action a : actions) { - if (a.isWaiting()){ + if (a.isWaiting()) { a.markUnread(); a.setDone(); - } else if (a.isRunning()){ + } else if (a.isRunning()) { //System.out.println("reset"); //resetSystem(); a.markUnread(); @@ -338,6 +346,9 @@ public final void virtualRobot(ByteBuffer message, Connection connection) { loop: while (message.remaining() > 0) { buffer.clear(); + if (DEBUG) { + System.out.println("C " + buffer); + } byte cmd = message.get(); switch (cmd) { case CMD_STOP: { @@ -386,9 +397,21 @@ public final void virtualRobot(ByteBuffer message, Connection connection) { Device d = getDevice(id); if (d != null && d instanceof VirtualDevice) { + if (DEBUG) { + System.out.println(".r:" + buffer.remaining() + ",p:" + buffer.position() + ",l:" + buffer.limit()); + } buffer.put(CMD_SET); + if (DEBUG) { + System.out.println(".r:" + buffer.remaining() + ",p:" + buffer.position() + ",l:" + buffer.limit()); + } buffer.put(id); + if (DEBUG) { + System.out.println(".r:" + buffer.remaining() + ",p:" + buffer.position() + ",l:" + buffer.limit()); + } ((VirtualDevice) d).getState(buffer, this); + if (DEBUG) { + System.out.println(".r:" + buffer.remaining() + ",p:" + buffer.position() + ",l:" + buffer.limit()); + } } } else if (LOG) { System.err.println("1mesagem muito curta:" + id + "[" + length + "] de " + message.remaining()); @@ -503,13 +526,24 @@ public final void virtualRobot(ByteBuffer message, Connection connection) { System.err.println("Erro: Comando invalido: " + cmd); } } + if (DEBUG) { + System.out.println("flip"); + } buffer.flip(); + if (DEBUG) { + System.out.println("update"); + } update(buffer, connection); } } catch (BufferUnderflowException e) { if (LOG) { System.err.println("mensagem pela metade"); } + e.printStackTrace(); + } catch (BufferOverflowException e) { + e.printStackTrace(); + System.err.println("r:" + buffer.remaining() + ",p:" + buffer.position() + ",l:" + buffer.limit()); + //System.out.println("??"); } } @@ -850,7 +884,9 @@ public void draw(Graphics2D g, DrawingPanel.GraphicAttributes ga, DrawingPanel.I g.setTransform(o); ga.done(t); - move(ga.getClock().getDt()); + if (!moveDisabled) { + move(ga.getClock().getDt()); + } } @Override diff --git a/src/robotinterface/robot/connection/Serial.java b/src/robotinterface/robot/connection/Serial.java index 8c31fe1..abf763f 100644 --- a/src/robotinterface/robot/connection/Serial.java +++ b/src/robotinterface/robot/connection/Serial.java @@ -9,6 +9,7 @@ import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; +import java.awt.EventQueue; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -20,6 +21,7 @@ import java.util.Collection; import java.util.Enumeration; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import robotinterface.drawable.util.QuickFrame; import robotinterface.gui.panels.SimulationPanel; import robotinterface.util.observable.Observer; @@ -100,12 +102,12 @@ public void setDefaultPort(String defaultPort) { @Override public void send(final byte[] data) { /*byte length = (byte) data.length; - byte[] newdata = new byte[length + 1]; - System.arraycopy(data, 0, newdata, 1, length); - newdata[0] = length;*/ + byte[] newdata = new byte[length + 1]; + System.arraycopy(data, 0, newdata, 1, length); + newdata[0] = length;*/ try { sendedPackages++; - output.write(data.length); + output.write(data.length); output.write(data); // output.flush(); //trava a thread main! pq??? } catch (IOException ex) { @@ -229,7 +231,12 @@ public Collection getAvailableDevices() { closeConnection(); } } catch (Throwable t) { - JOptionPane.showMessageDialog(null, "Falha ao carregar a biblioteca da porta serial.\nApenas simulação virtual disponivel.", "Erro", JOptionPane.ERROR_MESSAGE); + EventQueue.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(null, "Falha ao carregar a biblioteca da porta serial.\nApenas simulação virtual disponivel.", "Erro", JOptionPane.ERROR_MESSAGE); + } + }); FAIL_LOAD_LIBRARY = true; return avaliableDevices; } @@ -439,17 +446,16 @@ public static void main(String[] args) { // s = new VirtualConnection(); /*Robot r = new Robot(); - r.add(new HBridge()); - r.add(new Compass()); - r.add(new IRProximitySensor()); - r.add(new ReflectanceSensorArray()); - s.attach(r); - - if (s instanceof VirtualConnection) { - VirtualConnection v = (VirtualConnection) s; - v.setRobot(r); - }*/ - + r.add(new HBridge()); + r.add(new Compass()); + r.add(new IRProximitySensor()); + r.add(new ReflectanceSensorArray()); + s.attach(r); + + if (s instanceof VirtualConnection) { + VirtualConnection v = (VirtualConnection) s; + v.setRobot(r); + }*/ ArrayList testMessages = new ArrayList<>(); /* PRIMEIROS TESTES */ @@ -516,19 +522,19 @@ public static void main(String[] args) { /* MAPA DE PONTOS PELO SENSOR DE DISTÂNCIA - bug threads */ /*testMessages.add(new byte[]{7, (byte) 224});//reset system - testMessages.add(new byte[]{6, 5, 1, 17});//add dist -// testMessages.add(new byte[]{6, 4, 6, 0, 3, 4, 16, (byte) 200, 0});//add reflet - testMessages.add(new byte[]{5, 1, 2, 0, 30, 5, 1, 2, 1, -30}); //rotaciona - for (int i = 0; i < 5000; i++) { -// testMessages.add(new byte[]{4, 2, 0, 4, 3, 0, 4, 4, 1, 0});//get compass & get dist & get reflet - testMessages.add(new byte[]{Robot.CMD_GET, Robot.XTRA_ALL, 0});//get all - } - - SimulationPanel p = new SimulationPanel(); - p.addRobot(r); - r.setEnvironment(p.getEnv()); - QuickFrame.create(p, "Teste Simulação").addComponentListener(p); -*/ + testMessages.add(new byte[]{6, 5, 1, 17});//add dist + // testMessages.add(new byte[]{6, 4, 6, 0, 3, 4, 16, (byte) 200, 0});//add reflet + testMessages.add(new byte[]{5, 1, 2, 0, 30, 5, 1, 2, 1, -30}); //rotaciona + for (int i = 0; i < 5000; i++) { + // testMessages.add(new byte[]{4, 2, 0, 4, 3, 0, 4, 4, 1, 0});//get compass & get dist & get reflet + testMessages.add(new byte[]{Robot.CMD_GET, Robot.XTRA_ALL, 0});//get all + } + + SimulationPanel p = new SimulationPanel(); + p.addRobot(r); + r.setEnvironment(p.getEnv()); + QuickFrame.create(p, "Teste Simulação").addComponentListener(p); + */ /* TESTE DO RÁDIO */ //quando uma mensagem chega é exibido "S:10 x R:10" @@ -536,9 +542,9 @@ public static void main(String[] args) { //ATENÇÃO: trocar intervalo de tempo na linha ~389 //coloca 100 mensagens na lista de espera int test = 100; - for (int i = 0; i < test; i++) - testMessages.add(new byte[]{1,2,3,4,5});//get clock -// + for (int i = 0; i < test; i++) { + testMessages.add(new byte[]{1, 2, 3, 4, 5});//get clock + }// // testMessages.add(new byte[]{2, });//get clock //// testMessages.add(new byte[]{3, 4, (byte) 223, 0});//get freeRam // } @@ -546,18 +552,18 @@ public static void main(String[] args) { System.out.println("connected"); long timeSum = 0; byte[] buffer = new byte[20]; - + for (int i = 0; i < 1; i++) { //repetição int send = 0; for (byte[] message : testMessages) { send++; boolean timeout = false; long mtimestamp = System.currentTimeMillis(); - int w = ((Serial)s).getReceivedPackages(); + int w = ((Serial) s).getReceivedPackages(); s.send(message); try { loop: - while ( !((Serial)s).available() ){//w == ((Serial)s).getReceivedPackages()/*((Serial) s).receivedPackages*/) { + while (!((Serial) s).available()) {//w == ((Serial)s).getReceivedPackages()/*((Serial) s).receivedPackages*/) { //tempo maximo para enviar: ~20ms da RXTXcomm + 8ms do radio Thread.sleep(1); //tempo maximo para enviar: ~20ms da RXTXcomm + 8ms do radio //w++; @@ -575,13 +581,13 @@ public static void main(String[] args) { } } catch (InterruptedException ex) { } - + if (!timeout) { - s.receive(buffer, buffer.length); - - long rtt = System.currentTimeMillis() - mtimestamp; - timeSum += rtt; - System.out.println(" @Time: " + rtt + "ms"); + s.receive(buffer, buffer.length); + + long rtt = System.currentTimeMillis() - mtimestamp; + timeSum += rtt; + System.out.println(" @Time: " + rtt + "ms"); } try { diff --git a/src/robotinterface/robot/connection/Serial2.java b/src/robotinterface/robot/connection/Serial2.java index fb735da..841e4ad 100644 --- a/src/robotinterface/robot/connection/Serial2.java +++ b/src/robotinterface/robot/connection/Serial2.java @@ -5,6 +5,7 @@ import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; +import java.awt.EventQueue; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -19,163 +20,168 @@ public class Serial2 implements Connection, SerialPortEventListener { - private static boolean FAIL_LOAD_LIBRARY = false; - private ArrayList> observers; - private SerialPort serialPort; - private String defaultPort = null; - private boolean isConnected = false; - private int sentPackages = 0; - private int receivedPackages = 0; - private static final String PORT_NAMES[] = { - "/dev/tty.usbserial-A9007UX1", // Mac OS X - "/dev/ttyUSB#", // Linux - "/dev/ttyACM#", // Linux USB 3.0 - "COM#", // Windows - }; - - /** - * Input and output streams - */ - private InputStream input; - private OutputStream output; - - /* - * Read buffers - */ - private byte buffer[] = new byte[128]; - private int bufferIndex; - private int bufferLast; - - private int bufferSize = 1; // how big before reset or event firing - - private boolean newMessage = true; - private Queue messages; - - /** - * Default bits per second for COM port. - */ - private int dataRate = 9600; - /** - * Milliseconds to block while waiting for port open - */ - private static final int TIME_OUT = 2000; - private static final int PORT_SEARCH = 10; - - public Serial2(int dataRate) { - observers = new ArrayList<>(); - this.dataRate = dataRate; - messages = new LinkedList(); - } - - public int getSendedPackages() { - return sentPackages; - } - - public int getReceivedPackages() { - return receivedPackages; - } - - public String getDefaultPort() { - return defaultPort; - } - - public void setDefaultPort(String defaultPort) { - this.defaultPort = defaultPort; - } - - public boolean tryConnect(String port) { - - CommPortIdentifier portId = null; - Enumeration portEnum = null; - - try { - portEnum = CommPortIdentifier.getPortIdentifiers(); - } catch (Throwable t) { -// t.printStackTrace(); - throw new Error(); + private static boolean FAIL_LOAD_LIBRARY = false; + private ArrayList> observers; + private SerialPort serialPort; + private String defaultPort = null; + private boolean isConnected = false; + private int sentPackages = 0; + private int receivedPackages = 0; + private static final String PORT_NAMES[] = { + "/dev/tty.usbserial-A9007UX1", // Mac OS X + "/dev/ttyUSB#", // Linux + "/dev/ttyACM#", // Linux USB 3.0 + "COM#", // Windows + }; + + /** + * Input and output streams + */ + private InputStream input; + private OutputStream output; + + /* + * Read buffers + */ + private byte buffer[] = new byte[128]; + private int bufferIndex; + private int bufferLast; + + private int bufferSize = 1; // how big before reset or event firing + + private boolean newMessage = true; + private Queue messages; + + /** + * Default bits per second for COM port. + */ + private int dataRate = 9600; + /** + * Milliseconds to block while waiting for port open + */ + private static final int TIME_OUT = 2000; + private static final int PORT_SEARCH = 10; + + public Serial2(int dataRate) { + observers = new ArrayList<>(); + this.dataRate = dataRate; + messages = new LinkedList(); } - if (portEnum == null) { - return false; + public int getSendedPackages() { + return sentPackages; } - //First, Find an instance of serial port as set in PORT_NAMES. - while (portEnum.hasMoreElements()) { - CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); - if (currPortId.getName().equals(port)) { - portId = currPortId; - break; - } + public int getReceivedPackages() { + return receivedPackages; } - if (portId == null) { - //Could not find COM port - return false; + public String getDefaultPort() { + return defaultPort; } - try { - // open serial port, and use class name for the appName. - serialPort = (SerialPort) portId.open(this.getClass().getName(), - TIME_OUT); - - // set port parameters - serialPort.setSerialPortParams(dataRate, - SerialPort.DATABITS_8, - SerialPort.STOPBITS_1, - SerialPort.PARITY_NONE); - - //teste web: http://www.devmedia.com.br/utilizando-a-api-rxtx-para-manipulacao-da-serial-parte-iii/7171 - serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); - - // open the streams - input = serialPort.getInputStream(); - output = serialPort.getOutputStream(); - - // add event listeners - serialPort.addEventListener(this); - serialPort.notifyOnDataAvailable(true); - } catch (PortInUseException e) { - //porta ocupada - return false; - } catch (Exception e) { - return false; + public void setDefaultPort(String defaultPort) { + this.defaultPort = defaultPort; } - return true; - } - public Collection getAvailableDevices() { - ArrayList avaliableDevices = new ArrayList<>(); + public boolean tryConnect(String port) { - if (FAIL_LOAD_LIBRARY) { - return avaliableDevices; - } + CommPortIdentifier portId = null; + Enumeration portEnum = null; + + try { + portEnum = CommPortIdentifier.getPortIdentifiers(); + } catch (Throwable t) { +// t.printStackTrace(); + throw new Error(); + } - for (String name : PORT_NAMES) { - if (name.contains("#")) { - for (int i = 0; i < PORT_SEARCH; i++) { - String device = name.replace("#", "" + i); - //adiciona portas ocultas e bloqueadas (Linux) - System.setProperty("gnu.io.rxtx.SerialPorts", device); - try { - if (tryConnect(device)) { - avaliableDevices.add(device); - closeConnection(); + if (portEnum == null) { + return false; + } + + //First, Find an instance of serial port as set in PORT_NAMES. + while (portEnum.hasMoreElements()) { + CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); + if (currPortId.getName().equals(port)) { + portId = currPortId; + break; } - } catch (Throwable t) { - JOptionPane.showMessageDialog(null, "Falha ao carregar a biblioteca da porta serial.\nApenas simulação virtual disponivel.", "Erro", JOptionPane.ERROR_MESSAGE); - FAIL_LOAD_LIBRARY = true; + } + + if (portId == null) { + //Could not find COM port + return false; + } + + try { + // open serial port, and use class name for the appName. + serialPort = (SerialPort) portId.open(this.getClass().getName(), + TIME_OUT); + + // set port parameters + serialPort.setSerialPortParams(dataRate, + SerialPort.DATABITS_8, + SerialPort.STOPBITS_1, + SerialPort.PARITY_NONE); + + //teste web: http://www.devmedia.com.br/utilizando-a-api-rxtx-para-manipulacao-da-serial-parte-iii/7171 + serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); + + // open the streams + input = serialPort.getInputStream(); + output = serialPort.getOutputStream(); + + // add event listeners + serialPort.addEventListener(this); + serialPort.notifyOnDataAvailable(true); + } catch (PortInUseException e) { + //porta ocupada + return false; + } catch (Exception e) { + return false; + } + return true; + } + + public Collection getAvailableDevices() { + ArrayList avaliableDevices = new ArrayList<>(); + + if (FAIL_LOAD_LIBRARY) { return avaliableDevices; - } } - } + + for (String name : PORT_NAMES) { + if (name.contains("#")) { + for (int i = 0; i < PORT_SEARCH; i++) { + String device = name.replace("#", "" + i); + //adiciona portas ocultas e bloqueadas (Linux) + System.setProperty("gnu.io.rxtx.SerialPorts", device); + try { + if (tryConnect(device)) { + avaliableDevices.add(device); + closeConnection(); + } + } catch (Throwable t) { + EventQueue.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(null, "Falha ao carregar a biblioteca da porta serial.\nApenas simulação virtual disponivel.", "Erro", JOptionPane.ERROR_MESSAGE); + } + }); + FAIL_LOAD_LIBRARY = true; + return avaliableDevices; + } + } + } + } + return avaliableDevices; } - return avaliableDevices; - } - @Override - public boolean establishConnection() { + @Override + public boolean establishConnection() { - isConnected = false; + isConnected = false; // Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { // @Override @@ -183,355 +189,356 @@ public boolean establishConnection() { // closeConnection(); // } // })); - if (defaultPort == null) { - - for (String name : PORT_NAMES) { - if (name.contains("#")) { - for (int i = 0; i < PORT_SEARCH; i++) { - String device = name.replace("#", "" + i); + if (defaultPort == null) { + + for (String name : PORT_NAMES) { + if (name.contains("#")) { + for (int i = 0; i < PORT_SEARCH; i++) { + String device = name.replace("#", "" + i); + //adiciona portas ocultas e bloqueadas (Linux) + System.setProperty("gnu.io.rxtx.SerialPorts", device); + + isConnected = tryConnect(device); + + if (isConnected) { + System.out.println(device); + try { + Thread.sleep(1000); //espera 1s para a conexão funcionar + } catch (InterruptedException ex) { + } + + return true; + } + } + } + } + } else { //adiciona portas ocultas e bloqueadas (Linux) - System.setProperty("gnu.io.rxtx.SerialPorts", device); - - isConnected = tryConnect(device); + System.setProperty("gnu.io.rxtx.SerialPorts", defaultPort); + isConnected = tryConnect(defaultPort); if (isConnected) { - System.out.println(device); - try { - Thread.sleep(1000); //espera 1s para a conexão funcionar - } catch (InterruptedException ex) { - } + try { + Thread.sleep(1000); //espera 1s para a conexão funcionar + } catch (InterruptedException ex) { + } - return true; + return true; } - } } - } - } else { - //adiciona portas ocultas e bloqueadas (Linux) - System.setProperty("gnu.io.rxtx.SerialPorts", defaultPort); - isConnected = tryConnect(defaultPort); + return false; + } - if (isConnected) { - try { - Thread.sleep(1000); //espera 1s para a conexão funcionar - } catch (InterruptedException ex) { + @Override + public void closeConnection() { + if (serialPort != null) { + serialPort.removeEventListener(); + serialPort.close(); } + } - return true; - } + @Override + public boolean isConnected() { + return isConnected; } - return false; - } - - @Override - public void closeConnection() { - if (serialPort != null) { - serialPort.removeEventListener(); - serialPort.close(); + + @Override + public void attach(Observer observer) { + observers.add(observer); } - } - - @Override - public boolean isConnected() { - return isConnected; - } - - @Override - public void attach(Observer observer) { - observers.add(observer); - } - - @Override - public void detach(Observer observer) { - observers.remove(observer); - } - - /* - * This is a modified version of serialEvent from PSerial library, - * from Processing project - http://processing.org - */ - @Override - synchronized public void serialEvent(SerialPortEvent serialEvent) { - if (serialEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - try { - /* Se a funcao retornar antes de ler toda a mensagem, o evento so sera - * disparado apos 20ms. - */ - while ((bufferLast - bufferIndex) < bufferSize) {//input.available() > 0) { - synchronized (buffer) { - if (bufferLast == buffer.length) { - byte temp[] = new byte[bufferLast << 1]; - System.arraycopy(buffer, 0, temp, 0, bufferLast); - buffer = temp; - } - if (input.available() > 0) { - buffer[bufferLast++] = (byte) input.read(); - } - if ( (bufferLast - bufferIndex) >= bufferSize ) { - if (messageHandler()) - break; - } - } - } - } catch (IOException e) { - System.out.println("serialEvent: " + e.getMessage()); - } + @Override + public void detach(Observer observer) { + observers.remove(observer); } - } - public boolean messageHandler() { - if (newMessage) { - bufferSize = read() + 2; // TODO: REMOVER + 2 - newMessage = false; - //System.out.println("\t1: " + System.currentTimeMillis()); + /* + * This is a modified version of serialEvent from PSerial library, + * from Processing project - http://processing.org + */ + @Override + synchronized public void serialEvent(SerialPortEvent serialEvent) { + if (serialEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + try { + /* Se a funcao retornar antes de ler toda a mensagem, o evento so sera + * disparado apos 20ms. + */ + while ((bufferLast - bufferIndex) < bufferSize) {//input.available() > 0) { + synchronized (buffer) { + if (bufferLast == buffer.length) { + byte temp[] = new byte[bufferLast << 1]; + System.arraycopy(buffer, 0, temp, 0, bufferLast); + buffer = temp; + } + if (input.available() > 0) { + buffer[bufferLast++] = (byte) input.read(); + } + if ((bufferLast - bufferIndex) >= bufferSize) { + if (messageHandler()) { + break; + } + } + } + } + + } catch (IOException e) { + System.out.println("serialEvent: " + e.getMessage()); + } + } } - //System.out.println("Available: " + (bufferLast - bufferIndex)); - if ((bufferLast - bufferIndex) >= bufferSize) { - if (!observers.isEmpty()) { - ByteBuffer message = ByteBuffer.allocate(bufferSize+1); // TODO: REMOVER +1 - message.put((byte)bufferSize); // TODO: REMOVER - readBytes(message); - message.flip(); - for (Observer o : observers) { - o.update(message.asReadOnlyBuffer(), this); + + public boolean messageHandler() { + if (newMessage) { + bufferSize = read() + 2; // TODO: REMOVER + 2 + newMessage = false; + //System.out.println("\t1: " + System.currentTimeMillis()); } - } else { - byte[] message = new byte[bufferSize]; - readBytes(message); - synchronized (messages) { - messages.add(message); + //System.out.println("Available: " + (bufferLast - bufferIndex)); + if ((bufferLast - bufferIndex) >= bufferSize) { + if (!observers.isEmpty()) { + ByteBuffer message = ByteBuffer.allocate(bufferSize + 1); // TODO: REMOVER +1 + message.put((byte) bufferSize); // TODO: REMOVER + readBytes(message); + message.flip(); + for (Observer o : observers) { + o.update(message.asReadOnlyBuffer(), this); + } + } else { + byte[] message = new byte[bufferSize]; + readBytes(message); + synchronized (messages) { + messages.add(message); + } + } + receivedPackages++; + newMessage = true; + bufferSize = 1; + return true; + //System.out.println("\t2: " + System.currentTimeMillis()); } - } - receivedPackages++; - newMessage = true; - bufferSize = 1; - return true; - //System.out.println("\t2: " + System.currentTimeMillis()); - } - return false; - } - - @Override - public void send(byte[] data) { - try { - sentPackages++; - output.write(data.length); - output.write(data); - output.flush(); - } catch (IOException ex) { - System.out.println("Send fail!"); + return false; } - } - - @Override - public void send(ByteBuffer data) { - int length = data.remaining(); - byte[] msg = new byte[length]; - data.get(msg); - send(msg); - } - - public void buffer(int count) { - bufferSize = count; - } - - @Override - public boolean available() { - return (!messages.isEmpty()); - } - - public void clear() { - bufferLast = 0; - bufferIndex = 0; - } - - @Override - public int receive(byte[] b, int size) { - synchronized (messages) { - if (!messages.isEmpty()) { - byte[] lastMessage = messages.poll(); - int length = lastMessage.length; - if (length > size) { - length = size; + + @Override + public void send(byte[] data) { + try { + sentPackages++; + output.write(data.length); + output.write(data); + output.flush(); + } catch (IOException ex) { + System.out.println("Send fail!"); } - System.arraycopy(lastMessage, 0, b, 0, length); - return length; - } else { - return 0; - } } - } - public int read() { - if (bufferIndex == bufferLast) { - return -1; + @Override + public void send(ByteBuffer data) { + int length = data.remaining(); + byte[] msg = new byte[length]; + data.get(msg); + send(msg); } - synchronized (buffer) { - int outgoing = buffer[bufferIndex++] & 0xff; - if (bufferIndex == bufferLast) { // rewind - bufferIndex = 0; - bufferLast = 0; - } - return outgoing; + public void buffer(int count) { + bufferSize = count; } - } - public byte[] readBytes() { - if (bufferIndex == bufferLast) { - return null; + @Override + public boolean available() { + return (!messages.isEmpty()); } - synchronized (buffer) { - int length = bufferLast - bufferIndex; - byte outgoing[] = new byte[length]; - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex = 0; // rewind - bufferLast = 0; - return outgoing; + public void clear() { + bufferLast = 0; + bufferIndex = 0; } - } - public int readBytes(byte outgoing[]) { - if (bufferIndex == bufferLast) { - return 0; - } - - synchronized (buffer) { - int length = bufferLast - bufferIndex; - if (length > outgoing.length) { - length = outgoing.length; - } - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex += length; - if (bufferIndex == bufferLast) { - bufferIndex = 0; // rewind - bufferLast = 0; - } - return length; + @Override + public int receive(byte[] b, int size) { + synchronized (messages) { + if (!messages.isEmpty()) { + byte[] lastMessage = messages.poll(); + int length = lastMessage.length; + if (length > size) { + length = size; + } + System.arraycopy(lastMessage, 0, b, 0, length); + return length; + } else { + return 0; + } + } } - } - public int readBytes(ByteBuffer outgoing) { - if (bufferIndex == bufferLast) { - return 0; + public int read() { + if (bufferIndex == bufferLast) { + return -1; + } + + synchronized (buffer) { + int outgoing = buffer[bufferIndex++] & 0xff; + if (bufferIndex == bufferLast) { // rewind + bufferIndex = 0; + bufferLast = 0; + } + return outgoing; + } } - synchronized (buffer) { - int length = bufferLast - bufferIndex; - if (length > outgoing.capacity()) { - length = outgoing.capacity(); - } - outgoing.put(buffer, bufferIndex, length); + public byte[] readBytes() { + if (bufferIndex == bufferLast) { + return null; + } + + synchronized (buffer) { + int length = bufferLast - bufferIndex; + byte outgoing[] = new byte[length]; + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - bufferIndex += length; - if (bufferIndex == bufferLast) { - bufferIndex = 0; // rewind - bufferLast = 0; - } - return length; + bufferIndex = 0; // rewind + bufferLast = 0; + return outgoing; + } } - } - - public static void printBytes(String str) { - byte[] array = str.getBytes(); - printBytes(array, array.length); - } - - public static void printBytes(byte[] array, int size) { - //System.out.print("Received: "); - System.out.print("[" + size + "]{"); - for (int i = 0; i < size; i++) { - System.out.print("," + (int) (array[i] & 0xff)); + + public int readBytes(byte outgoing[]) { + if (bufferIndex == bufferLast) { + return 0; + } + + synchronized (buffer) { + int length = bufferLast - bufferIndex; + if (length > outgoing.length) { + length = outgoing.length; + } + System.arraycopy(buffer, bufferIndex, outgoing, 0, length); + + bufferIndex += length; + if (bufferIndex == bufferLast) { + bufferIndex = 0; // rewind + bufferLast = 0; + } + return length; + } } - System.out.println("}"); - } - public static void main(String[] args) { + public int readBytes(ByteBuffer outgoing) { + if (bufferIndex == bufferLast) { + return 0; + } - Serial2 s = new Serial2(57600); + synchronized (buffer) { + int length = bufferLast - bufferIndex; + if (length > outgoing.capacity()) { + length = outgoing.capacity(); + } + outgoing.put(buffer, bufferIndex, length); - ArrayList testMessages = new ArrayList<>(); + bufferIndex += length; + if (bufferIndex == bufferLast) { + bufferIndex = 0; // rewind + bufferLast = 0; + } + return length; + } + } - /* TESTE DO RÁDIO */ - //ATENÇÃO: trocar intervalo de tempo na linha ~435 - //coloca 100 mensagens na lista de espera - int numMessages = 100; - for (int i = 0; i < numMessages; i++) { - testMessages.add(new byte[]{1,2,3,4,5}); + public static void printBytes(String str) { + byte[] array = str.getBytes(); + printBytes(array, array.length); } - if (s.establishConnection()) { - System.out.println("connected\n"); - - int sended = 0; - int failed = 0; - byte[] buffer = new byte[20]; - long timeSum = 0; - - for (int i = 0; i < 1; i++) { //repetição - for (byte[] message : testMessages) { - boolean timeout = false; - long timestamp = System.currentTimeMillis(); - - sended++; - s.send(message); - System.out.print("Sended [" + sended + "]: "); - printBytes(message, message.length); - - while (!s.available()) { - try { - Thread.sleep(1); //tempo maximo para enviar: ~20ms da RXTXcomm + 8ms do radio - if ((System.currentTimeMillis() - timestamp) >= 1000) { - numMessages--; - timeout = true; - break; - } - } catch (InterruptedException ex) { - } - } + public static void printBytes(byte[] array, int size) { + //System.out.print("Received: "); + System.out.print("[" + size + "]{"); + for (int i = 0; i < size; i++) { + System.out.print("," + (int) (array[i] & 0xff)); + } + System.out.println("}"); + } - if (!timeout) { - int lenght = s.receive(buffer, buffer.length); - if (buffer[0] != 11) { - System.out.print("Received [" + sended + "]: "); - printBytes(buffer, lenght); + public static void main(String[] args) { - long rtt = System.currentTimeMillis() - timestamp; - timeSum += rtt; - System.out.println(" @Time [" + sended + "]: " + rtt + "ms\n"); - } else { - failed++; - System.out.println("Failed\n"); - } - } else { - failed++; - System.out.println("Timeout\n"); - } - - try { - Thread.sleep(10); - } catch (InterruptedException ex) { - } + Serial2 s = new Serial2(57600); + + ArrayList testMessages = new ArrayList<>(); + + /* TESTE DO RÁDIO */ + //ATENÇÃO: trocar intervalo de tempo na linha ~435 + //coloca 100 mensagens na lista de espera + int numMessages = 100; + for (int i = 0; i < numMessages; i++) { + testMessages.add(new byte[]{1, 2, 3, 4, 5}); } - System.out.println("Average Time: " + timeSum / numMessages + "ms\n"); - System.out.println("Sended: " + sended + "\tFailed: " + failed); - try { - Thread.sleep(1000); - } catch (InterruptedException ex) { + if (s.establishConnection()) { + System.out.println("connected\n"); + + int sended = 0; + int failed = 0; + byte[] buffer = new byte[20]; + long timeSum = 0; + + for (int i = 0; i < 1; i++) { //repetição + for (byte[] message : testMessages) { + boolean timeout = false; + long timestamp = System.currentTimeMillis(); + + sended++; + s.send(message); + System.out.print("Sended [" + sended + "]: "); + printBytes(message, message.length); + + while (!s.available()) { + try { + Thread.sleep(1); //tempo maximo para enviar: ~20ms da RXTXcomm + 8ms do radio + if ((System.currentTimeMillis() - timestamp) >= 1000) { + numMessages--; + timeout = true; + break; + } + } catch (InterruptedException ex) { + } + } + + if (!timeout) { + int lenght = s.receive(buffer, buffer.length); + if (buffer[0] != 11) { + System.out.print("Received [" + sended + "]: "); + printBytes(buffer, lenght); + + long rtt = System.currentTimeMillis() - timestamp; + timeSum += rtt; + System.out.println(" @Time [" + sended + "]: " + rtt + "ms\n"); + } else { + failed++; + System.out.println("Failed\n"); + } + } else { + failed++; + System.out.println("Timeout\n"); + } + + try { + Thread.sleep(10); + } catch (InterruptedException ex) { + } + } + + System.out.println("Average Time: " + timeSum / numMessages + "ms\n"); + System.out.println("Sended: " + sended + "\tFailed: " + failed); + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + } + } + + } else { + System.out.println("fail"); } - } - } else { - System.out.println("fail"); + System.out.println("Fim"); + System.exit(0); } - System.out.println("Fim"); - System.exit(0); - } - } diff --git a/src/robotinterface/robot/device/ReflectanceSensorArray.java b/src/robotinterface/robot/device/ReflectanceSensorArray.java index 22f20a2..4ef6b40 100644 --- a/src/robotinterface/robot/device/ReflectanceSensorArray.java +++ b/src/robotinterface/robot/device/ReflectanceSensorArray.java @@ -70,7 +70,7 @@ public void getState(ByteBuffer buffer, Robot robot) { for (int si = 4; si >= 0; si--) { transform.rotate(Math.PI / 12); transform.deltaTransform(src, dst); - values[si] = (robot.getEnvironment().isOver(dst.x + robot.getPosX(), dst.y + robot.getPosY())) ? 1 : 0; + values[si] = (robot.getEnvironment().isOver(dst.x + 2 + robot.getPosX(), dst.y + 2 + robot.getPosY())) ? 1 : 0; value |= (values[si] << si); } diff --git a/src/robotinterface/robot/simulation/Environment.java b/src/robotinterface/robot/simulation/Environment.java index 349e071..3bcabd2 100644 --- a/src/robotinterface/robot/simulation/Environment.java +++ b/src/robotinterface/robot/simulation/Environment.java @@ -26,6 +26,7 @@ import static java.lang.Math.pow; import static java.lang.Math.sqrt; import java.text.DecimalFormat; +import java.util.HashMap; import robotinterface.robot.device.IRProximitySensor; import robotinterface.util.LineIterator; @@ -47,6 +48,40 @@ public static Color getObstacleColor() { return obstacleColor; } + public Environment() { + + } + + @Deprecated + private void alienCode() { + HashMap map = new HashMap<>(); + map.put(' ', 0); + map.put('t', 1); + map.put('e', 2); + map.put('r', 4); + map.put('s', 8); + map.put('o', 16); + + String str = "terrestres terrosos"; + int i = 0; + for (char c : str.toCharArray()) { + addCodedLetter(i, map.get(c)); + i++; + } + } + + @Deprecated + private void addCodedLetter(int index, int code) { + double w = 50; + double x = index * 80 + 60; + for (int i = 0; i < 5; i++) { + if ((code & (1 << i)) != 0) { + double h = i * 7 - 14; + addFollowLine(new double[]{x, h, x + w, h}); + } + } + } + public void addWall(double[] line) { wallsData.add(line); @@ -149,7 +184,6 @@ public double beamDistance(double x, double y, double theta, double d) { double y2 = y + IRProximitySensor.MAX_DISTANCE * sin(theta); Line2D.Double line = new Line2D.Double(x, y, x2, y2); Point2D p; - wallsTmp.clear(); wallsTmp.addAll(walls); for (Line2D.Double wall : wallsTmp) { @@ -159,13 +193,12 @@ public double beamDistance(double x, double y, double theta, double d) { tmpLine.setLine(x, y, p.getX(), p.getY()); if (tmpLine.intersectsLine(wall)) { dt = sqrt(pow(x - p.getX(), 2) + pow(y - p.getY(), 2)) - d; - if (df > dt) { + if (df > dt && dt > 0) { df = dt; } } } } - return df / 2; }