unit fmuDevice;

interface

uses
  // VCL
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls,
  cuUtils,
  // This
  Line1C_TLB,
  LineX;

type
  TfmDevices = class(TForm)
    Caption1: TLabel;
    Caption2: TLabel;
    Bevel1: TBevel;
    Shape1: TShape;
    Label1: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    edtResultDescription: TEdit;
    edtResultCode: TEdit;
    btnAdd: TButton;
    btnDelete: TButton;
    btnClose: TButton;
    topPanel: TPanel;
    Label4: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    cbDeviceNumber: TComboBox;
    cbDeviceIndex: TComboBox;
    edtDeviceCount: TEdit;
    bottomPanel: TPanel;
    Shape2: TShape;
    Label9: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label6: TLabel;
    chkDeviceEnabled: TCheckBox;
    cboBaudRate: TComboBox;
    cboPortNumber: TComboBox;
    edtDeviceName: TEdit;
    udPortNumber: TUpDown;
    udBaudRate: TUpDown;
    edtPortNumber: TEdit;
    edtBaudRate: TEdit;
    cboParity: TComboBox;
    edtParity: TEdit;
    udParity: TUpDown;
    procedure EditorKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure EditorKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure edtDeviceNameExit(Sender: TObject);
    procedure DeviceIndexClick(Sender: TObject);
    procedure DeviceNumberClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure cboPortNumberChange(Sender: TObject);
    procedure edtPortNumberExit(Sender: TObject);
    procedure udPortNumberClick(Sender: TObject; Button: TUDBtnType);
    procedure cboBaudRateChange(Sender: TObject);
    procedure edtBaudRateExit(Sender: TObject);
    procedure udBaudRateClick(Sender: TObject; Button: TUDBtnType);
    procedure cboParityChange(Sender: TObject);
    procedure edtParityExit(Sender: TObject);
    procedure udParityClick(Sender: TObject; Button: TUDBtnType);
    procedure chkDeviceEnabledClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    procedure GetDeviceName;
    procedure SetDeviceName;
  private
    procedure GetDeviceIndex;
    procedure SetDeviceIndex;
  private
    procedure GetDeviceNumber;
    procedure SetDeviceNumber;
  private
    procedure GetLastResult;
    procedure GetDeviceCount;
  private
    procedure GetPortNumber;
    procedure SetUDPortNumber;
    procedure SetEditPortNumber;
    procedure SetComboPortNumber;
  private
    procedure GetBaudRate;
    procedure SetUDBaudRate;
    procedure SetEditBaudRate;
    procedure SetComboBaudRate;
  private
    procedure GetParity;
    procedure SetUDParity;
    procedure SetEditParity;
    procedure SetComboParity;
  private
    procedure GetDeviceEnabled;
    procedure SetDeviceEnabled;
  private
    SaveApplicationOnException: TExceptionEvent;
    procedure ApplicationException(Sender: TObject; E: Exception);
  private
    FLineX: TLineX;
    procedure UpdateForm;
    procedure Init(const ALineX: TLineX; AFont: TFont);
  end;

procedure ShowDevicesProperties(const ALineX: TLineX; AFont: TFont);

implementation

{$R *.DFM}

procedure ShowDevicesProperties(const ALineX: TLineX; AFont: TFont);
begin
  With TfmDevices.Create(Application) do
  begin
    try
      Init(ALineX, AFont);
      ShowModal;
    finally
      Free;
    end;
  end;
end;

{ TfmDevices }

procedure TfmDevices.Init(const ALineX: TLineX; AFont: TFont);
begin
  fLineX := ALineX;
  Font := AFont;
  UpdateForm;
end;

procedure TfmDevices.UpdateForm;
begin
  GetLastResult;
  GetDeviceName;
  GetDeviceIndex;
  GetDeviceNumber;
  GetDeviceEnabled;
  GetDeviceCount;
  GetPortNumber;
  GetBaudRate;
  GetParity;
end;

procedure TfmDevices.GetDeviceCount;
begin
  try
    edtDeviceCount.Text := IntToStr(fLineX.DeviceCount);
  except
    on E: Exception do
     edtDeviceCount.Text := E.Message;
  end;
end;

procedure TfmDevices.GetLastResult;
begin
  edtResultCode.Text := IntToStr(fLineX.ResultCode);
  edtResultDescription.Text := fLineX.ResultDescription;
end;

// DeviceName

procedure TfmDevices.GetDeviceName;
begin
  try
    edtDeviceName.Text := fLineX.CurrentDeviceName;
  except
    on E: Exception do edtDeviceName.Text := E.Message;
  end;
