/** * @file main.c * ledcontroller-3bit * * This file is a fork of the LedController code. You will find * the original copyright notices below. * * @copyright Copyright (C) 2013 andmarios - http://www.andmarios.com \n * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. \n * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. \n * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * @copyright Original Copyright Notice: \n * * LedController \n * Copyright (C) 2011 jmrobles - http://robleshermoso.wordpress.com \n * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. \n * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. \n * * You should have received a copy of the GNU General Public License * along with this program. If not, see . \n */ #include #include #include #include #define USB_VID 0x1294 /**< USB Vendor ID */ #define USB_PID 0x1320 /**< USB Product ID */ #define USB_EP 0x2 /**< USB EndPoint */ static struct libusb_device_handle *devh = NULL; /** * The device has a RGB LED, which has two states for each "sub-LED", * on and off. * The "sub-LEDs" are red, green and blue. * * Obviously there are 8 possible combinations for their state. * It seems there aren't bits mapped to each sub-LED, but instead * 3-bit values mapped to the 8 combinations. * * | R | G | B | Color | Value | Comment | * | - | - | - | ------ | ----- | ------------------------------- | * | 0 | 0 | 0 | off | 0x0 | | * | 0 | 0 | 1 | blue | 0x1 | | * | 1 | 0 | 0 | red | 0x2 | | * | 0 | 1 | 0 | green | 0x3 | | * | 0 | 1 | 1 | aqua | 0x4 | | * | 1 | 0 | 1 | purple | 0x5 | | * | 1 | 1 | 0 | yellow | 0x6 | more of a mustard - green color | * | 1 | 1 | 1 | white | 0x7 | a very blue-ish white | * * @param argc POSIX number of parameters * @param argv Array of parameters * @return Error code (0 on success) */ int main(int argc, char **argv) { if (argc != 2) { printf("Syntax: %s blue | red | green | aqua | purple | yellow | white | off\n", argv[0]); return -1; } unsigned char color_code = 0; if (strcmp(argv[1], "off") == 0) { color_code = 0; } else if (strcmp(argv[1], "blue") == 0) { color_code = 1; } else if (strcmp(argv[1], "red") == 0) { color_code = 2; } else if (strcmp(argv[1], "green") == 0) { color_code = 3; } else if (strcmp(argv[1], "aqua") == 0) { color_code = 4; } else if (strcmp(argv[1], "purple") == 0) { color_code = 5; } else if (strcmp(argv[1], "yellow") == 0) { color_code = 6; } else if (strcmp(argv[1], "white") == 0) { color_code = 7; } else { puts("Invalid color"); return -1; } libusb_init(NULL); devh = libusb_open_device_with_vid_pid(NULL, USB_VID, USB_PID); if (devh == NULL) { puts("Device not found"); return -1; } if (libusb_kernel_driver_active(devh, 0)) { puts("Detach driver from kernel"); int ret = libusb_detach_kernel_driver(devh, 0); if (ret < 0) { puts("Could not detach driver"); return -1; } } char data[5]; data[0] = color_code; data[1] = 0x4; data[2] = 0x4; data[3] = 0x4; data[4] = 0x4; libusb_claim_interface(devh, 0); int ret = libusb_interrupt_transfer(devh, USB_EP, data, 5, NULL, 0); if (ret < 0) { perror("libusb error"); return -1; } return 0; }