def handler(signum, frame):
    fan = FanUtil()
    logging.debug('INFO:Cause signal %d, set fan speed max.', signum)
    fan.set_fan_duty_cycle(fan.get_idx_fan_start(), DUTY_MAX)
    sys.exit(0)
    def manage_fans(self):
        FAN_LEV1_UP_TEMP = 57500  # temperature
        FAN_LEV1_DOWN_TEMP = 0  # unused
        FAN_LEV1_SPEED_PERC = 100  # percentage*/

        FAN_LEV2_UP_TEMP = 53000
        FAN_LEV2_DOWN_TEMP = 52700
        FAN_LEV2_SPEED_PERC = 80

        FAN_LEV3_UP_TEMP = 49500
        FAN_LEV3_DOWN_TEMP = 47700
        FAN_LEV3_SPEED_PERC = 65

        FAN_LEV4_UP_TEMP = 0  # unused
        FAN_LEV4_DOWN_TEMP = 42700
        FAN_LEV4_SPEED_PERC = 40

        thermal = ThermalUtil()
        fan = FanUtil()

        temp1 = thermal.get_thermal_1_val()
        if temp1 is None:
            return False

        temp2 = thermal.get_thermal_2_val()
        if temp2 is None:
            return False

        new_temp = (temp1 + temp2) / 2

        for x in range(fan.get_idx_fan_start(), fan.get_num_fans() + 1):
            fan_stat = fan.get_fan_status(x)
            if fan_stat is None:
                return False
            if fan_stat is False:
                self._new_perc = FAN_LEV1_SPEED_PERC
                logging.debug(
                    'INFO. SET new_perc to %d (FAN fault. fan_num:%d)',
                    self._new_perc, x)
                break
            logging.debug('INFO. fan_stat is True (fan_num:%d)', x)

        if fan_stat is not None and fan_stat is not False:
            diff = new_temp - self._ori_temp
            if diff == 0:
                logging.debug(
                    'INFO. RETURN. THERMAL temp not changed. %d / %d (new_temp / ori_temp)',
                    new_temp, self._ori_temp)
                return True
            else:
                if diff >= 0:
                    is_up = True
                    logging.debug(
                        'INFO. THERMAL temp UP %d / %d (new_temp / ori_temp)',
                        new_temp, self._ori_temp)
                else:
                    is_up = False
                    logging.debug(
                        'INFO. THERMAL temp DOWN %d / %d (new_temp / ori_temp)',
                        new_temp, self._ori_temp)

            if is_up is True:
                if new_temp >= FAN_LEV1_UP_TEMP:
                    self._new_perc = FAN_LEV1_SPEED_PERC
                elif new_temp >= FAN_LEV2_UP_TEMP:
                    self._new_perc = FAN_LEV2_SPEED_PERC
                elif new_temp >= FAN_LEV3_UP_TEMP:
                    self._new_perc = FAN_LEV3_SPEED_PERC
                else:
                    self._new_perc = FAN_LEV4_SPEED_PERC
                logging.debug(
                    'INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)',
                    self._new_perc, new_temp)
            else:
                if new_temp <= FAN_LEV4_DOWN_TEMP:
                    self._new_perc = FAN_LEV4_SPEED_PERC
                elif new_temp <= FAN_LEV3_DOWN_TEMP:
                    self._new_perc = FAN_LEV3_SPEED_PERC
                elif new_temp <= FAN_LEV2_DOWN_TEMP:
                    self._new_perc = FAN_LEV2_SPEED_PERC
                else:
                    self._new_perc = FAN_LEV1_SPEED_PERC
                logging.debug(
                    'INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)',
                    self._new_perc, new_temp)

        if self._ori_perc == self._new_perc:
            logging.debug(
                'INFO. RETURN. FAN speed not changed. %d / %d (new_perc / ori_perc)',
                self._new_perc, self._ori_perc)
            return True

        set_stat = fan.set_fan_duty_cycle(fan.get_idx_fan_start(),
                                          self._new_perc)
        if set_stat is True:
            logging.debug('INFO: PASS. set_fan_duty_cycle (%d)',
                          self._new_perc)
        else:
            logging.debug('INFO: FAIL. set_fan_duty_cycle (%d)',
                          self._new_perc)

        logging.debug('INFO: GET. ori_perc is %d. ori_temp is %d',
                      self._ori_perc, self._ori_temp)
        self._ori_perc = self._new_perc
        self._ori_temp = new_temp
        logging.debug('INFO: UPDATE. ori_perc to %d. ori_temp to %d',
                      self._ori_perc, self._ori_temp)

        return True
    def manage_fans(self):
        FAN_LEV1_UP_TEMP = 57500  # temperature
        FAN_LEV1_DOWN_TEMP = 0    # unused
        FAN_LEV1_SPEED_PERC = 100 # percentage*/

        FAN_LEV2_UP_TEMP = 53000
        FAN_LEV2_DOWN_TEMP = 52700
        FAN_LEV2_SPEED_PERC = 80

        FAN_LEV3_UP_TEMP = 49500
        FAN_LEV3_DOWN_TEMP = 47700
        FAN_LEV3_SPEED_PERC = 65

        FAN_LEV4_UP_TEMP = 0     # unused
        FAN_LEV4_DOWN_TEMP = 42700
        FAN_LEV4_SPEED_PERC = 40


        thermal = ThermalUtil()
        fan = FanUtil()

        temp1 = thermal.get_thermal_1_val()
        if temp1 is None:
            return False

        temp2 = thermal.get_thermal_2_val()
        if temp2 is None:
            return False

        new_temp = (temp1 + temp2) / 2

        for x in range(fan.get_idx_fan_start(), fan.get_num_fans()+1):
            fan_stat = fan.get_fan_status(x)
            if fan_stat is None:
                return False
            if fan_stat is False:
                self._new_perc = FAN_LEV1_SPEED_PERC
                logging.debug('INFO. SET new_perc to %d (FAN fault. fan_num:%d)', self._new_perc, x)
                break
            logging.debug('INFO. fan_stat is True (fan_num:%d)', x)

        if fan_stat is not None and fan_stat is not False:
            diff = new_temp - self._ori_temp
            if diff  == 0:
                logging.debug('INFO. RETURN. THERMAL temp not changed. %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
                return True
            else:
                if diff >= 0:
                    is_up = True
                    logging.debug('INFO. THERMAL temp UP %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
                else:
                    is_up = False
                    logging.debug('INFO. THERMAL temp DOWN %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)

            if is_up is True:
                if new_temp  >= FAN_LEV1_UP_TEMP:
                    self._new_perc = FAN_LEV1_SPEED_PERC
                elif new_temp  >= FAN_LEV2_UP_TEMP:
                    self._new_perc = FAN_LEV2_SPEED_PERC
                elif new_temp  >= FAN_LEV3_UP_TEMP:
                    self._new_perc = FAN_LEV3_SPEED_PERC
                else:
                    self._new_perc = FAN_LEV4_SPEED_PERC
                logging.debug('INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)
            else:
                if new_temp <= FAN_LEV4_DOWN_TEMP:
                    self._new_perc = FAN_LEV4_SPEED_PERC
                elif new_temp  <= FAN_LEV3_DOWN_TEMP:
                    self._new_perc = FAN_LEV3_SPEED_PERC
                elif new_temp  <= FAN_LEV2_DOWN_TEMP:
                    self._new_perc = FAN_LEV2_SPEED_PERC
                else:
                    self._new_perc = FAN_LEV1_SPEED_PERC
                logging.debug('INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)

        if self._ori_perc == self._new_perc:
            logging.debug('INFO. RETURN. FAN speed not changed. %d / %d (new_perc / ori_perc)', self._new_perc, self._ori_perc)
            return True

        set_stat = fan.set_fan_duty_cycle(fan.get_idx_fan_start(), self._new_perc)
        if set_stat is True:
            logging.debug('INFO: PASS. set_fan_duty_cycle (%d)', self._new_perc)
        else:
            logging.debug('INFO: FAIL. set_fan_duty_cycle (%d)', self._new_perc)

        logging.debug('INFO: GET. ori_perc is %d. ori_temp is %d', self._ori_perc, self._ori_temp)
        self._ori_perc = self._new_perc
        self._ori_temp = new_temp
        logging.debug('INFO: UPDATE. ori_perc to %d. ori_temp to %d', self._ori_perc, self._ori_temp)

        return True