Reading and Writing with Files

Step 6. Writing to a file

Now comes the fun part, writing to a file. The example script "1. WriteFile" will write data to your "myfile" for servo positions if your EZ-B is connected. If it is not connected or an error occurs it will delete your "myfile.txt" file.

Lets create new script, by going to Project/Add Controls/Scripting and select EZ-Script. Your new script control will pop up with the default name of "Script". Click on the gear "setting" for the script and rename the script "WriteTest".

Then enter the following code, then save the script:


#WriteTest

$filename = "c:\temp\myfile.txt"

FileReadClose($filename)
#FileDelete($filename)

$TestValue1 = 24
$TestValue2 = 10
$cnt = 0
$max = 3

:START

print("Writing line " + $cnt + " of " + $max)


FileWrite($filename, "Time: " + $time)
FileWrite($filename, ", Left Servo: " + $TestValue1)
FileWriteLine($filename, ", Right Servo: " + $TestValue2)

$cnt = $cnt + 1

if ($cnt = $max)
  halt()
endif

sleep(100)

goto(START)

What we are doing here is creating a new version of the same write script included in the example but we are manually adding in test values for our servos so that we don't have to have the EZ-B connected or servos connected to certain ports.

We have also commented out the line to delete the file. Deleting the file is handy if you wanted to log data with a refreshed (or clean) log file. With the delete file line commented out with the # we are ignoring this option and each time you run this script it will keep adding to the file, retaining what was previously written to the file.

the $cnt and $max variables are used to tell the script to loop through the number set as $max, in this example 3 times.

This is a great example of a few different ways you can write data to a file all in one script, but it might be a little busy. You can greatly simplify writing to a file.

Add a new script control and name it "WriteTest2" and enter the following code, the save the script:


#WriteTest2

$filename = "c:\temp\myfile2.txt"

FileReadClose($filename)

$TestValue1 = 24
$TestValue2 = 10

FileWrite($filename, "Time: " + $time)
FileWrite($filename, ", Left Servo: " + $TestValue1)
FileWriteLine($filename, ", Right Servo: " + $TestValue2)
FileWriteLine($filename, "EZ-Robot is awesome!")

sleep(100)

This code will write a single file line with the time, Left servo value and Right servo value (because it does not write the line until we tell it to do so with FileWriteLine) and then it will add a second line that says "EZ-Robot is awesome!".

We also added a new file name. We do not have to create this file ahead of time. If the file is not there, it will be created. If the file is there, it will be added to with new lines each time you run this script.

If you run this script once, it will write this data once and you'll have two lines. Each time you run this example, 2 new lines will be added to the file.

User-inserted image

You can simplify the write process even further in this example, add another script control and name it "WriteTest3" with this code, then save the script:


#WriteTest3
$filename = "c:\temp\myfile2.txt"
FileReadClose($filename)

$PingValue = 124
FileWriteLine($filename," Ping ," + $PingValue)

sleep(100)

With this code, we are just writing the word Ping with a comma and then the variable we set as the value. As you can see, this could easily be the actual variable you use for your Ping sensor values.

Lets say you wanted to add a time stamp to this example. Would this work? Give it a try by modifying the line as seen below.


FileWriteLine($filename,$time + " Ping ," + $PingValue)

This will allow you add a time stamp to the line.

Another option is to comma separate all the items you write in a single line:


FileWriteLine($filename,"Time:," +$time + ",Ping," + $PingValue)

Writing data to a file is all well and good. It can be handy if you wanted to log data and review it yourself. But if you want to make use of it within EZ-Builder, you need to write it in a specific way that your can script read it so your robot can make use of it.


ARC Pro

Upgrade to ARC Pro

Elevate your robot's capabilities to the next level with Synthiam ARC Pro, unlocking a world of possibilities in robot programming.

#1  

can the read text be a script?

#2  

Josh, I'm not sure I understand your question.  You would want to read the text contained within an EZ-Script?

#3  

well I was thinking of a script in the notepad file , so for example if you had questions and answers worked out but you also wanted a movement to accompany a response. Like eye brows raise when answering.   Maybe im not explaining it clearly , but I was imagining using word files as large memory for responses instead of placed inline with all the other scripts and code so ARC doesnt have to pass through them every cycle making it slower the larger amount of scripting there.

#4   — Edited

I think I see where you are going.

Let me add this to the "reading" of the files and data, while I can have a txt file with data in and have an EZ-Script read it does not mean my robot has "understanding" of it.  To create the connections and understanding to understand that a word like "Justin" or "Josh" relates to a person and who that person is requires more scripting, which I think is what your point is.

Your idea is instead of adding that extra scripting in an EZ-Script is add it to your text file or note pad file.

That is a pretty cool idea and I would say you can do it, to a certain level of difficulty.  I don't think you would want to try to build out an advanced AI full of scripts in text files because I think that approach would become unmanageable.

But like you said, if you want certain actions or scripts to active when lines are read in a text a file, you could make a comma separated file and insert your scripted commands among text separated by commas, but be mindful of any commas in your command control or action script call names so you tell ReadFile to split the read back at the spots.

#5  

So I did a quick experiment and here are some issues, you can add scripted data in your text file or comma separated file for an EZ-Script to take action on, but as you read in the lines you will assign them out to variables - which you then need to translate to an action or ez-script.  I don't see a way for ARC to understand its own scripting language from a file or to directly re-translate it.

This is why in the past I have used my own short hand commands in text files for the robot to read such as:

Justin Ratliff,Smile Josh,Wave DJ,Faint

That data might be in text file for people my robot knows and my scripts then use IF-THEN logic to carry out other scripts and actions based on those indicators in the text file like "Smile, Wave, Faint, etc." as examples.

PRO
Synthiam
#6  

You can make an ARC skill plugin control that loads txt files and executes them. It'll be pretty easy to do - but i'm not sure why you'd want to do that yet. Can you give me a use-case? Is it to avoid having lots of script windows? Or to avoid having a script manager with lots of items in it?

#7  

yes basically not have a ton of script windows open

#8  

it seems like it could be cleaner if you could congregate them in a memo txt doc

PRO
Synthiam
#9  

What about the script manager? Wouldn't that be the same thing?