Migrating from EZ-Script to JavaScript

Description

How to move your code from EZ-Script to JavaScript. JavaScript offers faster execution and more features.

Why?

Why migrate from EZ-Script to JavaScript? The answer is performance and functionality. While EZ-Script appears straightforward, it is very similar to JavaScript. The most significant differences will be outlined in this tutorial. However, JavaScript can organize commands in groups, called classes. These command groups make JavaScript more organized and easier to find the correct command that you're looking for.

Performance

The Synthiam implementation of JavaScript in ARC is fast... very fast! It outperforms EZ-Script by a significant magnitude. Take for instance, a benchmark between the two languages by counting to 1,000,000.

JavaScript (1.1 seconds)

User-inserted image

EZ-Script (2 minutes, 5 seconds)

User-inserted image


ARC Pro

Upgrade to ARC Pro

Don't limit your robot's potential – subscribe to ARC Pro and transform it into a dynamic, intelligent machine.

#17  

OK, I decided I was biting off to much at one time. I decided to just concentrate on trying one JS command at a time to see if I can get stuff working. I'm starting with the Uart command.

I'm making progress on making things work like checking if variables exist and initializing Uart ports. I'm been able to run several commands without errors so I think I'm catching on. However I've hit a wall.

After initializing the proper Uart port I decided to try to move a motor by sending a command through the port to the Kangaroo Motor controller. Like I mentioned  and showed above I've been able to do this using EZ Script. I followed @DJ's tutorial and the online JavaScript API here on this forum in the support section with no luck. The script ran and compilated with out an error but the Kangaroo didn't respond. I think the problem is how I'm sending the string to the roo. It needs a Return (enter) keyed after the position and speed command and I don't think I have that properly written in JS. Here's the EZ Script command that works makes the Kangaroo respond. Notice the 0x0d (ASCII for carrage return) :

uartWrite(2, 2, "1,p805 s300", 0x0d)

Here's the code I wrote in JS that I think is close (from what I read in the JavaScript API in the support section). The script completes and seems to send it through the UART. Again, I don't think I have the 0x0d part of string written properly. But I don't really know.

var str = "2,p805 s300 0x0d";
UART.hardwareUartWrite(2,str.length,2);
UART.hardwareUartWriteString(2,str,2);

Any help figuring this out would be welcomed.

#18  

I don't know if this is a dumb suggestion but I just noticed that Chat A.I. can write Java script code for you if you just ask what you need done. I looked at some examples that seem legit. Sorry if that is no help. Your problem stems from the Kangaroo so, Depends if A.I. can find previous solutions in other forum posters around the internet.

#19  

Thanks my friend. I've never used any chat AI programs. I wouldn't know how to start. However you gave me a good idea. I'll contact the Dimension Engineering who make the Kangaroo. Maybe they can tell me a way to send the simple serial command for speed, position and the needed "return" key using JavaScript. I had this same issue when I started commanding the Roo using EZ Script. It's that "return" (or Enter) key, 0x0d, that I cant figure how to get into the JavaScript command.

#20   — Edited

HAHA!! Got it!! Yes!!

I found the answer on the Stackoverflow forum. A guy there was working on a different problem he was having with a Python script that controls his Kangaroo. I looked through his script and saw in his Python script that he has a \r inside his double quotes and the end of his string. I inserted it and it works!!

So the proper script that works (once the UART initialized) is as follows. Note the \r at the end of line 1:

var str = "2,p805 s300\r"; UART.hardwareUartWrite(2,str.length,2); UART.hardwareUartWriteString(2,str,2);

#21  

Great news Dave, Glad you solved it and have a great Easter!

#23  

I've been making slow but sure progress with converting my EZ Script I posted above into Javascript. I'm able to do most basic things now like looping and If statements. I've also been able to send and commands to my Kangaroo using the UART. commands. I'm pretty excited at how little syntax I need and how fast it appears to be.

I do have a question about one of the UART. commands that I hope some one could help explain. When I'm asking to read bytes from the UART buffer I seem to have two commands available:

UART.hardwareUartReadString(uartIndex, bytesToRead, [ezbIndex])
UART.hardwareUartReadStringAvailable(uartIndex, [ezbIndex])

When I run these commands with different scripts I get the same returned answers: Script 1 using UART.hardwareUartReadStringAvailable


var getRightp = "1, Getp\r";
UART.hardwareUartWrite(2,getRightp.length,2);
UART.hardwareUartWriteString(2,getRightp,2);
sleep( 500 );

var UartAvailable = UART.hardwareUartAvailable(2,2);
print("UartAvailable: " + UartAvailable);

var UartReadStringAvailable = UART.hardwareUartReadStringAvailable(2,2);
print("UartReadStringAvailable: " + UartReadStringAvailable);

Script 1 Answers:

> UartAvailable: 7
> UartReadStringAvailable: 1,P20

Script 2 using UART.hardwareUartReadString

var getRightp = "1, Getp\r";
UART.hardwareUartWrite(2,getRightp.length,2);
UART.hardwareUartWriteString(2,getRightp,2);
sleep( 500 );

var Position = UART.hardwareUartReadString(2,7,2);
print("hardwareUartReadString: " + Position);

Script 2 Answers:

> UartAvailable: 7
> hardwareUartReadString: 1,P20

As I said, I get the same answers. The only differance I can see is that in UART.hardwareUartReadString I need to state how many bites I am expecting. This has proven a problem because I've notices that sometime the buffer has more then the usual 7 bytes available. Mostly after a failed read.

Can someone explain which is the best command to use and/or why I would have to state how many bytes I'm expecting if I use UART.hardwareUartReadString ?