end;

procedure TfmDevices.SetDeviceName;
begin
  fLineX.CurrentDeviceName := edtDeviceName.Text;
end;

// DeviceIndex

procedure TfmDevices.GetDeviceIndex;
begin
  try
    SafeSetComboBox(cbDeviceIndex, fLineX.CurrentDeviceIndex);
  except

  end;
end;

procedure TfmDevices.SetDeviceIndex;
begin
  fLineX.CurrentDeviceIndex := cbDeviceIndex.ItemIndex;
end;

// DeviceNumber

procedure TfmDevices.GetDeviceNumber;
begin
  try
    SafeSetComboBox(cbDeviceNumber, fLineX.CurrentDeviceNumber-1);
  except

  end;
end;

procedure TfmDevices.SetDeviceNumber;
begin
  fLineX.CurrentDeviceNumber := cbDeviceNumber.ItemIndex+1;
end;

// PortNumber

procedure TfmDevices.GetPortNumber;
var
  Value: Integer;
begin
  try
    Value := fLineX.PortNumber;
    SafeSetComboBox(cboPortNumber,
      cboPortNumber.Items.IndexOfObject(TObject(Value)));
    edtPortNumber.Text := IntToStr(Value);
    udPortNumber.Position := Value;
  except
    on E: Exception do edtPortNumber.Text := E.Message;
  end;
end;

procedure TfmDevices.SetUDPortNumber;
begin
  fLineX.PortNumber := udPortNumber.Position;
end;

procedure TfmDevices.SetEditPortNumber;
begin
  fLineX.PortNumber := StrToIntRus(edtPortNumber.Text);
end;

procedure TfmDevices.SetComboPortNumber;
begin
  with cboPortNumber do
   fLineX.PortNumber := Integer(Items.Objects[ItemIndex]);
end;

// BaudRate

procedure TfmDevices.GetBaudRate;
var
  Value: Integer;
begin
  try
    Value := fLineX.BaudRate;
    SafeSetComboBox(cboBaudRate,
      cboBaudRate.Items.IndexOfObject(TObject(Value)));
    udBaudRate.Position := Value;
    edtBaudRate.Text := IntToStr(Value);
  except
    on E: Exception do edtBaudRate.Text := E.Message;
  end;
end;

procedure TfmDevices.SetUDBaudRate;
begin
  fLineX.BaudRate := udBaudRate.Position;
end;

procedure TfmDevices.SetEditBaudRate;
begin
  fLineX.BaudRate := StrToIntRus(edtBaudRate.Text);
end;

procedure TfmDevices.SetComboBaudRate;
begin
  with cboBaudRate do
   fLineX.BaudRate := Integer(Items.Objects[ItemIndex]);
end;

// Parity

procedure TfmDevices.GetParity;
var
  Value: Integer;
begin
  try
    Value := fLineX.Parity;
    SafeSetComboBox(cboParity,
      cboParity.Items.IndexOfObject(TObject(Value)));
    udParity.Position := Value;
    edtParity.Text := IntToStr(Value);
  except
    on E: Exception do edtParity.Text := E.Message;
  end;
end;

procedure TfmDevices.SetUDParity;
begin
  fLineX.Parity := udParity.Position;
end;

procedure TfmDevices.SetEditParity;
begin
  fLineX.Parity := StrToIntRus(edtParity.Text);
end;

procedure TfmDevices.SetComboParity;
begin
  with cboParity do
   fLineX.Parity := Integer(Items.Objects[ItemIndex]);
end;

// DeviceEnabled

procedure TfmDevices.GetDeviceEnabled;
begin
  SafeSetChecked(chkDeviceEnabled, fLineX.DeviceEnabled);
end;

procedure TfmDevices.SetDeviceEnabled;
begin
  fLineX.DeviceEnabled := chkDeviceEnabled.Checked;
end;

{   }

procedure TfmDevices.EditorKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
  vk_Return:
    (Sender as TEdit).OnExit(Sender);
  end;
end;

