⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adstatlt.pas

📁 测试用例
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    RINGLight  := nil;
    TXDLight   := nil;
    RXDLight   := nil;
    ERRORLight := nil;
    BREAKLight := nil;
  end;

  procedure TLightSet.InitLights(const ComPort : TApdCustomComPort;
                                       Monitoring : Boolean);        
  begin
    if Assigned(FCTSLight) then
      CTSLight.Lit := False;
    if Assigned(FDSRLight) then
      DSRLight.Lit := False;
    if Assigned(FDCDLight) then
      DCDLight.Lit := False;
    if Assigned(FRINGLight) then
      RINGLight.Lit := False;
    if Assigned(FTXDLight) then
      TXDLight.Lit := False;
    if Assigned(FRXDLight) then
      RXDLight.Lit := False;
    if Assigned(FERRORLight) then
      ERRORLight.Lit := False;
    if Assigned(FBREAKLight) then
      BREAKLight.Lit := False;

    if Assigned(ComPort) and Monitoring then begin                   
      if Assigned(FCTSLight) then
        CTSLight.Lit := ComPort.CTS;
      if Assigned(FDSRLight) then
        DSRLight.Lit := ComPort.DSR;
      if Assigned(FDCDLight) then
        DCDLight.Lit := ComPort.DCD;
    end;
  end;

