#    Copyright 2014-2015 ARM Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


from devlib.module import Module
from devlib.utils.serial_port import open_serial_connection


class MbedFanActiveCoolingModule(Module):

    name = 'mbed-fan'
    timeout = 30

    @staticmethod
    def probe(target):
        return True

    def __init__(self, target, port='/dev/ttyACM0', baud=115200, fan_pin=0):
        super(MbedFanActiveCoolingModule, self).__init__(target)
        self.port = port
        self.baud = baud
        self.fan_pin = fan_pin

    def start(self):
        with open_serial_connection(timeout=self.timeout,
                                    port=self.port,
                                    baudrate=self.baud) as target:
            target.sendline('motor_{}_1'.format(self.fan_pin))

    def stop(self):
        with open_serial_connection(timeout=self.timeout,
                                    port=self.port,
                                    baudrate=self.baud) as target:
            target.sendline('motor_{}_0'.format(self.fan_pin))


class OdroidXU3ctiveCoolingModule(Module):

    name = 'odroidxu3-fan'

    @staticmethod
    def probe(target):
        return target.file_exists('/sys/devices/odroid_fan.15/fan_mode')

    def start(self):
        self.target.write_value('/sys/devices/odroid_fan.15/fan_mode', 0, verify=False)
        self.target.write_value('/sys/devices/odroid_fan.15/pwm_duty', 255, verify=False)

    def stop(self):
        self.target.write_value('/sys/devices/odroid_fan.15/fan_mode', 0, verify=False)
        self.target.write_value('/sys/devices/odroid_fan.15/pwm_duty', 1, verify=False)
