unit SP4TEu;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,EPICSTypes, Vcl.StdCtrls, Vcl.ExtCtrls,
  System.ImageList, Vcl.ImgList;

type
  TFSP4TE = class(TForm)
    LabModel: TLabel;
    Timer1: TTimer;
    LabSN: TLabel;
    LabFarm: TLabel;
    BtnOFF: TButton;
    ImageList1: TImageList;
    BtnDR1: TButton;
    BtnDR2: TButton;
    BtnDR3: TButton;
    BtnDR4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BtnOFFClick(Sender: TObject);
    procedure BtnDR1Click(Sender: TObject);
    procedure BtnDR2Click(Sender: TObject);
    procedure BtnDR3Click(Sender: TObject);
    procedure BtnDR4Click(Sender: TObject);
  private
    { Private 錾 }
  public
    { Public 錾 }
  end;

var
  FSP4TE: TFSP4TE;

implementation
uses CA_iN;

{$R *.dfm}

var
  fbd_rsa_sw_set_ptr, fbd_rsa_sw_get_ptr : integer;
  fbd_rsa_sn_get_ptr, fbd_rsa_model_get_ptr, fbd_rsa_firmware_get_ptr : integer;

  pvs : pv;
  eventMask: longint;
  monitor_flag : boolean;

  pCaCh : Pointer;
  pPvs : Pointer;
  iPriority : integer;
  dCaTimeout : double;
  callselect : ca_preemptive_callback_select;
  ch_event : integer;

procedure event_handler(args : event_handler_args) cdecl;
begin
  ch_event := integer(args.dbr^);
  monitor_flag := true;

end;


procedure connection_handler(args : connection_handler_args) cdecl;
var
 rtn : integer;
begin
  rtn := 0;
  if args.op = CA_OP_CONN_UP then
    begin
     pvs.chid.chid := args.chid.chid;
     pvs.onceConnected := AnsiChar(1);
     pvs.dbfType := ca_field_type(pvs.chid.chid);
     pvs.dbrType := ca_field_type(pvs.chid.chid);
     pvs.nElems := ca_element_count(pvs.chid.chid);
     eventMask := DBE_VALUE;
     rtn := ca_create_subscription(pvs.dbrType, pvs.nElems,pvs.chid.chid, eventMask, @event_handler, @pvs, nil);

    end;
end;



procedure TFSP4TE.BtnDR1Click(Sender: TObject);
var i : integer;
begin
   i := 1;
   ca_put_lo(fbd_rsa_sw_set_ptr,i);
end;

procedure TFSP4TE.BtnDR2Click(Sender: TObject);
var i : integer;
begin
   i := 2;
   ca_put_lo(fbd_rsa_sw_set_ptr,i);
end;

procedure TFSP4TE.BtnDR3Click(Sender: TObject);
var i : integer;
begin
    i := 3;
    ca_put_lo(fbd_rsa_sw_set_ptr,i);
end;

procedure TFSP4TE.BtnDR4Click(Sender: TObject);
var i : integer;
begin
  i := 4;
  ca_put_lo(fbd_rsa_sw_set_ptr,i);
end;

procedure TFSP4TE.BtnOFFClick(Sender: TObject);
var i : integer;
begin
   i := 0;
   ca_put_lo(fbd_rsa_sw_set_ptr,i);

end;

procedure TFSP4TE.FormCreate(Sender: TObject);
var i ,itrc : integer;
    rtn : integer;
    s : PAnsiChar;
    s2 : AnsiString;
    select : integer;
begin
    i := 1;
    rtn := ca_context_create(i);
    s := 'FBD:RSA:SW:SET';
    fbd_rsa_sw_set_ptr := ca_connect(s);
    {s := 'FBD:RSA:SW:GET';
    fbd_rsa_sw_get_ptr := ca_connect(s);   }
    s := 'FBD:RSA:SN:GET';
    fbd_rsa_sn_get_ptr := ca_connect(s);
    s := 'FBD:RSA:MODEL:GET';
    fbd_rsa_model_get_ptr := ca_connect(s);
    s := 'FBD:RSA:FIRMWARE:GET';
    fbd_rsa_firmware_get_ptr := ca_connect(s);

    s2 := get_string(fbd_rsa_model_get_ptr);
    LabModel.Caption := s2;

    s2 := get_string(fbd_rsa_sn_get_ptr);
    LabSN.Caption := 'SN'+s2;
    s2 := get_string(fbd_rsa_firmware_get_ptr);
    LabFarm.Caption := 'FW '+s2;


    rtn := ca_context_create(i);
    s := 'FBD:RSA:SW:GET';
    callselect := ca_preemptive_callback_select.ca_enable_preemptive_callback;
    select := integer(callselect);

    rtn := contextcreate(select);
    pvs.name := Pansichar(s);
    pCaCh := @connection_handler;
    pPvs := @pvs;
    iPriority := CA_PRIORITY_DEFAULT;
    fbd_rsa_sw_get_ptr := connect(pvs,pCaCh, pPvs, iPriority);
    rtn := ca_pend_event(1.0);




end;

procedure TFSP4TE.Timer1Timer(Sender: TObject);
var rtn : integer;
    i : integer;
begin

   if monitor_flag then
   begin
   timer1.Enabled := false;
   {i := ca_get_li(fbd_rsa_sw_get_ptr); }
   i:= ch_event;
   case i of
     0 : begin
           btndr1.ImageIndex := 1;
           btndr2.ImageIndex := 1;
           btndr3.ImageIndex := 1;
           btndr4.ImageIndex := 1;
         end;
     1 : begin
           btndr1.ImageIndex := 0;
           btndr2.ImageIndex := 1;
           btndr3.ImageIndex := 1;
           btndr4.ImageIndex := 1;
         end;
     2 : begin
           btndr1.ImageIndex := 1;
           btndr2.ImageIndex := 0;
           btndr3.ImageIndex := 1;
           btndr4.ImageIndex := 1;
         end;
     3 : begin
           btndr1.ImageIndex := 1;
           btndr2.ImageIndex := 1;
           btndr3.ImageIndex := 0;
           btndr4.ImageIndex := 1;
         end;
     4 : begin
           btndr1.ImageIndex := 1;
           btndr2.ImageIndex := 1;
           btndr3.ImageIndex := 1;
           btndr4.ImageIndex := 0;
         end;
   end;
  timer1.Enabled := true;
  monitor_flag := false;
  end;
end;

end.