{TSLController}

  function TApdCustomSLController.GetHaveCTSLight : Boolean;
  begin
    GetHaveCTSLight := Assigned(Lights.FCTSLight);
  end;

  function TApdCustomSLController.GetHaveDSRLight : Boolean;
  begin
    GetHaveDSRLight := Assigned(Lights.FDSRLight);
  end;

  function TApdCustomSLController.GetHaveDCDLight : Boolean;
  begin
    GetHaveDCDLight := Assigned(Lights.FDCDLight);
  end;

  function TApdCustomSLController.GetHaveRINGLight : Boolean;
  begin
    GetHaveRINGLight := Assigned(Lights.FRINGLight);
  end;

  function TApdCustomSLController.GetHaveTXDLight : Boolean;
  begin
    GetHaveTXDLight := Assigned(Lights.FTXDLight);
  end;

  function TApdCustomSLController.GetHaveRXDLight : Boolean;
  begin
    GetHaveRXDLight := Assigned(Lights.FRXDLight);
  end;

  function TApdCustomSLController.GetHaveERRORLight : Boolean;
  begin
    GetHaveERRORLight := Assigned(Lights.FERRORLight);
  end;

  function TApdCustomSLController.GetHaveBREAKLight : Boolean;
  begin
    GetHaveBREAKLight := Assigned(Lights.FBREAKLight);
  end;

  procedure TApdCustomSLController.SetComPort(const NewPort : TApdCustomComPort);
  var
    WasMonitoring : Boolean;

  begin
    if (NewPort = FComPort) then
      Exit;

    if Assigned(FComPort) then
      FComPort.DeregisterUserCallback(StatPortClose);

    WasMonitoring := Monitoring;
    Monitoring    := False;
    FComPort      := NewPort;
    Monitoring    := WasMonitoring;

    if Assigned(FComPort) then
      FComPort.RegisterUserCallback(StatPortClose);
  end;

  procedure TApdCustomSLController.SetLights(const NewLights : TLightSet);
  begin
    FLights := NewLights;
  end;

  procedure TApdCustomSLController.SetMonitoring(const NewMon : Boolean);
  begin
    if (csDesigning in ComponentState) or
      (csLoading in ComponentState) or
      (FMonitoring = NewMon) then
      Exit;

    if not Assigned(FComPort) then
      raise EPortNotAssigned.Create(ecPortNotAssigned, False);

    if not ComPort.Open then begin
      MonitoringPending := NewMon;
      if MonitoringPending then
        Exit;                                                         
    end;

    FMonitoring := NewMon;

    if FMonitoring then begin
      SaveTriggerAvail        := ComPort.OnTriggerAvail;
      SaveTriggerStatus       := ComPort.OnTriggerStatus;
      SaveTriggerTimer        := ComPort.OnTriggerTimer;
      ComPort.OnTriggerAvail  := StatTriggerAvail;
      ComPort.OnTriggerStatus := StatTriggerStatus;
      ComPort.OnTriggerTimer  := StatTriggerTimer;

      AddTriggers;
      InitLights;
    end else begin
      ComPort.OnTriggerAvail  := SaveTriggerAvail;
      ComPort.OnTriggerStatus := SaveTriggerStatus;
      ComPort.OnTriggerTimer  := SaveTriggerTimer;

      RemoveTriggers;
      InitLights;                                                  
    end;
  end;

  procedure TApdCustomSLController.Notification(AComponent : TComponent; Operation: TOperation);
  begin
    inherited Notification(AComponent, Operation);

    if (Operation = opRemove) then begin
      if (AComponent = FComPort) then begin
        Monitoring := False;
        ComPort    := nil;
      end else if (AComponent = Lights.CTSLight) then
        Lights.CTSLight := nil
      else if (AComponent = Lights.DSRLight) then
        Lights.DSRLight := nil
      else if (AComponent = Lights.DCDLight) then
        Lights.DCDLight := nil
      else if (AComponent = Lights.RINGLight) then
        Lights.RINGLight := nil
      else if (AComponent = Lights.TXDLight) then
        Lights.TXDLight := nil
      else if (AComponent = Lights.RXDLight) then
        Lights.RXDLight := nil
      else if (AComponent = Lights.ERRORLight) then
        Lights.ERRORLight := nil
      else if (AComponent = Lights.BREAKLight) then
        Lights.BREAKLight := nil;
    end else if (Operation = opInsert) then
      if not Assigned(FComPort) and (AComponent is TApdCustomComPort) then
        ComPort := TApdCustomComPort(AComponent);
  end;

  procedure TApdCustomSLController.Loaded;
  begin
    inherited Loaded;

    if Assigned(FComPort) then
      FComPort.RegisterUserCallback(StatPortClose);
  end;

  procedure TApdCustomSLController.InitTriggers;
    {-Set trigger handles to their default values}
  begin
    {default trigger handles}
    ModemStatMask := 0;
    MSTrig        := 0;
    ErrorOnTrig   := 0;
    BreakOnTrig   := 0;
    ErrorOffTrig  := 0;
    BreakOffTrig  := 0;
    RxdOffTrig    := 0;
    TxdOnTrig     := 0;
    TxdOffTrig    := 0;
    RingOffTrig   := 0;
  end;

  procedure TApdCustomSLController.AddTriggers;
    {-Add triggers to com port}
  begin
    InitTriggers;

    if Assigned(FComPort) then begin
      try
        if HaveCTSLight or HaveDSRLight or HaveDCDLight or HaveRingLight then begin
          MSTrig := ComPort.AddStatusTrigger(stModem);
          if HaveRingLight then
            RingOffTrig := ComPort.AddTimerTrigger;
        end;

        if HaveErrorLight then begin
          ErrorOnTrig  := ComPort.AddStatusTrigger(stLine);
          ErrorOffTrig := ComPort.AddTimerTrigger;
        end;

        if HaveBreakLight then begin
          BreakOnTrig  := ComPort.AddStatusTrigger(stLine);
          BreakOffTrig := ComPort.AddTimerTrigger;
        end;

        if HaveRXDLight then
          RXDOffTrig := ComPort.AddTimerTrigger;

        if HaveTXDLight then begin
          TXDOnTrig   := ComPort.AddStatusTrigger(stOutSent);
          TXDOffTrig := ComPort.AddTimerTrigger;
        end;

        ModemStatMask := 0;
        if HaveCTSLight then
          ModemStatMask := ModemStatMask or msCTSDelta;
        if HaveDSRLight then
          ModemStatMask := ModemStatMask or msDSRDelta;
        if HaveDCDLight then
          ModemStatMask := ModemStatMask or msDCDDelta;
        if HaveRINGLight then
          ModemStatMask := ModemStatMask or msRINGDelta;

        if HaveCTSLight or HaveDSRLight or HaveDCDLight or HaveRINGLight then
          ComPort.SetStatusTrigger(MSTrig, ModemStatMask, True);

        if HaveERRORLight then
          ComPort.SetStatusTrigger(ErrorOnTrig, lsOverrun or lsParity or lsFraming, True);
        if HaveBreakLight then
          ComPort.SetStatusTrigger(BreakOnTrig, lsBreak, True);
        if HaveTXDLight then
          ComPort.SetStatusTrigger(TXDOnTrig, 0, True);

      except
        ModemStatMask := 0;
        RemoveTriggers;
        raise;
      end;
    end;
  end;

  procedure TApdCustomSLController.RemoveTriggers;
    {-Remove triggers from com port}
  begin
    if Assigned(FComPort) then begin
      try
        if HaveCTSLight or HaveDSRLight or HaveDCDLight or HaveRingLight then begin
          ComPort.RemoveTrigger(MSTrig);
          if HaveRingLight then
            ComPort.RemoveTrigger(RingOffTrig);
        end;

        if HaveErrorLight then begin
          ComPort.RemoveTrigger(ErrorOnTrig);
          ComPort.RemoveTrigger(ErrorOffTrig);
        end;

        if HaveBreakLight then begin
          ComPort.RemoveTrigger(BreakOnTrig);
          ComPort.RemoveTrigger(BreakOffTrig);
        end;

        if HaveRXDLight then
          ComPort.RemoveTrigger(RXDOffTrig);

        if HaveTXDLight then begin
          ComPort.RemoveTrigger(TXDOnTrig);
          ComPort.RemoveTrigger(TXDOffTrig);
        end;

      finally
        InitTriggers;
      end;
    end;
  end;

  procedure TApdCustomSLController.InitLights;
    {-Initialize the default statuses of various modem lights}
  begin
    Lights.InitLights(FComPort, Monitoring);
  end;

  procedure TApdCustomSLController.CheckLight(const CurStat : Boolean; const Light : TApdCustomStatusLight);
    {-See if a light has changed and update it if so}
  begin
    if CurStat <> Light.Lit then
      Light.Lit := CurStat;
  end;

  procedure TApdCustomSLController.StatTriggerAvail(CP : TObject; Count : Word);
  begin
    if Assigned(FComPort) then begin
      if HaveRXDLight and not Lights.RXDLight.Lit then begin
        Lights.RXDLight.Lit := True;
        ComPort.SetTimerTrigger(RXDOffTrig, RXDOffTimeout, True);
      end;

      if Assigned(SaveTriggerAvail) then
        SaveTriggerAvail(CP, Count);
    end;
  end;

  procedure TApdCustomSLController.StatTriggerStatus(CP : TObject; TriggerHandle : Word);
  begin
    if Assigned(FComPort) then begin
      if (TriggerHandle = MSTrig) then begin
        if HaveDCDLight then
          CheckLight(ComPort.DCD, Lights.DCDLight);
        if HaveCTSLight then
          CheckLight(ComPort.CTS, Lights.CTSLight);
        if HaveDSRLight then
          CheckLight(ComPort.DSR, Lights.DSRLight);

        if HaveRingLight then
          if ComPort.DeltaRI and not Lights.RINGLight.Lit then begin
            Lights.RINGLight.Lit := True;
            ComPort.SetTimerTrigger(RingOffTrig, RingOffTimeout, True);
          end;

        ComPort.SetStatusTrigger(MSTrig, ModemStatMask, True);
      end else if (TriggerHandle = ErrorOnTrig) then begin
        Lights.ErrorLight.Lit := True;
        ComPort.SetTimerTrigger(ErrorOffTrig, ErrorOffTimeout, True);
        if (ComPort.LineError <> 0) then ;
      end else if (TriggerHandle = BreakOnTrig) then begin
        Lights.BreakLight.Lit := True;
        ComPort.SetTimerTrigger(BreakOffTrig, BreakOffTimeout, True);
        if ComPort.LineBreak then ;
      end else if (TriggerHandle = TXDOnTrig) then begin
        Lights.TXDLight.Lit := True;
        ComPort.SetTimerTrigger(TXDOffTrig, TXDOffTimeout, True);
      end;

      if Assigned(SaveTriggerStatus) then
        SaveTriggerStatus(CP, TriggerHandle);
    end;
  end;

  procedure TApdCustomSLController.StatTriggerTimer(CP : TObject; TriggerHandle : Word);
  begin
    if Assigned(FComport) then begin
      if (TriggerHandle = ErrorOffTrig) then begin
        Lights.ErrorLight.Lit := False;
        ComPort.SetStatusTrigger(ErrorOnTrig, lsOverrun or lsParity or lsFraming, True);
      end else if (TriggerHandle = BreakOffTrig) then begin
        Lights.BreakLight.Lit := False;
        ComPort.SetStatusTrigger(BreakOnTrig, lsBreak, True);
      end else if (TriggerHandle = RXDOffTrig) then
        if (ComPort.InBuffUsed = 0) then
          Lights.RXDLight.Lit := False
        else
          ComPort.SetTimerTrigger(RXDOffTrig, RXDOffTimeout, True)
      else if (TriggerHandle = TXDOffTrig) then
        if (ComPort.OutBuffUsed = 0) then begin
          Lights.TXDLight.Lit := False;
          ComPort.SetStatusTrigger(TXDOnTrig, 0, True);
        end else
          ComPort.SetTimerTrigger(TXDOffTrig, TXDOffTimeout, True)
      else if (TriggerHandle = RingOffTrig) then
        Lights.RINGLight.Lit := False;

      if Assigned(SaveTriggerTimer) then
        SaveTriggerTimer(CP, TriggerHandle);
    end;
  end;

  procedure TApdCustomSLController.StatPortClose(CP : TObject; Opening : Boolean);
  begin
    if (csDesigning in ComponentState) then
      Exit;

    if Opening then begin
      if MonitoringPending then begin
        MonitoringPending := False;
        Monitoring        := True;
      end;
    end else begin
      MonitoringPending := Monitoring;
      Monitoring := False;
    end;
  end;

  constructor TApdCustomSLController.Create(AOwner : TComponent);
  var
    I : Cardinal;
  begin
    inherited Create(AOwner);

    FMonitoring       := False;
    MonitoringPending := False;

    {search our owner for a com port}
    if Assigned(AOwner) and (AOwner.ComponentCount > 0) then
      for I := 0 to Pred(AOwner.ComponentCount) do
        if AOwner.Components[I] is TApdCustomComPort then begin
          FComPort := TApdCustomComPort(AOwner.Components[I]);
          Break;
        end;

    {set default timeouts}
    FErrorOffTimeout := adsDefErrorOffTimeout;
    FBreakOffTimeout := adsDefBreakOffTimeout;
    FRXDOffTimeout   := adsDefRXDOffTimeout;
    FTXDOffTimeout   := adsDefTXDOffTimeout;
    FRingOffTimeout  := adsDefRingOffTimeout;

    {set lights}
    FLights := TLightSet.Create;

    {set saved event handlers}
    SaveTriggerAvail  := nil;
    SaveTriggerStatus := nil;
    SaveTriggerTimer  := nil;

    InitTriggers;
  end;

  destructor TApdCustomSLController.Destroy;
  begin
    Monitoring := False;
    FLights.Free;

    inherited Destroy;
  end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -