The RCX-Datalog

The datalog represents a flexible storage of information inside of the RCX. Using the datalog might seem complicated. Here some advice:

1. Before using the datalog you have to define its size. You do this by sending the immediate instruction SetDatalog(Size) through a program running on your computer. Remember that immediate instructions may not be run inside of an RCX-program, but are to be sent to the RCX using the infrared-tower. Size must be a positive integer-number. The available size depends on the actual use of the RCX-memory. Its maximum is about 2kB. SetDatalog(0) clears the datalog.
2. Every time your RCX-program wants to store a value in the datalog, you'll have to call the DatalogNext(Source, Number) instruction. See the technical reference book for the specification of the source and number parameter.
3. The upload of the data stored in the datalog is managed by using the UploadDatalog(From, Size) instruction from the computer. This is the most difficult part of the task. First you must get the real size of the datalog. You will then have to check, whether the data is in variant-format. After this you will upload the datalog in packages of minimum 1 and maximum 50 single datas. Put attention not to try to upload 0 data. This will cause a DivisionByZero error-message. Here an example:

var data: variant;
       idx,iUpper,iLower,iCounter,uploads:integer;

procedure getTheDatalog;
begin
 data:=spirit1.uploadDatalog(0,1);   {get the first data datalog}
 if VarIsArray(data) then iUpper:=data[2,0] else exit;  {data must be variant type, then get the size}
 if iUpper=0 then exit;  {you can't upload zero data}
 uploads:=trunc(iUpper/50);  {the trunc-function in turbo-pascal is comparable to the Int-function in Basic}
 if (iUpper mod 50)=0 then uploads:=uploads-1;  {this line solves an interesting problem, if the size is a multiple of 50}
 for iCounter:=0 to uploads do
  begin
   iLower:=iCounter*50;
   If iUpper<=50 then data:=spirit1.UploadDatalog(iLower,iUpper)
                           else
                      data:=spirit1.UploadDatalog(iLower,50);
   iUpper:=iUpper-50;
  if varIsArray(data) then {data must be variant type}
     begin
       for idx:=VarArrayLowBound(data,2) to VarArrayHighBound(data,2) do  {variant-functions}
          begin
             {do something with data[2,idx]}
             {in data[0,idx] you'll find an index, in data[1,idx] the source-type, in data[2,idxx] the number-value}
          end;
     end;
end;
 
In the case of the scanner, we want to transform data into a bitmap-picture. If you want to collect data and make mathematical transformation in order to provide function-plot, you should use ROBOLAB, which has plenty of features.


 RetourMain page