| 1 |
import wmplugin |
|---|
| 2 |
import cwiid |
|---|
| 3 |
import math |
|---|
| 4 |
|
|---|
| 5 |
acc_zero = None |
|---|
| 6 |
acc_one = None |
|---|
| 7 |
acc = [0,0,0] |
|---|
| 8 |
|
|---|
| 9 |
NEW_AMOUNT = 0.1 |
|---|
| 10 |
OLD_AMOUNT = 1 - NEW_AMOUNT |
|---|
| 11 |
|
|---|
| 12 |
Roll_Scale = 1 |
|---|
| 13 |
Pitch_Scale = 1 |
|---|
| 14 |
X_Scale = 1 |
|---|
| 15 |
Y_Scale = 1 |
|---|
| 16 |
|
|---|
| 17 |
def wmplugin_info(): |
|---|
| 18 |
return [], \ |
|---|
| 19 |
[("Roll", wmplugin.ABS, 3141, -3141, 0, 0), \ |
|---|
| 20 |
("Pitch", wmplugin.ABS, 1570, -1570, 0, 0), \ |
|---|
| 21 |
("X", wmplugin.ABS | wmplugin.REL, 16, -16, 0, 0), \ |
|---|
| 22 |
("Y", wmplugin.ABS | wmplugin.REL, 16, -16, 0, 0)], \ |
|---|
| 23 |
[("Roll_Scale", wmplugin.PARAM_FLOAT, Roll_Scale), \ |
|---|
| 24 |
("Pitch_Scale", wmplugin.PARAM_FLOAT, Pitch_Scale), \ |
|---|
| 25 |
("X_Scale", wmplugin.PARAM_FLOAT, X_Scale), \ |
|---|
| 26 |
("Y_Scale", wmplugin.PARAM_FLOAT, Y_Scale)] |
|---|
| 27 |
|
|---|
| 28 |
def wmplugin_init(id, wiimote): |
|---|
| 29 |
global acc_zero, acc_one |
|---|
| 30 |
|
|---|
| 31 |
wmplugin.set_rpt_mode(id, cwiid.RPT_ACC) |
|---|
| 32 |
acc_zero, acc_one = wiimote.get_acc_cal(cwiid.EXT_NONE) |
|---|
| 33 |
return |
|---|
| 34 |
|
|---|
| 35 |
def wmplugin_exec(mesg): |
|---|
| 36 |
global acc_zero, acc_one, acc |
|---|
| 37 |
axes = [None, None, None, None] |
|---|
| 38 |
|
|---|
| 39 |
for m in mesg: |
|---|
| 40 |
if m[0] == cwiid.MESG_ACC: |
|---|
| 41 |
acc = [NEW_AMOUNT*(new-zero)/(one-zero) + OLD_AMOUNT*old |
|---|
| 42 |
for old,new,zero,one in zip(acc,m[1],acc_zero,acc_one)] |
|---|
| 43 |
a = math.sqrt(sum(map(lambda x: x**2, acc))) |
|---|
| 44 |
|
|---|
| 45 |
roll = math.atan(acc[cwiid.X]/acc[cwiid.Z]) |
|---|
| 46 |
if acc[cwiid.Z] <= 0: |
|---|
| 47 |
if acc[cwiid.X] > 0: roll += math.pi |
|---|
| 48 |
else: roll -= math.pi |
|---|
| 49 |
|
|---|
| 50 |
pitch = math.atan(acc[cwiid.Y]/acc[cwiid.Z]*math.cos(roll)) |
|---|
| 51 |
|
|---|
| 52 |
axes[0] = int(roll * 1000 * Roll_Scale) |
|---|
| 53 |
axes[1] = int(pitch * 1000 * Pitch_Scale) |
|---|
| 54 |
|
|---|
| 55 |
if (a > 0.85) and (a < 1.15): |
|---|
| 56 |
if (math.fabs(roll)*(180/math.pi) > 10) and \ |
|---|
| 57 |
(math.fabs(pitch)*(180/math.pi) < 80): |
|---|
| 58 |
axes[2] = int(roll * 5 * X_Scale) |
|---|
| 59 |
|
|---|
| 60 |
if (math.fabs(pitch)*(180/math.pi) > 10): |
|---|
| 61 |
axes[3] = int(pitch * 10 * Y_Scale) |
|---|
| 62 |
|
|---|
| 63 |
return [], axes |
|---|
| 64 |
|
|---|