procedure TfmDevices.EditorKeyPress(Sender: TObject; var Key: Char);
begin
  if Key in [#13, #27] then
  begin
    Key := #0;
  end
end;

procedure TfmDevices.FormCreate(Sender: TObject);
type
  TComboItem = record
    ItemName: String;
    ItemValue: Integer
  end;

  procedure FillComboBox(ComboBox: TComboBox;
    const ComboItems: array of TComboItem);
  var
    I: Integer;
    cboItem: TComboItem;
  begin
    with ComboBox.Items do
    begin
      BeginUpdate;
      try
        Clear;
        for I := Low(ComboItems) to High(ComboItems) do
        begin
          cboItem := ComboItems[I];
          AddObject(cboItem.ItemName, TObject(cboItem.ItemValue));
        end;
      finally
        EndUpdate;
      end;
    end;
  end;

  procedure FillPortNumber;
  var
    I: Integer;
  begin
    with cboPortNumber.Items do
    begin
      BeginUpdate;
      try
        Clear;
        for I := 1 to 32 do
        begin
          AddObject('COM ' + IntToStr(I), TObject(I));
        end;
      finally
        EndUpdate;
      end;
    end;
  end;

  procedure FillBaudRate;
  const
    BaudRates: array [0..8] of TComboItem =
      (
       (ItemName: '300'; ItemValue: 1),
       (ItemName: '600'; ItemValue: 2),
       (ItemName: '1200'; ItemValue: 3),
       (ItemName: '2400'; ItemValue: 4),
       (ItemName: '4800'; ItemValue: 5),
       (ItemName: '9600'; ItemValue: 7),
       (ItemName: '14400'; ItemValue: 9),
       (ItemName: '19200'; ItemValue: 10),
       (ItemName: '38400'; ItemValue: 12)
       );
  begin
    FillComboBox(cboBaudRate, BaudRates);
  end;

  procedure FillParity;
  const
    Parities: array [0..4] of TComboItem =
      (
       (ItemName: '';        ItemValue: 0),
       (ItemName: ''; ItemValue: 1),
       (ItemName: '';   ItemValue: 2),
       (ItemName: ''; ItemValue: 3),
       (ItemName: '';    ItemValue: 4)
       );
  begin
    FillComboBox(cboParity, Parities);
  end;

begin
  SaveApplicationOnException := Application.OnException;
  Application.OnException := ApplicationException;

  FillPortNumber;
  FillBaudRate;
  FillParity;
end;

// DeviceName

procedure TfmDevices.edtDeviceNameExit(Sender: TObject);
begin
  try
    SetDeviceName;
  finally
    UpdateForm;
  end;
end;

// DeviceIndex

procedure TfmDevices.DeviceIndexClick(Sender: TObject);
begin
  try
    SetDeviceIndex;
  finally
    UpdateForm;
  end;
end;

// DeviceNumber

procedure TfmDevices.DeviceNumberClick(Sender: TObject);
begin
  try
    SetDeviceNumber;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.btnAddClick(Sender: TObject);
begin
  try
    fLineX.AddDevice;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.btnDeleteClick(Sender: TObject);
begin
  try
    fLineX.DeleteDevice;
  finally
    UpdateForm;
  end;
end;

// PortNumber

procedure TfmDevices.cboPortNumberChange(Sender: TObject);
begin
  try
    SetComboPortNumber;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.edtPortNumberExit(Sender: TObject);
begin
  try
    SetEditPortNumber;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.udPortNumberClick(Sender: TObject;
  Button: TUDBtnType);
begin
  try
    SetUDPortNumber;
  finally
    UpdateForm;
  end;
end;

// BaudRate

procedure TfmDevices.cboBaudRateChange(Sender: TObject);
begin
  try
    SetComboBaudRate;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.edtBaudRateExit(Sender: TObject);
begin
  try
    SetEditBaudRate;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.udBaudRateClick(Sender: TObject; Button: TUDBtnType);
begin
  try
    SetUDBaudRate;
  finally
    UpdateForm;
  end;
end;

// Parity

procedure TfmDevices.cboParityChange(Sender: TObject);
begin
  try
    SetComboParity;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.edtParityExit(Sender: TObject);
begin
  try
    SetEditParity;
  finally
    UpdateForm;
  end;
end;

procedure TfmDevices.udParityClick(Sender: TObject; Button: TUDBtnType);
begin
  try
    SetUDParity;
  finally
    UpdateForm;
  end;
end;

// DeviceEnabled

procedure TfmDevices.chkDeviceEnabledClick(Sender: TObject);
begin
  try
    SetDeviceEnabled;
  finally
    UpdateForm;
  end;
end;

{   }

procedure TfmDevices.ApplicationException(Sender: TObject; E: Exception);
begin
  if not(E is EDisplayError) then
    Application.ShowException(E);
end;

procedure TfmDevices.FormDestroy(Sender: TObject);
begin
  Application.OnException := SaveApplicationOnException;
end;

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

end.
