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 "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(&reg, "^[0-9a-fA-F]{6}$", REG_EXTENDED);
if (regexec(&reg, color, 0, NULL, 0) != 0)
return -1;
if (regexec(&reg, color, 0, NULL, 0) != 0){
printf("Incorrect color: \"%s\". Using default: \"ffffff\"\n", color);
*red = *green = *blue = 0xff;
return;
}
regfree(&reg);
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

View file

@ -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 <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/";
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},

View file

@ -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;