From b369d7fb77ddbdfcfa88db7869667f37e2d02af3 Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Sun, 2 Feb 2025 05:01:21 +0300 Subject: [PATCH] Moving ahead on prototyping 'separate flow' --- src/argb-colors.c | 161 ++++++++++++++++++++++++++++++++-------------- src/argb-colors.h | 33 +++++----- src/commands.c | 4 +- 3 files changed, 131 insertions(+), 67 deletions(-) diff --git a/src/argb-colors.c b/src/argb-colors.c index 20fc6d3..d66ffb9 100644 --- a/src/argb-colors.c +++ b/src/argb-colors.c @@ -20,48 +20,83 @@ #include "commands.c" #include "iousb.c" -unsigned int red, green, blue; - -int parse_color(char *color, unsigned int *red, unsigned int *green, unsigned int *blue ){ - if (strlen(color) != 6) - return -1; +void parse_color(char *color, unsigned int *red, unsigned int *green, unsigned int *blue ){ + if (strlen(color) != 6){ + printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color); + *red = *green = *blue = 0xff; + return; + } regex_t reg; regcomp(®, "^[0-9a-fA-F]{6}$", REG_EXTENDED); - if (regexec(®, color, 0, NULL, 0) != 0) - return -1; + if (regexec(®, color, 0, NULL, 0) != 0){ + printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color); + *red = *green = *blue = 0xff; + return; + } regfree(®); if (sscanf(color, "%2x%2x%2x", red, green, blue) == 3) - return 0; - - return -1; + return; + + printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color); + *red = *green = *blue = 0xff; } -int sync_flow(char* directive){ - if (strcmp(directive, "wave") == 0) +int parse_brightness(char *brightness){ + int ret = atoi(brightness); + if (ret > 5) + return 0; + return ret; +} + +int sync_flow(char* command, unsigned int red, unsigned int green, unsigned int blue){ + if (strcmp(command, "wave") == 0) return wave1(); - else if (strcmp(directive, "wave2") == 0) + else if (strcmp(command, "wave2") == 0) return wave2(); - else if (strcmp(directive, "color") == 0) + else if (strcmp(command, "color") == 0) return staticColorSync(red, green, blue); - else if (strcmp(directive, "off") == 0) + else if (strcmp(command, "off") == 0) return turnOffBacklightSync(); else{ - printf("Command not recognized\n" - "Possible values are: color wave wave2 off\n"); + printf("Invalid command \"%s\"\n" + "Allowed: color wave wave2 off\n", command); return staticColorSync(red, green, blue); // TODO: refactor; leave information block and nothing instead } } -int separate_flow(){ +int separate_flow(char *command1, int red1, int green1, int blue1, int brightness1, int intensity1, + char *command2, int red2, int green2, int blue2, int brightness2, int intensity2, + char *command3, int red3, int green3, int blue3, int brightness3, int intensity3, + char *command4, int red4, int green4, int blue4, int brightness4, int intensity4, + char *command5, int red5, int green5, int blue5, int brightness5, int intensity5, + char *command6, int red6, int green6, int blue6, int brightness6, int intensity6 ){ - printf("Command not recognized\n" - "Possible values are: color off impulse flash flash2 cycle\n"); -} + if (strcmp(command1, "color") == 0) + return staticColorSeparate(brightness1, red1, green1, blue1); + else if (strcmp(command1, "off") == 0) + return turnOffBacklight(); + else if (strcmp(command1, "impulse") == 0) + return impulse(intensity1, red1, green1, blue1); + else if (strcmp(command1, "flash") == 0) + return flash(brightness1, intensity1, red1, green1, blue1); + else if (strcmp(command1, "flash2") == 0) + return doubleFlash(brightness1, intensity1, red1, green1, blue1); + else if (strcmp(command1, "cycle") == 0) + return cycle(intensity1, brightness1); + else{ + printf("Invalid command \"%s\"\n" + "Allowed: color off impulse flash flash2 cycle\n", command1); + return staticColorSync(red1, green1, blue1); // TODO: FIX ME + } + + //FIXME +} + int main(int argc, char *argv[]) { struct arguments arguments; @@ -69,18 +104,22 @@ int main(int argc, char *argv[]) { arguments.quiet = 0; arguments.sync = 0; arguments.separate = 0; - arguments.color = "ff2fff"; - arguments.brightness = "5"; + arguments.c1 = arguments.c2 = arguments.c3 = arguments.c4 = + arguments.c5 = arguments.c6 = arguments.color = "ff2f00"; + arguments.i1 = arguments.i2 = arguments.i3 = arguments.i4 = + arguments.i5 = arguments.i6 = "4"; + arguments.b1 = arguments.b2 = arguments.b3 = arguments.b4 = + arguments.b5 = arguments.b6 = arguments.brightness = "4"; + arguments.z1 = arguments.z2 = arguments.z3 = + arguments.z4 = arguments.z5 = arguments.z6 = "-"; - /* Parse our arguments; every option seen by parse_opt will - be reflected in arguments. */ argp_parse(&argp, argc, argv, 0, 0, &arguments); if (arguments.quiet) freopen("/dev/null", "a", stdout); if (arguments.sync && arguments.separate){ - printf("Only one option must be defined: '-s' or '-e'\n"); + printf("Only one option must be defined: '-s' or '-e'\n"); return -1; } /* @@ -89,14 +128,45 @@ int main(int argc, char *argv[]) { return -1; } */ - if (parse_color(arguments.color, &red, &green, &blue) != 0){ - printf("Color parse failure\n"); - return -1; + unsigned int red, green, blue, + red1, green1, blue1, + red2, green2, blue2, + red3, green3, blue3, + red4, green4, blue4, + red5, green5, blue5, + red6, green6, blue6, + brightness, + brightness1, brightness2, brightness3, + brightness4, brightness5, brightness6, + intensity1, intensity2, intensity3, + intensity4, intensity5, intensity6; + + parse_color(arguments.color, &red, &green, &blue); + + brightness = parse_brightness(arguments.brightness); + + if (arguments.separate == 1){ + parse_color(arguments.c1, &red1, &green1, &blue1); + parse_color(arguments.c2, &red2, &green2, &blue2); + parse_color(arguments.c3, &red3, &green3, &blue3); + parse_color(arguments.c4, &red4, &green4, &blue4); + parse_color(arguments.c5, &red5, &green5, &blue5); + parse_color(arguments.c6, &red6, &green6, &blue6); + + brightness1 = parse_brightness(arguments.b1); + brightness2 = parse_brightness(arguments.b2); + brightness3 = parse_brightness(arguments.b3); + brightness4 = parse_brightness(arguments.b4); + brightness5 = parse_brightness(arguments.b5); + brightness6 = parse_brightness(arguments.b6); + + intensity1 = parse_brightness(arguments.i1); + intensity2 = parse_brightness(arguments.i2); + intensity3 = parse_brightness(arguments.i3); + intensity4 = parse_brightness(arguments.i4); + intensity5 = parse_brightness(arguments.i5); + intensity6 = parse_brightness(arguments.i6); } - - int brightness = atoi(arguments.brightness); - if (brightness > 5) - brightness = 0; // - - - int ret = configure_device(); @@ -118,32 +188,23 @@ int main(int argc, char *argv[]) { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (arguments.sync == 1){ // Sync flow - if (sync_flow(arguments.args[0])){ + if (sync_flow(arguments.args[0], red, green, blue)){ printf("Command transfer failure\n"); libusb_close(dev_handle); return -1; } } - else if (arguments.separate == 0){ // Separate flow - if(staticColorSync(red, green, blue)){ // TODO: FIX! + else if (arguments.separate == 1){ // Separate flow + if (separate_flow(arguments.z1, red1, green1, blue1, brightness1, intensity1, + arguments.z2, red2, green2, blue2, brightness2, intensity2, + arguments.z3, red3, green3, blue3, brightness3, intensity3, + arguments.z4, red4, green4, blue4, brightness4, intensity4, + arguments.z5, red5, green5, blue5, brightness5, intensity5, + arguments.z6, red6, green6, blue6, brightness6, intensity6)){ printf("Command transfer failure\n"); libusb_close(dev_handle); return -1; } - - /* - if (cycle(0, 4)){ - printf("Command transfer failure\n"); - libusb_close(dev_handle); - return -1; - } - - if (impulse(0, 0xff, 0x2f, 0xff)){ - printf("Command transfer failure\n"); - libusb_close(dev_handle); - return -1; - } - //*/ } else{ if(staticColorSync(red, green, blue)){ // Executed neither for sync, nor for separate => set single color diff --git a/src/argb-colors.h b/src/argb-colors.h index a7f3112..9747f84 100644 --- a/src/argb-colors.h +++ b/src/argb-colors.h @@ -8,10 +8,13 @@ enum separate_options { B1, B2, B3, B4, B5, B6 }; -const char *argp_program_version = "argbColor 0.1"; +const char *argp_program_version = "argb-color 0.1\n\n\ +License: GPLv3+: GNU GPL version 3 or newer .\n\ +Dmitry Isaenko, 2025, Russia.\n\ +https://redrise.ru, https://github.com/developersu"; const char *argp_program_bug_address = "https://github.com/developersu/argbColors/issues/"; static char doc[] = "-s [color|wave|wave2|off]\n-e -z1=[color|off|impulse|flash|flash2|cycle] ... -z6=[...]"; -static char doc1[] = "Apply same effect to every connected device or configure each device separately\v\ +static char doc1[] = "Apply one effect for everything or configure each 'device' separately\v\ Command's related options:\n\ Synchronized\n\ * color: color (-c ...)\n\ @@ -34,7 +37,7 @@ static struct argp_option options[] = { {"separate", 'e', 0, 0, "Separate commands flow" , 1}, {"color", 'c', "RGB_color", 0, "Color (000000..ffffff)" , 2}, - {"brightness", 'b', "value", 0, "Brightness (0..5)" , 2}, + {"brightness", 'b', "value", 0, "Brightness (0..4)" , 2}, {"z1", Z1, "command", 0, "Command for zone 1", 3 }, {"z2", Z2, "command", 0, "Command for zone 2", 3 }, @@ -50,19 +53,19 @@ static struct argp_option options[] = { {"c5", C5, "RGB_color", 0, "Color for zone 5", 4 }, {"c6", C6, "RGB_color", 0, "Color for zone 6", 4 }, - {"i1", I1, "value", 0, "Intensity/frequency for zone 1", 4 }, - {"i2", I2, "value", 0, "Intensity/frequency for zone 2", 4 }, - {"i3", I3, "value", 0, "Intensity/frequency for zone 3", 4 }, - {"i4", I4, "value", 0, "Intensity/frequency for zone 4", 4 }, - {"i5", I5, "value", 0, "Intensity/frequency for zone 5", 4 }, - {"i6", I6, "value", 0, "Intensity/frequency for zone 6", 4 }, + {"i1", I1, "value", 0, "Intensity/frequency for zone 1 (0..4)", 4 }, + {"i2", I2, "value", 0, "Intensity/frequency for zone 2 (0..4)", 4 }, + {"i3", I3, "value", 0, "Intensity/frequency for zone 3 (0..4)", 4 }, + {"i4", I4, "value", 0, "Intensity/frequency for zone 4 (0..4)", 4 }, + {"i5", I5, "value", 0, "Intensity/frequency for zone 5 (0..4)", 4 }, + {"i6", I6, "value", 0, "Intensity/frequency for zone 6 (0..4)", 4 }, - {"b1", B1, "value", 0, "Brightness for zone 1", 4 }, - {"b2", B2, "value", 0, "Brightness for zone 2", 4 }, - {"b3", B3, "value", 0, "Brightness for zone 3", 4 }, - {"b4", B4, "value", 0, "Brightness for zone 4", 4 }, - {"b5", B5, "value", 0, "Brightness for zone 5", 4 }, - {"b6", B6, "value", 0, "Brightness for zone 6", 4 }, + {"b1", B1, "value", 0, "Brightness for zone 1 (0..4)", 4 }, + {"b2", B2, "value", 0, "Brightness for zone 2 (0..4)", 4 }, + {"b3", B3, "value", 0, "Brightness for zone 3 (0..4)", 4 }, + {"b4", B4, "value", 0, "Brightness for zone 4 (0..4)", 4 }, + {"b5", B5, "value", 0, "Brightness for zone 5 (0..4)", 4 }, + {"b6", B6, "value", 0, "Brightness for zone 6 (0..4)", 4 }, {"quiet", 'q', 0, 0, "Mute output" , 7}, {"verbose", 'v', 0, 0, "Verbose output" , 7}, diff --git a/src/commands.c b/src/commands.c index 0ee334e..faaeff8 100644 --- a/src/commands.c +++ b/src/commands.c @@ -436,11 +436,11 @@ int flash(int brightness, int frequency, unsigned char red, unsigned char green, return 0; } -int doubleFlash(int brighness, int frequency, unsigned char red, unsigned char green, unsigned char blue){ +int doubleFlash(int brightness, int frequency, unsigned char red, unsigned char green, unsigned char blue){ unsigned char brgt; - switch (brighness){ + switch (brightness){ case 0: brgt = 0x1a; break;