def read_mode(): global et312, i try: et312.read(0x407b) print(i) i += 1 except Exception: print("Current mode read failed!")
def on_message(client, userdata, msg): # TODO: automadom/et312/status { mode: "Waves", channel_a: 0, channel_b: 10, ma: 50 } # TODO: automadom/et312/ramp { channel_a_level: 50, channel_a_ramptime: 4, channel_b_level: 50, channel_b_ramptime: 4 } # TODO: automadom/et312/set { channel_a: 50, channel_b: 60 } command = msg.topic.split('/') if (command[2] == 'channel_a'): base = 0x4000 level = int(msg.payload.decode("utf-8")) print("Set channel_a to " + str(level)) et312.write(base + 0xac, [0]) # no select et312.write(base + 0xa8, [0, 0]) # rate, direction et312.write(base + 0xa5, [level]) if (command[2] == 'channel_b'): base = 0x4100 level = int(msg.payload.decode("utf-8")) print("Set channel_b to " + str(level)) et312.write(base + 0xac, [0]) # no select et312.write(base + 0xa8, [0, 0]) # rate, direction et312.write(base + 0xa5, [level]) if (command[2] == 'status'): print("ADC4 (Level A knob) : {0:#x}".format(et312.read(0x4064))) print("ADC5 (Level B knob) : {0:#x}".format(et312.read(0x4065))) print("ADC3 (Battery voltage) : {0:#x}".format( et312.read(0x4063))) print("ADC1 (MA knob) : {0:#x}".format(et312.read(0x4061))) print(" MA scaled value : %d (mode range %d-%d)" % (et312.read(0x420d), et312.read(0x4086), et312.read(0x4087)))
def main(): parser = argparse.ArgumentParser() parser.add_argument("-p", "--port", dest="serial_port", help="Serial Port to use") args = parser.parse_args() if not args.serial_port: print("Serial port argument is required!") sys.exit(1) with buttshock.et312.ET312SerialSync(args.serial_port) as et312: print("Key is {0:#x} ({0})".format(et312.key, et312.key)) # Get the current mode print("Current box key: {0:#x}".format(et312.read(0x4213))) print("Current host key: {0:#x}".format(et312.read(0x4212)))
with open(args.input_file, "rb") as f: input_file = bytearray(f.read()) program = int(args.program_number) if (args.port): import sys sys.path.append("../../buttshock-py/") import buttshock.et312 et312 = buttshock.et312.ET312SerialSync(args.port) # try: # et312.perform_handshake() # except buttshock.ButtshockError as e: # print("Handshake failed") # exit if (args.usermode): program = et312.read(0x8017+int(args.usermode)) print ("user mode %d is module %d"%(int(args.usermode),program)) else: program = int(args.program_number) memory_definitions = {} if args.definition_file: import re f = open(args.definition_file,"r") for line in f: definition = re.search('\|[^\$]+\$([0-9a-fA-F]+)[^\|]*\|\s+([^|]*)',line) if definition: memloc = int(definition.group(1),16) if (memloc >= 0x4000 and memloc <= 0x4fff): # print "%04x=%s"%(memloc-0x4000,definition.group(2))
def main(): parser = argparse.ArgumentParser() parser.add_argument("-c","--channel",dest="channel",help="Channel a or b or empty for both") parser.add_argument("-l","--level",dest="level",help="Set output to given level") parser.add_argument("-p","--port",dest="port",help="Port for ET312 (default /dev/ttyUSB0)") parser.add_argument("-r","--ramp",dest="ramp",help="Ramp down from given level") args = parser.parse_args() port = "/dev/ttyUSB0" # lazy default if (args.port): port = args.port # Lock the serial port while we use it, wait a few seconds connected = False for _ in range(10): try: et312 = buttshock.et312.ET312SerialSync(port) if et312.port.isOpen(): fcntl.flock(et312.port.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) connected = True break except Exception as e: print(e) sleep(.2) if (not connected): print ("Failed") return try: et312.perform_handshake() # this location gets written a 0 when any mode starts, but otherwise unused arewerunning = et312.read(0x4093) if (arewerunning != 42): # so let's get it into a blank empty mode. easiest way is calltable 18 et312.write(0x4078, [0x90]) # mode 90 doesn't exist et312.write(0x4070, [18]) # execute mode 90 while (et312.read(0x4070) != 0xff): pass # Overwrite name of current mode with spaces, then display "Game" et312.write(0x4180, [0x64]) et312.write(0x4070, [0x15]) while (et312.read(0x4070) != 0xff): pass for pos, char in enumerate('Game'): et312.write(0x4180, [ord(char),pos+9]) et312.write(0x4070, [0x13]) while (et312.read(0x4070) != 0xff): pass for base in [0x4000,0x4100]: et312.write(base+0xa8, [0,0]) # don't increment channel A intensity et312.write(base+0xa5, [128]) # A intensity mod value = min et312.write(base+0xac, [0]) # no select et312.write(base+0xb1, [0]) # rate et312.write(base+0xae, [0x64]) # freq mod et312.write(base+0xb5, [4]) # select normal parms et312.write(base+0xb7, [0xc8]) # width mod value et312.write(base+0xba, [0]) # width mod value et312.write(base+0xbe, [4]) # select normal parms et312.write(base+0x9c, [255]) # ramp off #et312.write(0x4098,[5,5,1]) # gate it! et312.write(0x4093,[42]) # we're provisioned for base in [0x4000,0x4100]: if ( (not args.channel) or (base == 0x4000 and args.channel == "a") or ( base == 0x4100 and args.channel == "b")): et312.write(base+0xac, [0]) # no select if (args.level): level = int(args.level) et312.write(base+0xa8, [0, 0]) # rate, direction et312.write(base+0xa5, [level]) elif (args.ramp): level = int(args.ramp) # let it drop down to nothing et312.write(base+0xa5, [level]) et312.write(base+0xa6, [128,level]) # Min, Max et312.write(base+0xa8, [10, 255]) # rate, direction et312.write(base+0xaa, [0xfc]) # at min? then stop! et312.write(base+0xac, [1]) # use fast timer except Exception as e: print(e) if (et312): et312.reset_key() # reset cipher key so easy resync next time et312.close()
with open(args.input_file, "rb") as f: input_file = bytearray(f.read()) program = int(args.program_number) if (args.port): import sys sys.path.append("../../buttshock-py/") import buttshock.et312 et312 = buttshock.et312.ET312SerialSync(args.port) # try: # et312.perform_handshake() # except buttshock.ButtshockError as e: # print("Handshake failed") # exit if (args.usermode): program = et312.read(0x8017 + int(args.usermode)) print("user mode %d is module %d" % (int(args.usermode), program)) else: program = int(args.program_number) memory_definitions = {} if args.definition_file: import re f = open(args.definition_file, "r") for line in f: definition = re.search('\|[^\$]+\$([0-9a-fA-F]+)[^\|]*\|\s+([^|]*)', line) if definition: memloc = int(definition.group(1), 16) if (memloc >= 0x4000 and memloc <= 0x4fff):
def main(): modes = { 0x76: "Waves", 0x77: "Stroke", 0x78: "Climb", 0x79: "Combo", 0x7a: "Intense", 0x7b: "Rhythm", 0x7c: "Audio1", 0x7d: "Audio2", 0x7e: "Audio3", 0x80: "Random1", 0x81: "Random2", 0x82: "Toggle", 0x83: "O****m", 0x84: "Torment", 0x85: "Phase1", 0x86: "Phase2", 0x87: "Phase3", 0x88: "User1", 0x89: "User2", 0x8a: "User3", 0x8b: "User4", 0x8c: "User5", 0: "None", 0x7f: "Split" } powerlevels = {1: "Low (1)", 2: "Normal (2)", 3: "High (3)"} parser = argparse.ArgumentParser() parser.add_argument("-p", "--port", dest="port", help="Port for ET312 (default /dev/ttyUSB0)") args = parser.parse_args() port = "/dev/ttyUSB0" # lazy default if (args.port): port = args.port # Lock the serial port while we use it, wait a few seconds connected = False for _ in range(10): try: et312 = buttshock.et312.ET312SerialSync(port) if et312.port.isOpen(): fcntl.flock(et312.port.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) connected = True break except Exception as e: print(e) sleep(.2) if (not connected): print("Failed") return try: print("[+] connected") # no need to do a handshake unless we want to poke # print ("[+] trying handshake") # et312.perform_handshake() # print ("[+] handshake ok") print("ADC0 (current sense)\t\t: {0:#x}".format(et312.read(0x4060))) print("ADC1 (MA knob)\t\t\t: {0:#x}".format(et312.read(0x4061))) print("\tMA scaled value\t\t: %d (mode range %d-%d)" % (et312.read(0x420d), et312.read(0x4086), et312.read(0x4087))) print("ADC2 (PSU voltage)\t\t: {0:#x}".format(et312.read(0x4062))) print("ADC3 (Battery voltage)\t\t: {0:#x}".format(et312.read(0x4063))) print("\tBattery at boot\t\t: {0:.1f}%".format( (et312.read(0x4203)) * 100 / 256)) print("ADC4 (Level A knob)\t\t: {0:#x}".format(et312.read(0x4064))) print("ADC5 (Level B knob)\t\t: {0:#x}".format(et312.read(0x4065))) currentmode = et312.read(0x407b) print("Power Level\t\t\t: " + powerlevels[et312.read(0x41f4)]) usermodes = et312.read(0x41f3) - 0x87 print("User programs loaded\t\t: {0:#d}".format(usermodes)) for i in range(0, usermodes): startmodule = et312.read(0x8018 + i) if (startmodule < 0xa0): programlookup = et312.read(0x8000 + startmodule - 0x60) programblockstart = 0x8040 + programlookup else: programlookup = et312.read(0x8000 + startmodule - 0xa0) programblockstart = 0x8100 + programlookup print("\tUser %d is module 0x%02x\t: 0x%04x (eeprom)" % (i + 1, startmodule, programblockstart)) print("Current Mode\t\t\t: " + modes[currentmode]) if (currentmode == 0x7f): print("\tSplit Mode A\t\t: " + modes[et312.read(0x41f5)]) print("\tSplit Mode B\t\t: " + modes[et312.read(0x41f6)]) if (currentmode == 0x80): print("\tCurrent Random Mode\t: " + modes[et312.read(0x4074)]) timeleft = et312.read(0x4075) - et312.read(0x406a) if (timeleft < 0): timeleft += 256 print("\tTime until change mode\t: {0:#d} seconds ".format( int(timeleft / 1.91))) print("\tMode has been running\t: {0:#d} seconds".format( int((et312.read(0x4089) + et312.read(0x408a) * 256) * 1.048))) except Exception as e: print(e) if (et312): print("[+] resetting key") et312.reset_key() # reset cipher key so easy resync next time et312.close()
def main(): global et312 signal(SIGINT, handler) # Lock the serial port while we use it, wait a few seconds connected = False for _ in range(10): try: et312 = buttshock.et312.ET312SerialSync( config['ET312']['serial_port']) if et312.port.isOpen(): fcntl.flock(et312.port.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) connected = True break except Exception as e: print(e) sleep(.2) if (not connected): print("Failed to connect to ET312") return try: et312.perform_handshake() # this location gets written a 0 when any mode starts, but otherwise unused arewerunning = et312.read(0x4093) if (arewerunning != 42): # so let's get it into a blank empty mode. easiest way is calltable 18 et312.write(0x4078, [0x90]) # mode 90 doesn't exist et312.write(0x4070, [18]) # execute mode 90 while (et312.read(0x4070) != 0xff): pass # Overwrite name of current mode with spaces, then display "MQTT" et312.write(0x4180, [0x64]) et312.write(0x4070, [0x15]) while (et312.read(0x4070) != 0xff): pass for pos, char in enumerate('MQTT'): et312.write(0x4180, [ord(char), pos + 9]) et312.write(0x4070, [0x13]) while (et312.read(0x4070) != 0xff): pass for base in [0x4000, 0x4100]: et312.write(base + 0xa8, [0, 0]) # don't increment channel A intensity et312.write(base + 0xa5, [128]) # A intensity mod value = min et312.write(base + 0xac, [0]) # no select et312.write(base + 0xb1, [0]) # rate et312.write(base + 0xae, [0x64]) # freq mod et312.write(base + 0xb5, [4]) # select normal parms et312.write(base + 0xb7, [0xc8]) # width mod value et312.write(base + 0xba, [0]) # width mod value et312.write(base + 0xbe, [4]) # select normal parms et312.write(base + 0x9c, [255]) # ramp off #et312.write(0x4098,[5,5,1]) # gate it! et312.write(0x4093, [42]) # we're provisioned except Exception as e: print(e) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.on_log = on_log client.connect(config['MQTT']['broker_ip'], int(config['MQTT']['broker_port']), 60) client.loop_forever()