Thanks!

#24   — Edited

Well, it's been a learning experience for me. However with the help of the tutorial at the top of this page, the Synthiam JavaScript api at the link provided in that same tutorial along with many, many tips throughout the internet to JS scripting sites I was able to convert the EZ script I posted above to JavaScript.

As I said, I'm a novice to JS and mostly understand how to write a working script in EZ Script. I'm starting to understand some of the basic nuances of JS and have made a converted working script. It looks much neater and runs much smoother and faster then my original EZ Script. At this point I'm satisfied with my result but after seeing how much I don't know about JS I'm not sure it's done as well as possible. However it works nice for my needs and I'm happy. LOL.

My intent is to move two carriages that are powered and controlled by a Sabertooth / Kangaroo motor controller. They must move out of an enclosed robot torso until they reach a save point before the arm servos can start moving around. I could just send the carriages out and hope they reach a safe point but if the arms starts moving around before they are clear they will destroy themselves. This script has a built in fail safe to keep that from happening. It monitors the progress of the carriage motor's encoders, Then when it reaches safety it sets a global variable that tells a different waiting script (it's an EZ Script at this point) that it's safe to start moving the arm servos.

Here it is for your enjoyment. LOL. :

//Extend Right Arm Carriage
var rt_carrage_PosSpeed_Roo_cmd = "1,p809 s300\r";
UART.hardwareUartWrite(2,rt_carrage_PosSpeed_Roo_cmd.length,2); //UART 2 on EZB 2
UART.hardwareUartWriteString(2,rt_carrage_PosSpeed_Roo_cmd,2); //UART 2 on EZB 2

//Extend Left Arm Carriage
var lft_carrage_PosSpeed_Roo_cmd = "2,p809 s300\r";
UART.hardwareUartWrite(2,lft_carrage_PosSpeed_Roo_cmd.length,2); //UART 2 on EZB 2
UART.hardwareUartWriteString(2,lft_carrage_PosSpeed_Roo_cmd,2); //UART 2 on EZB 2

sleep( 100 );

//Start of if Statemant
do{
///////////////
//Right ARM
//////////////

//Send Request to Kangaroo Channel 1 to Get Position of Right Carriage
var getRightp = "1, Getp\r";
UART.hardwareUartWrite(2,getRightp.length,2); //UART 2 on EZB 2
UART.hardwareUartWriteString(2,getRightp,2); //UART 2 on EZB 2

//Pause to let UART Buffer fill
sleep( 100 );

//Read Full String Actual Position of Right Carriage. Expecting 1,pxxx (Lowercase p - Still Moving)) or 1,Pxxx(Upper case P - Movment Stopped)
var UartReadStringAvailable_RT = UART.hardwareUartReadStringAvailable(2,2);
print("UartReadStringAvailable_RT: " + UartReadStringAvailable_RT);

//Get the Actual Last Numaric String of Right Carriage Posistion Without the P. Expecting 0 Thru 805
var actualPosition_RT = UartReadStringAvailable_RT.substr(3, 7);
print( "actualPosition_RT: " + actualPosition_RT );


///////////////
//Left ARM
//////////////

//Send Request to Kangaroo Channel 1 to Get Position of Right Carriage
var getLeftp = "2, Getp\r";
UART.hardwareUartWrite(2,getLeftp.length,2); //UART 2 on EZB 2
UART.hardwareUartWriteString(2,getLeftp,2); //UART 2 on EZB 2

//Pause to Let UART Buffer Fill
sleep( 100 );

//Read String in UART Buffer of position of Right Carriage from Kangaroo. Expecting 1,pxxx (Lowercase p - Still Moving)) or 1,Pxxx(Upper case P - Movment Stopped)
var UartReadStringAvail_Left = UART.hardwareUartReadStringAvailable(2,2); //UART 2 on EZB 2
print("UartReadStringAvail_Left: " + UartReadStringAvail_Left);

//Get the Actual Last Numaric String of Left carriage posistion without the P. Expecting 0 Thru 805
var actualPosition_Left = UartReadStringAvail_Left.substr(3, 7);
print( "actualPosition_Left: " + actualPosition_Left );

//End of if Statement
}  while(actualPosition_RT < 808 && actualPosition_Left < 808 );

print("Final Reading Left: " + actualPosition_Left);
print("Final Reading: " + actualPosition_RT);

//Sets the Global Variable a waiting script is waiting for before it starts moving servos. 
setVar( "$Both_ARS_Extended",1 )

Here's the console readout:


> actualPosition_Left: 405

> UartReadStringAvailable_RT: 1,p467

> actualPosition_RT: 467

> UartReadStringAvail_Left: 2,p489

> actualPosition_Left: 489

> UartReadStringAvailable_RT: 1,p551

> actualPosition_RT: 551

> UartReadStringAvail_Left: 2,p572

> actualPosition_Left: 572

> UartReadStringAvailable_RT: 1,p638

> actualPosition_RT: 638

> UartReadStringAvail_Left: 2,p656

> actualPosition_Left: 656

> UartReadStringAvailable_RT: 1,p726

> actualPosition_RT: 726

> UartReadStringAvail_Left: 2,p744

> actualPosition_Left: 744

> UartReadStringAvailable_RT: 1,p795

> actualPosition_RT: 795

> UartReadStringAvail_Left: 2,p799

> actualPosition_Left: 799

> UartReadStringAvailable_RT: 1,p808

> actualPosition_RT: 808

> UartReadStringAvail_Left: 2,p808

> actualPosition_Left: 808

> Final Reading Left: 808

> Final Reading: 808

Done (00:00:03.3421916)