using System; public class WaterLevelSensor { private int _setPoint; private int _currentLevel; private bool _rising; private Mode _mode = Mode.HighLevelIndicator; public enum Mode { HighLevelIndicator, LowLevelIndicator }; public event WaterLevelEventHandler Full; public event WaterLevelEventHandler Empty; public event WaterLevelEventHandler Fill; public event WaterLevelEventHandler Drain; public int SetPoint { get { return _setPoint; } set { _setPoint = value; } } public int CurrentLevel { get { return _currentLevel; } set { _currentLevel = value; } } public Mode SensorMode { get { return _mode; } set { _mode = value; } } public WaterLevelSensor(int setPoint, int currentLevel){ SetPoint = setPoint; CurrentLevel = currentLevel; } private WaterLevelSensor(){ } public void WaterLevelChange(int amount){ int lastLevel = CurrentLevel; CurrentLevel += amount; _rising = (CurrentLevel >= lastLevel); switch(_mode){ case Mode.HighLevelIndicator : if(_rising){ if(CurrentLevel >= SetPoint){ WaterLevelEventArgs args = new WaterLevelEventArgs(CurrentLevel); OnFull(args); }else{ WaterLevelEventArgs args = new WaterLevelEventArgs(CurrentLevel); OnFill(args); } } break; case Mode.LowLevelIndicator : if(!_rising){ if(CurrentLevel <= SetPoint){ WaterLevelEventArgs args = new WaterLevelEventArgs(CurrentLevel); OnEmpty(args); }else{ WaterLevelEventArgs args = new WaterLevelEventArgs(CurrentLevel); OnDrain(args); } } break; } // end switch } public void OnFull(WaterLevelEventArgs e){ if(Full != null){ Full(e); } } public void OnEmpty(WaterLevelEventArgs e){ if(Empty != null){ Empty(e); } } public void OnFill(WaterLevelEventArgs e){ if(Fill != null){ Fill(e); } } public void OnDrain(WaterLevelEventArgs e){ if(Drain != null){ Drain(e); } } }