# -*- python -*-
# This example demonstrates how to use adjust backlight
# without interfering to much with manual adjustments.
# The example with oscillate the backlight between 50 %
# and 100 % but include any manual adjustments.
# This file is dual-licensed under GNU General Public License
# version 3 and GNU Free Documentation License version 1.3.
# Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
#
# 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 3 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, see .
# Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
#
# Permission is granted to copy, distribute and/or modify this document
# under the terms of the GNU Free Documentation License, Version 1.3
# or any later version published by the Free Software Foundation;
# with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
# You should have received a copy of the GNU General Public License
# along with this software package. If not, see .
import math
# Get backlight controller.
controller = list_backlights()[0]
controller = Backlight(controller, adjbacklight = True, minimum = 0)
# `adjbacklight = True` requires the `adjbacklight` command/package
# and lets us avoid hassling with permissions.
# `minimum = 0` is optional.
# The users brightness adjustment
user_adjustment = controller.brightness / controller.maximum
# Do not fade in or out, apply settings immediately.
fadein_time, fadeout_time = None, None
# Update the backlight ten times per second.
wait_period = 0.1
cycle, adj, last = 0, 1, controller.brightness
def periodically(year, month, day, hour, minute, second, weekday, fade):
'''
Invoked periodically
If you want to control at what to invoke this function next time
you can set the value of the global variable `wait_period` to the
number of seconds to wait before invoking this function again.
The value does not need to be an integer.
@param year:int The year
@param month:int The month, 1 = January, 12 = December
@param day:int The day, minimum value is 1, probable maximum value is 31 (*)
@param hour:int The hour, minimum value is 0, maximum value is 23
@param minute:int The minute, minimum value is 0, maximum value is 59
@param second:int The second, minimum value is 0, probable maximum value is 60 (**)
@param weekday:int The weekday, 1 = Monday, 7 = Sunday
@param fade:float? Blueshift can use this function to fade into a state when it start
or exits. `fade` can either be negative, zero or positive or `None`,
but the magnitude of value cannot exceed 1. When Blueshift starts,
this function will be invoked multiple with the time parameters
of the time it is invoked and each time `fade` will increase towards
1, starting at 0, when the value is 1, the settings should be applied
to 100 %. After this this function will be invoked once again with
`fade` being `None`. When Blueshift exits the same behaviour is used
except, `fade` decrease towards -1 but start slightly below 0, when
-1 is reached all settings should be normal. Then Blueshift will NOT
invoke this function with `fade` being `None`, instead it will by
itself revert all settings and quit.
(*) Can be exceeded if the calendar system is changed, like in 1712-(02)Feb-30
(**) See https://en.wikipedia.org/wiki/Leap_second
'''
global cycle, adj, last, user_adjustment
if not controller.brightness == last:
user_adjustment = controller.brightness / (controller.maximum * adj)
cycle = (cycle + 0.5) % 1
adj = (1 + math.cos(cycle * 2 * math.pi)) / 2
adj = (1 + adj) / 2
controller.brightness = adj * user_adjustment * controller.maximum
last = controller.brightness
def reset():
'''
Invoked to reset the displays
'''
controller.brightness = round(user_adjustment * controller.maximum)