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()
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.