Bem, vou postar o código que já tenho. Acessar a porta não é problema, o que não estou conseguindo é encontrar uma maneira de ficar monitorando continuadamente a entrada. As soluções prontas que encontrei(ioport, portcontrol...) também não fazem muita coisa. São ferramentas para serem usadas por linha de comando, e que apenas retornam uma informação quando acionadas. Mas essa é a parte fácil.
Nesse caso, o daemon em loop ficaria continuadamente comparando o estado atual da porta com o estado anterior, e em caso de alteração, tomaria a decisão programada. O meu problema é exatamente o monitoramento contínuo.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Ports, Crt;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;
CheckBox8: TCheckBox;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure CheckBox1Change(Sender: TObject);
procedure CheckBox2Change(Sender: TObject);
procedure CheckBox3Change(Sender: TObject);
procedure CheckBox4Change(Sender: TObject);
procedure CheckBox5Change(Sender: TObject);
procedure CheckBox6Change(Sender: TObject);
procedure CheckBox7Change(Sender: TObject);
procedure CheckBox8Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
Led1, Led2, Led3, Led4, Led5, Led6, Led7, Led8: boolean;
PortStatus: Integer;
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
ioperm($378,8,1);
port[$378]:=0;
Led1:=false;
Led2:=false;
Led3:=false;
Led4:=false;
Led5:=false;
Led6:=false;
Led7:=false;
Led8:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.CheckBox1.Checked:=true;
Form1.CheckBox2.Checked:=true;
Form1.CheckBox3.Checked:=true;
Form1.CheckBox4.Checked:=true;
Form1.CheckBox5.Checked:=true;
Form1.CheckBox6.Checked:=true;
Form1.CheckBox7.Checked:=true;
Form1.CheckBox8.Checked:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.CheckBox1.Checked:=false;
Form1.CheckBox2.Checked:=false;
Form1.CheckBox3.Checked:=false;
Form1.CheckBox4.Checked:=false;
Form1.CheckBox5.Checked:=false;
Form1.CheckBox6.Checked:=false;
Form1.CheckBox7.Checked:=false;
Form1.CheckBox8.Checked:=false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.CheckBox1.Checked:=true;
Delay(300);
Form1.CheckBox1.Checked:=false;
end;
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
if (Led1=false) then
begin
PortStatus:=(Integer(port[$378]))+1;
port[$378]:=PortStatus;
Led1:=true;
end
else if (Led1=true) then
begin
PortStatus:=(Integer(port[$378]))-1;
port[$378]:=PortStatus;
Led1:=false;
end;
end;
procedure TForm1.CheckBox2Change(Sender: TObject);
begin
if (Led2=false) then
begin
PortStatus:=(Integer(port[$378]))+2;
port[$378]:=PortStatus;
Led2:=true;
end
else if (Led2=true) then
begin
PortStatus:=(Integer(port[$378]))-2;
port[$378]:=PortStatus;
Led2:=false;
end;
end;
procedure TForm1.CheckBox3Change(Sender: TObject);
begin
if (Led3=false) then
begin
PortStatus:=(Integer(port[$378]))+4;
port[$378]:=PortStatus;
Led3:=true;
end
else if (Led3=true) then
begin
PortStatus:=(Integer(port[$378]))-4;
port[$378]:=PortStatus;
Led3:=false;
end;
end;
procedure TForm1.CheckBox4Change(Sender: TObject);
begin
if (Led4=false) then
begin
PortStatus:=(Integer(port[$378]))+8;
port[$378]:=PortStatus;
Led4:=true;
end
else if (Led4=true) then
begin
PortStatus:=(Integer(port[$378]))-8;
port[$378]:=PortStatus;
Led4:=false;
end;
end;
procedure TForm1.CheckBox5Change(Sender: TObject);
begin
if (Led5=false) then
begin
PortStatus:=(Integer(port[$378]))+16;
port[$378]:=PortStatus;
Led5:=true;
end
else if (Led5=true) then
begin
PortStatus:=(Integer(port[$378]))-16;
port[$378]:=PortStatus;
Led5:=false;
end;
end;
procedure TForm1.CheckBox6Change(Sender: TObject);
begin
if (Led6=false) then
begin
PortStatus:=(Integer(port[$378]))+32;
port[$378]:=PortStatus;
Led6:=true;
end
else if (Led6=true) then
begin
PortStatus:=(Integer(port[$378]))-32;
port[$378]:=PortStatus;
Led6:=false;
end;
end;
procedure TForm1.CheckBox7Change(Sender: TObject);
begin
if (Led7=false) then
begin
PortStatus:=(Integer(port[$378]))+64;
port[$378]:=PortStatus;
Led7:=true;
end
else if (Led7=true) then
begin
PortStatus:=(Integer(port[$378]))-64;
port[$378]:=PortStatus;
Led7:=false;
end;
end;
procedure TForm1.CheckBox8Change(Sender: TObject);
begin
if (Led8=false) then
begin
PortStatus:=(Integer(port[$378]))+128;
port[$378]:=PortStatus;
Led8:=true;
end
else if (Led8=true) then
begin
PortStatus:=(Integer(port[$378]))-128;
port[$378]:=PortStatus;
Led8:=false;
end;
end;
initialization
{$I unit1.lrs}
end.
Obs.: Este código ainda está em fase experimental, e funciona para acionar as 8 saídas da porta paralela, mas ainda não tem nada para controlar as entradas.
EDIT: Bem, desculpem pelo tópico besta, mas pesquisei um pouco e encontrei uma solução extremamente simples: TTimer!
Foi só adicionar o comando para verificar o status da porta ao evento OnTimer e setar um valor baixo ao timer. Só isso.