// #pragma once #include #include #include //----------------------------------------------------------------------------- // TmplMould //----------------------------------------------------------------------------- namespace DIOS::Dev::Detail { template class TmplMould { public: TmplMould (T init, T min, T max, T accuracy) { m_Value = init; m_LimitMin = min; m_LimitMax = max; m_Accuracy = accuracy; assert (m_LimitMin < m_LimitMax); } public: bool CanInc () const; // 能加 1 吗 bool CanDec () const; // 能减 1 吗 bool Verify (T value) const; // 值在界限内吗 bool Inc (); // 加 1 bool Dec (); // 减 1 bool Update (T value); // 更新为指定值 bool UpdateLimitMax(T value); // 更新为指定值 bool UpdateLimitMin(T value); // 更新为指定值 T Get () const; // 获得当前值 T GetLimitMax() const; T GetLimitMin() const; bool ToNext (const std::vector & ar); bool ToPrev (const std::vector & ar); bool ToUpdate (T value, const std::vector & ar); //change by wxx for 万东:丰富基类方法(要求ar按从小到大排列) 20230803 bool CanToNext(T & value, const std::vector & ar); bool CanToPrev(T & value, const std::vector & ar); bool CanToUpdate(T & value, const std::vector & ar); protected: T m_LimitMin; T m_LimitMax; T m_Accuracy; T m_Value; }; template class TmplMouldWithWarn : public TmplMould { protected: T m_WarningMin; T m_WarningMax; T m_CalibWarningMin; T m_CalibWarningMax; T m_ErrorMin; T m_ErrorMax; public: std::function m_OnWarningMin; std::function m_OnWarningMax; std::function m_OnCalibWarningMin; std::function m_OnCalibWarningMax; std::function m_OnErrorMin; std::function m_OnErrorMax; public: using super = TmplMould; TmplMouldWithWarn(T init, T min, T WarnMin, T WarnMax, T CalibWarnMin, T CalibWarnMax, T max, T accuracy) :super(init, min, max, accuracy) { m_WarningMin = WarnMin; m_WarningMax = WarnMax; m_CalibWarningMin = CalibWarnMin; m_CalibWarningMax = CalibWarnMax; m_ErrorMin = min; m_ErrorMax = max; assert(m_CalibWarningMin < m_CalibWarningMax); assert(m_ErrorMin < m_ErrorMax); assert(m_ErrorMin < m_ErrorMax); } }; }