tests/wiimote/py_ext_0@py_ext/pyfile.xml
author Surkov Sergey <surkovsv93@gmail.com>
Tue, 27 Jun 2017 19:21:09 +0300
changeset 1710 953ceea2573e
parent 1185 b36755d7c19e
permissions -rw-r--r--
fix bug with TextViewer instance in debug mode, appears after transferring new program on PLC
TextViewer isn't able to display debug values, so calling for this class SubscribeAllDataConsumers method causes error
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PyFile>
  <variables>
    <variable name="WiiNunchuckStickX" type="INT"/>
    <variable name="WiiNunchuckStickY" type="INT"/>
    <variable name="WiiNunchuckAccX" type="INT"/>
    <variable name="WiiNunchuckAccY" type="INT"/>
    <variable name="WiiNunchuckAccZ" type="INT"/>
    <variable name="WiiNunchuckButtons" type="WORD"/>
    <variable name="WiiButtons" type="WORD"/>
  </variables>
  <globals>
<![CDATA[
import cwiid,commands,sys,re,os,time

wiimote = None
WIIMOTE_ADDR_MODEL = re.compile("((?:[0-9A-F]{2})(?::[0-9A-F]{2}){5})\s*Nintendo")
nunchuckzero = None

def Wiimote_cback(messages, time):
    global nunchuckzero
    state = dict(messages)
    bts = state.get(cwiid.MESG_BTN, None)
    if bts is not None:
        PLCGlobals.WiiButtons = bts
    nunchuck = state.get(cwiid.MESG_NUNCHUK, None)
    if nunchuck is not None:
        PLCGlobals.WiiNunchuckButtons = nunchuck['buttons']
        X,Y = nunchuck['stick']
        PLCGlobals.WiiNunchuckAccX = nunchuck['acc'][cwiid.X]
        PLCGlobals.WiiNunchuckAccY = nunchuck['acc'][cwiid.Y]
        PLCGlobals.WiiNunchuckAccZ = nunchuck['acc'][cwiid.Z]
        if nunchuckzero is None:
            nunchuckzero = X,Y
        (PLCGlobals.WiiNunchuckStickX,
         PLCGlobals.WiiNunchuckStickY) = X-nunchuckzero[0],Y-nunchuckzero[1]

def Connect_Wiimote(connected_callback):
    global wiimote,nunchuckzero
    mac_addr = ''
    try:
        mac_addr = file("wiimac.txt","rt").read()
    except:
        PLCObject.LogMessage("Wiimote MAC unknown, scanning bluetooth")
        output = commands.getoutput("hcitool scan")
        result = WIIMOTE_ADDR_MODEL.search(output)
        if result is not None:
            mac_addr = result.group(1)
            PLCObject.LogMessage("Found Wiimote with MAC %s"%mac_addr)
            file("wiimac.txt","wt").write(mac_addr)
 
    # Connect to wiimote
    if not mac_addr:
        PLCObject.LogMessage("Connection to unknown Wiimote...")
        wiimote = cwiid.Wiimote()
    else:
        PLCObject.LogMessage("Connection to Wiimote %s..."%mac_addr)
        wiimote = cwiid.Wiimote(mac_addr)

    if wiimote is not None:
        nunchuckzero = None
        wiimote.rpt_mode = cwiid.RPT_BTN | cwiid.RPT_EXT
        # use the callback interface
        wiimote.mesg_callback = Wiimote_cback
        wiimote.enable(cwiid.FLAG_MESG_IFC)
        connected_callback(mac_addr)
        PLCObject.LogMessage("Wiimote %s Connected"%mac_addr)
    else:
        PLCObject.LogMessage("Wiimote %s not found"%mac_addr)
        os.remove("wiimac.txt")
        connected_callback(None)

def Disconnect_Wiimote():
  global wiimote
  if wiimote is not None:
    wiimote.disable(cwiid.FLAG_MESG_IFC)
    time.sleep(0.1)
    wiimote.close()
    wiimote = None
    PLCObject.LogMessage("Wiimote disconnected")

]]>
  </globals>
  <init>
<![CDATA[
]]>
  </init>
  <cleanup>
<![CDATA[
Disconnect_Wiimote()

]]>
  </cleanup>
  <start>
<![CDATA[
]]>
  </start>
  <stop>
<![CDATA[
]]>
  </stop>
</PyFile>