mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-01-18 20:17:51 -05:00
* Split detection system out into its own class, DetectionManager
* Clean up ResourceManger's many callbacks into just two, one for detection and one general purpose
762 lines
52 KiB
C++
762 lines
52 KiB
C++
/*---------------------------------------------------------*\
|
|
| RGBController.h |
|
|
| |
|
|
| OpenRGB's RGB controller hardware abstration layer, |
|
|
| provides a generic representation of an RGB device |
|
|
| |
|
|
| Adam Honse (CalcProgrammer1) 02 Jun 2019 |
|
|
| |
|
|
| This file is part of the OpenRGB project |
|
|
| SPDX-License-Identifier: GPL-2.0-or-later |
|
|
\*---------------------------------------------------------*/
|
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <thread>
|
|
#include <chrono>
|
|
#include <mutex>
|
|
#include <shared_mutex>
|
|
#include "nlohmann/json.hpp"
|
|
|
|
/*---------------------------------------------------------*\
|
|
| RGB Color Type and Conversion Macros |
|
|
\*---------------------------------------------------------*/
|
|
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) ((RGBColor)((b << 16) | (g << 8) | (r)))
|
|
|
|
#define RGBToBGRColor(rgb) ((rgb & 0xFF) << 16 | (rgb & 0xFF00) | (rgb & 0xFF0000) >> 16)
|
|
|
|
/*---------------------------------------------------------*\
|
|
| 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_FLAG_MANUAL_SAVE = (1 << 8), /* Mode can manually be saved */
|
|
MODE_FLAG_AUTOMATIC_SAVE = (1 << 9), /* Mode automatically saves */
|
|
MODE_FLAG_REQUIRES_ENTIRE_DEVICE = (1 << 10),/* Mode always applies to entire */
|
|
/* device, overrides per-zone modes */
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| 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 */
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Mode Color Types |
|
|
\*---------------------------------------------------------*/
|
|
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 Class |
|
|
\*---------------------------------------------------------*/
|
|
class mode
|
|
{
|
|
public:
|
|
/*-----------------------------------------------------*\
|
|
| 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 brightness_min; /*brightness min value */
|
|
unsigned int brightness_max; /*brightness max 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 brightness; /* Mode brightness value */
|
|
unsigned int direction; /* Mode direction value */
|
|
unsigned int color_mode; /* Mode color selection */
|
|
std::vector<RGBColor>
|
|
colors; /* mode-specific colors */
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Mode Constructor / Destructor |
|
|
\*-----------------------------------------------------*/
|
|
mode();
|
|
~mode();
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| LED Struct |
|
|
\*---------------------------------------------------------*/
|
|
typedef struct
|
|
{
|
|
/*-----------------------------------------------------*\
|
|
| LED Information |
|
|
\*-----------------------------------------------------*/
|
|
std::string name; /* LED name */
|
|
unsigned int value; /* Device-specific LED value */
|
|
} led;
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Zone Flags |
|
|
\*---------------------------------------------------------*/
|
|
enum
|
|
{
|
|
ZONE_FLAG_RESIZE_EFFECTS_ONLY = (1 << 0), /* Zone is resizable, but only for */
|
|
/* effects - treat as single LED */
|
|
ZONE_FLAG_MANUALLY_CONFIGURED = (1 << 15),/* Zone has been manually configured*/
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Zone Types |
|
|
\*---------------------------------------------------------*/
|
|
typedef int zone_type;
|
|
|
|
enum
|
|
{
|
|
ZONE_TYPE_SINGLE,
|
|
ZONE_TYPE_LINEAR,
|
|
ZONE_TYPE_MATRIX,
|
|
ZONE_TYPE_LINEAR_LOOP,
|
|
ZONE_TYPE_MATRIX_LOOP_X,
|
|
ZONE_TYPE_MATRIX_LOOP_Y,
|
|
ZONE_TYPE_SEGMENTED
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Matrix Map Struct |
|
|
\*---------------------------------------------------------*/
|
|
class matrix_map_type
|
|
{
|
|
public:
|
|
unsigned int height;
|
|
unsigned int width;
|
|
std::vector<unsigned int> map;
|
|
|
|
matrix_map_type();
|
|
matrix_map_type(unsigned int height, unsigned int width, unsigned int * map);
|
|
~matrix_map_type();
|
|
|
|
void Reset();
|
|
void Set(unsigned int height, unsigned int width, unsigned int * map);
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Segment Class |
|
|
\*---------------------------------------------------------*/
|
|
class segment
|
|
{
|
|
public:
|
|
std::string name; /* Segment name */
|
|
zone_type type; /* Segment type */
|
|
unsigned int start_idx; /* Start index within zone */
|
|
unsigned int leds_count; /* Number of LEDs in segment*/
|
|
matrix_map_type matrix_map; /* Matrix map */
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Zone Constructor / Destructor |
|
|
\*-----------------------------------------------------*/
|
|
segment();
|
|
~segment();
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Zone Class |
|
|
\*---------------------------------------------------------*/
|
|
class zone
|
|
{
|
|
public:
|
|
std::string name; /* Zone name */
|
|
zone_type type; /* Zone type */
|
|
led * leds; /* List of LEDs in zone */
|
|
RGBColor * colors; /* Colors of LEDs in zone */
|
|
unsigned int start_idx; /* Start index of led/color */
|
|
unsigned int leds_count; /* Number of LEDs in zone */
|
|
unsigned int leds_min; /* Minimum number of LEDs */
|
|
unsigned int leds_max; /* Maximum number of LEDs */
|
|
matrix_map_type matrix_map; /* Matrix map */
|
|
std::vector<segment> segments; /* Segments in zone */
|
|
unsigned int flags; /* Zone flags bitfield */
|
|
std::vector<mode> modes; /* Zone-specific modes */
|
|
int active_mode; /* Active zone-specific mode*/
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Zone Constructor / Destructor |
|
|
\*-----------------------------------------------------*/
|
|
zone();
|
|
~zone();
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Device Types |
|
|
| The enum order should be maintained as is for the API |
|
|
| however DEVICE_TYPE_UNKNOWN needs to remain last. Any |
|
|
| new device types need to be inserted at the end of the |
|
|
| list but before unknown. |
|
|
\*---------------------------------------------------------*/
|
|
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_HEADSET_STAND,
|
|
DEVICE_TYPE_GAMEPAD,
|
|
DEVICE_TYPE_LIGHT,
|
|
DEVICE_TYPE_SPEAKER,
|
|
DEVICE_TYPE_VIRTUAL,
|
|
DEVICE_TYPE_STORAGE,
|
|
DEVICE_TYPE_CASE,
|
|
DEVICE_TYPE_MICROPHONE,
|
|
DEVICE_TYPE_ACCESSORY,
|
|
DEVICE_TYPE_KEYPAD,
|
|
DEVICE_TYPE_LAPTOP,
|
|
DEVICE_TYPE_MONITOR,
|
|
DEVICE_TYPE_UNKNOWN,
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Controller Flags |
|
|
\*---------------------------------------------------------*/
|
|
enum
|
|
{
|
|
CONTROLLER_FLAG_LOCAL = (1 << 0), /* Device is local to this instance */
|
|
CONTROLLER_FLAG_REMOTE = (1 << 1), /* Device is on a remote instance */
|
|
CONTROLLER_FLAG_VIRTUAL = (1 << 2), /* Device is a virtual device */
|
|
CONTROLLER_FLAG_HIDDEN = (1 << 3), /* Device is hidden */
|
|
|
|
CONTROLLER_FLAG_RESET_BEFORE_UPDATE = (1 << 8), /* Device resets update flag before */
|
|
/* calling update function */
|
|
};
|
|
|
|
/*---------------------------------------------------------*\
|
|
| RGBController Callback Types |
|
|
\*---------------------------------------------------------*/
|
|
typedef void (*RGBControllerCallback)(void *, unsigned int, void *);
|
|
|
|
/*---------------------------------------------------------*\
|
|
| Update Reason Codes |
|
|
\*---------------------------------------------------------*/
|
|
enum
|
|
{
|
|
RGBCONTROLLER_UPDATE_REASON_UPDATELEDS, /* UpdateLEDs() called */
|
|
RGBCONTROLLER_UPDATE_REASON_UPDATEMODE, /* UpdateMode() called */
|
|
RGBCONTROLLER_UPDATE_REASON_SAVEMODE, /* SaveMode() called */
|
|
RGBCONTROLLER_UPDATE_REASON_RESIZEZONE, /* ResizeZone() called */
|
|
RGBCONTROLLER_UPDATE_REASON_CLEARSEGMENTS, /* ClearSegments() called */
|
|
RGBCONTROLLER_UPDATE_REASON_ADDSEGMENT, /* AddSegment() called */
|
|
RGBCONTROLLER_UPDATE_REASON_HIDDEN, /* Hidden flag set */
|
|
RGBCONTROLLER_UPDATE_REASON_UNHIDDEN, /* Hidden flag cleared */
|
|
};
|
|
|
|
std::string device_type_to_str(device_type type);
|
|
|
|
class RGBControllerInterface
|
|
{
|
|
public:
|
|
/*-----------------------------------------------------*\
|
|
| Controller Information |
|
|
\*-----------------------------------------------------*/
|
|
virtual std::string GetName() = 0;
|
|
virtual std::string GetVendor() = 0;
|
|
virtual std::string GetDescription() = 0;
|
|
virtual std::string GetVersion() = 0;
|
|
virtual std::string GetSerial() = 0;
|
|
virtual std::string GetLocation() = 0;
|
|
|
|
virtual device_type GetDeviceType() = 0;
|
|
virtual unsigned int GetFlags() = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Hidden Flag Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual bool GetHidden() = 0;
|
|
virtual void SetHidden(bool hidden) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Zone Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual int GetZoneActiveMode(unsigned int zone) = 0;
|
|
virtual RGBColor GetZoneColor(unsigned int zone, unsigned int color_index) = 0;
|
|
virtual RGBColor* GetZoneColorsPointer(unsigned int zone) = 0;
|
|
virtual std::size_t GetZoneCount() = 0;
|
|
virtual unsigned int GetZoneFlags(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneLEDsCount(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneLEDsMax(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneLEDsMin(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneMatrixMapHeight(unsigned int zone) = 0;
|
|
virtual const unsigned int * GetZoneMatrixMap(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneMatrixMapWidth(unsigned int zone) = 0;
|
|
virtual std::size_t GetZoneModeCount(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeBrightnessMax(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeBrightnessMin(unsigned int zone, unsigned int mode) = 0;
|
|
virtual RGBColor GetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index) = 0;
|
|
virtual unsigned int GetZoneModeColorMode(unsigned int zone, unsigned int mode) = 0;
|
|
virtual std::size_t GetZoneModeColorsCount(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeColorsMax(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeColorsMin(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeDirection(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeFlags(unsigned int zone, unsigned int mode) = 0;
|
|
virtual std::string GetZoneModeName(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeSpeed(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeSpeedMax(unsigned int zone, unsigned int mode) = 0;
|
|
virtual unsigned int GetZoneModeSpeedMin(unsigned int zone, unsigned int mode) = 0;
|
|
virtual int GetZoneModeValue(unsigned int zone, unsigned int mode) = 0;
|
|
virtual std::string GetZoneName(unsigned int zone) = 0;
|
|
virtual std::size_t GetZoneSegmentCount(unsigned int zone) = 0;
|
|
virtual unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment) = 0;
|
|
virtual unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) = 0;
|
|
virtual const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) = 0;
|
|
virtual unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment) = 0;
|
|
virtual std::string GetZoneSegmentName(unsigned int zone, unsigned int segment) = 0;
|
|
virtual unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment) = 0;
|
|
virtual unsigned int GetZoneSegmentType(unsigned int zone, unsigned int segment) = 0;
|
|
virtual unsigned int GetZoneStartIndex(unsigned int zone) = 0;
|
|
virtual zone_type GetZoneType(unsigned int zone) = 0;
|
|
|
|
virtual unsigned int GetLEDsInZone(unsigned int zone) = 0;
|
|
|
|
virtual void SetZoneActiveMode(unsigned int zone, int mode) = 0;
|
|
virtual void SetZoneModeBrightness(unsigned int zone, unsigned int mode, unsigned int brightness) = 0;
|
|
virtual void SetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index, RGBColor color) = 0;
|
|
virtual void SetZoneModeColorMode(unsigned int zone, unsigned int mode, unsigned int color_mode) = 0;
|
|
virtual void SetZoneModeColorsCount(unsigned int zone, unsigned int mode, std::size_t count) = 0;
|
|
virtual void SetZoneModeDirection(unsigned int zone, unsigned int mode, unsigned int direction) = 0;
|
|
virtual void SetZoneModeSpeed(unsigned int zone, unsigned int mode, unsigned int speed) = 0;
|
|
|
|
virtual bool SupportsPerZoneModes() = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Mode Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual std::size_t GetModeCount() = 0;
|
|
virtual unsigned int GetModeBrightness(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeBrightnessMax(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeBrightnessMin(unsigned int mode) = 0;
|
|
virtual RGBColor GetModeColor(unsigned int mode, unsigned int color_index) = 0;
|
|
virtual unsigned int GetModeColorMode(unsigned int mode) = 0;
|
|
virtual std::size_t GetModeColorsCount(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeColorsMax(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeColorsMin(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeDirection(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeFlags(unsigned int mode) = 0;
|
|
virtual std::string GetModeName(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeSpeed(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeSpeedMax(unsigned int mode) = 0;
|
|
virtual unsigned int GetModeSpeedMin(unsigned int mode) = 0;
|
|
virtual int GetModeValue(unsigned int mode) = 0;
|
|
|
|
virtual void SetModeBrightness(unsigned int mode, unsigned int brightness) = 0;
|
|
virtual void SetModeColor(unsigned int mode, unsigned int color_index, RGBColor color) = 0;
|
|
virtual void SetModeColorMode(unsigned int mode, unsigned int color_mode) = 0;
|
|
virtual void SetModeColorsCount(unsigned int mode, std::size_t count) = 0;
|
|
virtual void SetModeDirection(unsigned int mode, unsigned int direction) = 0;
|
|
virtual void SetModeSpeed(unsigned int mode, unsigned int speed) = 0;
|
|
|
|
virtual int GetActiveMode() = 0;
|
|
virtual void SetActiveMode(int mode) = 0;
|
|
virtual void SetCustomMode() = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| LED Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual std::size_t GetLEDCount() = 0;
|
|
virtual std::string GetLEDName(unsigned int led) = 0;
|
|
virtual unsigned int GetLEDValue(unsigned int led) = 0;
|
|
|
|
virtual std::string GetLEDDisplayName(unsigned int led) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Color Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual RGBColor GetColor(unsigned int led) = 0;
|
|
virtual RGBColor* GetColorsPointer() = 0;
|
|
virtual void SetColor(unsigned int led, RGBColor color) = 0;
|
|
|
|
virtual void SetAllColors(RGBColor color) = 0;
|
|
virtual void SetAllZoneColors(int zone, RGBColor color) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Serialized Description Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual unsigned char * GetColorDescriptionData(unsigned char* data_ptr, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetColorDescriptionSize(unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetDeviceDescriptionData(unsigned char* data_ptr, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetDeviceDescriptionSize(unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetLEDDescriptionData(unsigned char* data_ptr, led led, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetLEDDescriptionSize(led led, unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetMatrixMapDescriptionData(unsigned char* data_ptr, matrix_map_type matrix_map, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetMatrixMapDescriptionSize(matrix_map_type matrix_map, unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetModeDescriptionData(unsigned char* data_ptr, mode mode, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetModeDescriptionSize(mode mode, unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetSegmentDescriptionData(unsigned char* data_ptr, segment segment, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetSegmentDescriptionSize(segment segment, unsigned int protocol_version) = 0;
|
|
virtual unsigned char * GetZoneDescriptionData(unsigned char* data_ptr, zone zone, unsigned int protocol_version) = 0;
|
|
virtual unsigned int GetZoneDescriptionSize(zone zone, unsigned int protocol_version) = 0;
|
|
|
|
virtual unsigned char* SetColorDescription(unsigned char* data_ptr, unsigned int protocol_version, bool resize = false) = 0;
|
|
virtual unsigned char* SetDeviceDescription(unsigned char* data_ptr, unsigned int protocol_version) = 0;
|
|
virtual unsigned char* SetLEDDescription(unsigned char* data_ptr, led* led, unsigned int protocol_version) = 0;
|
|
virtual unsigned char* SetMatrixMapDescription(unsigned char* data_ptr, matrix_map_type* matrix_map, unsigned int protocol_version) = 0;
|
|
virtual unsigned char* SetModeDescription(unsigned char* data_ptr, mode* mode, unsigned int protocol_version) = 0;
|
|
virtual unsigned char* SetSegmentDescription(unsigned char* data_ptr, segment* segment, unsigned int protocol_version) = 0;
|
|
virtual unsigned char* SetZoneDescription(unsigned char* data_ptr, zone* zone, unsigned int protocol_version) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| JSON Description Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual nlohmann::json GetDeviceDescriptionJSON() = 0;
|
|
virtual nlohmann::json GetLEDDescriptionJSON(led led) = 0;
|
|
virtual nlohmann::json GetMatrixMapDescriptionJSON(matrix_map_type matrix_map) = 0;
|
|
virtual nlohmann::json GetModeDescriptionJSON(mode mode) = 0;
|
|
virtual nlohmann::json GetSegmentDescriptionJSON(segment segment) = 0;
|
|
virtual nlohmann::json GetZoneDescriptionJSON(zone zone) = 0;
|
|
|
|
virtual void SetDeviceDescriptionJSON(nlohmann::json controller_json) = 0;
|
|
virtual led SetLEDDescriptionJSON(nlohmann::json led_json) = 0;
|
|
virtual matrix_map_type SetMatrixMapDescriptionJSON(nlohmann::json matrix_map_json) = 0;
|
|
virtual mode SetModeDescriptionJSON(nlohmann::json mode_json) = 0;
|
|
virtual segment SetSegmentDescriptionJSON(nlohmann::json segment_json) = 0;
|
|
virtual zone SetZoneDescriptionJSON(nlohmann::json zone_json) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Update Callback Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) = 0;
|
|
virtual void UnregisterUpdateCallback(void * callback_arg) = 0;
|
|
virtual void ClearCallbacks() = 0;
|
|
virtual void SignalUpdate(unsigned int update_reason) = 0;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Device Update Functions |
|
|
\*-----------------------------------------------------*/
|
|
virtual void UpdateLEDs() = 0;
|
|
virtual void UpdateZoneLEDs(int zone) = 0;
|
|
virtual void UpdateSingleLED(int led) = 0;
|
|
|
|
virtual void UpdateMode() = 0;
|
|
virtual void UpdateZoneMode(int zone) = 0;
|
|
virtual void SaveMode() = 0;
|
|
|
|
virtual void ClearSegments(int zone) = 0;
|
|
virtual void AddSegment(int zone, segment new_segment) = 0;
|
|
|
|
virtual void ResizeZone(int zone, int new_size) = 0;
|
|
};
|
|
|
|
class RGBController : public RGBControllerInterface
|
|
{
|
|
public:
|
|
/*-----------------------------------------------------*\
|
|
| RGBController base class constructor |
|
|
\*-----------------------------------------------------*/
|
|
RGBController();
|
|
virtual ~RGBController();
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Controller Information |
|
|
\*-----------------------------------------------------*/
|
|
std::string GetName();
|
|
std::string GetVendor();
|
|
std::string GetDescription();
|
|
std::string GetVersion();
|
|
std::string GetSerial();
|
|
std::string GetLocation();
|
|
|
|
device_type GetDeviceType();
|
|
unsigned int GetFlags();
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Hidden Flag Functions |
|
|
\*-----------------------------------------------------*/
|
|
bool GetHidden();
|
|
void SetHidden(bool hidden);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Zone Functions |
|
|
\*-----------------------------------------------------*/
|
|
int GetZoneActiveMode(unsigned int zone);
|
|
RGBColor GetZoneColor(unsigned int zone, unsigned int color_index);
|
|
RGBColor* GetZoneColorsPointer(unsigned int zone);
|
|
std::size_t GetZoneCount();
|
|
unsigned int GetZoneFlags(unsigned int zone);
|
|
unsigned int GetZoneLEDsCount(unsigned int zone);
|
|
unsigned int GetZoneLEDsMax(unsigned int zone);
|
|
unsigned int GetZoneLEDsMin(unsigned int zone);
|
|
unsigned int GetZoneMatrixMapHeight(unsigned int zone);
|
|
const unsigned int* GetZoneMatrixMap(unsigned int zone);
|
|
unsigned int GetZoneMatrixMapWidth(unsigned int zone);
|
|
std::size_t GetZoneModeCount(unsigned int zone);
|
|
unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeBrightnessMax(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeBrightnessMin(unsigned int zone, unsigned int mode);
|
|
RGBColor GetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index);
|
|
unsigned int GetZoneModeColorMode(unsigned int zone, unsigned int mode);
|
|
std::size_t GetZoneModeColorsCount(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeColorsMax(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeColorsMin(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeDirection(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeFlags(unsigned int zone, unsigned int mode);
|
|
std::string GetZoneModeName(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeSpeed(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeSpeedMax(unsigned int zone, unsigned int mode);
|
|
unsigned int GetZoneModeSpeedMin(unsigned int zone, unsigned int mode);
|
|
int GetZoneModeValue(unsigned int zone, unsigned int mode);
|
|
std::string GetZoneName(unsigned int zone);
|
|
std::size_t GetZoneSegmentCount(unsigned int zone);
|
|
unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment);
|
|
unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment);
|
|
const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment);
|
|
unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment);
|
|
std::string GetZoneSegmentName(unsigned int zone, unsigned int segment);
|
|
unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment);
|
|
unsigned int GetZoneSegmentType(unsigned int zone, unsigned int segment);
|
|
unsigned int GetZoneStartIndex(unsigned int zone);
|
|
zone_type GetZoneType(unsigned int zone);
|
|
|
|
unsigned int GetLEDsInZone(unsigned int zone);
|
|
|
|
void SetZoneActiveMode(unsigned int zone, int mode);
|
|
void SetZoneModeBrightness(unsigned int zone, unsigned int mode, unsigned int brightness);
|
|
void SetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index, RGBColor color);
|
|
void SetZoneModeColorMode(unsigned int zone, unsigned int mode, unsigned int color_mode);
|
|
void SetZoneModeColorsCount(unsigned int zone, unsigned int mode, std::size_t count);
|
|
void SetZoneModeDirection(unsigned int zone, unsigned int mode, unsigned int direction);
|
|
void SetZoneModeSpeed(unsigned int zone, unsigned int mode, unsigned int speed);
|
|
|
|
bool SupportsPerZoneModes();
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Mode Functions |
|
|
\*-----------------------------------------------------*/
|
|
std::size_t GetModeCount();
|
|
unsigned int GetModeBrightness(unsigned int mode);
|
|
unsigned int GetModeBrightnessMax(unsigned int mode);
|
|
unsigned int GetModeBrightnessMin(unsigned int mode);
|
|
RGBColor GetModeColor(unsigned int mode, unsigned int color_index);
|
|
unsigned int GetModeColorMode(unsigned int mode);
|
|
std::size_t GetModeColorsCount(unsigned int mode);
|
|
unsigned int GetModeColorsMax(unsigned int mode);
|
|
unsigned int GetModeColorsMin(unsigned int mode);
|
|
unsigned int GetModeDirection(unsigned int mode);
|
|
unsigned int GetModeFlags(unsigned int mode);
|
|
std::string GetModeName(unsigned int mode);
|
|
unsigned int GetModeSpeed(unsigned int mode);
|
|
unsigned int GetModeSpeedMax(unsigned int mode);
|
|
unsigned int GetModeSpeedMin(unsigned int mode);
|
|
int GetModeValue(unsigned int mode);
|
|
|
|
void SetModeBrightness(unsigned int mode, unsigned int brightness);
|
|
void SetModeColor(unsigned int mode, unsigned int color_index, RGBColor color);
|
|
void SetModeColorMode(unsigned int mode, unsigned int color_mode);
|
|
void SetModeColorsCount(unsigned int mode, std::size_t count);
|
|
void SetModeDirection(unsigned int mode, unsigned int direction);
|
|
void SetModeSpeed(unsigned int mode, unsigned int speed);
|
|
|
|
int GetActiveMode();
|
|
void SetActiveMode(int mode);
|
|
void SetCustomMode();
|
|
|
|
/*-----------------------------------------------------*\
|
|
| LED Functions |
|
|
\*-----------------------------------------------------*/
|
|
std::size_t GetLEDCount();
|
|
std::string GetLEDName(unsigned int led);
|
|
unsigned int GetLEDValue(unsigned int led);
|
|
|
|
std::string GetLEDDisplayName(unsigned int led);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Color Functions |
|
|
\*-----------------------------------------------------*/
|
|
RGBColor GetColor(unsigned int led);
|
|
RGBColor* GetColorsPointer();
|
|
void SetColor(unsigned int led, RGBColor color);
|
|
void SetAllColors(RGBColor color);
|
|
void SetAllZoneColors(int zone, RGBColor color);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Serialized Description Functions |
|
|
\*-----------------------------------------------------*/
|
|
unsigned char * GetColorDescriptionData(unsigned char* data_ptr, unsigned int protocol_version);
|
|
unsigned int GetColorDescriptionSize(unsigned int protocol_version);
|
|
unsigned char * GetDeviceDescriptionData(unsigned char* data_ptr, unsigned int protocol_version);
|
|
unsigned int GetDeviceDescriptionSize(unsigned int protocol_version);
|
|
unsigned char * GetLEDDescriptionData(unsigned char* data_ptr, led led, unsigned int protocol_version);
|
|
unsigned int GetLEDDescriptionSize(led led, unsigned int protocol_version);
|
|
unsigned char * GetMatrixMapDescriptionData(unsigned char* data_ptr, matrix_map_type matrix_map, unsigned int protocol_version);
|
|
unsigned int GetMatrixMapDescriptionSize(matrix_map_type matrix_map, unsigned int protocol_version);
|
|
unsigned char * GetModeDescriptionData(unsigned char* data_ptr, mode mode, unsigned int protocol_version);
|
|
unsigned int GetModeDescriptionSize(mode mode, unsigned int protocol_version);
|
|
unsigned char * GetSegmentDescriptionData(unsigned char* data_ptr, segment segment, unsigned int protocol_version);
|
|
unsigned int GetSegmentDescriptionSize(segment segment, unsigned int protocol_version);
|
|
unsigned char * GetZoneDescriptionData(unsigned char* data_ptr, zone zone, unsigned int protocol_version);
|
|
unsigned int GetZoneDescriptionSize(zone zone, unsigned int protocol_version);
|
|
|
|
unsigned char* SetColorDescription(unsigned char* data_ptr, unsigned int protocol_version, bool resize = false);
|
|
unsigned char* SetDeviceDescription(unsigned char* data_ptr, unsigned int protocol_version);
|
|
unsigned char* SetLEDDescription(unsigned char* data_ptr, led* led, unsigned int protocol_version);
|
|
unsigned char* SetMatrixMapDescription(unsigned char* data_ptr, matrix_map_type* matrix_map, unsigned int protocol_version);
|
|
unsigned char* SetModeDescription(unsigned char* data_ptr, mode* mode, unsigned int protocol_version);
|
|
unsigned char* SetSegmentDescription(unsigned char* data_ptr, segment* segment, unsigned int protocol_version);
|
|
unsigned char* SetZoneDescription(unsigned char* data_ptr, zone* zone, unsigned int protocol_version);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| JSON Description Functions |
|
|
\*-----------------------------------------------------*/
|
|
nlohmann::json GetDeviceDescriptionJSON();
|
|
nlohmann::json GetLEDDescriptionJSON(led led);
|
|
nlohmann::json GetMatrixMapDescriptionJSON(matrix_map_type matrix_map);
|
|
nlohmann::json GetModeDescriptionJSON(mode mode);
|
|
nlohmann::json GetSegmentDescriptionJSON(segment segment);
|
|
nlohmann::json GetZoneDescriptionJSON(zone zone);
|
|
|
|
void SetDeviceDescriptionJSON(nlohmann::json controller_json);
|
|
led SetLEDDescriptionJSON(nlohmann::json led_json);
|
|
matrix_map_type SetMatrixMapDescriptionJSON(nlohmann::json matrix_map_json);
|
|
mode SetModeDescriptionJSON(nlohmann::json mode_json);
|
|
segment SetSegmentDescriptionJSON(nlohmann::json segment_json);
|
|
zone SetZoneDescriptionJSON(nlohmann::json zone_json);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Update Callback Functions |
|
|
\*-----------------------------------------------------*/
|
|
void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg);
|
|
void UnregisterUpdateCallback(void * callback_arg);
|
|
void ClearCallbacks();
|
|
void SignalUpdate(unsigned int update_reason);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Device Update Functions |
|
|
\*-----------------------------------------------------*/
|
|
void UpdateLEDs();
|
|
void UpdateZoneLEDs(int zone);
|
|
void UpdateSingleLED(int led);
|
|
|
|
void UpdateMode();
|
|
void UpdateZoneMode(int zone);
|
|
void SaveMode();
|
|
|
|
void DeviceCallThreadFunction();
|
|
|
|
void ClearSegments(int zone);
|
|
void AddSegment(int zone, segment new_segment);
|
|
|
|
void ResizeZone(int zone, int new_size);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Functions to be implemented in device implementation |
|
|
\*-----------------------------------------------------*/
|
|
virtual void DeviceResizeZone(int zone, int new_size);
|
|
|
|
virtual void DeviceUpdateLEDs();
|
|
virtual void DeviceUpdateZoneLEDs(int zone);
|
|
virtual void DeviceUpdateSingleLED(int led);
|
|
|
|
virtual void DeviceUpdateMode();
|
|
virtual void DeviceUpdateZoneMode(int zone);
|
|
virtual void DeviceSaveMode();
|
|
|
|
protected:
|
|
/*-----------------------------------------------------*\
|
|
| Controller information strings |
|
|
\*-----------------------------------------------------*/
|
|
std::string description; /* controller description */
|
|
std::string location; /* controller location */
|
|
std::string name; /* controller name */
|
|
std::string serial; /* controller serial number */
|
|
std::string vendor; /* controller vendor */
|
|
std::string version; /* controller version */
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Controller variables |
|
|
\*-----------------------------------------------------*/
|
|
int active_mode = 0;/* active mode */
|
|
unsigned int flags; /* controller flags */
|
|
device_type type; /* device type */
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Controller member vectors |
|
|
\*-----------------------------------------------------*/
|
|
std::vector<RGBColor> colors; /* Color buffer */
|
|
std::vector<led> leds; /* LEDs */
|
|
std::vector<std::string>
|
|
led_alt_names; /* alternate LED names */
|
|
std::vector<mode> modes; /* Modes */
|
|
std::vector<zone> zones; /* Zones */
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Access mutex variables |
|
|
\*-----------------------------------------------------*/
|
|
std::shared_mutex AccessMutex;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Functions not part of interface for internal use only |
|
|
\*-----------------------------------------------------*/
|
|
unsigned int LEDsInZone(unsigned int zone);
|
|
void SetupColors();
|
|
void UpdateLEDsInternal();
|
|
|
|
private:
|
|
/*-----------------------------------------------------*\
|
|
| Device thread variables |
|
|
\*-----------------------------------------------------*/
|
|
std::thread* DeviceCallThread;
|
|
std::atomic<bool> CallFlag_UpdateLEDs;
|
|
std::atomic<bool> CallFlag_UpdateMode;
|
|
std::atomic<bool> DeviceThreadRunning;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Update callback variables |
|
|
\*-----------------------------------------------------*/
|
|
std::mutex UpdateMutex;
|
|
std::vector<RGBControllerCallback> UpdateCallbacks;
|
|
std::vector<void *> UpdateCallbackArgs;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Certain internal OpenRGB framework classes can modify |
|
|
| protected members |
|
|
\*-----------------------------------------------------*/
|
|
friend class DetectionManager;
|
|
friend class NetworkClient;
|
|
friend class NetworkServer;
|
|
friend class ProfileManager;
|
|
friend class ResourceManager;
|
|
};
|