unit MainUnit; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ImgList; type TMainForm = class(TForm) ReadTime: TTimer; LevelImages: TImageList; Label1: TLabel; Label2: TLabel; Label3: TLabel; LevelImage0H: TImage; LevelImage0I: TImage; LevelImage0L: TImage; LevelImage1H: TImage; LevelImage1I: TImage; LevelImage1L: TImage; LevelImage2H: TImage; LevelImage2I: TImage; LevelImage2L: TImage; LevelImage3H: TImage; LevelImage3I: TImage; LevelImage3L: TImage; LevelImage4H: TImage; LevelImage4I: TImage; LevelImage4L: TImage; LevelImage5H: TImage; LevelImage5I: TImage; LevelImage5L: TImage; LevelImage6H: TImage; LevelImage6I: TImage; LevelImage6L: TImage; LevelImage7H: TImage; LevelImage7I: TImage; LevelImage7L: TImage; LevelImage8H: TImage; LevelImage8I: TImage; LevelImage8L: TImage; LevelImage9H: TImage; LevelImage9I: TImage; LevelImage9L: TImage; LevelImage10H: TImage; LevelImage10I: TImage; LevelImage10L: TImage; LevelImage11H: TImage; LevelImage11I: TImage; LevelImage11L: TImage; LevelImage12H: TImage; LevelImage12I: TImage; LevelImage12L: TImage; LevelImage13H: TImage; LevelImage13I: TImage; LevelImage13L: TImage; LevelImage14H: TImage; LevelImage14I: TImage; LevelImage14L: TImage; LevelImage15H: TImage; LevelImage15I: TImage; LevelImage15L: TImage; LevelImage16H: TImage; LevelImage16I: TImage; LevelImage16L: TImage; Label4: TLabel; Label5: TLabel; Label6: TLabel; LevelImage17H: TImage; LevelImage17I: TImage; LevelImage17L: TImage; LevelImage18H: TImage; LevelImage18I: TImage; LevelImage18L: TImage; LevelImage19H: TImage; LevelImage19I: TImage; LevelImage19L: TImage; LevelImage20H: TImage; LevelImage20I: TImage; LevelImage20L: TImage; LevelImage21H: TImage; LevelImage21I: TImage; LevelImage21L: TImage; LevelImage22H: TImage; LevelImage22I: TImage; LevelImage22L: TImage; LevelImage23H: TImage; LevelImage23I: TImage; LevelImage23L: TImage; LevelImage24H: TImage; LevelImage24I: TImage; LevelImage24L: TImage; LevelImage25H: TImage; LevelImage25I: TImage; LevelImage25L: TImage; LevelImage26H: TImage; LevelImage26I: TImage; LevelImage26L: TImage; LevelImage27H: TImage; LevelImage27I: TImage; LevelImage27L: TImage; LevelImage28H: TImage; LevelImage28I: TImage; LevelImage28L: TImage; LevelImage29H: TImage; LevelImage29I: TImage; LevelImage29L: TImage; LevelImage30H: TImage; LevelImage30I: TImage; LevelImage30L: TImage; LevelImage31H: TImage; LevelImage31I: TImage; LevelImage31L: TImage; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; Label23: TLabel; Label24: TLabel; Label25: TLabel; Label26: TLabel; Label27: TLabel; Label28: TLabel; Label29: TLabel; Label30: TLabel; Label31: TLabel; Label32: TLabel; Label33: TLabel; Label34: TLabel; Label35: TLabel; Label36: TLabel; Label37: TLabel; Label38: TLabel; Label39: TLabel; Label40: TLabel; Label41: TLabel; Label42: TLabel; StatusLabel: TLabel; procedure FormCreate(Sender: TObject); procedure ReadTimeTimer(Sender: TObject); procedure LevelImageHClick(Sender: TObject); procedure LevelImageIClick(Sender: TObject); procedure LevelImageLClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.DFM} uses AIOUSB, DetectUnit; var DeviceIndex: LongWord; DIOData, OutMask: LongWord; bUpdate: Boolean; LowLevel, HighLevel, InputLevel, gLowLevel, gHighLevel, gInputLevel: TBitmap; BitImageL, BitImageI, BitImageH: array[0..31] of TImage; procedure TMainForm.FormCreate(Sender: TObject); var DetectForm: TDetectForm; Status: LongWord; I: Integer; begin LowLevel := TBitmap.Create; HighLevel := TBitmap.Create; InputLevel := TBitmap.Create; gLowLevel := TBitmap.Create; gHighLevel := TBitmap.Create; gInputLevel := TBitmap.Create; DeviceIndex := diOnly; OutMask := $00000000; DIOData := $FFFFFFFF; 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; BitImageL[ 0] := LevelImage0L; BitImageI[ 0] := LevelImage0I; BitImageH[ 0] := LevelImage0H; BitImageL[ 1] := LevelImage1L; BitImageI[ 1] := LevelImage1I; BitImageH[ 1] := LevelImage1H; BitImageL[ 2] := LevelImage2L; BitImageI[ 2] := LevelImage2I; BitImageH[ 2] := LevelImage2H; BitImageL[ 3] := LevelImage3L; BitImageI[ 3] := LevelImage3I; BitImageH[ 3] := LevelImage3H; BitImageL[ 4] := LevelImage4L; BitImageI[ 4] := LevelImage4I; BitImageH[ 4] := LevelImage4H; BitImageL[ 5] := LevelImage5L; BitImageI[ 5] := LevelImage5I; BitImageH[ 5] := LevelImage5H; BitImageL[ 6] := LevelImage6L; BitImageI[ 6] := LevelImage6I; BitImageH[ 6] := LevelImage6H; BitImageL[ 7] := LevelImage7L; BitImageI[ 7] := LevelImage7I; BitImageH[ 7] := LevelImage7H; BitImageL[ 8] := LevelImage8L; BitImageI[ 8] := LevelImage8I; BitImageH[ 8] := LevelImage8H; BitImageL[ 9] := LevelImage9L; BitImageI[ 9] := LevelImage9I; BitImageH[ 9] := LevelImage9H; BitImageL[10] := LevelImage10L; BitImageI[10] := LevelImage10I; BitImageH[10] := LevelImage10H; BitImageL[11] := LevelImage11L; BitImageI[11] := LevelImage11I; BitImageH[11] := LevelImage11H; BitImageL[12] := LevelImage12L; BitImageI[12] := LevelImage12I; BitImageH[12] := LevelImage12H; BitImageL[13] := LevelImage13L; BitImageI[13] := LevelImage13I; BitImageH[13] := LevelImage13H; BitImageL[14] := LevelImage14L; BitImageI[14] := LevelImage14I; BitImageH[14] := LevelImage14H; BitImageL[15] := LevelImage15L; BitImageI[15] := LevelImage15I; BitImageH[15] := LevelImage15H; BitImageL[16] := LevelImage16L; BitImageI[16] := LevelImage16I; BitImageH[16] := LevelImage16H; BitImageL[17] := LevelImage17L; BitImageI[17] := LevelImage17I; BitImageH[17] := LevelImage17H; BitImageL[18] := LevelImage18L; BitImageI[18] := LevelImage18I; BitImageH[18] := LevelImage18H; BitImageL[19] := LevelImage19L; BitImageI[19] := LevelImage19I; BitImageH[19] := LevelImage19H; BitImageL[20] := LevelImage20L; BitImageI[20] := LevelImage20I; BitImageH[20] := LevelImage20H; BitImageL[21] := LevelImage21L; BitImageI[21] := LevelImage21I; BitImageH[21] := LevelImage21H; BitImageL[22] := LevelImage22L; BitImageI[22] := LevelImage22I; BitImageH[22] := LevelImage22H; BitImageL[23] := LevelImage23L; BitImageI[23] := LevelImage23I; BitImageH[23] := LevelImage23H; BitImageL[24] := LevelImage24L; BitImageI[24] := LevelImage24I; BitImageH[24] := LevelImage24H; BitImageL[25] := LevelImage25L; BitImageI[25] := LevelImage25I; BitImageH[25] := LevelImage25H; BitImageL[26] := LevelImage26L; BitImageI[26] := LevelImage26I; BitImageH[26] := LevelImage26H; BitImageL[27] := LevelImage27L; BitImageI[27] := LevelImage27I; BitImageH[27] := LevelImage27H; BitImageL[28] := LevelImage28L; BitImageI[28] := LevelImage28I; BitImageH[28] := LevelImage28H; BitImageL[29] := LevelImage29L; BitImageI[29] := LevelImage29I; BitImageH[29] := LevelImage29H; BitImageL[30] := LevelImage30L; BitImageI[30] := LevelImage30I; BitImageH[30] := LevelImage30H; BitImageL[31] := LevelImage31L; BitImageI[31] := LevelImage31I; BitImageH[31] := LevelImage31H; LevelImages.GetBitmap(0, LowLevel); LevelImages.GetBitmap(1, InputLevel); LevelImages.GetBitmap(2, HighLevel); LevelImages.GetBitmap(3, gLowLevel); LevelImages.GetBitmap(4, gInputLevel); LevelImages.GetBitmap(5, gHighLevel); for I := 0 to 31 do begin BitImageL[I].Picture.Assign(gLowLevel); BitImageI[I].Picture.Assign(InputLevel); BitImageH[I].Picture.Assign(gHighLevel); end; bUpdate := True; ReadTime.Enabled := True; end; procedure TMainForm.ReadTimeTimer(Sender: TObject); var oDIOData: LongWord; Status: LongWord; I: Integer; begin oDIOData := DIOData; Status := DIO_ReadAll(DeviceIndex, @DIOData); if Status = ERROR_SUCCESS then StatusLabel.Caption := 'OK' else begin StatusLabel.Caption := 'Error ' + IntToStr(Status); Exit; end; if (oDIOData xor DIOData) <> 0 then bUpdate := True; if not bUpdate then Exit; for I := 0 to 31 do if (OutMask and (1 shl I)) = 0 then begin //The bit is an input, so draw in input slot. if (DIOData and (1 shl I)) = 0 then BitImageI[I].Picture.Assign(LowLevel) else BitImageI[I].Picture.Assign(HighLevel) ; end else begin //The bit is an output, so draw readback in output slots. if (DIOData and (1 shl I)) = 0 then begin BitImageL[I].Picture.Assign(LowLevel); BitImageH[I].Picture.Assign(gHighLevel); end else begin BitImageL[I].Picture.Assign(gLowLevel); BitImageH[I].Picture.Assign(HighLevel); end; end; bUpdate := False; end; procedure TMainForm.LevelImageHClick(Sender: TObject); var I: Integer; begin I := (Sender as TImage).Tag; DIOData := DIOData or (1 shl I); //Set the bit high. BitImageL[I].Picture.Assign(gLowLevel); BitImageI[I].Picture.Assign(gInputLevel); BitImageH[I].Picture.Assign(HighLevel); if (OutMask and (1 shl I)) <> 0 then begin //If it's already output, just write the data. DIO_WriteAll(DeviceIndex, @DIOData); end else begin //Otherwise, set as output as well. OutMask := OutMask or (1 shl I); DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); end; bUpdate := True; end; procedure TMainForm.LevelImageIClick(Sender: TObject); var I: Integer; begin I := (Sender as TImage).Tag; OutMask := OutMask and not (1 shl I); //Clear output, to turn the bit to input. DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); BitImageL[I].Picture.Assign(gLowLevel); BitImageI[I].Picture.Assign(InputLevel); BitImageH[I].Picture.Assign(gHighLevel); bUpdate := True; end; procedure TMainForm.LevelImageLClick(Sender: TObject); var I: Integer; begin I := (Sender as TImage).Tag; DIOData := DIOData and not (1 shl I); //Clear the bit to low. BitImageL[I].Picture.Assign(LowLevel); BitImageI[I].Picture.Assign(gInputLevel); BitImageH[I].Picture.Assign(gHighLevel); if (OutMask and (1 shl I)) <> 0 then begin //If it's already output, just write the data. DIO_WriteAll(DeviceIndex, @DIOData); end else begin //Otherwise, set as output as well. OutMask := OutMask or (1 shl I); DIO_Configure(DeviceIndex, False, @OutMask, @DIOData); end; bUpdate := True; end; end.