# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Module authors:
#   Markus Zolliker <markus.zolliker@psi.ch>
#
# *****************************************************************************


from frappy.core import Writable, BoolType, FloatRange, HasIO, Property, StringType, Parameter
from frappy_psi.logo import Sensor


class Heater(Sensor):
    addr = 'VW10'  # heater readback address
    scale = 0.1
    switch_addr = Property('address for switch', StringType(), default='V0.1')
    enable_addr = Property('address for enable', StringType(), default='V0.0')
    maxheater_addr = Property('address for target', StringType(), default='VW10')
    value = Parameter(unit='%')
    switch = Parameter('heater is enabled', BoolType())
    enable = Parameter('heater enabled', BoolType(), readonly=False)
    maxheater = Parameter('max. heater power', FloatRange(unit='%'), readonly=False)

    def read_switch(self):
        return self.get_vm_value(self.switch_addr)

    def read_enable(self):
        return self.get_vm_value(self.enable_addr)

    def write_enable(self, value):
        self.set_vm_value(self.enable_addr, value)
        return self.read_enable()

    def read_maxheater(self):
        return self.get_vm_value(self.maxheater_addr, self.scale)

    def write_maxheater(self, value):
        self.io.set_vm_value(self.maxheater_addr, value, self.scale)
        return self.read_maxheater()
