unit untMain;
{------------------------------------------------------------------------------}
{   .  .                                    }
{------------------------------------------------------------------------------}
{ (C)  " ". All rights reserved. WEB: http://www.atol.ru      }
{------------------------------------------------------------------------------}
interface

uses
  // VCL
  Windows, Messages, SysUtils, Classes, Controls, Graphics, Forms, Dialogs, Spin,
  StdCtrls, ExtCtrls, ComCtrls, ComObj, Buttons, ActiveX, AxCtrls, Grids,Variants,
  // Common
  untObj;

type
  TfrmMain = class(TForm)
    Panel1: TPanel;
    btnShowProperties: TButton;
    btnClose: TButton;
    chkDeviceEnabled: TCheckBox;
    Panel4: TPanel;
    btnDisconnectAllChannels: TButton;
    chkLockDevices: TCheckBox;
    GroupBox2: TGroupBox;
    Label2: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label24: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label32: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    Label31: TLabel;
    Label40: TLabel;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    Label36: TLabel;
    Label37: TLabel;
    Label38: TLabel;
    Label39: TLabel;
    cbChannel27: TComboBox;
    cbChannel28: TComboBox;
    cbChannel29: TComboBox;
    cbChannel30: TComboBox;
    cbChannel31: TComboBox;
    cbChannel32: TComboBox;
    cbChannel24: TComboBox;
    cbChannel23: TComboBox;
    cbChannel22: TComboBox;
    cbChannel21: TComboBox;
    cbChannel20: TComboBox;
    cbChannel19: TComboBox;
    cbChannel11: TComboBox;
    cbChannel12: TComboBox;
    cbChannel13: TComboBox;
    cbChannel14: TComboBox;
    cbChannel15: TComboBox;
    cbChannel16: TComboBox;
    btnSetChannels: TButton;
    btnGetChannels: TButton;
    cbChannel8: TComboBox;
    cbChannel7: TComboBox;
    cbChannel6: TComboBox;
    cbChannel5: TComboBox;
    cbChannel4: TComboBox;
    cbChannel3: TComboBox;
    cbChannel2: TComboBox;
    cbChannel10: TComboBox;
    cbChannel18: TComboBox;
    cbChannel26: TComboBox;
    cbChannel25: TComboBox;
    cbChannel17: TComboBox;
    cbChannel9: TComboBox;
    cbChannel1: TComboBox;
    btnGetChannel: TButton;
    btnSetChannel: TButton;
    cbChannelState: TComboBox;
    GroupBox1: TGroupBox;
    Label10: TLabel;
    Label9: TLabel;
    Label11: TLabel;
    Label1: TLabel;
    edtResultCode: TEdit;
    cbChannelNum: TComboBox;
    procedure btnCloseClick(Sender: TObject);
    procedure chkDeviceEnabledClick(Sender: TObject);
    procedure chkLockdevicesClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure cbChannelStateChange(Sender: TObject);
    procedure btnGetChannelClick(Sender: TObject);
    procedure btnSetChannelClick(Sender: TObject);
    procedure btnGetChannelsClick(Sender: TObject);
    procedure btnSetChannelsClick(Sender: TObject);
    procedure btnDisconnectAllChannelsClick(Sender: TObject);
    procedure btnShowPropertiesClick(Sender: TObject);
    procedure btnAddDeviceClick(Sender: TObject);
    procedure btnDeleteDeviceClick(Sender: TObject);
    procedure cbChannelXChange(Sender: TObject);
    procedure cbChannelNumChange(Sender: TObject);
  protected

  private
    procedure LoadProperties;
  end;

var
  frmMain: TfrmMain;

{------------------------------------------------------------------------------}
implementation

{$R *.DFM}

procedure TfrmMain.LoadProperties;
var
  b: boolean;
begin
    cbChannelNum.ItemIndex := AX.ChannelNumber - 1;
    b := not AX.ChannelState;
    cbChannelState.ItemIndex := integer(b);

    cbChannel1.ItemIndex := integer((AX.ChannelsStates and $00000001) = 0);
    cbChannel2.ItemIndex := integer((AX.ChannelsStates and $00000002) = 0);
    cbChannel3.ItemIndex := integer((AX.ChannelsStates and $00000004) = 0);
    cbChannel4.ItemIndex := integer((AX.ChannelsStates and $00000008) = 0);
    cbChannel5.ItemIndex := integer((AX.ChannelsStates and $00000010) = 0);
    cbChannel6.ItemIndex := integer((AX.ChannelsStates and $00000020) = 0);
    cbChannel7.ItemIndex := integer((AX.ChannelsStates and $00000040) = 0);
    cbChannel8.ItemIndex := integer((AX.ChannelsStates and $00000080) = 0);

    cbChannel9.ItemIndex  := integer((AX.ChannelsStates and $00000100) = 0);
    cbChannel10.ItemIndex := integer((AX.ChannelsStates and $00000200) = 0);
    cbChannel11.ItemIndex := integer((AX.ChannelsStates and $00000400) = 0);
    cbChannel12.ItemIndex := integer((AX.ChannelsStates and $00000800) = 0);
    cbChannel13.ItemIndex := integer((AX.ChannelsStates and $00001000) = 0);
    cbChannel14.ItemIndex := integer((AX.ChannelsStates and $00002000) = 0);
    cbChannel15.ItemIndex := integer((AX.ChannelsStates and $00004000) = 0);
    cbChannel16.ItemIndex := integer((AX.ChannelsStates and $00008000) = 0);

    cbChannel17.ItemIndex := integer((AX.ChannelsStates and $00010000) = 0);
    cbChannel18.ItemIndex := integer((AX.ChannelsStates and $00020000) = 0);
    cbChannel19.ItemIndex := integer((AX.ChannelsStates and $00040000) = 0);
    cbChannel20.ItemIndex := integer((AX.ChannelsStates and $00080000) = 0);
    cbChannel21.ItemIndex := integer((AX.ChannelsStates and $00100000) = 0);
    cbChannel22.ItemIndex := integer((AX.ChannelsStates and $00200000) = 0);
    cbChannel23.ItemIndex := integer((AX.ChannelsStates and $00400000) = 0);
    cbChannel24.ItemIndex := integer((AX.ChannelsStates and $00800000) = 0);

    cbChannel25.ItemIndex := integer((AX.ChannelsStates and $01000000) = 0);
    cbChannel26.ItemIndex := integer((AX.ChannelsStates and $02000000) = 0);
    cbChannel27.ItemIndex := integer((AX.ChannelsStates and $04000000) = 0);
    cbChannel28.ItemIndex := integer((AX.ChannelsStates and $08000000) = 0);
    cbChannel29.ItemIndex := integer((AX.ChannelsStates and $10000000) = 0);
    cbChannel30.ItemIndex := integer((AX.ChannelsStates and $20000000) = 0);
    cbChannel31.ItemIndex := integer((AX.ChannelsStates and $40000000) = 0);
    cbChannel32.ItemIndex := integer((AX.ChannelsStates and $80000000) = 0);

    chkDeviceEnabled.Checked := AX.DeviceEnabled;
    chkLockDevices.Checked := AX.LockDevices;
    edtResultCode.Text:= '('+IntToStr(AX.ResultCode)+') '+AX.ResultDescription;
end;

procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmMain.chkDeviceEnabledClick(Sender: TObject);
begin
  chkDeviceEnabled.OnClick := nil;
  AX.DeviceEnabled:= chkDeviceEnabled.Checked;
  LoadProperties;
  chkDeviceEnabled.OnClick := chkDeviceEnabledClick;
end;

procedure TfrmMain.chkLockdevicesClick(Sender: TObject);
begin
  AX.LockDevices:= chkLockDevices.Checked;
  LoadProperties;
end;

procedure TfrmMain.FormCreate(Sender: TObject);

  procedure FillChannelState(ACombobox: TComboBox);
  begin
    ACombobox.Items.AddObject('', TObject(true));
    ACombobox.Items.AddObject('', TObject(false));
  end;

begin
  FillChannelState(cbChannelState);

  FillChannelState(cbChannel1);
  FillChannelState(cbChannel2);
  FillChannelState(cbChannel3);
  FillChannelState(cbChannel4);
  FillChannelState(cbChannel5);
  FillChannelState(cbChannel6);
  FillChannelState(cbChannel7);
  FillChannelState(cbChannel8);
  FillChannelState(cbChannel9);
  FillChannelState(cbChannel10);
  FillChannelState(cbChannel11);
  FillChannelState(cbChannel12);
  FillChannelState(cbChannel13);
  FillChannelState(cbChannel14);
  FillChannelState(cbChannel15);
  FillChannelState(cbChannel16);
  FillChannelState(cbChannel17);
  FillChannelState(cbChannel18);
  FillChannelState(cbChannel19);
  FillChannelState(cbChannel20);
  FillChannelState(cbChannel21);
  FillChannelState(cbChannel22);
  FillChannelState(cbChannel23);
  FillChannelState(cbChannel24);
  FillChannelState(cbChannel25);
  FillChannelState(cbChannel26);
  FillChannelState(cbChannel27);
  FillChannelState(cbChannel28);
  FillChannelState(cbChannel29);
  FillChannelState(cbChannel30);
  FillChannelState(cbChannel31);
  FillChannelState(cbChannel32);

  Caption := Application.Title;
end;

procedure TfrmMain.FormShow(Sender: TObject);

  function CreateAX(const ClassName, AXFileName, LSFileName: string): OleVariant;
  begin
    RESULT:= UnAssigned;
    try
      RESULT:= CreateOleObject(ClassName);
    except
      RESULT:= UnAssigned;
    end;
    if VarIsEmpty(RESULT) then
      raise Exception.Create('  ');
  end;

begin
  AX := UnAssigned;
  AXDisp := nil;
  AX := CreateAX('AddIn.Switch', 'Switch.dll', '');
  if VarIsEmpty(AX) then
    Close
  else
  begin
    try
      AXDisp := IDispatch(AX);
      AX.ApplicationHandle := Application.Handle;
      LoadProperties;
    except
      ShowMessage('     !');
      Close;
    end;
  end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  AXDisp := nil;
  AX := UnAssigned;
end;

procedure TfrmMain.cbChannelStateChange(Sender: TObject);
begin
  AX.ChannelState := not (boolean((Sender as TComboBox).ItemIndex));
  LoadProperties;
end;

procedure TfrmMain.btnGetChannelClick(Sender: TObject);
begin
  AX.GetChannelState;
  LoadProperties;
end;

procedure TfrmMain.btnSetChannelClick(Sender: TObject);
begin
  AX.SetChannelState;
  LoadProperties;
end;

procedure TfrmMain.btnGetChannelsClick(Sender: TObject);
begin
  AX.GetChannelsStates;
  LoadProperties;
end;

procedure TfrmMain.btnSetChannelsClick(Sender: TObject);
begin
  AX.SetChannelsStates;
  LoadProperties;
end;

procedure TfrmMain.btnDisconnectAllChannelsClick(Sender: TObject);
begin
  AX.DisconnectAllChannels;
  LoadProperties;
end;

procedure TfrmMain.btnShowPropertiesClick(Sender: TObject);
begin
  AX.ShowProperties;
  LoadProperties;
end;

procedure TfrmMain.btnAddDeviceClick(Sender: TObject);
begin
  AX.AddDevice;
  LoadProperties;
end;

procedure TfrmMain.btnDeleteDeviceClick(Sender: TObject);
begin
  AX.DeleteDevice;
  LoadProperties;
end;

procedure TfrmMain.cbChannelXChange(Sender: TObject);
var
  fChannelEnabled: boolean;
  fBitMask: Cardinal;
begin
  fChannelEnabled := not boolean((Sender as TComboBox).ItemIndex);
  fBitMask := 1 shl (Sender as TControl).Tag;
  AX.ChannelsStates := AX.ChannelsStates and (not fBitMask);
  if fChannelEnabled then
    AX.ChannelsStates := AX.ChannelsStates or fBitMask;
end;

procedure TfrmMain.cbChannelNumChange(Sender: TObject);
begin
  AX.ChannelNumber := cbChannelNum.ItemIndex + 1;
  LoadProperties;
end;

end.
