#!/usr/bin/python2 import sys import os.path import imp import usb.core import usb.util from time import sleep dev = None intf = None def help(): print 'Use :' print 'g810-led {key} {color}' print 'g810-led {profilefile}' def main(): if len(sys.argv) == 2: profilefile = sys.argv[1] if os.path.exists(profilefile) is True: try: g810profile = imp.load_source('g810profile', profilefile) except: print 'Error loading profile file, exiting...' sys.exit() if g810profile is None: print "Nothing to do, exiting..." sys.exit() applyProfile(g810profile) elif len(sys.argv) == 3: attachKeyboard() setKeyColor(sys.argv[1], sys.argv[2]) updateKeyboard() detachKeyboard() def applyProfile(profile): keys = dir(profile) attachKeyboard() for key in keys: color = eval('profile.'+key) if color is not None: if len(color) == 6: setKeyColor(key, color) updateKeyboard() detachKeyboard() def attachKeyboard(): global dev global intf dev = usb.core.find(idVendor=0x046d, idProduct=0xc33f) if dev is None: print 'Device not found, exiting...' sys.exit() intf = 1 if dev.is_kernel_driver_active(intf) is True: dev.detach_kernel_driver(intf) usb.util.claim_interface(dev, intf) def detachKeyboard(): global dev global intf if intf is not None: usb.util.release_interface(dev, intf) dev.attach_kernel_driver(intf) dev = None intf = None def updateKeyboard(): global dev try: data = '11ff107f00000000000000000000000000000000' print data data = [ int(''.join([data[i], data[i+1]]), base=16) for i in range(0, len(data), 2)] dev.ctrl_transfer(0x21,0x09,0x0211,1,data) except: print 'Error updating keyboard' def setKeyColor(key, color): ext = True key = key.lower() if key == 'logo': base = '11ff101b' key = 'd2' ext = False elif (key == 'backlight') or (key == 'light'): base = '11ff101f' key = '99' ext = False elif key == 'next': base = '11ff101f' key = '9d' ext = False elif key == 'prev': base = '11ff101f' key = '9e' ext = False elif (key == 'playpause') or (key == 'play' or (key == 'pause')): base = '11ff101f' key = '9b' ext = False elif key == 'mute': base = '11ff101f' key = '9c' ext = False elif key == 'g1': base = '11ff101f' key = 'b4' ext = False elif key == 'g2': base = '11ff101f' key = 'b5' ext = False elif key == 'g3': base = '11ff101f' key = 'b6' ext = False elif key == 'g4': base = '11ff101f' key = 'b7' ext = False elif key == 'g5': base = '11ff101f' key = 'b8' ext = False else: base = '12ff0c3a0001000e' if key == 'a': key = '04' elif key == 'b': key = '05' elif key == 'c': key = '06' elif key == 'd': key = '07' elif key == 'e': key = '08' elif key == 'f': key = '09' elif key == 'g': key = '0a' elif key == 'h': key = '0b' elif key == 'i': key = '0c' elif key == 'j': key = '0d' elif key == 'k': key = '0e' elif key == 'l': key = '0f' elif key == 'm': key = '10' elif key == 'n': key = '11' elif key == 'o': key = '12' elif key == 'p': key = '13' elif key == 'q': key = '14' elif key == 'r': key = '15' elif key == 's': key = '16' elif key == 't': key = '17' elif key == 'u': key = '18' elif key == 'v': key = '19' elif key == 'w': key = '1a' elif key == 'x': key = '1b' elif key == 'z': key = '1c' elif key == 'y': key = '1d' elif (key == 'one') or (key == '1') or (key == 'n1'): key = '1e' elif (key == 'two') or (key == '2') or (key == 'n2'): key = '1f' elif (key == 'three') or (key == '3') or (key == 'n3'): key = '20' elif (key == 'four') or (key == '4') or (key == 'n4'): key = '21' elif (key == 'five') or (key == '5') or (key == 'n5'): key = '22' elif (key == 'six') or (key == '6') or (key == 'n6'): key = '23' elif (key == 'seven') or (key == '7') or (key == 'n7'): key = '24' elif (key == 'eight') or (key == '8') or (key == 'n8'): key = '25' elif (key == 'nine') or (key == '9') or (key == 'n9'): key = '26' elif (key == 'zero') or (key == '0') or (key == 'n0'): key = '27' elif key == 'enter': key = '28' elif (key == 'escape') or (key == 'esc'): key = '29' elif (key == 'backspace') or (key == 'back'): key = '2a' elif key == 'tab': key = '2b' elif key == 'space': key = '2c' elif (key == 'apostrophe') or (key == '?') or (key == "'"): key = '2d' elif (key == 'tidle') or (key == '^'): key = '2e' elif (key == 'open_bracket') or (key == 'openbracket') or (key == 'egrave'): key = '2f' elif (key == 'close_bracket') or (key == 'closebracket') or (key == '!'): key = '30' elif (key == '$') or (key == 'dollar'): key = '32' elif key == 'eaigu': key = '33' elif key == 'agrave': key = '34' elif key == 'degre': key = '35' elif (key == 'comma') or (key == ','): key = '36' elif (key == 'dot') or (key == '.'): key = '37' elif (key == 'minus') or (key == '-'): key = '38' elif (key == 'caps_lock') or (key == 'capslock'): key = '39' elif key == 'f1': key = '3a' elif key == 'f2': key = '3b' elif key == 'f3': key = '3c' elif key == 'f4': key = '3d' elif key == 'f5': key = '3e' elif key == 'f6': key = '3f' elif key == 'f7': key = '40' elif key == 'f8': key = '41' elif key == 'f9': key = '42' elif key == 'f10': key = '43' elif key == 'f11': key = '44' elif key == 'f12': key = '45' elif (key == 'print_screen') or (key == 'printscreen') or (key == 'printscr') or (key == 'print'): key = '46' elif (key == 'scroll_lock') or (key == 'scrolllock'): key = '47' elif (key == 'pause_break') or (key == 'pausebreak') or (key == 'breack'): key = '48' elif key == 'insert': key = '49' elif key == 'home': key = '4a' elif (key == 'page_up') or (key == 'pageup'): key = '4b' elif (key == 'delete') or (key == 'del'): key = '4c' elif key == 'end': key = '4d' elif (key == 'page_down') or (key == 'pagedown'): key = '4e' elif (key == 'arrowright') or (key == 'right'): key = '4f' elif (key == 'arrowleft') or (key == 'left'): key = '50' elif (key == 'arrowbottom') or (key == 'bottom'): key = '51' elif (key == 'arrowtop') or (key == 'top'): key = '52' elif (key == 'num_lock') or (key == 'numlock'): key = '53' elif (key == 'num/') or (key == 'num_slash') or (key == 'numslash'): key = '54' elif (key == 'num*') or (key == 'num_asterisk') or (key == 'numasterisk'): key = '55' elif (key == 'num-') or (key == 'num_minus') or (key == 'numminus'): key = '56' elif (key == 'num+') or (key == 'num_plus') or (key == 'numplus'): key = '57' elif key == 'numenter': key = '58' elif key == 'num1': key = '59' elif key == 'num2': key = '5a' elif key == 'num3': key = '5b' elif key == 'num4': key = '5c' elif key == 'num5': key = '5d' elif key == 'num6': key = '5e' elif key == 'num7': key = '5f' elif key == 'num8': key = '60' elif key == 'num9': key = '61' elif key == 'num0': key = '62' elif (key == 'num.') or (key == 'numdot'): key = '63' elif (key == '<') or (key == '>') or (key == 'backslash'): key = '64' elif key == 'menu': key = '65' elif (key == 'ctrlleft') or (key == 'ctrll'): key = 'e0' elif (key == 'shiftleft') or (key == 'shiftl'): key = 'e1' elif (key == 'altleft') or (key == 'altl'): key = 'e2' elif (key == 'metaleft') or (key == 'metal') or (key == 'winleft') or (key == 'winl'): key = 'e3' elif (key == 'ctrlright') or (key == 'ctrlr'): key = 'e4' elif (key == 'shiftright') or (key == 'shiftr'): key = 'e5' elif (key == 'altgr') or (key == 'altr'): key = 'e6' elif (key == 'metaright') or (key == 'metar') or (key == 'winright') or (key == 'winr'): key = 'e7' else: return setKeyColorInternal(base, key, color, ext) def setKeyColorInternal(base, key, color, ext): global dev try: data = base+key+color+'000000000000000000000000' if ext is True: data = data + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' print data data = [ int(''.join([data[i], data[i+1]]), base=16) for i in range(0, len(data), 2)] dev.ctrl_transfer(0x21,0x09,0x0211,1,data) sleep(0.001) except: print 'Error setting color: key=' + key + " color=" + color if len(sys.argv) > 1: if sys.argv[1] == '--help': help() sys.exit() main()