public static byte[] rearrangeStatus(byte[] s)
{
byte[] ns = new byte[12];
// big endian... these values are really only 1 byte apiece rather than the 2 apiece we specified
ns[0] = 0; // left joystick X
ns[1] = s[6]; // left joystick X
ns[2] = 0; // left joystick Y
ns[3] = s[7]; // left joystick Y
ns[4] = 0; // right joystick X
ns[5] = s[8]; // right joystick X
ns[6] = 0; // right joystick Y
ns[7] = s[9]; // right joystick Y
int L1 = (s[20] > 127 ? 1 : 0) << 7;
int L2 = (s[18] > 127 ? 1 : 0) << 6;
int L3 = (s[2] == 0x02 ? 1 : 0) << 5;
int R1 = (s[21] > 127 ? 1 : 0) << 4;
int R2 = (s[19] > 127 ? 1 : 0) << 3;
int R3 = (s[2] == 0x04 ? 1 : 0) << 2;
int up = (s[2] == 0x10 ? 1 : 0) << 1;
int down = (s[2] == 0x40 ? 1 : 0) << 0;
ns[8] = (byte) (L1 | L2 | L3 | R1 | R2 | R3 | up | down);
byte left = (byte) ((s[2] == 0x80 ? 1 : 0) << 7);
byte right = (byte) ((s[2] == 0x20 ? 1 : 0) << 6);
int square = (byte) ((s[3] == 0x80 ? 1 : 0) << 5);
int triangle = (byte) ((s[3] == 0x10 ? 1 : 0) << 4);
int circle = (byte) ((s[3] == 0x20 ? 1 : 0) << 3);
int cross = (byte) ((s[3] == 0x40 ? 1 : 0) << 2);
int start = (byte) ((s[2] == 0x08 ? 1 : 0) << 1);
int select = (byte) ((s[2] == 0x01 ? 1 : 0) << 0);
ns[9] = (byte)(left | right | square | triangle | circle | cross | start | select);
ns[10] = s[4]; // PS button
ns[11] = 0;
Console.WriteLine(s[6] + ", " + s[7] + "," + s[8] + "," + s[9]);
return ns;
}