Skip to content

Commit 59fba53

Browse files
author
稚晖
authored
Merge pull request #148 from RedWolf-369/main
添加RGB支持
2 parents 6b5bb48 + a8d0012 commit 59fba53

File tree

7 files changed

+208
-32
lines changed

7 files changed

+208
-32
lines changed

2.Firmware/HelloWord-Dynamic-fw/.idea/workspace.xml

+21-18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2.Firmware/HelloWord-Keyboard-fw/Middlewares/ST/STM32_USB_Device_Library/Class/CustomHID/Inc/usbd_customhid.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ extern "C" {
4444
#define CUSTOM_HID_EPIN_ADDR 0x81U
4545
#define CUSTOM_HID_EPIN_SIZE 64U
4646

47-
#define CUSTOM_HID_EPOUT_ADDR 0x01U
47+
#define CUSTOM_HID_EPOUT_ADDR 0x02U
4848
#define CUSTOM_HID_EPOUT_SIZE 64U
4949

5050
#define USB_CUSTOM_HID_CONFIG_DESC_SIZ 41U

2.Firmware/HelloWord-Keyboard-fw/Middlewares/ST/STM32_USB_Device_Library/Class/CustomHID/Src/usbd_customhid.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -632,17 +632,17 @@ static uint8_t USBD_CUSTOM_HID_DataIn(USBD_HandleTypeDef *pdev,
632632
* @param epnum: endpoint index
633633
* @retval status
634634
*/
635-
void HID_RxCpltCallback(uint8_t* _data);
635+
636636

637637
static uint8_t USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef *pdev,
638638
uint8_t epnum)
639639
{
640640

641641
USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;
642642

643-
// ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
644-
// hhid->Report_buf[1]);
645-
HID_RxCpltCallback( hhid->Report_buf);
643+
((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
644+
hhid->Report_buf[1]);
645+
646646
USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR, hhid->Report_buf,
647647
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
648648

2.Firmware/HelloWord-Keyboard-fw/USB_DEVICE/App/usbd_custom_hid_if.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
/* USER CODE BEGIN PV */
3434
/* Private variables ---------------------------------------------------------*/
35-
35+
void HID_RxCpltCallback(uint8_t* _data);
3636
/* USER CODE END PV */
3737

3838
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY

2.Firmware/HelloWord-Keyboard-fw/UserApp/main.cpp

+28-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
KeyboardConfig_t config;
88
HWKeyboard keyboard(&hspi1);
99

10-
10+
static bool isSoftWareControlColor = false;
11+
static bool isReceiveSuccess = false;
1112
/* Main Entry ----------------------------------------------------------------*/
1213
void Main()
1314
{
@@ -39,12 +40,19 @@ void Main()
3940
if (t > 250) fadeDir = false;
4041
else if (t < 1) fadeDir = true;
4142

42-
for (uint8_t i = 0; i < HWKeyboard::LED_NUMBER; i++)
43-
keyboard.SetRgbBufferByID(i, HWKeyboard::Color_t{(uint8_t) t, 50, 0});
44-
/*-----------------------------------*/
45-
46-
// Send RGB buffers to LEDs
47-
keyboard.SyncLights();
43+
if(isReceiveSuccess){
44+
keyboard.SyncLights();
45+
isReceiveSuccess = false;
46+
}
47+
if(!isSoftWareControlColor)
48+
{
49+
50+
/*---- This is a demo RGB effect ----*/
51+
for (uint8_t i = 0; i < HWKeyboard::LED_NUMBER; i++)
52+
keyboard.SetRgbBufferByID(i, HWKeyboard::Color_t{(uint8_t)t, 50, 20});
53+
/*-----------------------------------*/
54+
keyboard.SyncLights();
55+
}
4856
}
4957
}
5058

@@ -80,5 +88,17 @@ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef* hspi)
8088
extern "C"
8189
void HID_RxCpltCallback(uint8_t* _data)
8290
{
83-
91+
if(_data[1] == 0xbd) isSoftWareControlColor= false;
92+
if(_data[1] == 0xac) {
93+
isSoftWareControlColor = true;
94+
uint8_t pageIndex = _data[2];
95+
for (uint8_t i = 0; i < 10; i++) {
96+
if(i+pageIndex*10>=HWKeyboard::LED_NUMBER) {
97+
isReceiveSuccess = true;
98+
break;
99+
}
100+
keyboard.SetRgbBufferByID(i+pageIndex*10,
101+
HWKeyboard::Color_t{_data[3+i*3], _data[4+i*3], _data[5+i*3]});
102+
}
103+
}
84104
}

3.Software/HelloWord_plugin.js

+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
2+
3+
export function Name() { return "HellowWord Keyboard"; }
4+
export function VendorId() { return 0x1001; }
5+
export function ProductId() { return 0xF103; }
6+
export function Publisher() { return "HellowWord"; }
7+
export function Size() { return [17, 8]; }
8+
export function DefaultPosition(){return [75, 55]; }
9+
export function DefaultScale(){return 18.8}
10+
export function ControllableParameters() {
11+
return [
12+
{"property":"shutdownColor", "group":"lighting", "label":"Shutdown Color", "min":"0", "max":"360", "type":"color", "default":"009bde"},
13+
{"property":"LightingMode", "group":"lighting", "label":"Lighting Mode", "type":"combobox", "values":["Canvas", "Forced"], "default":"Canvas"},
14+
{"property":"forcedColor", "group":"lighting", "label":"Forced Color", "min":"0", "max":"360", "type":"color", "default":"009bde"},
15+
];
16+
}
17+
export function Initialize() {
18+
device.log("初始化")
19+
}
20+
21+
const vKeys =
22+
[
23+
13,12,11,10,9,8,7,6,5,4,3,2,1,0, // 14
24+
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,26, 27, 28,
25+
43,42,41,40,39,38,37,36,35,34,33,32,31,30,29, // 15
26+
//29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,40, 41, 42, 43, // 14
27+
44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,55, 56, 57,
28+
71,70,69,68,67,66,65,64,63,62,61,60,59,58, // 14
29+
//58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, // 14
30+
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, //10
31+
82, 83, 84,
32+
//100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85 //背部16个灯
33+
];
34+
35+
36+
//LED对应Key的位置共82,还有19个为背景灯和三个指示灯
37+
var vLedNames = [
38+
//"Pasue","f12","f11","f10","f9","f8","f7","f6","f5","f4","f3","f2","f1","esc",
39+
"Esc", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Pasue",
40+
"~","1","2","3","4","5","6","7","8","9","0","-","=","backspace","Insert",
41+
"TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LEFT_U_BRACE", "RIGHT_U_BRACE", "BACKSLASH", "DELETE",
42+
"CAP_LOCK", "A","S","D","F","G","H","J","K","L","SEMI_COLON", "QUOTE", "ENTER", "PAGE_UP",
43+
"LEFT_SHIFT", "Z","X","C","V","B","N","M","COMMA", "PERIOD", "SLASH", "RIGHT_SHIFT", "UP_ARROW", "PAGE_DOWN",
44+
"LEFT_CTRL", "LEFT_GUI", "LEFT_ALT", "SPACE", "RIGHT_ALT", "FN", "RIGHT_CTRL", "LEFT_ARROW", "DOWN_ARROW", "RIGHT_ARROW",
45+
"Front1","Front2","Front3",
46+
//"back1","back2","back3","back4","back5","back6","back7","back8","back9","back10","back11","back12","back13","back14","back15","back16",
47+
]
48+
//上位机矩阵LED对应坐标点
49+
var vLedPositions = [
50+
//键盘的82个灯
51+
[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0], [12,0], [13,0], //14
52+
//[13,0],[12,0],[11,0],[10,0],[9,0],[8,0],[7,0],[6,0],[5,0],[4,0],[3,0],[2,0], [1,0], [0,0], //14
53+
[0,1],[1,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[11,1], [12,1], [13,1], [14,1], //15
54+
[0,2],[1,2],[2,2],[3,2],[4,2],[5,2],[6,2],[7,2],[8,2],[9,2],[10,2],[11,2], [12,2], [13,2], [14,2] ,//15
55+
[0,3],[1,3],[2,3],[3,3],[4,3],[5,3],[6,3],[7,3],[8,3],[9,3],[10,3],[11,3], [12,3], [13,3], //14
56+
[0,4],[1,4],[2,4],[3,4],[4,4],[5,4],[6,4],[7,4],[8,4],[9,4],[10,4],[11,4], [12,4], [13,4], //14
57+
[0,5],[1,5],[2,5],[3,5],[4,5],[5,5],[6,5],[7,5],[8,5],[9,5], [10,5],[11,5],[12,5], //13 指示灯 3个
58+
//背部16个灯
59+
//[0,6],[1,6],[2,6],[3,6],[4,6],[5,6],[6,6],[7,6],[8,6],[8,6],[10,6],[11,6], [12,6], [13,6], [14,6] ,[15,6],//16
60+
]
61+
62+
63+
export function LedNames() {
64+
return vLedNames;
65+
}
66+
67+
export function LedPositions() {
68+
return vLedPositions;
69+
}
70+
71+
export function Render() {
72+
sendColors();
73+
}
74+
75+
export function Shutdown() {
76+
let packet = [];
77+
packet[0x00] = 0x02;//reportid
78+
packet[0x01] = 0xBD;//控制命令:关闭软件控制
79+
packet[0x02] = 0;//第几包数据,共6包,120个灯
80+
packet[0x03] = 1;//保留字节
81+
device.write(packet,32);
82+
}
83+
/**
84+
The three above examples are each suitable for a different packet structure.
85+
The sendZone function is good for devices that use a separate packet for each LED.
86+
The sendPacket function is more suitable for devices that send multiple LEDs in a row within a single packet.
87+
The sendColors function is suitable for devices that have multiple LEDs in a packet,
88+
but they are not one directly after the other. In our case, we are going to use the sendColors function.
89+
* @param {*} zone
90+
* @param {*} shutdown
91+
*/
92+
93+
94+
function sendColors(shutdown = false){
95+
96+
const RGBData = new Array(110*3).fill(0);
97+
for(let led_idx = 0; led_idx < vKeys.length; led_idx++) {
98+
let iX = vLedPositions[led_idx][0];
99+
let iY = vLedPositions[led_idx][1];
100+
var col;
101+
102+
if(shutdown){
103+
col = hexToRgb(shutdownColor);
104+
}else if (LightingMode === "Forced") {
105+
col = hexToRgb(forcedColor);
106+
device.log("Forced:"+col)
107+
}else{
108+
col = device.color(iX, iY);
109+
}
110+
let iLedIdx = vKeys[led_idx] * 3;
111+
RGBData[iLedIdx] = col[0];
112+
RGBData[iLedIdx + 1] = col[1];
113+
RGBData[iLedIdx + 2] = col[2];
114+
}
115+
116+
//总共110灯珠,每次传输10个
117+
for(let ledPage = 0; ledPage < 12; ledPage++)
118+
{
119+
let packet = [];
120+
packet[0x00] = 0x02;//reportid,不占用实际字节,由于是多id设备,必须占用
121+
packet[0x01] = 0xac;//控制命令
122+
packet[0x02] = ledPage;//包页码
123+
//3个字节对应一个rgb灯,一个包传10个,占用30字节
124+
packet = packet.concat(RGBData.splice(0, 30));
125+
device.write(packet,33);
126+
}
127+
}
128+
129+
130+
function hexToRgb(hex) {
131+
let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
132+
let colors = [];
133+
colors[0] = parseInt(result[1], 16);
134+
colors[1] = parseInt(result[2], 16);
135+
colors[2] = parseInt(result[3], 16);
136+
137+
return colors;
138+
}
139+
140+
export function Validate(endpoint) {
141+
return endpoint.interface === -1 && endpoint.usage === 0xc00 && endpoint.usage_page === 0xffc0;
142+
}
143+
144+
export function Image() {
145+
return "";
146+
}

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
## 1. 项目说明
2828

2929
### 1.0 更新说明:
30+
**23.2.20更新**
31+
* 修改`CUSTOM_HID_EPOUT_ADDR = 2`,HID_RxCpltCallback位置变更到CUSTOM_HID_OutEvent_FS中(原来的位置可能导致while循环内无法发送report)。
32+
33+
> * main里面增加了RGB控制相关代码,可以通过HID协议发送数据包来控制键盘RGB效果
34+
> * 已对接SignalRGB,Software中添加SignalRGB插件
35+
> * report包大小33字节,前三个字节依次为reportid(本项目为2)、控制命令(0xAC(上位机控制),0xBD(关闭上位机控制),report包次序(一个包最多传10个RGB值,需要多个包拼接,从0计算);后30字节为RGB值。
36+
3037

3138
**22.8.31更新:**
3239

0 commit comments

Comments
 (0)