示例#1
0
def read_mode():
    global et312, i
    try:
        et312.read(0x407b)
        print(i)
        i += 1
    except Exception:
        print("Current mode read failed!")
示例#2
0
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)))
示例#3
0
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))
示例#5
0
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):
示例#7
0
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()
示例#8
0
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()