Programming the Scanner

1. RCX-Code

###define sceptre = 1
                readData = 2
                turn = 3
 
selectprgm(slot_5)
 

beginoftask(main)
 
  SetSensorType(sensor_1,switch_type) {right}
  SetSensorType(sensor_2,switch_type)  {left}
  SetSensorType(sensor_3,light_type)
  SetSensorMode(sensor_1,bool_mode,0)
  SetSensorMode(sensor_2,bool_mode,0)
  SetSensorMode(sensor_3,raw_mode,0)
   setvar(sceptre,con,2)    {switch 2 has the sceptre}
   setvar(readData,con,0) {readData not enabled}
   setvar(turn,con,0)      {0=RCX, 1=Computer}
 
   setpower(motor_B+motor_C,con,7)
   setfwd(motor_b)
  starttask(task_1)   {reading-task}
 
{........................reset head.......................................}
   setrwd(motor_c)   {go right}
   if(senval,sensor_1,eq,con,0)  {1} {left extrem or midth position}
        on(motor_c)
       while(senval,sensor_1,eq,con,0) {wait until contact}
         wait(con,1)
       endwhile()
         off(motor_c)
         playsystemsound(beep_sound)
    endif()                                     {1} {now right extrem position}

{........................prepare reading...............................}
   wait(con,5)
   setfwd(motor_c)   {go left}
   setvar(readData,con,1)  {allow reading}
   on(motor_c)
   wait(con,15)   {away from switch}
   starttask(task_2)   {right switch task activated}
   starttask(task_3)   {left switch task activated}
endoftask()

{-------------------------------------------------------------------------------}
beginoftask(task_1)   {light_sensor  reading and storing}
loop(con,forever)
 if(var,readData,eq,con,1)
 
  datalogNext(senval,sensor_3)
 endif()
endloop()
endoftask()
{-------------------------------------------------------------------------------}
beginoftask(task_2)  {right switch}
 loop(con,forever)
  if(senval,sensor_1,eq,con,1)
    if(var,sceptre,eq,con,1)   {switch 1 has sceptre}
      {stop motor_C, alterdir, on motor_c)}
        setvar(sceptre,con,2)   {sceptre passes to switch 2}
        setfwd(motor_c)              {go to the left}
        setvar(readData,con,1)  {allow reading}
        on(motor_c)
    endif()
  endif()
 endloop()
endoftask()
{-------------------------------------------------------------------------------}
beginoftask(task_3)    {left switch}
loop(con,forever)
  if(senval,sensor_2,eq,con,1)
    if(var,sceptre,eq,con,2)   {switch 2 has sceptre}
      {stop motor_C, stop reading, allow upload (turn=1),
        advance paper,
        wait until turn back to RCX, alterdir, on motor_c)}
        setvar(readData,con,0)  {forbide reading}
        setvar(sceptre,con,1)   {sceptre passes to switch 1}
         gosub(1)                           {.......}
        setrwd(motor_c)              {go to the right}
        on(motor_c)
    endif()
  endif()
 endloop()
endoftask()

{--------------------------------------------------------------------------------}
beginofsub(1)
  off(motor_c)
  setvar(turn,con,1)             {computer's turn}
  on(motor_b)    {advance paper}
  wait(con,8)
  off(motor_b)
   while(var,turn,eq,con,1)    {wait until RCX's turn}
   wait(con,1)
   endwhile()
endofsub()



2. Delphi-program-source

unit scanner1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls,spirit, OleCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Spirit1: TSpirit;
    Timer1: TTimer;
    Image1: TImage;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit4: TEdit;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

const xlower=100;
      xupper=660;

var turn,uploads,iLower,Iupper:integer;
    data:variant;
    calc,alpha,a,b:real;
    colour:integer;
    lines,posx:integer;
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.picture.bitmap.height:=2000;
image1.picture.bitmap.width:=1000;
image1.picture.bitmap.canvas.pen.width:=4;
image1.picture.bitmap.canvas.brush.color:=clNavy;
image1.picture.bitmap.canvas.rectangle(0,0,image1.picture.bitmap.width,
    image1.picture.bitmap.height);
a:=255/(690-750);   {white=690, black=750  raw}    {255=white 0=black}
b:=-a*750;
  lines:=0;
spirit1.initcomm;
spirit1.setdatalog(0);
if spirit1.setdatalog(500) then MessageDlg('ok size', mtinformation,  [mbOk], 0);
timer1.enabled:=true;
 

spirit1.setvar(5,2,0); {turn set to RCX}
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
image1.picture.bitmap.savetofile('BMPScannix.bmp');
spirit1.closecomm;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var idx,iCounter:integer;
begin
 turn:=spirit1.poll(0,5);

 if turn=1 then     {1=COMPUTER 0=rcx}
    begin
     timer1.enabled:=false;  {no new event until new datalog}
     lines:=lines+1;

     data:=spirit1.uploadDatalog(0,1);  {get the size of the datalog}
      if varIsarray(data) then  iUpper:=data[2,0] else exit;
      edit1.text:=inttostr(iUpper);
      if iupper=0 then
           begin
            MessageDlg('iUpper=0', mtinformation,  [mbOk], 0);
            exit;
           end;
        alpha:=(Xupper-100)/iUpper;
      uploads:=trunc(iUpper/50);
      if (iupper mod 50)=0 then uploads:=uploads-1;

      image1.picture.bitmap.canvas.
         moveto(XLower,100+lines*image1.picture.bitmap.canvas.pen.width);
 

      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;
             edit2.text:=inttostr(iupper);
             edit3.text:=inttostr(ilower);
        if varIsarray(data) then
          begin
          for idx:=VararraylowBound(data,2) to VarArrayHighBound(data,2) do
             begin
               edit4.text:=inttostr(idx);
              calc:=a*data[2,idx]+b;
              colour:=trunc(calc);
              if colour<0 then colour:=0;
              if colour>255 then colour:=255;

              calc:=alpha*(ilower+idx);

             image1.picture.bitmap.canvas.pen.color:=RGB(colour,colour,colour);
             posx:=xLower+trunc(calc);

             image1.picture.bitmap.canvas.lineto(posx,100+lines*
               image1.picture.bitmap.canvas.pen.width);

             end; {for idx}
            end else MessageDlg('oh no datalog', mterror,  [mbOk], 0);
        end; {for icounter}
        with spirit1 do
      begin
        setdatalog(0);      {clear datalog}
         setdatalog(500);

       setvar(5,2,0);     {var5=turn: 0=RCX 1=Computer}
       messagebeep(0);
      end;
      timer1.enabled:=true;
    end;
end;

end.



Download  PScanner.exe

Page précédente