unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ImgList, ExtCtrls, Buttons, ComCtrls; type TMainForm = class(TForm) LevelImages: TImageList; Label5: TLabel; OutButton1C: TSpeedButton; OutButton1B: TSpeedButton; OutButton1A: TSpeedButton; OutButton2A: TSpeedButton; ReadTime: TTimer; TristateButton: TSpeedButton; BitLabelD7: TLabel; BitLabelD6: TLabel; BitLabelD5: TLabel; BitLabelD4: TLabel; BitLabelD3: TLabel; BitLabelD2: TLabel; BitLabelD1: TLabel; BitLabelD0: TLabel; Label6: TLabel; OutButton2B: TSpeedButton; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Image8: TImage; Image9: TImage; Image10: TImage; Image11: TImage; Image12: TImage; Image13: TImage; Image14: TImage; Image15: TImage; Image16: TImage; Image17: TImage; Image18: TImage; Image19: TImage; Image20: TImage; Image21: TImage; Image22: TImage; Image23: TImage; Image24: TImage; Image25: TImage; Image26: TImage; Image27: TImage; Image28: TImage; Image29: TImage; Image30: TImage; Image31: TImage; Image32: TImage; Image33: TImage; Image34: TImage; Image35: TImage; Image36: TImage; Image37: TImage; Image38: TImage; Image39: TImage; Image40: TImage; Image41: TImage; Image42: TImage; Image43: TImage; Image44: TImage; Image45: TImage; Image46: TImage; Image47: TImage; Image48: TImage; OutButton2C: TSpeedButton; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; Label25: TLabel; Label27: TLabel; Label35: TLabel; Label36: TLabel; Label37: TLabel; Label38: TLabel; Label39: TLabel; Label40: TLabel; Label41: TLabel; Label42: TLabel; Panel1: TPanel; Label68: TLabel; Label70: TLabel; Label71: TLabel; Label72: TLabel; Label73: TLabel; Label74: TLabel; Label75: TLabel; Label76: TLabel; Label77: TLabel; Label78: TLabel; Label79: TLabel; Label80: TLabel; Label81: TLabel; Label82: TLabel; Label83: TLabel; Label84: TLabel; Panel2: TPanel; Panel4: TPanel; Panel5: TPanel; Label52: TLabel; Label55: TLabel; procedure FormCreate(Sender: TObject); procedure ReadTimeTimer(Sender: TObject); procedure LevelImageClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure OutButtonClick(Sender: TObject); procedure TristateButtonClick(Sender: TObject); protected public end; var MainForm: TMainForm; implementation {$R *.DFM} uses AIOUSB, DetectUnit; var DeviceIndex: LongWord; LevelImage: array[0..47] of TImage; OutButton: array[0..5] of TSpeedButton; LowLevel, HighLevel: TBitmap; DIOData: array[0..5] of Byte; DoUpdate: Boolean; function FormatFreq(Freq: Double): String; begin end; procedure TMainForm.FormCreate(Sender: TObject); var DetectForm: TDetectForm; OutMask: Word; I: Integer; Status: LongWord; begin LowLevel := TBitmap.Create; HighLevel := TBitmap.Create; DeviceIndex := diOnly; OutMask := $0000; for I := 0 to 5 do DIOData[I] := $FF; Status := DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); if Status <> ERROR_SUCCESS 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; DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); end; LevelImage[ 0] := Image1; LevelImage[ 1] := Image2; LevelImage[ 2] := Image3; LevelImage[ 3] := Image4; LevelImage[ 4] := Image5; LevelImage[ 5] := Image6; LevelImage[ 6] := Image7; LevelImage[ 7] := Image8; LevelImage[ 8] := Image9; LevelImage[ 9] := Image10; LevelImage[10] := Image11; LevelImage[11] := Image12; LevelImage[12] := Image13; LevelImage[13] := Image14; LevelImage[14] := Image15; LevelImage[15] := Image16; LevelImage[16] := Image17; LevelImage[17] := Image18; LevelImage[18] := Image19; LevelImage[19] := Image20; LevelImage[20] := Image21; LevelImage[21] := Image22; LevelImage[22] := Image23; LevelImage[23] := Image24; LevelImage[24] := Image25; LevelImage[25] := Image26; LevelImage[26] := Image27; LevelImage[27] := Image28; LevelImage[28] := Image29; LevelImage[29] := Image30; LevelImage[30] := Image31; LevelImage[31] := Image32; LevelImage[32] := Image33; LevelImage[33] := Image34; LevelImage[34] := Image35; LevelImage[35] := Image36; LevelImage[36] := Image37; LevelImage[37] := Image38; LevelImage[38] := Image39; LevelImage[39] := Image40; LevelImage[40] := Image41; LevelImage[41] := Image42; LevelImage[42] := Image43; LevelImage[43] := Image44; LevelImage[44] := Image45; LevelImage[45] := Image46; LevelImage[46] := Image47; LevelImage[47] := Image48; OutButton[ 0] := OutButton1A; OutButton[ 1] := OutButton1B; OutButton[ 2] := OutButton1C; OutButton[ 3] := OutButton2A; OutButton[ 4] := OutButton2B; OutButton[ 5] := OutButton2C; LevelImages.GetBitmap(0, LowLevel); LevelImages.GetBitmap(1, HighLevel); DoUpdate := True; ReadTime.Enabled := True; end; procedure TMainForm.ReadTimeTimer(Sender: TObject); var I: Integer; oDIODATA, Changes: array[0..5] of Byte; begin for i:=0 to 5 do begin oDIOData[I] := DIOData[I]; end; DIO_ReadAll(DeviceIndex, @DIOData[0]); for i:=0 to 5 do begin Changes[I] := DIOData[I] xor oDIOData[I]; end; if DoUpdate then begin for i:=0 to 5 do begin Changes[I] := $FF; end; DoUpdate := False; end; for I := 0 to 47 do if (Changes[I div 8] and (1 shl (I mod 8))) <> 0 then begin if (DIOData[I div 8] and (1 shl (I mod 8))) <> 0 then LevelImage[I].Picture.Assign(HighLevel) else LevelImage[I].Picture.Assign(LowLevel) end ; end; procedure TMainForm.LevelImageClick(Sender: TObject); var I: Integer; NewValue: Boolean; begin I := (Sender as TImage).Tag; NewValue := ((DIOData[I div 8]) and (1 shl (I mod 8))) = 0; //Get bit value DIO_Write1(DeviceIndex, I, NewValue); DoUpdate := True; end; procedure TMainForm.FormDestroy(Sender: TObject); begin LowLevel.Free; HighLevel.Free; end; procedure TMainForm.OutButtonClick(Sender: TObject); var I: Integer; OutMask: Word; begin OutMask := $0000; for I := 0 to 5 do if OutButton[I].Down then OutMask := OutMask or (1 shl I) ; I := (Sender as TSpeedButton).Tag; DIOData[i] := $FF; //Set new output byte high, in case user made a mistake DIO_Configure(DeviceIndex, TristateButton.Down, @OutMask, @DIOData[0]); DoUpdate := True; end; procedure TMainForm.TristateButtonClick(Sender: TObject); var I: Integer; OutMask: Word; begin OutMask := $0000; for I := 0 to 5 do if OutButton[I].Down then OutMask := OutMask or (1 shl I) ; DIO_Configure(DeviceIndex, TristateButton.Down, @OutMask, @DIOData[0]); end; end.