Skip to content

Commit df4a499

Browse files
committed
Add support for Madlions MAD60HE
1 parent 6513b2b commit df4a499

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

AnalogSense.js

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ const KEY_NUMPAD9 = 0x61;
208208
const KEY_NUMPAD0 = 0x62;
209209
const KEY_NUMPAD_DECIMAL = 0x63;
210210
const KEY_INTL_BACKSLASH = 0x64;
211-
const KEY_CONTEXT_MENU = 0x65;
211+
const KEY_CTX = 0x65;
212212
const KEY_POWER = 0x66;
213213
const KEY_NUMPAD_EQUAL = 0x67;
214214
const KEY_F13 = 0x68;
@@ -698,6 +698,76 @@ class AsProviderKeychron extends AsProvider
698698
}
699699
}
700700

701+
class AsProviderMadlions extends AsProvider
702+
{
703+
static populateFilters(filters)
704+
{
705+
// MAD60HE
706+
filters.push({ vendorId: 0x373b, usagePage: 0xFF60, usage: 0x61, productId: 0x1055 });
707+
filters.push({ vendorId: 0x373b, usagePage: 0xFF60, usage: 0x61, productId: 0x1056 });
708+
filters.push({ vendorId: 0x373b, usagePage: 0xFF60, usage: 0x61, productId: 0x105D });
709+
}
710+
711+
startListening(handler)
712+
{
713+
const layout = [
714+
/* 0 */ KEY_ESCAPE, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUALS, KEY_BACKSPACE,
715+
/* 14 */ KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_BRACKET_LEFT, KEY_BRACKET_RIGHT, KEY_BACKSLASH,
716+
/* 28 */ KEY_CAPS_LOCK, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_QUOTE, KEY_NONE, KEY_ENTER,
717+
/* 42 */ KEY_LSHIFT, KEY_NONE, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH, KEY_NONE, KEY_RSHIFT,
718+
/* 56 */ KEY_LCTRL, KEY_LMETA, KEY_LALT, KEY_NONE, KEY_NONE, KEY_NONE, KEY_SPACE, KEY_NONE, KEY_NONE, KEY_RMETA, KEY_RALT, KEY_CTX, KEY_RCTRL, KEY_FN,
719+
];
720+
721+
this.offset = 0;
722+
this.buffer = {};
723+
724+
const buf = new Uint8Array(32);
725+
buf.set([
726+
0x02, 0x96, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x04,
727+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730+
]);
731+
this.dev.sendReport(0, buf);
732+
733+
const _this = this;
734+
this.dev.oninputreport = function(event)
735+
{
736+
for (let i = 0; i != 4; ++i)
737+
{
738+
if (_this.offset + i < layout.length)
739+
{
740+
const key = layout[_this.offset + i];
741+
const travel = event.data.getUint16(7 + (i * 5) + 3);
742+
if (travel == 0)
743+
{
744+
delete _this.buffer[key];
745+
}
746+
else
747+
{
748+
_this.buffer[key] = travel / 350;
749+
}
750+
}
751+
}
752+
handler(_this._bufferToActiveKeys());
753+
754+
_this.offset += 4;
755+
if (_this.offset >= layout.length)
756+
{
757+
_this.offset = 0;
758+
}
759+
760+
buf[6] = _this.offset;
761+
_this.dev.sendReport(0, buf);
762+
};
763+
}
764+
765+
stopListening()
766+
{
767+
this.dev.oninputreport = undefined;
768+
}
769+
}
770+
701771
window.analogsense = {
702772
providers: [
703773
AsProviderWooting,
@@ -706,6 +776,7 @@ window.analogsense = {
706776
AsProviderNuphy,
707777
AsProviderDrunkdeer,
708778
AsProviderKeychron,
779+
AsProviderMadlions,
709780
],
710781
findProviderForDevice: function(dev)
711782
{

0 commit comments

Comments
 (0)