Added RGB color mode

This commit is contained in:
jpk 2017-08-28 19:08:19 +02:00
parent b2916bcfa8
commit 056bdc09f2
1 changed files with 42 additions and 19 deletions

View File

@ -25,10 +25,13 @@ struct sockaddr_in server_addr;
static int lw12_cmd_light(int argc, char *argv[]) { static int lw12_cmd_light(int argc, char *argv[]) {
if (argc == 0) { if (argc == 0) {
printf("Not enough parameters, choices are:\n"); printf("Not enough parameters, choices are:\n");
printf(" on - turn the LED stripe on\n"); printf(" on\n");
printf(" off - turn the LED stripe off\n"); printf(" off\n");
printf(" set <color> <value>" printf(" set <color> <value>\n\n");
" - set a color value (e.g. 'light set red 244')\n"); printf("Color:\n------\nred\ngreen\nblue\nrgb\n\n"
"The colors red, green and blue require one additional\n"
"parameter as number between 0 - 255. The `rgb` value\n"
"has to be given in #RRGGBB hex format.\n");
} }
if (strncasecmp(argv[0], "on", strlen(argv[0])) == 0) { if (strncasecmp(argv[0], "on", strlen(argv[0])) == 0) {
lw12_sendcmd(sockfd, &server_addr, (char *)LIGHTS_ON); lw12_sendcmd(sockfd, &server_addr, (char *)LIGHTS_ON);
@ -37,32 +40,52 @@ static int lw12_cmd_light(int argc, char *argv[]) {
lw12_sendcmd(sockfd, &server_addr, (char *)LIGHTS_OFF); lw12_sendcmd(sockfd, &server_addr, (char *)LIGHTS_OFF);
} else if (strncasecmp(argv[0], "set", strlen(argv[0])) == 0) { } else if (strncasecmp(argv[0], "set", strlen(argv[0])) == 0) {
if (argc < 3) { if (argc < 3) {
printf("Not enough parameters, usage:\n"); printf("Not enough parameters, usage:\n"
printf("set <color> <value>" " - set <color> <value>\n\b");
" - set a color value (e.g. 'light set red 244')\n");
return 1; return 1;
} }
// todo set color // todo set color
char cmd[LW12_CMD_LENGTH]; unsigned char cmd[LW12_CMD_LENGTH];
// last char gets not copied?! // last char gets not copied?!
strncpy(cmd, LIGHT_COLOR, LW12_CMD_LENGTH); strncpy((char *)cmd, LIGHT_COLOR, LW12_CMD_LENGTH);
int pos; if (strncasecmp(argv[1], "red", strlen(argv[1])) == 0) {
if (strncasecmp(argv[1], "red", strlen(argv[1])) == 0) uint8_t colorvalue = (uint8_t)atoi(argv[2]);
pos = 0; cmd[4] = (char)colorvalue;
else if (strncasecmp(argv[1], "green", strlen(argv[1])) == 0) } else if (strncasecmp(argv[1], "green", strlen(argv[1])) == 0) {
pos = 1; uint8_t colorvalue = (uint8_t)atoi(argv[2]);
else if (strncasecmp(argv[1], "blue", strlen(argv[1])) == 0) cmd[5] = (char)colorvalue;
pos = 2; } else if (strncasecmp(argv[1], "blue", strlen(argv[1])) == 0) {
else { uint8_t colorvalue = (uint8_t)atoi(argv[2]);
cmd[6] = (char)colorvalue;
} else if (strncasecmp(argv[1], "rgb", strlen(argv[1])) == 0) {
if (strlen(argv[2]) != 7) {
printf("Invalid RGB value. Example: #ff138a\n");
return 1;
}
char *pos = argv[2];
if (*pos == '#')
pos++;
int colorvalue = (int)strtol(pos, 0, 16);
// exchange byte order to match RR GG BB
colorvalue = (colorvalue & 0x000000ff) << 16
| (colorvalue & 0x00ff0000) >> 16
| (colorvalue & 0x0000ff00);
memcpy(cmd+4, &colorvalue, 4);
} else {
printf("Unknown color selected, use: red, green or blue\n"); printf("Unknown color selected, use: red, green or blue\n");
return 1; return 1;
} }
uint8_t colorvalue = (uint8_t)atoi(argv[2]);
cmd[4 + pos] = (char)colorvalue;
// last char gets not copied?! // last char gets not copied?!
for (int x = 0; x < 9; x++)
printf("%02x", cmd[x]);
printf("\n");
cmd[LW12_CMD_LENGTH-1] = '\xef'; cmd[LW12_CMD_LENGTH-1] = '\xef';
for (int x = 0; x < 9; x++)
printf("%02x", cmd[x]);
printf("\n");
lw12_sendcmd(sockfd, &server_addr, (char *)cmd); lw12_sendcmd(sockfd, &server_addr, (char *)cmd);
} }
return 0; return 0;