/*-----------------------------------------*\ | RGBController.h | | | | Definitions and types for generic RGB | | lighting controller interface | | | | Adam Honse (CalcProgrammer1) 6/2/2019 | \*-----------------------------------------*/ #pragma once #include #include typedef unsigned int RGBColor; #define RGBGetRValue(rgb) (rgb & 0x000000FF) #define RGBGetGValue(rgb) ((rgb >> 8) & 0x000000FF) #define RGBGetBValue(rgb) ((rgb >> 16) & 0x000000FF) #define ToRGBColor(r, g, b) ((b << 16) | (g << 8) | (r)) /*------------------------------------------------------------------*\ | Mode Flags | \*------------------------------------------------------------------*/ enum { MODE_FLAG_HAS_SPEED = (1 << 0), /* Mode has speed parameter */ MODE_FLAG_HAS_DIRECTION_LR = (1 << 1), /* Mode has left/right parameter */ MODE_FLAG_HAS_DIRECTION_UD = (1 << 2), /* Mode has up/down parameter */ MODE_FLAG_HAS_DIRECTION_HV = (1 << 3), /* Mode has horiz/vert parameter */ MODE_FLAG_HAS_BRIGHTNESS = (1 << 4), /* Mode has brightness parameter */ MODE_FLAG_HAS_PER_LED_COLOR = (1 << 5), /* Mode has per-LED colors */ MODE_FLAG_HAS_MODE_SPECIFIC_COLOR = (1 << 6), /* Mode has mode specific colors */ MODE_FLAG_HAS_RANDOM_COLOR = (1 << 7), /* Mode has random color option */ }; /*------------------------------------------------------------------*\ | Mode Directions | \*------------------------------------------------------------------*/ enum { MODE_DIRECTION_LEFT = 0, /* Mode direction left */ MODE_DIRECTION_RIGHT = 1, /* Mode direction right */ MODE_DIRECTION_UP = 2, /* Mode direction up */ MODE_DIRECTION_DOWN = 3, /* Mode direction down */ MODE_DIRECTION_HORIZONTAL = 4, /* Mode direction horizontal */ MODE_DIRECTION_VERTICAL = 5, /* Mode direction vertical */ }; enum { MODE_COLORS_NONE = 0, /* Mode has no colors */ MODE_COLORS_PER_LED = 1, /* Mode has per LED colors selected */ MODE_COLORS_MODE_SPECIFIC = 2, /* Mode specific colors selected */ MODE_COLORS_RANDOM = 3, /* Mode has random colors selected */ }; /*------------------------------------------------------------------*\ | Mode Type | \*------------------------------------------------------------------*/ typedef struct { /*--------------------------------------------------------------*\ | Mode Information | \*--------------------------------------------------------------*/ std::string name; /* Mode name */ int value; /* Device-specific mode value */ unsigned int flags; /* Mode flags bitfield */ unsigned int speed_min; /* speed minimum value */ unsigned int speed_max; /* speed maximum value */ unsigned int colors_min; /* minimum number of mode colors*/ unsigned int colors_max; /* maximum numver of mode colors*/ /*--------------------------------------------------------------*\ | Mode Settings | \*--------------------------------------------------------------*/ unsigned int speed; /* Mode speed parameter value */ unsigned int direction; /* Mode direction value */ unsigned int color_mode; /* Mode color selection */ std::vector colors; /* mode-specific colors */ } mode; typedef struct { std::string name; /* LED name */ } led; typedef int zone_type; enum { ZONE_TYPE_SINGLE, ZONE_TYPE_LINEAR, ZONE_TYPE_MATRIX }; typedef int device_type; enum { DEVICE_TYPE_MOTHERBOARD, DEVICE_TYPE_DRAM, DEVICE_TYPE_GPU, DEVICE_TYPE_COOLER, DEVICE_TYPE_LEDSTRIP, DEVICE_TYPE_KEYBOARD, DEVICE_TYPE_MOUSE, DEVICE_TYPE_MOUSEMAT, DEVICE_TYPE_HEADSET, DEVICE_TYPE_UNKNOWN }; std::string device_type_to_str(device_type type); typedef struct { std::string name; /* Zone name */ zone_type type; /* Zone type */ std::vector> map; /* LED index map */ } zone; class RGBController { public: std::string name; /* controller name */ std::string description; /* controller description */ std::string version; /* controller version */ std::string serial; /* controller serial number */ std::string location; /* controller location */ std::vector leds; /* LEDs */ std::vector zones; /* Zones */ std::vector modes; /* Modes */ std::vector colors; /* Color buffer */ device_type type; /* device type */ int active_mode = 0;/* active mode */ virtual ~RGBController() = default; /*---------------------------------------------------------*\ | Generic functions implemented in RGBController.cpp | \*---------------------------------------------------------*/ RGBColor GetLED(int led); void SetLED(int led, RGBColor color); void SetAllLEDs(RGBColor color); void SetAllZoneLEDs(int zone, RGBColor color); int GetMode(); void SetMode(int mode); unsigned char * GetDeviceDescription(); void ReadDeviceDescription(unsigned char* data_buf); /*---------------------------------------------------------*\ | Functions to be implemented in device implementation | \*---------------------------------------------------------*/ virtual void UpdateLEDs() = 0; virtual void UpdateZoneLEDs(int zone) = 0; virtual void UpdateSingleLED(int led) = 0; virtual void SetCustomMode() = 0; virtual void UpdateMode() = 0; };