/// <summary> /// /// </summary> /// <param name="port"></param> /// <param name="mouse"></param> static void MouseLoop(UsbController port, UsbStream mouse) { // Mouse report storage. byte[] report = new byte[5]; // Offsets into mouse report storage. const byte BUTTONS = 0; const byte X_MOVEMENT = 1; const byte Y_MOVEMENT = 2; // Size of mouse movement for each report (every 10 mS). const byte mouseStep = 3; bool fAddMouse = true; // While the Done button is not pressed... while (buttons.Done.Read()) { // Perform this operation once every 10 milliseconds (actually a // bit more than 10 milliseconds). We've asked the host to // query for mouse info at least every 10 milliseconds, but it // actually queries every 8 milliseconds - it's OK not to // respond to every query. Thread.Sleep(10); report[X_MOVEMENT] = 0; // Zero X movement report[Y_MOVEMENT] = 0; // Zero Y movement // Add X,Y movement to the mouse report. if (!buttons.Left.Read()) report[X_MOVEMENT] -= mouseStep; if (!buttons.Right.Read()) report[X_MOVEMENT] += mouseStep; if (!buttons.Up.Read()) report[Y_MOVEMENT] -= mouseStep; if (!buttons.Down.Read()) report[Y_MOVEMENT] += mouseStep; if (!buttons.Toggle.Read()) { if (mouse != null) { mouse.Dispose(); mouse = null; } fAddMouse = !fAddMouse; ConfigureUsbPort(port, fAddMouse); if (fAddMouse) { mouse = port.CreateUsbStream(3, UsbStream.NullEndpoint); } } // Add the button state to the mouse report. report[BUTTONS] = (byte)((!buttons.LeftMouseButton.Read() ? 1 : 0) | (!buttons.RightMouseButton.Read() ? 2 : 0)); if (mouse != null) { // Send the mouse report to the host. mouse.Write(report, 0, 3); } } // Wait for the Done button to be released. while (!buttons.Done.Read()) ; }