|
<< Click To Display Table Of Contents >> You Are Here: MADRIX Script (Introduction) > Basics > Reading From External Files |
The function
int ReadAsync(string file, string txt, int encoding)
reads the content from a file with a certain encoding as text into the string txt. The file is opened and closed automatically. There is no "open" function like in other programming languages. The parameter file may contain a filename of a local file, like "C:/config.txt". In addition, the HTTP protocol is supported. That means it is possible to retrieve data from a web server. For example: "https://www.madrix.com". The following examples would read some content from different files.
string txt;
ReadAsync("C:/config.txt", txt);
ReadAsync("http://www.testserver.de/testfile.txt", txt);
Here is an example which reads some numbers from a file (to be found at C:/temp/src.txt) and renders a curve on the matrix.
float g_pos[] = {0.8, 0.5};
string file = "C:/temp/src.txt";
string txt;
void InitEffect()
{
SetAsync(true);
SetBpm(300);
}
void RenderEffect()
{
ShiftVectorMatrix(0.0, 0.0, 1.0, 1.0, SHIFT_LEFT, 0.1);
ReadAsync(file, txt);
float f = (float)txt;
DrawVectorLine(WHITE, g_pos[0], g_pos[1], g_pos[0] + 0.1, f);
g_pos[1] = f;
}
Let's take for example a program which writes the temperature from an external sensor connected to USB to the file and MADRIX draws the curve onto a matrix. As described later on, it would also be possible to write a macro for the SCE Ticker effect to display the values as text.
The function can return several codes/status updates for different scenarios:
Value |
Description |
int FILE_OK |
The function could read the file without problems. |
int FILE_NOT_EXIST |
The specified file does not exist. This is returned if a local file has been specified that is not there. If the file was an HTTP request, this error is returned when the file does not exist on the host. |
int FILE_ERROR |
This is returned if any error occurred while reading the content of a local file. |
int INVALID_HOST |
This value is returned if the file was an HTTP request and the specified host does not exist. |
int NETWORK_ERROR |
This value is returned on any network error, e.g. if no network adapter is available or the connection between the host and the client has been disconnected. |
In addition, ReadAsync can take a third parameter to specify the file encoding. If the parameter is omitted, an automatic detection is applied. The following values are valid:
Value |
Description |
int FILE_ENCODE_AUTO_DETECT |
Applies an automatic detection. This is the default. If the file starts with the special characters BOM (byte order mark), the corresponding file encoding is expected. Otherwise, an ANSI encoded file is expected. |
int FILE_ENCODE_ANSI |
Expects an ANSI encoded file. |
int FILE_ENCODE_UTF8 |
Expects a UTF-8 encoded file not starting with the special characters BOM (byte order mark). |
int FILE_ENCODE_UTF8_BOM |
Expects a UTF-8 encoded file starting with the special characters BOM (byte order mark). |
int FILE_ENCODE_UTF16_LE |
Expects a UTF-16 Little Endian encoded file starting with the special characters BOM (byte order mark). |
UTF (Unicode Transformation Format) encoded files are recommended in order to handle special characters (e.g. from Asian languages) correctly. The actual encoding of a text file can be figured out or even changed by using an appropriate text editor, for example.
For testing purposes there are two scripts which deliver random numbers at the end of this chapter. Or you could play with this test set-up for SCE Ticker / Scrolling Text:
@scriptname="ReadAsync Test Set-Up";
@author="";
@version="";
@description="";
string file = "C:/temp/src.txt"; //location of the source text file
string txt;
int interval = 600000; //interval = 10 minutes
void InitEffect()
{
SetReadAsyncInterval(file, interval);
}
void PreRenderEffect()
{
switch(ReadAsync(file, txt))
{
case FILE_OK : WriteText("FILE_OK"); SetText(txt); break; // txt is displayed
case FILE_NOT_EXIST : WriteText("FILE_NOT_EXIST");break;
case FILE_ERROR : WriteText("FILE_ERROR");break;
case NETWORK_ERROR : WriteText("NETWORK_ERROR");break;
case INVALID_HOST : WriteText("INVALID_HOST");break;
default : break;
}
}
void PostRenderEffect()
{
}
The file will be continuously read in the background. ReadAsync always receives the result of the last reading process. It is possible to control the interval of the reading process. The default value is 1000 ms which means that an opened file will be read one time each second. The function
int SetReadAsyncInterval(string file, int interval)
sets the reading interval for a certain file. The int interval is given in milliseconds. The minimum reading interval is 10 ms. Imagine your sensor writes data every 500 ms. Therefore, you can set the interval to 500 ms in order to let MADRIX instantly show the values. Or you can set it higher, e.g. to 5000 ms (5 seconds), in order to save resources.
If the file in question has not been opened yet, e.g. by a call of ReadAsync, the file will be opened to begin internal reading. It makes sense to set the reading interval within the InitEffect function in order to have the content of the file read before the first call of ReadAsync, which is perhaps located in RenderEffect.
Up to now, MADRIX Script is not designed to operate on strings. There aren't many proper functions available that may help you to parse strings or even manipulate them. Furthermore, such functionality requires a lot of computing time, which is not necessarily available within MADRIX Script. It may be better to have external tools (e.g. python scripts, PHP, or Visual basic scripts) which prepare files for MADRIX Script in order to have faster scripts.
Another interesting possibility is to have interactive scripts. Imagine a small application which retrieves input from a user and writes it to a file. A script may read the file and react to the input.
The following scripts are external scripts which may be used to test the script above or to play around with the reading functionality of MADRIX Script. Both scripts deliver random numbers using a local file or via HTTP request.
The following script creates random values between 0 and 1 and writes them to the file "C:/temp/src.txt". In order to use a different file, set the file variable in the third line of the script to a different one. Please do not forget to change the script above to read the same file. Each second one value is written. In order to test HTTP functionality, this script may also run on a web server and you can request the written file from the web server.
import time
import random
file = "C:/temp/src.txt"
while True:
f = random.random()
s = "%.2f" % f
try:
wf = open(file, "w")
wf.write(s)
wf.close()
except:
print "Can't open file"
print "Wert %.2f" %f
time.sleep(1)
A PHP Script To Create Random Numbers
The following PHP script delivers a random number between 0 and 1 each time it is called.
<?php
echo (rand() / getrandmax()) . "\n";
?>
| MADRIX 3.23. |
| [Ctrl & +/-] = Zoom In/Out | [Ctrl & 0] = 100% |
|
Previous Next
|
|
Enable Automatic Translation | Activer La Traduction Automatique | 启用自动翻译 |