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
+ }
0 commit comments