/// <summary> /// Open Wiimote device and initialize it. /// </summary> public void OpenDevice() { Debug.Assert(device == null); CloseDevice(); readMemoryReady = new ManualResetEvent(true); device = new WiimoteIO(DevicePath, ParseDeviceReport); SetLED(0); // Calibrate accelSensor ReadMemory(0x0016, 8, data => { AccelSensorCalibrationValue cv = new AccelSensorCalibrationValue() { Origin = ParseAccelCalibration(data, 0), G = ParseAccelCalibration(data, 4), }; cv.G.X -= cv.Origin.X; cv.G.Y -= cv.Origin.Y; cv.G.Z -= cv.Origin.Z; cv.Initialized = true; accelSensorCalibrationData = cv; } ); WaitReadMemory(); SetReportType(ReportType.B2A3I12, true); RequestStatus(); }
WiimoteStatus.Vector3F ParseAccel(byte[] data) { AccelSensorCalibrationValue cv = accelSensorCalibrationData; if (!cv.Initialized) { return(new WiimoteStatus.Vector3F()); } return(new WiimoteStatus.Vector3F( ((data[3] << 2 | data[1] >> 5 & 3) - cv.Origin.X) / cv.G.X, ((data[4] << 2 | data[2] >> 4 & 2) - cv.Origin.Y) / cv.G.Y, ((data[5] << 2 | data[2] >> 5 & 2) - cv.Origin.Z) / cv.G.Z )); }