25 from __future__
import absolute_import
26 from .wiimoteConstants
import *
27 from .wiiutils
import *
33 Holds the state of a WIIRemote-plus. 35 The state is passed in and is as communicated 36 by one message from the WII+ device. We unpack 37 the information and place it into individual 38 dictionaries for callers to grab. 40 Public instance variables: 41 o time Time in fractional seconds since beginning of Epoch of when 42 state was measured (Float). 43 o ascTime Time when state was measured (Human-readable) 44 o rumble True/False if wiimote vibration is on/off 45 o angleRate A GyroReading instance containing gyro (a.k.a. angular rate) measurement 46 o acc A WIIReading instance containing accelerometer measurement corrected by 47 the calibration information that is stored in the Wiimote 48 o accRaw A WIIReading instance containing accelerometer measurement uncorrected 49 o buttons A dictionary for which buttons are being held down. That could be 50 multiple buttons. Keys are: 51 BTN_1, BTN_2, BTN_PLUS, BTN_MINUS, BTN_A, BTN_B, 52 BTN_UP, BTN_DOWN, BTN_LEFT, BTN_RIGHT, BTN_HOME 54 o IRSources Dictionary with on/off values for which IR lights are 55 being sensed. Keys are: 58 o motionPlusPresent True if a gyro Motion+ is plugged into the Wiimote. Else False 60 o nunchukPresent True if nunchuk is plugged in. Else False 61 o nunchukAccRaw A WIIReading instance with acceleromoter measurement from the nunchuk (raw values) 62 o nunchukAcc The same, but zeroed using factory calibration 63 o nunchukStickRaw A tuple with the two axes of the joystick on the nunchuk, raw readings 64 o nunchukStick A tuple with the two axes of the joystick on the nunchuk, zeroed to be [-1, 1] 65 o nunchukButtons A dictionary for which nunchuk buttons are down. Keys are BTN_C and BTN_Z 68 o setAccelerometerCalibration Bias setting for accelerometer. This triplet is used to 69 turn raw accelerometer values into calibrated values. 70 o setGyroCalibration Bias setting for gyro. This triplet is used to 71 turn raw gyro values into calibrated values. 74 _accCalibrationZero =
None 75 _gyroZeroReading =
None 76 _nunchukZeroReading =
None 77 _nunchukJoystickZero =
None 79 def __init__(self, state, theTime, theRumble, buttonStatus):
80 """Unpack the given state, normalizing if normalizers are passed in.""" 92 self.
buttons = {BTN_1:
False, BTN_2:
False, BTN_PLUS:
False,
93 BTN_MINUS:
False, BTN_A:
False, BTN_B:
False,
94 BTN_UP:
False, BTN_DOWN:
False, BTN_LEFT:
False,
95 BTN_RIGHT:
False, BTN_HOME:
False}
107 CLASSIC_BTN_L:
False, CLASSIC_BTN_R:
False,
108 CLASSIC_BTN_X:
False, CLASSIC_BTN_Y:
False,
109 CLASSIC_BTN_ZL:
False, CLASSIC_BTN_ZR:
False,
110 CLASSIC_BTN_PLUS:
False, CLASSIC_BTN_MINUS:
False,
111 CLASSIC_BTN_UP:
False, CLASSIC_BTN_DOWN:
False,
112 CLASSIC_BTN_LEFT:
False, CLASSIC_BTN_RIGHT:
False,
113 CLASSIC_BTN_HOME:
False}
118 if buttonStatus == 0:
119 for key
in self.
buttons.keys():
123 self.
buttons[BTN_1] = (buttonStatus & BTN_1) > 0
124 self.
buttons[BTN_2] = (buttonStatus & BTN_2) > 0
125 self.
buttons[BTN_PLUS] = (buttonStatus & BTN_PLUS) > 0
126 self.
buttons[BTN_MINUS] = (buttonStatus & BTN_MINUS) > 0
127 self.
buttons[BTN_A] = (buttonStatus & BTN_A) > 0
128 self.
buttons[BTN_B] = (buttonStatus & BTN_B) > 0
129 self.
buttons[BTN_UP] = (buttonStatus & BTN_UP) > 0
130 self.
buttons[BTN_DOWN] = (buttonStatus & BTN_DOWN) > 0
131 self.
buttons[BTN_LEFT] = (buttonStatus & BTN_LEFT) > 0
132 self.
buttons[BTN_RIGHT] = (buttonStatus & BTN_RIGHT) > 0
133 self.
buttons[BTN_HOME] = (buttonStatus & BTN_HOME) > 0
135 for msgComp
in state:
141 if msgType == WII_MSG_TYPE_ACC:
143 accStatus = msgComp[1]
158 elif msgType == WII_MSG_TYPE_IR:
162 IRStatus = msgComp[1]
171 elif msgType == WII_MSG_TYPE_MOTIONPLUS:
176 gyroDict = msgComp[1]
178 if gyroDict
is not None:
191 elif msgType == WII_MSG_TYPE_NUNCHUK:
193 if nunChuk
is not None:
209 calibration = [127, 127]
214 joyx = -(joyx-calibration[0])/100.
215 joyy = (joyy-calibration[1])/100.
223 nunButtons = nunChuk[
'buttons']
227 elif msgType == WII_MSG_TYPE_CLASSIC:
229 if clasSic
is not None:
233 clasButtons = clasSic[
'buttons']
234 self.
classicButtons[CLASSIC_BTN_A] = (clasButtons & CLASSIC_BTN_A) > 0
235 self.
classicButtons[CLASSIC_BTN_B] = (clasButtons & CLASSIC_BTN_B) > 0
236 self.
classicButtons[CLASSIC_BTN_DOWN] = (clasButtons & CLASSIC_BTN_DOWN) > 0
237 self.
classicButtons[CLASSIC_BTN_HOME] = (clasButtons & CLASSIC_BTN_HOME) > 0
238 self.
classicButtons[CLASSIC_BTN_L] = (clasButtons & CLASSIC_BTN_L) > 0
239 self.
classicButtons[CLASSIC_BTN_LEFT] = (clasButtons & CLASSIC_BTN_LEFT) > 0
240 self.
classicButtons[CLASSIC_BTN_MINUS] = (clasButtons & CLASSIC_BTN_MINUS) > 0
241 self.
classicButtons[CLASSIC_BTN_PLUS] = (clasButtons & CLASSIC_BTN_PLUS) > 0
242 self.
classicButtons[CLASSIC_BTN_R] = (clasButtons & CLASSIC_BTN_R) > 0
243 self.
classicButtons[CLASSIC_BTN_RIGHT] = (clasButtons & CLASSIC_BTN_RIGHT) > 0
244 self.
classicButtons[CLASSIC_BTN_UP] = (clasButtons & CLASSIC_BTN_UP) > 0
245 self.
classicButtons[CLASSIC_BTN_X] = (clasButtons & CLASSIC_BTN_X) > 0
246 self.
classicButtons[CLASSIC_BTN_Y] = (clasButtons & CLASSIC_BTN_Y) > 0
247 self.
classicButtons[CLASSIC_BTN_ZL] = (clasButtons & CLASSIC_BTN_ZL) > 0
248 self.
classicButtons[CLASSIC_BTN_ZR] = (clasButtons & CLASSIC_BTN_ZR) > 0
253 """Set the current accelerometer zeroing calibration.""" 259 """Return current accelerometer zeroing offset as two lists of x/y/z: the 260 zero-reading, and the one-reading.""" 265 """Set the x/y/z zeroing offsets for the gyro. Argument is a list""" 271 """Return current gyro zeroing offset as a list of x/y/z. """ 276 """Set the current nunchuk accelerometer zeroing calibration.""" 282 """Set the origin for the nunchuk joystick""" 287 """Return current nunchuk accelerometer zeroing offset as two lists of x/y/z: the 288 zero-reading, and the one-reading.""" 294 res =
'Time: ' + self.
ascTime +
'\n' 313 butRes +=
', 4Way-up' 315 butRes +=
', 4Way-down' 317 butRes +=
', 4Way-left' 319 butRes +=
', 4Way-right' 325 res +=
'Buttons: none.\n' 327 res +=
'Buttons: ' + butRes.lstrip(
', ') +
'\n' 330 if self.
acc is not None:
331 res +=
'Accelerator: (' + \
332 repr(self.
acc[X]) +
',' + \
333 repr(self.
acc[Y]) +
',' + \
334 repr(self.
acc[Z]) +
')\n' 338 res +=
'Gyro (angular rate): (' + \
345 res +=
'Rumble: On.\n' 347 res +=
'Rumble: Off.\n' 354 irRes +=
'IR source 1' 357 irRes +=
'IR source 2' 360 irRes +=
'IR source 3' 363 irRes +=
'IR source 4' 366 res += irRes.lstrip(
', ') +
'\n' 368 res +=
'No IR sources detected.\n' 377 """Instances hold one 3-D reading. 380 [X], [Y], [Z] to obtain respective axis paramters. 381 tuple() to obtain x/y/z as a NumPy array. 382 +,-,/ to add or subtract readings from each other 383 as one vector operation (pairwise for each dimension). 391 """Create a (possibly) time stamped WII Reading. 393 Parameter xyz is an array of x,y,z coordinates of the 394 reading. WIIReading instances can be added, subtracted, and 395 divided into each other. The operations are pairwise over 396 x, y, and z. A numpy array of x,y,z is available by 397 calling tuple(). The time stamp is available via time(). 401 self.
_measurement = np.array([xyz[X], xyz[Y], xyz[Z]], dtype=np.float64)
404 if key
not in (X, Y, Z):
405 raise AttributeError(
"Attempt to index into a 3-D measurement array with index " + repr(key) +
".")
422 """Adding two readings returns a numpy tuple with readings added pairwise.""" 427 """Subtracting two readings returns a numpy tuple with components subtracted pairwise.""" 432 """Dividing two readings returns a numpy tuple with components divided pairwise.""" 437 """Return a numpy tuple that with X, Y, Z scaled by the given factor.""" 443 """Instances hold one gyroscope reading. 446 [PHI], [THETA], [PSI] to obtain respective axis paramters. 447 tuple() to obtain phi/theta/psi as a NumPy array. 448 +,-,/ to add or subtract readings from each other 449 as one vector operation (pairwise for each dimension). 456 """Create a (possibly) time stamped WII Reading. 458 Parameter phiThetaPsi is an array of phi,theta,psi coordinates of the 459 gyro reading. GyroReading instances can be added, subtracted, and 460 divided into each other. The operations are pairwise over 461 phi, theta, and psi. A numpy array of phi,theta,psi is available by 462 calling tuple(). The time stamp is available via time(). 466 self.
_measurement = np.array([phiThetaPsi[PHI], phiThetaPsi[THETA], phiThetaPsi[PSI]], dtype=np.float64)
469 if key
not in (PHI, THETA, PSI):
470 raise AttributeError(
"Attempt to index into a 3-D measurement array with index " + repr(key) +
".")
474 return '[PHI (roll)=' + repr(self.
_measurement[PHI]) + \
488 """Adding two gyro readings returns a new reading with components added pairwise.""" 492 """Subtracting two gyro readings returns a new reading 493 with components subtracted pairwise. 499 """Dividing two readings returns a numpy tuple with components divided pairwise.""" 504 """Return a numpy tuple that with X, Y, Z scaled by the given factor.""" def scale(self, scaleFactor)
def setAccelerometerCalibration(cls, zeroReading, oneReading)
def setNunchukAccelerometerCalibration(cls, zeroReading, oneReading)
def __getitem__(self, key)
def getGyroCalibration(cls)
def setNunchukJoystickCalibration(cls, readings)
def getNunchukAccelerometerCalibration(cls)
def __init__(self, xyz, theTime=None)
def setGyroCalibration(cls, zeroReading)
def __init__(self, state, theTime, theRumble, buttonStatus)
def scale(self, scaleFactor)
def __init__(self, phiThetaPsi, theTime=None)
def getAccelerometerCalibration(cls)
def __getitem__(self, key)