mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-05-16 18:44:53 -04:00
Add DDP (Distributed Display Protocol) controller support
This commit is contained in:
committed by
Adam Honse
parent
570cc16c98
commit
a31c4f5254
97
Controllers/DDPController/DDPController.h
Normal file
97
Controllers/DDPController/DDPController.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| DDPController.h |
|
||||
| |
|
||||
| Driver for DDP protocol devices |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include "net_port.h"
|
||||
|
||||
#define DDP_DEFAULT_PORT 4048
|
||||
#define DDP_HEADER_SIZE 10
|
||||
#define DDP_HEADER_SIZE_TC 14
|
||||
#define DDP_VERSION 1
|
||||
#define DDP_MAX_PACKET_SIZE 1450
|
||||
#define DDP_MAX_DATA_SIZE 1440
|
||||
|
||||
#define DDP_FLAG_VER_MASK 0xC0
|
||||
#define DDP_FLAG_VER_1 0x40
|
||||
#define DDP_FLAG_TIMECODE 0x10
|
||||
#define DDP_FLAG_STORAGE 0x08
|
||||
#define DDP_FLAG_REPLY 0x04
|
||||
#define DDP_FLAG_QUERY 0x02
|
||||
#define DDP_FLAG_PUSH 0x01
|
||||
|
||||
#define DDP_TYPE_RGB8 0x0B
|
||||
#define DDP_TYPE_RGB_SIMPLE 1
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct ddp_header
|
||||
{
|
||||
unsigned char flags;
|
||||
unsigned char sequence;
|
||||
unsigned char data_type;
|
||||
unsigned char dest_id;
|
||||
unsigned int data_offset;
|
||||
unsigned short data_length;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
struct DDPDevice
|
||||
{
|
||||
std::string name;
|
||||
std::string ip;
|
||||
unsigned short port;
|
||||
unsigned int num_leds;
|
||||
};
|
||||
|
||||
struct DDPEndpoint
|
||||
{
|
||||
char ip[16];
|
||||
unsigned short port;
|
||||
};
|
||||
|
||||
class DDPController
|
||||
{
|
||||
public:
|
||||
DDPController(const std::vector<DDPDevice>& devices);
|
||||
~DDPController();
|
||||
|
||||
void UpdateLEDs(const std::vector<unsigned int>& colors);
|
||||
void SetKeepaliveTime(unsigned int time_ms);
|
||||
|
||||
private:
|
||||
std::vector<DDPDevice> devices;
|
||||
std::vector<net_port*> udp_ports;
|
||||
DDPEndpoint* unique_endpoints;
|
||||
unsigned int num_endpoints;
|
||||
unsigned char sequence_number;
|
||||
|
||||
|
||||
std::atomic<bool> keepalive_thread_run;
|
||||
std::thread keepalive_thread;
|
||||
std::mutex last_update_mutex;
|
||||
std::chrono::steady_clock::time_point last_update_time;
|
||||
std::vector<unsigned int> last_colors;
|
||||
unsigned int keepalive_time_ms;
|
||||
|
||||
bool InitializeNetPorts();
|
||||
void CloseNetPorts();
|
||||
int GetPortIndex(const DDPDevice& device);
|
||||
bool SendDDPPacket(const DDPDevice& device,
|
||||
const unsigned char* data,
|
||||
unsigned short length,
|
||||
unsigned int offset = 0);
|
||||
void KeepaliveThreadFunction();
|
||||
};
|
||||
Reference in New Issue
Block a user