Fading now works
This commit is contained in:
parent
2e2103ffde
commit
f754f6422c
2
TODO
2
TODO
@ -2,5 +2,5 @@
|
|||||||
#List devices
|
#List devices
|
||||||
#Query backlight percentage (get)
|
#Query backlight percentage (get)
|
||||||
xbacklight compat option (-get/-set/-inc/-dec/-help/-time/-steps)
|
xbacklight compat option (-get/-set/-inc/-dec/-help/-time/-steps)
|
||||||
allow fade in and fade out
|
#allow fade in and fade out
|
||||||
a lot of cleanup
|
a lot of cleanup
|
||||||
|
|||||||
@ -48,6 +48,8 @@ struct arg_values{
|
|||||||
//How many seconds to transition
|
//How many seconds to transition
|
||||||
int fade_duration;
|
int fade_duration;
|
||||||
|
|
||||||
|
int fade_steps;
|
||||||
|
|
||||||
unsigned char operation;
|
unsigned char operation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
4
makefile
4
makefile
@ -55,9 +55,9 @@ $(foreach dir,$(SOURCE_DIRS),$(eval $(call GENERATE_OBJECTS,$(dir))))
|
|||||||
$(OBJECTS): | $(OBJDIR) $(DEPDIR)
|
$(OBJECTS): | $(OBJDIR) $(DEPDIR)
|
||||||
|
|
||||||
$(OBJDIR):
|
$(OBJDIR):
|
||||||
mkdir "$@"
|
mkdir -p "$@"
|
||||||
$(DEPDIR):
|
$(DEPDIR):
|
||||||
mkdir "$@"
|
mkdir -p "$@"
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
36
src/cmd.c
36
src/cmd.c
@ -27,6 +27,8 @@
|
|||||||
#define GET_SHORT_OPT "-g"
|
#define GET_SHORT_OPT "-g"
|
||||||
#define FADE_LONG_OPT "--fade"
|
#define FADE_LONG_OPT "--fade"
|
||||||
#define FADE_SHORT_OPT "-f"
|
#define FADE_SHORT_OPT "-f"
|
||||||
|
#define STEPS_LONG_OPT "--steps"
|
||||||
|
#define STEPS_SHORT_OPT "-s"
|
||||||
#define DEVICE_LONG_OPT "--device"
|
#define DEVICE_LONG_OPT "--device"
|
||||||
#define DEVICE_SHORT_OPT "-d"
|
#define DEVICE_SHORT_OPT "-d"
|
||||||
#define LIST_LONG_OPT "--list"
|
#define LIST_LONG_OPT "--list"
|
||||||
@ -39,7 +41,8 @@
|
|||||||
|
|
||||||
struct cmd_arg rexbacklight_args[] = {
|
struct cmd_arg rexbacklight_args[] = {
|
||||||
{DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"},
|
{DEVICE_LONG_OPT, DEVICE_SHORT_OPT, "select which device to control"},
|
||||||
{FADE_LONG_OPT, FADE_SHORT_OPT, "TODO: change brightness over time interval"},
|
{FADE_LONG_OPT, FADE_SHORT_OPT, "change brightness over time interval"},
|
||||||
|
{STEPS_LONG_OPT, STEPS_SHORT_OPT, "number of steps over which to fade"},
|
||||||
{GET_LONG_OPT, GET_SHORT_OPT, "print current brightness level to stdout"},
|
{GET_LONG_OPT, GET_SHORT_OPT, "print current brightness level to stdout"},
|
||||||
{LIST_LONG_OPT, LIST_SHORT_OPT, "print device names to stdout and exit"},
|
{LIST_LONG_OPT, LIST_SHORT_OPT, "print device names to stdout and exit"},
|
||||||
{HELP_LONG_OPT, HELP_SHORT_OPT, "print this help message and exit"}
|
{HELP_LONG_OPT, HELP_SHORT_OPT, "print this help message and exit"}
|
||||||
@ -54,24 +57,28 @@ void free_cmd_args(struct arg_values* a){
|
|||||||
free(a->next);
|
free(a->next);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHECK_NEXT_ARG(rval) \
|
#define CHECK_NEXT_ARG() \
|
||||||
do{ \
|
do{ \
|
||||||
if(i == argc - 1){ \
|
if(i == argc - 1){ \
|
||||||
fprintf(stderr, "Missing argument to '%s'\n\n", argv[i]); \
|
fprintf(stderr, "Missing argument to '%s'\n\n", argv[i]); \
|
||||||
free_cmd_args(&ret); \
|
free_cmd_args(&ret); \
|
||||||
usage(rval); \
|
usage(RETVAL_MISSING_OPTION); \
|
||||||
} \
|
} \
|
||||||
}while(0)
|
}while(0)
|
||||||
#define UNRECOGNIZED_OPTION(rval) \
|
#define UNRECOGNIZED_OPTION() \
|
||||||
do{ \
|
do{ \
|
||||||
fprintf(stderr, "Unrecognized command line option '%s'\n\n", argv[i]); \
|
fprintf(stderr, "Unrecognized command line option '%s'\n\n", argv[i]); \
|
||||||
free_cmd_args(&ret); \
|
free_cmd_args(&ret); \
|
||||||
usage(rval); \
|
usage(RETVAL_UNRECOGNIZED_OPTION); \
|
||||||
}while(0);
|
}while(0);
|
||||||
|
|
||||||
|
struct arg_values init_arg_values(void){
|
||||||
|
return (struct arg_values){.next = NULL, .device = NULL, .delta = 0, .fade_duration = 0, .fade_steps = 20, .operation = 0};
|
||||||
|
}
|
||||||
|
|
||||||
//Convert command line arguments to flags
|
//Convert command line arguments to flags
|
||||||
struct arg_values process_cmd_args(int argc, char** argv){
|
struct arg_values process_cmd_args(int argc, char** argv){
|
||||||
struct arg_values ret = {0};
|
struct arg_values ret = init_arg_values();
|
||||||
struct arg_values* curr = &ret;
|
struct arg_values* curr = &ret;
|
||||||
|
|
||||||
//Skip argv[0]
|
//Skip argv[0]
|
||||||
@ -83,14 +90,21 @@ struct arg_values process_cmd_args(int argc, char** argv){
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
}else if(CHECK_OPTION(FADE, argv[i])){
|
}else if(CHECK_OPTION(FADE, argv[i])){
|
||||||
CHECK_NEXT_ARG(-5);
|
CHECK_NEXT_ARG();
|
||||||
curr->fade_duration = strtol(argv[++i], NULL, 0);
|
curr->fade_duration = strtol(argv[++i], NULL, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if(CHECK_OPTION(STEPS, argv[i])){
|
||||||
|
CHECK_NEXT_ARG();
|
||||||
|
curr->fade_steps = strtol(argv[++i], NULL, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
else if(CHECK_OPTION(DEVICE, argv[i])){
|
else if(CHECK_OPTION(DEVICE, argv[i])){
|
||||||
CHECK_NEXT_ARG(-5);
|
CHECK_NEXT_ARG();
|
||||||
curr->next = calloc(1, sizeof(struct arg_values));
|
curr->next = malloc(sizeof(struct arg_values));
|
||||||
|
*(curr->next) = init_arg_values();
|
||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
curr->device = argv[++i];
|
curr->device = argv[++i];
|
||||||
continue;
|
continue;
|
||||||
@ -130,7 +144,7 @@ struct arg_values process_cmd_args(int argc, char** argv){
|
|||||||
else if(argv[i][0] == '-'){
|
else if(argv[i][0] == '-'){
|
||||||
//If we get a '-' followed by not a number, it's not a known option
|
//If we get a '-' followed by not a number, it's not a known option
|
||||||
if(argv[i][1] < '0' || argv[i][1] > '9'){
|
if(argv[i][1] < '0' || argv[i][1] > '9'){
|
||||||
UNRECOGNIZED_OPTION(RETVAL_UNRECOGNIZED_OPTION);
|
UNRECOGNIZED_OPTION();
|
||||||
|
|
||||||
//If we get a '-' followed by a number, it's a decrement request
|
//If we get a '-' followed by a number, it's a decrement request
|
||||||
}else{
|
}else{
|
||||||
@ -144,7 +158,7 @@ struct arg_values process_cmd_args(int argc, char** argv){
|
|||||||
if(argv[i][j] == '\0')
|
if(argv[i][j] == '\0')
|
||||||
break;
|
break;
|
||||||
if(argv[i][j] < '0' || argv[i][j] > '9')
|
if(argv[i][j] < '0' || argv[i][j] > '9')
|
||||||
UNRECOGNIZED_OPTION(RETVAL_UNRECOGNIZED_OPTION);
|
UNRECOGNIZED_OPTION();
|
||||||
}
|
}
|
||||||
curr->operation = OP_SET;
|
curr->operation = OP_SET;
|
||||||
curr->delta = atof(argv[i]);
|
curr->delta = atof(argv[i]);
|
||||||
|
|||||||
@ -15,11 +15,14 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
@ -116,16 +119,53 @@ float get_brightness(const char* file){
|
|||||||
return atof(buff);
|
return atof(buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//update brightness incrementally over requested millisecond time interval
|
||||||
|
void fade_out(int iv, int fv, int ms_duration, int steps){
|
||||||
|
FILE* fd;
|
||||||
|
struct timeval start, end;
|
||||||
|
double tdelta = 0; //amount of time that has passed
|
||||||
|
float value = iv; //current value to write to file
|
||||||
|
int step_delta = ms_duration / steps;
|
||||||
|
int step_inc = step_delta;
|
||||||
|
float brdelta = (float)(fv - iv) / steps; //amount brightness needs to change overall
|
||||||
|
|
||||||
|
while(ms_duration > tdelta){
|
||||||
|
//write
|
||||||
|
gettimeofday(&start, NULL);
|
||||||
|
fd = fopen(backlight_file, "w+");
|
||||||
|
if(!fd){
|
||||||
|
io_error_2(IO_ERROR_OPEN, IO_ERROR_FILE, backlight_dir, backlight_file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fprintf(fd, "%d", (int)value);
|
||||||
|
fclose(fd);
|
||||||
|
gettimeofday(&end, NULL);
|
||||||
|
|
||||||
|
//calc time delta
|
||||||
|
tdelta += (((end.tv_sec * 1000.0) + (end.tv_usec / 1000.0)) - ((start.tv_sec * 1000.0) + (start.tv_usec / 1000.0)));
|
||||||
|
|
||||||
|
//calc next value to write
|
||||||
|
value += brdelta;
|
||||||
|
|
||||||
|
//waste excess time until next step
|
||||||
|
if(step_delta > tdelta){
|
||||||
|
usleep((step_delta - tdelta) * 1000);
|
||||||
|
tdelta = step_delta;
|
||||||
|
}
|
||||||
|
//calc end of next step
|
||||||
|
step_delta += step_inc;
|
||||||
|
}
|
||||||
|
fd = fopen(backlight_file, "w+");
|
||||||
|
fprintf(fd, "%d", fv);
|
||||||
|
|
||||||
|
fclose(fd);
|
||||||
|
}
|
||||||
|
|
||||||
//Write value to backlight files
|
//Write value to backlight files
|
||||||
void do_assignment(struct arg_values* arg){
|
void do_assignment(struct arg_values* arg){
|
||||||
int out = process_op(arg, 0, get_brightness(backlight_file), get_brightness(max_backlight_file));
|
int start = get_brightness(backlight_file);
|
||||||
FILE* bright = fopen(backlight_file, "w+");
|
int out = process_op(arg, 0, start, get_brightness(max_backlight_file));
|
||||||
if(!bright){
|
fade_out(start, out, arg->fade_duration, arg->fade_steps);
|
||||||
io_error_2(IO_ERROR_OPEN, IO_ERROR_FILE, backlight_dir, backlight_file);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fprintf(bright, "%d", out);
|
|
||||||
fclose(bright);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Run get operation
|
//Run get operation
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user