public void handleTouchpad(byte[] data, DS4State sensors, int touchPacketOffset = 0) { bool touchPadIsDown = sensors.TouchButton; if (!PacketChanged(data, touchPacketOffset) && (touchPadIsDown == lastTouchPadIsDown)) { TouchUnchanged?.Invoke(this, EventArgs.Empty); return; } byte touchID1 = (byte)(data[0 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0x7F); byte touchID2 = (byte)(data[4 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0x7F); int currentX1 = data[1 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] + (data[2 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0xF) * 255; int currentY1 = ((data[2 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0xF0) >> 4) + data[3 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] * 16; int currentX2 = data[5 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] + (data[6 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0xF) * 255; int currentY2 = ((data[6 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] & 0xF0) >> 4) + data[7 + TOUCHPAD_DATA_OFFSET + touchPacketOffset] * 16; TouchpadEventArgs args; if (sensors.Touch1 || sensors.Touch2) { if ((sensors.Touch1 && !lastIsActive1) || (sensors.Touch2 && !lastIsActive2)) { if (TouchesBegan != null) { if (sensors.Touch1 && sensors.Touch2) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1), new Touch(currentX2, currentY2, touchID2)); } else if (sensors.Touch1) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1)); } else { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX2, currentY2, touchID2)); } TouchesBegan(this, args); } } else if ((sensors.Touch1 == lastIsActive1) && (sensors.Touch2 == lastIsActive2) && (TouchesMoved != null)) { Touch tPrev, t0, t1; if (sensors.Touch1 && sensors.Touch2) { tPrev = new Touch(lastTouchPadX1, lastTouchPadY1, lastTouchID1); t0 = new Touch(currentX1, currentY1, touchID1, tPrev); tPrev = new Touch(lastTouchPadX2, lastTouchPadY2, lastTouchID2); t1 = new Touch(currentX2, currentY2, touchID2, tPrev); } else if (sensors.Touch1) { tPrev = new Touch(lastTouchPadX1, lastTouchPadY1, lastTouchID1); t0 = new Touch(currentX1, currentY1, touchID1, tPrev); t1 = null; } else { tPrev = new Touch(lastTouchPadX2, lastTouchPadY2, lastTouchID2); t0 = new Touch(currentX2, currentY2, touchID2, tPrev); t1 = null; } args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, t0, t1); TouchesMoved(this, args); } if (!lastTouchPadIsDown && touchPadIsDown && (TouchButtonDown != null)) { if (sensors.Touch1 && sensors.Touch2) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1), new Touch(currentX2, currentY2, touchID2)); } else if (sensors.Touch1) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1)); } else { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX2, currentY2, touchID2)); } TouchButtonDown(this, args); } else if (lastTouchPadIsDown && !touchPadIsDown && (TouchButtonUp != null)) { if (sensors.Touch1 && sensors.Touch2) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1), new Touch(currentX2, currentY2, touchID2)); } else if (sensors.Touch1) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX1, currentY1, touchID1)); } else { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(currentX2, currentY2, touchID2)); } TouchButtonUp(this, args); } if (sensors.Touch1) { lastTouchPadX1 = currentX1; lastTouchPadY1 = currentY1; } if (sensors.Touch2) { lastTouchPadX2 = currentX2; lastTouchPadY2 = currentY2; } lastTouchPadIsDown = touchPadIsDown; } else { if (touchPadIsDown && !lastTouchPadIsDown) { TouchButtonDown?.Invoke(this, new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, null)); } else if (!touchPadIsDown && lastTouchPadIsDown) { TouchButtonUp?.Invoke(this, new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, null)); } if ((lastIsActive1 || lastIsActive2) && (TouchesEnded != null)) { if (lastIsActive1 && lastIsActive2) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(lastTouchPadX1, lastTouchPadY1, touchID1), new Touch(lastTouchPadX2, lastTouchPadY2, touchID2)); } else if (lastIsActive1) { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(lastTouchPadX1, lastTouchPadY1, touchID1)); } else { args = new TouchpadEventArgs(sensors.ReportTimeStamp, sensors.TouchButton, new Touch(lastTouchPadX2, lastTouchPadY2, touchID2)); } TouchesEnded(this, args); } } lastIsActive1 = sensors.Touch1; lastIsActive2 = sensors.Touch2; lastTouchID1 = touchID1; lastTouchID2 = touchID2; lastTouchPadIsDown = touchPadIsDown; }
public TouchpadEventArgs(DateTime utcTimestamp, bool tButtonDown, Touch t0, Touch t1 = null) { if (t1 != null) { touches = new Touch[2]; touches[0] = t0; touches[1] = t1; } else if (t0 != null) { touches = new Touch[1]; touches[0] = t0; } touchButtonPressed = tButtonDown; timeStamp = utcTimestamp; }
public Touch(int X, int Y, byte tID, Touch prevTouch = null) { hwX = X; hwY = Y; touchID = tID; previousTouch = prevTouch; if (previousTouch != null) { deltaX = X - previousTouch.hwX; deltaY = Y - previousTouch.hwY; } }
private bool isRight(Touch t) { return t.hwX >= 1920 * 2 / 5; }
private bool isLeft(Touch t) { return t.hwX < 1920 * 2 / 5; }
public virtual void touchesBegan(object sender, TouchpadEventArgs arg) { if (!Global.UseTPforControls[deviceNum]) { cursor.touchesBegan(arg); wheel.touchesBegan(arg); } pastTime = arg.timeStamp; firstTouch = arg.touches[0]; if (Global.DoubleTap[deviceNum]) { DateTime test = arg.timeStamp; if ((test <= firstTap + TimeSpan.FromMilliseconds(Global.TapSensitivity[deviceNum] * 1.5)) && !arg.touchButtonPressed) { secondtouchbegin = true; } } dev.GetCurrentState(state); synthesizeMouseButtons(); }