@@ -208,7 +208,7 @@ const KEY_NUMPAD9 = 0x61;
208208const KEY_NUMPAD0 = 0x62 ;
209209const KEY_NUMPAD_DECIMAL = 0x63 ;
210210const KEY_INTL_BACKSLASH = 0x64 ;
211- const KEY_CONTEXT_MENU = 0x65 ;
211+ const KEY_CTX = 0x65 ;
212212const KEY_POWER = 0x66 ;
213213const KEY_NUMPAD_EQUAL = 0x67 ;
214214const 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+
701771window . 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