-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathenums.h
145 lines (129 loc) · 3.62 KB
/
enums.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#pragma once
#include <stdint.h>
#pragma pack(push, 1)
typedef struct {
// Kind of the control transfer
uint8_t kind;
// ?? always zeroed
uint8_t reserved;
// mode or config slot
uint8_t mode;
// Speed or length of usb packets to follow
uint8_t speedLength;
// Brightness. 0 to 50
uint8_t brightness;
// Predefined color
uint8_t color;
uint8_t reserved2;
uint8_t checksum;
} header_t;
#pragma pack(pop)
#define KIND_PRESET 0x08
#define KIND_READ_CONFIG 0x92
#define KIND_CUSTOM_CONFIG 0x12
#define RESERVED1 0x00
// This is the list of predefined modes.
// For custom config, this byte describes the config slot
#define MODE_STATIC 0x01
#define MODE_BREATHING 0x02
#define MODE_WAVE 0x03
#define MODE_FADE_ON_KEYPRESS 0x04
#define MODE_MARQUEE 0x05
#define MODE_RIPPLE 0x06
#define MODE_FLASH_ON_KEYPRESS 0x07
#define MODE_NEON 0x08
#define MODE_RAINBOW_MARQUEE 0x09
#define MODE_RAINDROP 0x0a
#define MODE_CIRCLE_MARQUEE 0x0b
#define MODE_HEDGE 0x0c
#define MODE_ROTATE 0x0d
#define COLOR_RED 0x01
#define COLOR_GREEN 0x02
#define COLOR_YELLOW 0x03
#define COLOR_BLUE 0x04
#define COLOR_PURPLE 0x05
#define COLOR_AQUA 0x06
#define COLOR_WHITE 0x07
void fin_header(header_t *hdr) {
hdr->reserved = 0;
uint16_t chksumtmp = 0;
uint8_t *data = (uint8_t*)hdr;
for (uint8_t i = 0; i < 7; i++) {
chksumtmp+=data[i];
}
hdr->checksum = (uint8_t)(0xff - (chksumtmp & 0xff));
}
int set_mode(libusb_device_handle *handle, uint8_t mode, uint8_t color, uint8_t brightness, uint8_t speed) {
header_t header;
header.kind = KIND_PRESET;
header.reserved = RESERVED1;
header.mode = 0x33;
header.speedLength = 0x05;
header.brightness = 0x32;
header.color = 0x02;
header.reserved2 = 0x01;
fin_header(&header);
int r = libusb_control_transfer(handle, 0x21, 0x09, 0x0300, 0x0003, (uint8_t*)&header, 0x0008, 0);
if (r < 0) {
printf("Control transfer 1 failed! %d\n", r);
return -1;
} else {
printf("Control transfer 1 OK!\n");
}
header.mode = mode;
header.speedLength = speed;
header.brightness = brightness;
header.color = color;
header.reserved2 = 0;
fin_header(&header);
r = libusb_control_transfer(handle, 0x21, 0x09, 0x0300, 0x0003, (uint8_t*)&header, 0x0008, 0);
if (r < 0) {
printf("Control transfer 2 failed! %d\n", r);
return -1;
} else {
printf("Control transfer 2 OK!\n");
}
return 0;
}
int set_custom_mode(libusb_device_handle *handle, uint8_t *data) {
header_t header;
header.kind = KIND_CUSTOM_CONFIG;
header.reserved = RESERVED1;
header.mode = 1;
header.speedLength = 8;
header.brightness = 0;
header.color = 0;
header.reserved2 = RESERVED1;
fin_header(&header);
int r = libusb_control_transfer(handle, 0x21, 0x09, 0x0300, 0x0003, (uint8_t*)&header, 0x0008, 0);
if (r < 0) {
printf("Control transfer 1 failed! %d\n", r);
return -1;
} else {
printf("Control transfer 1 OK!\n");
}
for (uint8_t i = 0; i < 8; i++) {
int transferred = 0;
r = libusb_interrupt_transfer(handle, (6 | LIBUSB_ENDPOINT_OUT), data + (i * 64), 64, &transferred, 0);
if (r < 0 || transferred != 64) {
printf("Interrupt transfer %d failed", i);
}
}
printf("Interrupt transfers OK!\n");
header.kind = KIND_PRESET;
header.reserved = RESERVED1;
header.mode = 0x34;
header.speedLength = 0x05;
header.brightness = 0x32;
header.color = 0x02;
header.reserved2 = 0x01;
fin_header(&header);
r = libusb_control_transfer(handle, 0x21, 0x09, 0x0300, 0x0003, (uint8_t*)&header, 0x0008, 0);
if (r < 0) {
printf("Control transfer 2 failed! %d\n", r);
return -1;
} else {
printf("Control transfer 2 OK!\n");
}
return 0;
}