]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/hs60/v2/v2.c
Allow HS60 to use Community Layouts (#3862)
[qmk_firmware.git] / keyboards / hs60 / v2 / v2.c
1 /* Copyright 2018 Yiancar
2  *
3  * This program is free software: you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation, either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16 #include "v2.h"
17
18 //#include "is31fl3733.h"
19
20 // Please ignore this is for upcoming features
21 /*#ifdef RAW_ENABLE
22
23 void raw_hid_receive( uint8_t *data, uint8_t length )
24 {
25     uint8_t command = data[0];
26     switch ( command )
27     {
28         case id_protocol_version:
29         {
30             msg_protocol_version *msg = (msg_protocol_version*)&data[1];
31             msg->version = PROTOCOL_VERSION;
32             break;
33         }
34 #if USE_KEYMAPS_IN_EEPROM
35         case id_keymap_keycode_load:
36         {
37             msg_keymap_keycode_load *msg = (msg_keymap_keycode_load*)&data[1];
38             msg->keycode = keymap_keycode_load( msg->layer, msg->row, msg->column );
39             break;
40         }
41         case id_keymap_keycode_save:
42         {
43             msg_keymap_keycode_save *msg = (msg_keymap_keycode_save*)&data[1];
44             keymap_keycode_save( msg->layer, msg->row, msg->column, msg->keycode);
45             break;
46         }
47         case id_keymap_default_save:
48         {
49             keymap_default_save();
50             break;
51         }
52 #endif // USE_KEYMAPS_IN_EEPROM
53         case id_backlight_config_set_values:
54         {
55             msg_backlight_config_set_values *msg = (msg_backlight_config_set_values*)&data[1];
56             backlight_config_set_values(msg);
57             backlight_config_save();
58             break;
59         }
60         case id_backlight_config_set_alphas_mods:
61         {
62             msg_backlight_config_set_alphas_mods *msg = (msg_backlight_config_set_alphas_mods*)&data[1];
63             backlight_config_set_alphas_mods( msg->alphas_mods );
64             backlight_config_save();
65             break;
66         }
67         case id_backlight_set_key_color:
68         {
69             msg_backlight_set_key_color *msg = (msg_backlight_set_key_color*)&data[1];
70             backlight_set_key_color(msg->row, msg->column, msg->hsv);
71             break;
72         }
73         case id_system_get_state:
74         {
75             msg_system_state *msg = (msg_system_state*)&data[1];
76             msg->value = backlight_get_tick();
77             break;
78         }
79         default:
80         {
81             // Unhandled message.
82             data[0] = id_unhandled;
83             break;
84         }
85     }
86
87     // Return same buffer with values changed
88     raw_hid_send( data, length );
89
90 }
91
92 #endif*/
93
94 #ifdef HS60_ANSI
95
96 const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
97 /* Refer to IS31 manual for these locations
98  *   driver
99  *   |  R location
100  *   |  |       G location
101  *   |  |       |       B location
102  *   |  |       |       | */
103     {0, B_1,    A_1,    C_1}, //MX1
104     {0, E_1,    D_1,    F_1}, //MX2
105     {0, H_1,    G_1,    I_1}, //MX3
106     {0, K_1,    J_1,    L_1}, //MX4
107     {0, B_2,    A_2,    C_2}, //MX6
108     {0, E_2,    D_2,    F_2}, //MX7
109     {0, H_2,    G_2,    I_2}, //MX8
110     {0, K_2,    J_2,    L_2}, //MX14
111     {0, B_3,    A_3,    C_3}, //MX11
112     {0, E_3,    D_3,    F_3}, //MX12
113     {0, H_3,    G_3,    I_3}, //MX13
114     {0, K_3,    J_3,    L_3}, //MX19
115     {0, B_4,    A_4,    C_4}, //MX16
116     {0, E_4,    D_4,    F_4}, //MX17
117     {0, H_4,    G_4,    I_4}, //MX18
118     {0, K_4,    J_4,    L_4}, //MX23
119     {0, B_5,    A_5,    C_5}, //MX20
120     {0, E_5,    D_5,    F_5}, //MX21
121     {0, H_5,    G_5,    I_5}, //MX22
122     {0, K_5,    J_5,    L_5}, //MX27
123     {0, B_6,    A_6,    C_6}, //MX24
124     {0, E_6,    D_6,    F_6}, //MX25
125     {0, H_6,    G_6,    I_6}, //MX26
126     {0, K_6,    J_6,    L_6}, //MX31
127     {0, B_7,    A_7,    C_7}, //MX28
128     {0, E_7,    D_7,    F_7}, //MX29
129     {0, H_7,    G_7,    I_7}, //MX30
130     {0, K_7,    J_7,    L_7}, //MX36
131     {0, B_8,    A_8,    C_8}, //MX33
132     {0, E_8,    D_8,    F_8}, //MX34
133     {0, H_8,    G_8,    I_8}, //MX35
134     {0, K_8,    J_8,    L_8}, //MX40
135     {0, B_9,    A_9,    C_9}, //MX37
136     {0, E_9,    D_9,    F_9}, //MX38
137     {0, H_9,    G_9,    I_9}, //MX39
138     {0, K_9,    J_9,    L_9}, //MX44
139     {0, B_10,   A_10,   C_10}, //MX41
140     {0, E_10,   D_10,   F_10}, //MX42
141     {0, H_10,   G_10,   I_10}, //MX43
142     {0, K_10,   J_10,   L_10}, //MX48
143     {0, B_11,   A_11,   C_11}, //MX45
144     {0, E_11,   D_11,   F_11}, //MX46
145     {0, H_11,   G_11,   I_11}, //MX47
146     {0, K_11,   J_11,   L_11}, //MX53
147     {0, B_12,   A_12,   C_12}, //MX50
148     {0, E_12,   D_12,   F_12}, //MX51
149     {0, H_12,   G_12,   I_12}, //MX52
150
151     {0, B_13,   A_13,   C_13}, //MX55
152     {0, E_13,   D_13,   F_13}, //MX56
153
154     {0, K_13,   J_13,   L_13}, //MX61
155     {0, B_14,   A_14,   C_14}, //MX59
156     {0, E_14,   D_14,   F_14}, //MX57
157     {0, H_14,   G_14,   I_14}, //MX60
158     {0, K_14,   J_14,   L_14}, //MX62
159     {0, B_15,   A_15,   C_15}, //MX5
160     {0, E_15,   D_15,   F_15}, //MX10
161     {0, H_15,   G_15,   I_15}, //MX15
162     {0, K_15,   J_15,   L_15}, //MX32
163
164     {0, E_16,   D_16,   F_16}, //MX49
165     {0, H_16,   G_16,   I_16}, //MX54
166     {0, K_16,   J_16,   L_16}, //MX58
167 };
168
169 const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
170 //
171 //  MX1,  MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59,
172 //  MX2,  MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56,  ---,
173 //  MX3,  MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60,
174 //  MX4,  ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53,  ---, MX61,
175 //  MX5, MX10, MX15,  ---,  ---,  ---, MX32,  ---,  ---,  ---, MX49, MX54, MX58, MX62
176 /* {row | col << 4}
177  *    |           {x=0..224, y=0..64}
178  *    |              |            modifier
179  *    |              |         | */
180     {{0|(0<<4)},    {  0,  0}, 1}, //MX1
181     {{1|(0<<4)},    {  0, 16}, 1}, //MX2
182     {{2|(0<<4)},    {  0, 32}, 1}, //MX3
183     {{3|(0<<4)},    {  0, 48}, 1}, //MX4
184     {{0|(1<<4)},    { 17,  0}, 0}, //MX6
185     {{1|(1<<4)},    { 17, 16}, 0}, //MX7
186     {{2|(1<<4)},    { 17, 32}, 0}, //MX8
187     {{3|(2<<4)},    { 34, 48}, 0}, //MX14
188     {{0|(2<<4)},    { 34,  0}, 0}, //MX11
189     {{1|(2<<4)},    { 34, 16}, 0}, //MX12
190     {{2|(2<<4)},    { 34, 32}, 0}, //MX13
191     {{3|(3<<4)},    { 51, 48}, 0}, //MX19
192     {{0|(3<<4)},    { 51,  0}, 0}, //MX16
193     {{1|(3<<4)},    { 51, 16}, 0}, //MX17
194     {{2|(3<<4)},    { 51, 32}, 0}, //MX18
195     {{3|(4<<4)},    { 68, 48}, 0}, //MX23
196     {{0|(4<<4)},    { 68,  0}, 0}, //MX20
197     {{1|(4<<4)},    { 68, 16}, 0}, //MX21
198     {{2|(4<<4)},    { 68, 32}, 0}, //MX22
199     {{3|(5<<4)},    { 85, 48}, 0}, //MX27
200     {{0|(5<<4)},    { 85,  0}, 0}, //MX24
201     {{1|(5<<4)},    { 85, 16}, 0}, //MX25
202     {{2|(5<<4)},    { 85, 32}, 0}, //MX26
203     {{3|(6<<4)},    {102, 48}, 0}, //MX31
204     {{0|(6<<4)},    {102,  0}, 0}, //MX28
205     {{1|(6<<4)},    {102, 16}, 0}, //MX29
206     {{2|(6<<4)},    {102, 32}, 0}, //MX30
207     {{3|(7<<4)},    {119, 48}, 0}, //MX36
208     {{0|(7<<4)},    {119,  0}, 0}, //MX33
209     {{1|(7<<4)},    {119, 16}, 0}, //MX34
210     {{2|(7<<4)},    {119, 32}, 0}, //MX35
211     {{3|(8<<4)},    {136, 48}, 0}, //MX40
212     {{0|(8<<4)},    {136,  0}, 0}, //MX37
213     {{1|(8<<4)},    {136, 16}, 0}, //MX38
214     {{2|(8<<4)},    {136, 32}, 0}, //MX39
215     {{3|(9<<4)},    {153, 48}, 0}, //MX44
216     {{0|(9<<4)},    {153,  0}, 0}, //MX41
217     {{1|(9<<4)},    {153, 16}, 0}, //MX42
218     {{2|(9<<4)},    {153, 32}, 0}, //MX43
219     {{3|(10<<4)},   {170, 48}, 0}, //MX48
220     {{0|(10<<4)},   {170,  0}, 0}, //MX45
221     {{1|(10<<4)},   {170, 16}, 0}, //MX46
222     {{2|(10<<4)},   {170, 32}, 0}, //MX47
223     {{3|(11<<4)},   {187, 48}, 0}, //MX53
224     {{0|(11<<4)},   {187,  0}, 0}, //MX50
225     {{1|(11<<4)},   {187, 16}, 0}, //MX51
226     {{2|(11<<4)},   {187, 32}, 0}, //MX52
227
228     {{0|(12<<4)},   {204,  0}, 0}, //MX55
229     {{1|(12<<4)},   {204, 16}, 0}, //MX56
230
231     {{3|(13<<4)},   {221, 48}, 1}, //MX61
232     {{0|(13<<4)},   {221,  0}, 1}, //MX59
233     {{2|(12<<4)},   {221, 16}, 0}, //MX57
234     {{2|(13<<4)},   {221, 32}, 1}, //MX60
235     {{4|(13<<4)},   {221, 64}, 1}, //MX62
236     {{4|(0<<4)},    {  0, 64}, 1}, //MX5
237     {{4|(1<<4)},    { 17, 64}, 1}, //MX10
238     {{4|(2<<4)},    { 34, 64}, 1}, //MX15
239     {{4|(5<<4)},    {102, 64}, 0}, //MX32
240
241     {{4|(10<<4)},   {170, 64}, 1}, //MX49
242     {{4|(11<<4)},   {187, 64}, 1}, //MX54
243     {{4|(12<<4)},    {204, 64}, 1}  //MX58
244 };
245
246 #elif defined(HS60_HHKB)
247
248 const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
249 /* Refer to IS31 manual for these locations
250  *   driver
251  *   |  R location
252  *   |  |       G location
253  *   |  |       |       B location
254  *   |  |       |       | */
255     {0, B_1,    A_1,    C_1}, //MX1
256     {0, E_1,    D_1,    F_1}, //MX2
257     {0, H_1,    G_1,    I_1}, //MX3
258     {0, K_1,    J_1,    L_1}, //MX4
259     {0, B_2,    A_2,    C_2}, //MX6
260     {0, E_2,    D_2,    F_2}, //MX7
261     {0, H_2,    G_2,    I_2}, //MX8
262     {0, K_2,    J_2,    L_2}, //MX14
263     {0, B_3,    A_3,    C_3}, //MX11
264     {0, E_3,    D_3,    F_3}, //MX12
265     {0, H_3,    G_3,    I_3}, //MX13
266     {0, K_3,    J_3,    L_3}, //MX19
267     {0, B_4,    A_4,    C_4}, //MX16
268     {0, E_4,    D_4,    F_4}, //MX17
269     {0, H_4,    G_4,    I_4}, //MX18
270     {0, K_4,    J_4,    L_4}, //MX23
271     {0, B_5,    A_5,    C_5}, //MX20
272     {0, E_5,    D_5,    F_5}, //MX21
273     {0, H_5,    G_5,    I_5}, //MX22
274     {0, K_5,    J_5,    L_5}, //MX27
275     {0, B_6,    A_6,    C_6}, //MX24
276     {0, E_6,    D_6,    F_6}, //MX25
277     {0, H_6,    G_6,    I_6}, //MX26
278     {0, K_6,    J_6,    L_6}, //MX31
279     {0, B_7,    A_7,    C_7}, //MX28
280     {0, E_7,    D_7,    F_7}, //MX29
281     {0, H_7,    G_7,    I_7}, //MX30
282     {0, K_7,    J_7,    L_7}, //MX36
283     {0, B_8,    A_8,    C_8}, //MX33
284     {0, E_8,    D_8,    F_8}, //MX34
285     {0, H_8,    G_8,    I_8}, //MX35
286     {0, K_8,    J_8,    L_8}, //MX40
287     {0, B_9,    A_9,    C_9}, //MX37
288     {0, E_9,    D_9,    F_9}, //MX38
289     {0, H_9,    G_9,    I_9}, //MX39
290     {0, K_9,    J_9,    L_9}, //MX44
291     {0, B_10,   A_10,   C_10}, //MX41
292     {0, E_10,   D_10,   F_10}, //MX42
293     {0, H_10,   G_10,   I_10}, //MX43
294     {0, K_10,   J_10,   L_10}, //MX48
295     {0, B_11,   A_11,   C_11}, //MX45
296     {0, E_11,   D_11,   F_11}, //MX46
297     {0, H_11,   G_11,   I_11}, //MX47
298     {0, K_11,   J_11,   L_11}, //MX53
299     {0, B_12,   A_12,   C_12}, //MX50
300     {0, E_12,   D_12,   F_12}, //MX51
301     {0, H_12,   G_12,   I_12}, //MX52
302     {0, K_12,   J_12,   L_12}, //MX64
303     {0, B_13,   A_13,   C_13}, //MX55
304     {0, E_13,   D_13,   F_13}, //MX56
305     {0, H_13,   G_13,   I_13}, //MX63
306     {0, K_13,   J_13,   L_13}, //MX61
307     {0, B_14,   A_14,   C_14}, //MX59
308     {0, E_14,   D_14,   F_14}, //MX57
309     {0, H_14,   G_14,   I_14}, //MX60
310     {0, K_14,   J_14,   L_14}, //MX62
311     {0, B_15,   A_15,   C_15}, //MX5
312     {0, E_15,   D_15,   F_15}, //MX10
313     {0, H_15,   G_15,   I_15}, //MX15
314     {0, K_15,   J_15,   L_15}, //MX32
315
316
317     {0, H_16,   G_16,   I_16}, //MX54
318     {0, K_16,   J_16,   L_16}, //MX58
319 };
320
321 const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
322 //
323 //  MX1,  MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59,
324 //  MX2,  MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, MX64,
325 //  MX3,  MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60,
326 //  MX4, ----, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, MX63, MX61,
327 //  MX5, MX10, MX15, ----, ----, ----, MX32, ----,  ---, ----, ----, MX54, MX58, MX62
328 /* {row | col << 4}
329  *    |           {x=0..224, y=0..64}
330  *    |              |            modifier
331  *    |              |         | */
332     {{0|(0<<4)},    {  0,  0}, 1}, //MX1
333     {{1|(0<<4)},    {  0, 16}, 1}, //MX2
334     {{2|(0<<4)},    {  0, 32}, 1}, //MX3
335     {{3|(0<<4)},    {  0, 48}, 1}, //MX4
336     {{0|(1<<4)},    { 17,  0}, 0}, //MX6
337     {{1|(1<<4)},    { 17, 16}, 0}, //MX7
338     {{2|(1<<4)},    { 17, 32}, 0}, //MX8
339     {{3|(2<<4)},    { 34, 48}, 0}, //MX14
340     {{0|(2<<4)},    { 34,  0}, 0}, //MX11
341     {{1|(2<<4)},    { 34, 16}, 0}, //MX12
342     {{2|(2<<4)},    { 34, 32}, 0}, //MX13
343     {{3|(3<<4)},    { 51, 48}, 0}, //MX19
344     {{0|(3<<4)},    { 51,  0}, 0}, //MX16
345     {{1|(3<<4)},    { 51, 16}, 0}, //MX17
346     {{2|(3<<4)},    { 51, 32}, 0}, //MX18
347     {{3|(4<<4)},    { 68, 48}, 0}, //MX23
348     {{0|(4<<4)},    { 68,  0}, 0}, //MX20
349     {{1|(4<<4)},    { 68, 16}, 0}, //MX21
350     {{2|(4<<4)},    { 68, 32}, 0}, //MX22
351     {{3|(5<<4)},    { 85, 48}, 0}, //MX27
352     {{0|(5<<4)},    { 85,  0}, 0}, //MX24
353     {{1|(5<<4)},    { 85, 16}, 0}, //MX25
354     {{2|(5<<4)},    { 85, 32}, 0}, //MX26
355     {{3|(6<<4)},    {102, 48}, 0}, //MX31
356     {{0|(6<<4)},    {102,  0}, 0}, //MX28
357     {{1|(6<<4)},    {102, 16}, 0}, //MX29
358     {{2|(6<<4)},    {102, 32}, 0}, //MX30
359     {{3|(7<<4)},    {119, 48}, 0}, //MX36
360     {{0|(7<<4)},    {119,  0}, 0}, //MX33
361     {{1|(7<<4)},    {119, 16}, 0}, //MX34
362     {{2|(7<<4)},    {119, 32}, 0}, //MX35
363     {{3|(8<<4)},    {136, 48}, 0}, //MX40
364     {{0|(8<<4)},    {136,  0}, 0}, //MX37
365     {{1|(8<<4)},    {136, 16}, 0}, //MX38
366     {{2|(8<<4)},    {136, 32}, 0}, //MX39
367     {{3|(9<<4)},    {153, 48}, 0}, //MX44
368     {{0|(9<<4)},    {153,  0}, 0}, //MX41
369     {{1|(9<<4)},    {153, 16}, 0}, //MX42
370     {{2|(9<<4)},    {153, 32}, 0}, //MX43
371     {{3|(10<<4)},   {170, 48}, 0}, //MX48
372     {{0|(10<<4)},   {170,  0}, 0}, //MX45
373     {{1|(10<<4)},   {170, 16}, 0}, //MX46
374     {{2|(10<<4)},   {170, 32}, 0}, //MX47
375     {{3|(11<<4)},   {187, 48}, 0}, //MX53
376     {{0|(11<<4)},   {187,  0}, 0}, //MX50
377     {{1|(11<<4)},   {187, 16}, 0}, //MX51
378     {{2|(11<<4)},   {187, 32}, 0}, //MX52
379     {{1|(13<<4)},   {221,  0}, 1}, //MX64
380     {{0|(12<<4)},   {204,  0}, 0}, //MX55
381     {{1|(12<<4)},   {204, 16}, 0}, //MX56
382     {{3|(12<<4)},   {204, 48}, 0}, //MX63
383     {{3|(13<<4)},   {212, 48}, 1}, //MX61
384     {{0|(13<<4)},   {221,  0}, 0}, //MX59
385     {{2|(12<<4)},   {221, 16}, 0}, //MX57
386     {{2|(13<<4)},   {221, 32}, 1}, //MX60
387     {{4|(13<<4)},   {221, 64}, 1}, //MX62
388     {{4|(0<<4)},    {  0, 64}, 1}, //MX5
389     {{4|(1<<4)},    { 17, 64}, 1}, //MX10
390     {{4|(2<<4)},    { 34, 64}, 1}, //MX15
391     {{4|(5<<4)},    {102, 64}, 0}, //MX32
392
393
394     {{4|(11<<4)},   {187, 64}, 1}, //MX54
395     {{4|(12<<4)},    {204, 64}, 1}  //MX58
396 };
397
398 #else //ISO layout
399
400 const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
401 /* Refer to IS31 manual for these locations
402  *   driver
403  *   |  R location
404  *   |  |       G location
405  *   |  |       |       B location
406  *   |  |       |       | */
407     {0, B_1,    A_1,    C_1}, //MX1
408     {0, E_1,    D_1,    F_1}, //MX2
409     {0, H_1,    G_1,    I_1}, //MX3
410     {0, K_1,    J_1,    L_1}, //MX4
411     {0, B_2,    A_2,    C_2}, //MX6
412     {0, E_2,    D_2,    F_2}, //MX7
413     {0, H_2,    G_2,    I_2}, //MX8
414     {0, K_2,    J_2,    L_2}, //MX14
415     {0, B_3,    A_3,    C_3}, //MX11
416     {0, E_3,    D_3,    F_3}, //MX12
417     {0, H_3,    G_3,    I_3}, //MX13
418     {0, K_3,    J_3,    L_3}, //MX19
419     {0, B_4,    A_4,    C_4}, //MX16
420     {0, E_4,    D_4,    F_4}, //MX17
421     {0, H_4,    G_4,    I_4}, //MX18
422     {0, K_4,    J_4,    L_4}, //MX23
423     {0, B_5,    A_5,    C_5}, //MX20
424     {0, E_5,    D_5,    F_5}, //MX21
425     {0, H_5,    G_5,    I_5}, //MX22
426     {0, K_5,    J_5,    L_5}, //MX27
427     {0, B_6,    A_6,    C_6}, //MX24
428     {0, E_6,    D_6,    F_6}, //MX25
429     {0, H_6,    G_6,    I_6}, //MX26
430     {0, K_6,    J_6,    L_6}, //MX31
431     {0, B_7,    A_7,    C_7}, //MX28
432     {0, E_7,    D_7,    F_7}, //MX29
433     {0, H_7,    G_7,    I_7}, //MX30
434     {0, K_7,    J_7,    L_7}, //MX36
435     {0, B_8,    A_8,    C_8}, //MX33
436     {0, E_8,    D_8,    F_8}, //MX34
437     {0, H_8,    G_8,    I_8}, //MX35
438     {0, K_8,    J_8,    L_8}, //MX40
439     {0, B_9,    A_9,    C_9}, //MX37
440     {0, E_9,    D_9,    F_9}, //MX38
441     {0, H_9,    G_9,    I_9}, //MX39
442     {0, K_9,    J_9,    L_9}, //MX44
443     {0, B_10,   A_10,   C_10}, //MX41
444     {0, E_10,   D_10,   F_10}, //MX42
445     {0, H_10,   G_10,   I_10}, //MX43
446     {0, K_10,   J_10,   L_10}, //MX48
447     {0, B_11,   A_11,   C_11}, //MX45
448     {0, E_11,   D_11,   F_11}, //MX46
449     {0, H_11,   G_11,   I_11}, //MX47
450     {0, K_11,   J_11,   L_11}, //MX53
451     {0, B_12,   A_12,   C_12}, //MX50
452     {0, E_12,   D_12,   F_12}, //MX51
453     {0, H_12,   G_12,   I_12}, //MX52
454     {0, K_12,   J_12,   L_12}, //MX9
455     {0, B_13,   A_13,   C_13}, //MX55
456     {0, E_13,   D_13,   F_13}, //MX56
457
458     {0, K_13,   J_13,   L_13}, //MX61
459     {0, B_14,   A_14,   C_14}, //MX59
460     {0, E_14,   D_14,   F_14}, //MX57
461     {0, H_14,   G_14,   I_14}, //MX60
462     {0, K_14,   J_14,   L_14}, //MX62
463     {0, B_15,   A_15,   C_15}, //MX5
464     {0, E_15,   D_15,   F_15}, //MX10
465     {0, H_15,   G_15,   I_15}, //MX15
466     {0, K_15,   J_15,   L_15}, //MX32
467
468     {0, E_16,   D_16,   F_16}, //MX49
469     {0, H_16,   G_16,   I_16}, //MX54
470     {0, K_16,   J_16,   L_16}, //MX58
471 };
472
473 const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
474 //
475 //  MX1,  MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59,
476 //  MX2,  MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56,  ---,
477 //  MX3,  MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60,
478 //  MX4,  ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53,  ---, MX61,
479 //  MX5, MX10, MX15,  ---,  ---,  ---, MX32,  ---,  ---,  ---, MX49, MX54, MX58, MX62
480 /* {row | col << 4}
481  *    |           {x=0..224, y=0..64}
482  *    |              |            modifier
483  *    |              |         | */
484     {{0|(0<<4)},    {  0,  0}, 1}, //MX1
485     {{1|(0<<4)},    {  0, 16}, 1}, //MX2
486     {{2|(0<<4)},    {  0, 32}, 1}, //MX3
487     {{3|(0<<4)},    {  0, 48}, 1}, //MX4
488     {{0|(1<<4)},    { 17,  0}, 0}, //MX6
489     {{1|(1<<4)},    { 17, 16}, 0}, //MX7
490     {{2|(1<<4)},    { 17, 32}, 0}, //MX8
491     {{3|(2<<4)},    { 34, 48}, 0}, //MX14
492     {{0|(2<<4)},    { 34,  0}, 0}, //MX11
493     {{1|(2<<4)},    { 34, 16}, 0}, //MX12
494     {{2|(2<<4)},    { 34, 32}, 0}, //MX13
495     {{3|(3<<4)},    { 51, 48}, 0}, //MX19
496     {{0|(3<<4)},    { 51,  0}, 0}, //MX16
497     {{1|(3<<4)},    { 51, 16}, 0}, //MX17
498     {{2|(3<<4)},    { 51, 32}, 0}, //MX18
499     {{3|(4<<4)},    { 68, 48}, 0}, //MX23
500     {{0|(4<<4)},    { 68,  0}, 0}, //MX20
501     {{1|(4<<4)},    { 68, 16}, 0}, //MX21
502     {{2|(4<<4)},    { 68, 32}, 0}, //MX22
503     {{3|(5<<4)},    { 85, 48}, 0}, //MX27
504     {{0|(5<<4)},    { 85,  0}, 0}, //MX24
505     {{1|(5<<4)},    { 85, 16}, 0}, //MX25
506     {{2|(5<<4)},    { 85, 32}, 0}, //MX26
507     {{3|(6<<4)},    {102, 48}, 0}, //MX31
508     {{0|(6<<4)},    {102,  0}, 0}, //MX28
509     {{1|(6<<4)},    {102, 16}, 0}, //MX29
510     {{2|(6<<4)},    {102, 32}, 0}, //MX30
511     {{3|(7<<4)},    {119, 48}, 0}, //MX36
512     {{0|(7<<4)},    {119,  0}, 0}, //MX33
513     {{1|(7<<4)},    {119, 16}, 0}, //MX34
514     {{2|(7<<4)},    {119, 32}, 0}, //MX35
515     {{3|(8<<4)},    {136, 48}, 0}, //MX40
516     {{0|(8<<4)},    {136,  0}, 0}, //MX37
517     {{1|(8<<4)},    {136, 16}, 0}, //MX38
518     {{2|(8<<4)},    {136, 32}, 0}, //MX39
519     {{3|(9<<4)},    {153, 48}, 0}, //MX44
520     {{0|(9<<4)},    {153,  0}, 0}, //MX41
521     {{1|(9<<4)},    {153, 16}, 0}, //MX42
522     {{2|(9<<4)},    {153, 32}, 0}, //MX43
523     {{3|(10<<4)},   {170, 48}, 0}, //MX48
524     {{0|(10<<4)},   {170,  0}, 0}, //MX45
525     {{1|(10<<4)},   {170, 16}, 0}, //MX46
526     {{2|(10<<4)},   {170, 32}, 0}, //MX47
527     {{3|(11<<4)},   {187, 48}, 0}, //MX53
528     {{0|(11<<4)},   {187,  0}, 0}, //MX50
529     {{1|(11<<4)},   {187, 16}, 0}, //MX51
530     {{2|(11<<4)},   {187, 32}, 0}, //MX52
531     {{3|(2<<4)},    { 17, 32}, 1}, //MX9
532     {{0|(12<<4)},   {204,  0}, 0}, //MX55
533     {{1|(12<<4)},   {204, 16}, 0}, //MX56
534
535     {{3|(13<<4)},   {221, 48}, 1}, //MX61
536     {{0|(13<<4)},   {221,  0}, 1}, //MX59
537     {{2|(12<<4)},   {204, 32}, 0}, //MX57
538     {{2|(13<<4)},   {221, 24}, 1}, //MX60
539     {{4|(13<<4)},   {221, 64}, 1}, //MX62
540     {{4|(0<<4)},    {  0, 64}, 1}, //MX5
541     {{4|(1<<4)},    { 17, 64}, 1}, //MX10
542     {{4|(2<<4)},    { 34, 64}, 1}, //MX15
543     {{4|(5<<4)},    {102, 64}, 0}, //MX32
544
545     {{4|(10<<4)},   {170, 64}, 1}, //MX49
546     {{4|(11<<4)},   {187, 64}, 1}, //MX54
547     {{4|(12<<4)},    {204, 64}, 1}  //MX58
548 };
549
550 #endif
551
552 void bootmagic_lite(void)
553 {
554     // The lite version of TMK's bootmagic made by Wilba.
555     // 100% less potential for accidentally making the
556     // keyboard do stupid things.
557
558     // We need multiple scans because debouncing can't be turned off.
559     matrix_scan();
560     wait_ms(10);
561     matrix_scan();
562
563     // If the Esc and space bar are held down on power up,
564     // reset the EEPROM valid state and jump to bootloader.
565     // Assumes Esc is at [0,0] and spacebar is at [4,6].
566     // This isn't very generalized, but we need something that doesn't
567     // rely on user's keymaps in firmware or EEPROM.
568     if ( ( matrix_get_row(0) & (1<<0) ) &&
569         ( matrix_get_row(4) & (1<<6) ) )
570     {
571         // Set the TMK/QMK EEPROM state as invalid.
572         eeconfig_disable();
573         //eeprom_set_valid(false);
574         // Jump to bootloader.
575         bootloader_jump();
576     }
577 }
578
579 void matrix_init_kb(void) {
580     // put your keyboard start-up code here
581     // runs once when the firmware starts up
582
583     bootmagic_lite();
584
585     // Please ignore this is for upcoming features
586     // If the EEPROM has the magic, the data is good.
587     // OK to load from EEPROM.
588     /*if (eeprom_is_valid())
589     {
590         backlight_config_load();
591
592         // TODO: do something to "turn on" keymaps in EEPROM?
593     }
594     else
595     {
596         // If the EEPROM has not been saved before, or is out of date,
597         // save the default values to the EEPROM. Default values
598         // come from construction of the zeal_backlight_config instance.
599         backlight_config_save();
600
601         // Clear the LED colors stored in EEPROM
602         for ( int row=0; row < MATRIX_ROWS; row++ )
603         {
604             HSV hsv;
605             for ( int column=0; column < MATRIX_COLS; column++ )
606             {
607                 hsv.h = rand() & 0xFF;
608                 hsv.s = rand() & 0x7F;
609                 hsv.v = 255;
610                 backlight_set_key_color( row, column, hsv );
611             }
612         }
613         #ifdef USE_KEYMAPS_IN_EEPROM
614         keymap_default_save();
615         #endif
616         // Save the magic number last, in case saving was interrupted
617         eeprom_set_valid(true);
618     }*/
619
620     matrix_init_user();
621 }
622
623 void matrix_scan_kb(void) {
624
625     matrix_scan_user();
626 }
627
628 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
629
630     return process_record_user(keycode, record);
631 }
632
633 void led_set_kb(uint8_t usb_led) {
634     //backlight_set_indicator_state(usb_led);
635 }