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); } } }
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); } } }
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; };