Example #1
0
void CSlotConnect::ApplyRangeLink2Slot(CSlot & S, COleVariant &V)
  {
  // Apply Range COMING into Link
  if (S.m_Range.m_bValid)
    {
    // Apply Range before going to Link
    if (IsFloatDataVT(V.vt))
      {
      HRESULT hr=VariantChangeType(&V, &V, 0, VT_R8);
      if (FAILED(hr))
        S.SetError(SErr_ApplyRangeLink2Slot, hr, "");
      V.dblVal=(V.dblVal-S.m_Range.m_dMin)/(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    else if (IsSignedDataVT(V.vt))
      {
      HRESULT hr=VariantChangeType(&V, &V, 0, VT_I4);
      if (FAILED(hr))
        S.SetError(SErr_ApplyRangeLink2Slot, hr, "");
      V.lVal=(V.lVal-(long)S.m_Range.m_dMin)/(long)(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    else if (IsUnsignedDataVT(V.vt))
      {
      HRESULT hr=VariantChangeType(&V, &V, 0, VT_UI4);
      if (FAILED(hr))
        S.SetError(SErr_ApplyRangeLink2Slot, hr, "");
      V.ulVal=(V.ulVal-(unsigned long)S.m_Range.m_dMin)/(unsigned long)(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    }
  }
Example #2
0
void CSlotConnect::ApplyRangeSlot2Link(CSlot & S, COleVariant &V)
  {
  if (S.m_Range.m_bValid)
    {
    // Apply Range GOING to Link
    if (IsFloatDataVT(S.Type()))
      {
      V.ChangeType(VT_R8);
      V.dblVal=S.m_Range.m_dMin+V.dblVal*(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    else if (IsSignedDataVT(S.Type()))
      {
      V.ChangeType(VT_I4);
      V.lVal=(long)S.m_Range.m_dMin+V.lVal*(long)(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    else if (IsUnsignedDataVT(S.Type()))
      {
      V.ChangeType(VT_UI4);
      V.ulVal=(unsigned long)S.m_Range.m_dMin+V.ulVal*(unsigned long)(S.m_Range.m_dMax-S.m_Range.m_dMin);
      }
    }
  }
Example #3
0
bool CLink::SetValue(CChangeItem * pRqst)
  {
  ASSERT(pRqst && pRqst->m_lDstInx==m_lLink);


  if (m_State.m_bHold && !pRqst->m_bOverrideHold)
    {
    m_ChgFlags|=IOMChgFlag_Ignored;
    m_lValuesIgnored++;
    return false;
    }

  VARTYPE SlotType=Type();
  m_iLastChgDirn=FullValue().ChangeDirection(*pRqst);
  FullValue()=*pRqst;
  if (pRqst->m_eSrc==eCSD_Simulator)
    {
    COleVariant &V=FullValue().m_vValue;
    CSlotRange & Rng=m_pSlot->m_Range;
    //CSlotSpan & Spn=m_pSlot->m_Span;
    if (IsFloatDataVT(SlotType))
      {
      HRESULT hr=VariantChangeType(&V, &V, 0, VT_R8);
      if (FAILED(hr))
        SetError(SErr_SetValue, hr, "");

      if (!m_bMustSend)
        {
        DWORD TC=GetTickCount();
        double TimeDiff=fabs((double)TC-m_dwLastWriteTick);
        double Tol=0;
        if (Rng.m_bValid)
          {
          Tol=gs_SlotMngr.CalcFloatTolerance(Rng.Range(), TimeDiff);
          }
        else if (!m_bRangeInited)
          {
          m_bRangeInited=true;
          m_dMinValue=V.dblVal;
          m_dMaxValue=V.dblVal;
          Tol=0;
          }
        else 
          {
          m_dMinValue=Min(m_dMinValue, V.dblVal);
          m_dMaxValue=Max(m_dMaxValue, V.dblVal);
          Tol=gs_SlotMngr.CalcFloatTolerance(Max(1.0e-6, m_dMaxValue-m_dMinValue), TimeDiff);
          }
    
        if (fabs(V.dblVal-m_dLastAppliedValue)<Tol)
          {
          m_ChgFlags|=IOMChgFlag_Ignored;
          m_lValuesIgnored++;
          SendDisplayValue();
          return false;
          }
        m_dwLastWriteTick=TC;
        m_dLastAppliedValue=V.dblVal;
        }
      }
    
    HRESULT hr=VariantChangeType(&V, &V, 0, SlotType);
    if (FAILED(hr))
      SetError(SErr_SetValue, hr, "");

    m_bMustSend = false;
    }

//
//  if (VariantsEqual(&m_vValue, &pRqst->m_vValue)
//      && m_wQuality==pRqst->m_wQuality
//      //&& m_ftTimeStamp==pRqst->m_ftTimeStamp
//      )
//    {
//    m_lValuesIgnored++;
//    return false;
//    }

  m_ChgFlags|=IOMChgFlag_Changes|IOMChgFlag_Value|IOMChgFlag_HoldValue;
  m_lValueChanges++;

  m_dwTransactionID=pRqst->m_dwTransactionID;

  ProcessConnects();

  SendDisplayValue();

  return true;
  };