unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ImgList, ExtCtrls, Buttons, ComCtrls; type TMainForm = class(TForm) InImage0: TImage; InImage1: TImage; InImage2: TImage; InImage3: TImage; OutImage0: TImage; OutImage1: TImage; OutImage2: TImage; OutImage3: TImage; LevelImages: TImageList; Label2: TLabel; Label3: TLabel; ReadTime: TTimer; OutLabel3: TLabel; OutLabel2: TLabel; OutLabel1: TLabel; OutLabel0: TLabel; InLabel3: TLabel; InLabel2: TLabel; InLabel1: TLabel; InLabel0: TLabel; procedure FormCreate(Sender: TObject); procedure ReadTimeTimer(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure LevelImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); protected public end; var MainForm: TMainForm; implementation {$R *.DFM} uses AIOUSB, DetectUnit; var DeviceIndex: LongWord; InImage, OutImage: array[0..3] of TImage; RelayLow, RelayHigh, InputOff, InputOn: TBitmap; DIOData: Word; DoUpdate: Boolean; procedure TMainForm.FormCreate(Sender: TObject); var DetectForm: TDetectForm; Status: LongWord; PID: LongWord; begin RelayLow := TBitmap.Create; RelayHigh := TBitmap.Create; InputOff := TBitmap.Create; InputOn := TBitmap.Create; DeviceIndex := diOnly; Status := QueryDeviceInfo(DeviceIndex, @PID, nil, nil, nil, nil); if (Status <> ERROR_SUCCESS) or not ((PID = $8030) or (PID = $8031)) then begin DetectForm := TDetectForm.Create(Self); if DetectForm.ShowModal = mrOK then begin DeviceIndex := DetectForm.DeviceIndex; DetectForm.Free; end else begin DetectForm.Free; Application.Terminate; Exit; end; end; DIOData := $FFFF; DIO_WriteAll(DeviceIndex, @DIOData); InImage[0] := InImage0; InImage[1] := InImage1; InImage[2] := InImage2; InImage[3] := InImage3; OutImage[0] := OutImage0; OutImage[1] := OutImage1; OutImage[2] := OutImage2; OutImage[3] := OutImage3; LevelImages.GetBitmap(0, RelayLow ); LevelImages.GetBitmap(1, RelayHigh); LevelImages.GetBitmap(2, InputOff ); LevelImages.GetBitmap(3, InputOn ); DoUpdate := True; ReadTime.Enabled := True; end; procedure TMainForm.ReadTimeTimer(Sender: TObject); var I: Integer; oDIOData, Changes: Word; begin oDIOData := DIOData; DIO_ReadAll(DeviceIndex, @DIOData); Changes := DIOData xor oDIOData; if DoUpdate then begin Changes := $FFFF; DoUpdate := False; end; //Read back relays for display for I := 0 to 3 do if (Changes and (1 shl I)) <> 0 then begin if (DIOData and (1 shl I)) = 0 then OutImage[I].Picture.Assign(RelayLow) else OutImage[I].Picture.Assign(RelayHigh) end ; //Read isolated inputs for I := 0 to 3 do if (Changes and ($100 shl I)) <> 0 then begin if (DIOData and ($100 shl I)) = 0 then InImage[I].Picture.Assign(InputOff) else InImage[I].Picture.Assign(InputOn) end ; end; procedure TMainForm.FormDestroy(Sender: TObject); begin RelayLow.Free; RelayHigh.Free; InputOff.Free; InputOn.Free; end; procedure TMainForm.LevelImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var I: Integer; NewValue: Boolean; begin if Button = mbLeft then begin I := (Sender as TImage).Tag; DIOData := DIOData xor (1 shl I); //Toggle bit NewValue := (DIOData and (1 shl I)) <> 0; //Get bit value DIO_Write1(DeviceIndex, I, NewValue); DoUpdate := True; end; end; end.