Moving ahead on prototyping 'separate flow'
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed

This commit is contained in:
Dmitry Isaenko 2025-02-02 05:01:21 +03:00
parent 77c6af0021
commit b369d7fb77
3 changed files with 131 additions and 67 deletions

View file

@ -20,48 +20,83 @@
#include "commands.c" #include "commands.c"
#include "iousb.c" #include "iousb.c"
unsigned int red, green, blue; void parse_color(char *color, unsigned int *red, unsigned int *green, unsigned int *blue ){
if (strlen(color) != 6){
int parse_color(char *color, unsigned int *red, unsigned int *green, unsigned int *blue ){ printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color);
if (strlen(color) != 6) *red = *green = *blue = 0xff;
return -1; return;
}
regex_t reg; regex_t reg;
regcomp(&reg, "^[0-9a-fA-F]{6}$", REG_EXTENDED); regcomp(&reg, "^[0-9a-fA-F]{6}$", REG_EXTENDED);
if (regexec(&reg, color, 0, NULL, 0) != 0) if (regexec(&reg, color, 0, NULL, 0) != 0){
return -1; printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color);
*red = *green = *blue = 0xff;
return;
}
regfree(&reg); regfree(&reg);
if (sscanf(color, "%2x%2x%2x", red, green, blue) == 3) if (sscanf(color, "%2x%2x%2x", red, green, blue) == 3)
return 0; return;
return -1; printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color);
*red = *green = *blue = 0xff;
} }
int sync_flow(char* directive){ int parse_brightness(char *brightness){
if (strcmp(directive, "wave") == 0) 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(); return wave1();
else if (strcmp(directive, "wave2") == 0) else if (strcmp(command, "wave2") == 0)
return wave2(); return wave2();
else if (strcmp(directive, "color") == 0) else if (strcmp(command, "color") == 0)
return staticColorSync(red, green, blue); return staticColorSync(red, green, blue);
else if (strcmp(directive, "off") == 0) else if (strcmp(command, "off") == 0)
return turnOffBacklightSync(); return turnOffBacklightSync();
else{ else{
printf("Command not recognized\n" printf("Invalid command \"%s\"\n"
"Possible values are: color wave wave2 off\n"); "Allowed: color wave wave2 off\n", command);
return staticColorSync(red, green, blue); // TODO: refactor; leave information block and nothing instead 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" if (strcmp(command1, "color") == 0)
"Possible values are: color off impulse flash flash2 cycle\n"); 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[]) { int main(int argc, char *argv[]) {
struct arguments arguments; struct arguments arguments;
@ -69,11 +104,15 @@ int main(int argc, char *argv[]) {
arguments.quiet = 0; arguments.quiet = 0;
arguments.sync = 0; arguments.sync = 0;
arguments.separate = 0; arguments.separate = 0;
arguments.color = "ff2fff"; arguments.c1 = arguments.c2 = arguments.c3 = arguments.c4 =
arguments.brightness = "5"; 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); argp_parse(&argp, argc, argv, 0, 0, &arguments);
if (arguments.quiet) if (arguments.quiet)
@ -89,14 +128,45 @@ int main(int argc, char *argv[]) {
return -1; return -1;
} }
*/ */
if (parse_color(arguments.color, &red, &green, &blue) != 0){ unsigned int red, green, blue,
printf("Color parse failure\n"); red1, green1, blue1,
return -1; 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;
int brightness = atoi(arguments.brightness); parse_color(arguments.color, &red, &green, &blue);
if (brightness > 5)
brightness = 0; 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 ret = configure_device(); int ret = configure_device();
@ -118,32 +188,23 @@ int main(int argc, char *argv[]) {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (arguments.sync == 1){ // Sync flow 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"); printf("Command transfer failure\n");
libusb_close(dev_handle); libusb_close(dev_handle);
return -1; return -1;
} }
} }
else if (arguments.separate == 0){ // Separate flow else if (arguments.separate == 1){ // Separate flow
if(staticColorSync(red, green, blue)){ // TODO: FIX! 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"); printf("Command transfer failure\n");
libusb_close(dev_handle); libusb_close(dev_handle);
return -1; 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{ else{
if(staticColorSync(red, green, blue)){ // Executed neither for sync, nor for separate => set single color if(staticColorSync(red, green, blue)){ // Executed neither for sync, nor for separate => set single color

View file

@ -8,10 +8,13 @@ enum separate_options {
B1, B2, B3, B4, B5, B6 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 <https://gnu.org/licenses/gpl.html>.\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/"; 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 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\ Command's related options:\n\
Synchronized\n\ Synchronized\n\
* color: color (-c ...)\n\ * color: color (-c ...)\n\
@ -34,7 +37,7 @@ static struct argp_option options[] = {
{"separate", 'e', 0, 0, "Separate commands flow" , 1}, {"separate", 'e', 0, 0, "Separate commands flow" , 1},
{"color", 'c', "RGB_color", 0, "Color (000000..ffffff)" , 2}, {"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 }, {"z1", Z1, "command", 0, "Command for zone 1", 3 },
{"z2", Z2, "command", 0, "Command for zone 2", 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 }, {"c5", C5, "RGB_color", 0, "Color for zone 5", 4 },
{"c6", C6, "RGB_color", 0, "Color for zone 6", 4 }, {"c6", C6, "RGB_color", 0, "Color for zone 6", 4 },
{"i1", I1, "value", 0, "Intensity/frequency for zone 1", 4 }, {"i1", I1, "value", 0, "Intensity/frequency for zone 1 (0..4)", 4 },
{"i2", I2, "value", 0, "Intensity/frequency for zone 2", 4 }, {"i2", I2, "value", 0, "Intensity/frequency for zone 2 (0..4)", 4 },
{"i3", I3, "value", 0, "Intensity/frequency for zone 3", 4 }, {"i3", I3, "value", 0, "Intensity/frequency for zone 3 (0..4)", 4 },
{"i4", I4, "value", 0, "Intensity/frequency for zone 4", 4 }, {"i4", I4, "value", 0, "Intensity/frequency for zone 4 (0..4)", 4 },
{"i5", I5, "value", 0, "Intensity/frequency for zone 5", 4 }, {"i5", I5, "value", 0, "Intensity/frequency for zone 5 (0..4)", 4 },
{"i6", I6, "value", 0, "Intensity/frequency for zone 6", 4 }, {"i6", I6, "value", 0, "Intensity/frequency for zone 6 (0..4)", 4 },
{"b1", B1, "value", 0, "Brightness for zone 1", 4 }, {"b1", B1, "value", 0, "Brightness for zone 1 (0..4)", 4 },
{"b2", B2, "value", 0, "Brightness for zone 2", 4 }, {"b2", B2, "value", 0, "Brightness for zone 2 (0..4)", 4 },
{"b3", B3, "value", 0, "Brightness for zone 3", 4 }, {"b3", B3, "value", 0, "Brightness for zone 3 (0..4)", 4 },
{"b4", B4, "value", 0, "Brightness for zone 4", 4 }, {"b4", B4, "value", 0, "Brightness for zone 4 (0..4)", 4 },
{"b5", B5, "value", 0, "Brightness for zone 5", 4 }, {"b5", B5, "value", 0, "Brightness for zone 5 (0..4)", 4 },
{"b6", B6, "value", 0, "Brightness for zone 6", 4 }, {"b6", B6, "value", 0, "Brightness for zone 6 (0..4)", 4 },
{"quiet", 'q', 0, 0, "Mute output" , 7}, {"quiet", 'q', 0, 0, "Mute output" , 7},
{"verbose", 'v', 0, 0, "Verbose output" , 7}, {"verbose", 'v', 0, 0, "Verbose output" , 7},

View file

@ -436,11 +436,11 @@ int flash(int brightness, int frequency, unsigned char red, unsigned char green,
return 0; 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; unsigned char brgt;
switch (brighness){ switch (brightness){
case 0: case 0:
brgt = 0x1a; brgt = 0x1a;
break; break;