2015-11-28 06:47:26 +01:00
using System ;
namespace DS4Windows
{
public class SixAxisEventArgs : EventArgs
{
public readonly SixAxis sixAxis ;
2017-06-22 03:07:21 +02:00
public readonly DateTime timeStamp ;
public SixAxisEventArgs ( DateTime utcTimestamp , SixAxis sa )
2015-11-28 06:47:26 +01:00
{
sixAxis = sa ;
2017-06-22 03:07:21 +02:00
timeStamp = utcTimestamp ;
2015-11-28 06:47:26 +01:00
}
}
public class SixAxis
{
public readonly int gyroX , gyroY , gyroZ , deltaX , deltaY , deltaZ , accelX , accelY , accelZ ;
2017-07-12 15:04:37 +02:00
public readonly int gyroYawFull , gyroPitchFull , gyroRollFull ;
2017-06-27 12:16:10 +02:00
public readonly int accelXFull , accelYFull , accelZFull ;
2015-11-28 06:47:26 +01:00
public readonly byte touchID ;
2017-07-16 09:22:21 +02:00
public readonly double elapsed ;
public readonly SixAxis previousAxis = null ;
public SixAxis ( int X , int Y , int Z , int aX , int aY , int aZ , double milliseconds , SixAxis prevAxis = null )
2015-11-28 06:47:26 +01:00
{
2017-07-16 14:11:58 +02:00
gyroX = - X / 256 ;
2017-06-22 03:07:21 +02:00
gyroY = Y / 256 ;
2017-07-16 14:11:58 +02:00
gyroZ = - Z / 256 ;
2017-07-13 14:27:25 +02:00
gyroYawFull = - X ;
2017-07-12 15:04:37 +02:00
gyroPitchFull = Y ;
2017-07-13 14:27:25 +02:00
gyroRollFull = - Z ;
2017-06-27 12:16:10 +02:00
2017-07-16 14:11:58 +02:00
accelX = - aX / 64 ;
accelY = - aY / 64 ;
2017-06-22 03:07:21 +02:00
accelZ = aZ / 64 ;
2017-07-16 14:11:58 +02:00
accelXFull = - aX ;
accelYFull = - aY ;
2017-06-27 12:16:10 +02:00
accelZFull = aZ ;
2017-07-16 09:22:21 +02:00
elapsed = milliseconds ;
2017-06-27 12:16:10 +02:00
2015-11-28 06:47:26 +01:00
previousAxis = prevAxis ;
if ( previousAxis ! = null )
{
2017-06-22 03:11:14 +02:00
deltaX = gyroX - previousAxis . gyroX ;
deltaY = gyroY - previousAxis . gyroY ;
deltaZ = gyroZ - previousAxis . gyroZ ;
2015-11-28 06:47:26 +01:00
}
}
}
public class DS4SixAxis
{
public event EventHandler < SixAxisEventArgs > SixAccelMoved = null ; // no status change for the touchpad itself... but other sensors may have changed, or you may just want to do some processing
internal int lastGyroX , lastGyroY , lastGyroZ , lastAX , lastAY , lastAZ ; // tracks 0, 1 or 2 touches; we maintain touch 1 and 2 separately
2017-07-16 09:22:21 +02:00
internal double lastMilliseconds ;
2015-11-28 06:47:26 +01:00
internal byte [ ] previousPacket = new byte [ 8 ] ;
2017-07-16 09:22:21 +02:00
public void handleSixaxis ( byte [ ] gyro , byte [ ] accel , DS4State state , double milliseconds )
2015-11-28 06:47:26 +01:00
{
2017-07-12 15:04:37 +02:00
int currentX = ( short ) ( ( ushort ) ( gyro [ 3 ] < < 8 ) | gyro [ 2 ] ) ; // Gyro Yaw
int currentY = ( short ) ( ( ushort ) ( gyro [ 1 ] < < 8 ) | gyro [ 0 ] ) ; // Gyro Pitch
2017-06-22 03:07:21 +02:00
int currentZ = ( short ) ( ( ushort ) ( gyro [ 5 ] < < 8 ) | gyro [ 4 ] ) ; // Gyro Roll
2017-07-12 15:04:37 +02:00
int AccelX = ( short ) ( ( ushort ) ( accel [ 1 ] < < 8 ) | accel [ 0 ] ) ;
int AccelY = ( short ) ( ( ushort ) ( accel [ 3 ] < < 8 ) | accel [ 2 ] ) ;
int AccelZ = ( short ) ( ( ushort ) ( accel [ 5 ] < < 8 ) | accel [ 4 ] ) ;
2017-06-22 03:07:21 +02:00
2017-07-16 09:22:21 +02:00
SixAxisEventArgs args = null ;
2015-11-28 06:47:26 +01:00
if ( AccelX ! = 0 | | AccelY ! = 0 | | AccelZ ! = 0 )
{
if ( SixAccelMoved ! = null )
{
2017-07-16 09:22:21 +02:00
SixAxis sPrev = null , now = null ;
sPrev = new SixAxis ( lastGyroX , lastGyroY , lastGyroZ , lastAX , lastAY , lastAZ , lastMilliseconds ) ;
now = new SixAxis ( currentX , currentY , currentZ , AccelX , AccelY , AccelZ , milliseconds , sPrev ) ;
2015-11-28 06:47:26 +01:00
args = new SixAxisEventArgs ( state . ReportTimeStamp , now ) ;
2017-07-16 10:30:49 +02:00
state . Motion = now ;
2015-11-28 06:47:26 +01:00
SixAccelMoved ( this , args ) ;
}
lastGyroX = currentX ;
lastGyroY = currentY ;
lastGyroZ = currentZ ;
lastAX = AccelX ;
lastAY = AccelY ;
lastAZ = AccelZ ;
2017-07-16 09:22:21 +02:00
lastMilliseconds = milliseconds ;
2015-11-28 06:47:26 +01:00
}
}
}
}