
-- module defines Hystersis class, that handles below functionality
--
--                             threshold
--                                 |                                ^
--                                 V                                |
--                              +--*--+-<-->-- <- valueAfter        |
--                              |     |                             |
--                              |     |                             |
--                              v     ^                             |
--                              |     |                             | outputValue
--                              |     |                             |
--                              |     |                             |
-- valueBefore -> ---<-->-------+--*--+                             |
--                              ^     ^                             |
--                              |     |                             |
--                              |width|                             |
--
-- ----------------------------------------------------------------->
--                                inputValue


-- class definition
Hysteresis = {};

Hysteresis.__index = Hysteresis;

-- constructor
function Hysteresis.create(threshold, valueBefore, valueAfter, width, outputValue)

  local hyst = {};                  -- our new object
  setmetatable(hyst, Hysteresis);    -- make Hysteresis handle lookup

  -- initialize our object
  hyst.threshold = threshold;
  hyst.valueBefore = valueBefore;
  hyst.valueAfter = valueAfter;
  hyst.width = width;
  hyst.outputValue = outputValue;

  return hyst;

  end


-- function updates parameters
-- should be called if below parameters can change
function Hysteresis:updateParameters(threshold, valueBefore, valueAfter, width)

  self.threshold = threshold;
  self.valueBefore = valueBefore;
  self.valueAfter = valueAfter;
  self.width = width;

end

--returns output values on the basis of hysteresis parameters and input value
function Hysteresis:getOutputValue(inputValue)

  if inputValue >= (self.threshold + (self.width / 2)) then
    self.outputValue = self.valueAfter;
  elseif inputValue <= (self.threshold - (self.width / 2)) then
    self.outputValue = self.valueBefore;
  end

  return self.outputValue;

end


