Gamepad Test
{{ example ? 'Example session' : 'Controller observations' }}
{{ finding }}
{{ summaryLine }}
{{ summaryValue }}
Example controller — synthetic evidence
✓ tested · ? never pressed · H held at start · × excluded · blue = live
{{ exportStatus }}
{{ reportText }}
{{ exportStatus }}
| Stick / axes | Max radius | Drift flag | Deadzone | Rotation bins | Error (%) | Rest window | Updates / ms | Mean X / Y | Mean radius | Jitter RMS | XInput ref. | Copy |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ row.name }} | {{ num(row.maximum_radius,3,settings.drift) }} | {{ row.drift === null ? 'Not tested' : row.drift ? 'Flagged' : 'Clear' }} | {{ num(row.suggested_deadzone) }} | {{ row.rotation_bins }}/24 {{ row.rotation_complete ? 'full' : 'partial' }} | {{ num(row.circularity_error_pct,1) }} | {{ row.rest_complete ? 'Complete' : 'Partial' }} | {{ row.rest_count }} / {{ num(row.rest_elapsed_ms,1,settings.window_ms) }} | {{ num(row.mean_x) }} / {{ num(row.mean_y) }} | {{ num(row.mean_radius) }} | {{ num(row.jitter) }} | {{ num(row.reference_deadzone) }} |
{{ noStickMessage }}
{{ exportStatus }}
| Trigger | Pull max | Reach ≥0.95 | Rest value | Pull min | Behaviour | Updates | XInput ref. | Copy |
|---|---|---|---|---|---|---|---|---|
| {{ row.name }} | {{ num(row.maximum,3,0.95) }} | {{ row.full_travel === null ? 'Not tested' : row.full_travel ? 'Reached' : 'Short' }} | {{ num(row.rest) }} | {{ num(row.minimum) }} | {{ row.behaviour === 'Analog values observed' ? 'Analog' : row.behaviour === 'Only 0/1 observed' ? '0/1 only' : 'Unclear' }} | {{ row.samples }} | {{ num(row.reference_threshold) }} |
{{ values.coverage.mapping_known ? 'No standard trigger positions exposed.' : 'Unknown mapping: triggers are not identified. See the indexed button and axis ledgers.' }}
{{ exportStatus }}
| Axis | Maximum | Minimum | Last value | Index | Copy |
|---|---|---|---|---|---|
| {{ row.name }} | {{ num(row.maximum) }} | {{ num(row.minimum) }} | {{ num(row.last) }} | {{ row.index }} |
No axes exposed. Button and trigger observations remain available.
{{ exportStatus }}
Chart unavailable; measurements remain in the report.
{{ noStickMessage }}
{{ exportStatus }}
| Type / step | Observed ms | Device ms | Clock | Axes (index:value) | Buttons / event | Copy |
|---|---|---|---|---|---|---|
| {{ row.type }} / {{ row.step }} | {{ num(row.time_ms,1) }} | {{ num(row.sample_ms,1) }} | {{ row.clock === 'gamepad.timestamp' ? 'Device' : row.clock === 'performance.now' ? 'Monotonic' : 'Event' }} | {{ displayLog(row.axes) || '—' }} | {{ displayLog(row.buttons) }} |
Similar tools
- Keyboard Test Check which keyboard keys register and investigate repeated or missing presses, with local event analysis and a report you can share.
- Mouse Test Check your mouse for unwanted clicks and scroll problems in your browser, then save a factual report for repair or warranty discussions.
- Touch Screen Test Check your touchscreen for missed or unwanted touches in your browser and save an observation report for purchase or repair discussions.
- Reaction Time Test Test your visual reaction time with simple or choice responses and compare repeated sessions with clear reasons for excluded attempts.
A camera that keeps turning after both thumbs leave the sticks is a familiar sign of stick drift. Other controller problems look different: a trigger may never reach full input, a direction may have limited travel, or a button may register inconsistently. Checking these separately helps distinguish a setting that needs adjustment from a repeatable problem worth taking to support.
A browser receives controller input through the Gamepad API, a browser interface for reading exposed axes and buttons. An axis reports a normalized value from −1 to 1, usually with neutral near zero. Buttons report a pressed state and a value from 0 to 1; analog triggers can report intermediate values. These numbers describe the signal reaching software, not millimetres of movement, applied force or a calibrated physical angle.
When the browser recognizes the standard mapping, it can assign familiar positions such as left stick, right stick and trigger. The mapping describes control positions rather than a guarantee about the printed button symbols. An unfamiliar controller may still provide numbered axes and buttons, but their physical roles need to be checked individually. A missing familiar label does not establish a broken control.
In a potentiometer stick, moving contacts slide across resistive tracks to sense horizontal and vertical movement. Wear can change those readings, while debris or contamination can disturb contact. A changed resting position or inaccurate calibration can also leave the reported centre offset. A steady offset and fluctuating readings are useful clues, but neither identifies the damaged part by itself.
- Inner deadzone
- The region near centre that a game ignores. Enlarging it can suppress unwanted movement, but intentional small movements must travel farther before the game responds. This trades fine control for tolerance of resting movement.
- Outer deadzone
- The region near the edge that is treated as full input. Moving the full-input threshold inward can help a stick reach maximum output sooner, but leaves less travel for adjustments near the edge. It does not solve movement around the centre.
Resting behaviour and outer travel answer different questions. Circularity error describes how closely the recorded outer path follows a circle in normalized coordinates. It does not measure stick drift, and a square or differently scaled response can produce a large error without proving a fault. Missing directions also matter: a short arc that follows a circle says little about the untested remainder.
For triggers, the useful checks are the released value, the highest value during a full pull and whether intermediate values appear. For buttons, registering once establishes that an input was seen; repeated deliberate presses are needed to investigate an intermittent complaint. Vibration requires a compatible controller, connection and browser interface, and a successful software request alone cannot establish that a motor actually moved.
Deadzone tuning changes which movement software accepts. Recalibration, where the manufacturer provides it, adjusts how the controller interprets its centre or range. Neither restores worn contact material. Comparing repeated observations with the symptom in a game helps determine whether tuning remains acceptable or cleaning, repair or replacement deserves investigation.
How to Use This Tool:
Connect a physical controller through your computer or phone's operating system. On a phone, pair the controller first; touch-screen gamepads do not provide the hardware inputs checked here. This page reads the controllers the browser exposes; it does not open a pairing or permission-request dialog. The initial guided test needs no Advanced settings.
- Connect or pair the controller, keep this page visible and press a controller button. Check Tested device, or choose Which controller if several are exposed.
If no controller appears, check the operating system connection and press a button again with the page focused. Gamepad API unavailable requires a supporting browser and a secure page, normally HTTPS or trusted localhost; browser policy can also block access.
- Select Start and leave the sticks and triggers untouched during Hands off. The default resting window is two seconds. Wait for Window ended, then select Next.
- Rotate each stick slowly around its outer edge with gentle pressure during Rotate sticks. Select Next after covering the full path.
- Press and release every button during Press buttons, including both stick clicks and each D-pad direction. Select Next when finished.
- Release each trigger, slowly pull it fully and release it again during Pull triggers. Select Finish to retain the completed or partial observations.
- Review the named findings alongside the resting-window and rotation coverage. Retest any never-registered button before calling it faulty, then copy or download the Defect report as plain text for comparison or support. Tables also support CSV and Word downloads, while the stick chart offers image and coordinate CSV downloads.
During a session, Repeat adds another attempt while keeping earlier evidence; Skip advances without inventing missing observations. Stop retains evidence. Start or Resume continues the current step with a fresh capture. Use Reset for a clean full test or a different controller. While stopped, mark only physically absent positions under Buttons absent on my controller.
Optional Advanced overrides change the drift threshold, rest window or deadzone margin. Editing one during capture pauses the session. If Check settings appears, correct the value within its displayed bounds or clear it to restore the default; recorded evidence remains available after correction.
For an optional haptic check, select Test vibration · 0.5 s or Test trigger rumble in Advanced, then record Felt it or Did not feel it. Vibration is never started automatically by the guided steps.
Interpreting Results:
The summary highlights observed concerns. Recorded inputs reviewed is not a whole-controller pass: button coverage can be complete while resting, rotation or trigger checks remain partial or untested.
After Stop or disconnection, blue live readings clear while the resting extents, deadzone rings and recorded trigger maxima remain. Button marks retain tested, never-pressed, held-at-start and excluded states. The cleared live display therefore does not mean the recorded evidence was erased.
- Resting movement: compare the named stick's maximum resting radius with the effective threshold. A partial window can reveal movement, but repeat an interrupted attempt with the controller untouched. The suggested inner deadzone is a starting value to try manually in a compatible game or controller setting; this test does not apply it.
- Short trigger travel: repeat a slow full pull and check the released position, any trigger-stop setting and the manufacturer's controller test. The reported maximum is a normalized input value, not a percentage of physical travel or force.
- Never-registered buttons: release the button, press it deliberately and check whether its count changes. Review any active remapping before seeking repair. Excluding a present but unresponsive button would hide the unresolved coverage problem.
- Circularity error: compare it alongside the number of covered directions. Full coverage makes the comparison more informative, but there is no universal acceptable error percentage here. Keep the browser, operating system, connection mode and controller profile consistent between tests.
If a small inner deadzone stops unwanted movement while preserving the control you need, tuning may be sufficient. If the centre or range seems miscalibrated, try the manufacturer's recalibration procedure when available. Follow its cleaning guidance when contamination is suspected. Persistent symptoms after those checks, or a deadzone so large that fine movement becomes difficult, justify asking about repair, warranty service or replacement.
Include the repeated symptom and test conditions with any support request. The report documents browser observations and your stated exclusions; it cannot determine warranty eligibility or guarantee that a particular repair will solve the problem.
Technical Details:
Two stick coordinates describe both direction and distance from the reported centre. Averaging the coordinates alone can conceal movement in opposite directions, so radial distance and variation around the mean are calculated separately. All stick distances below use normalized axis units.
Formula Core
For n accepted resting observations, x and y are the paired axis readings. The mean coordinates describe offset, the mean radius describes average distance from centre, R is the greatest observed radius, and J is root mean square jitter around the mean position.
A stick held at one displaced position can have zero jitter while remaining off-centre. Conversely, movement on opposite sides of centre can average to zero while retaining a positive mean radius. Each accepted observation has equal weight; these are not time-weighted averages.
The suggested inner deadzone D adds the selected margin m to R, rounds upward in increments of 0.01 and caps the result at 0.99.
The ceiling brackets mean round upward. The tiny arithmetic tolerance prevents an exact decimal step from gaining an unintended extra hundredth; it does not relax the drift comparison. The default margin is 0.02. When R plus the margin exceeds 0.99, the report marks the suggestion as capped because it may not cover the observed movement. This is a radial tuning estimate, and games with different deadzone shapes or scales may need different settings.
Zero average offset with visible movement
An illustrative completed resting capture contains two accepted positions, (0.03, 0.04) and (−0.03, −0.04). The mean coordinates are both zero, but each radius is 0.05, so the mean radius, maximum radius and jitter are all 0.05. At the default drift threshold of 0.05, equality remains clear. Adding the default margin of 0.02 gives a suggested inner deadzone of 0.07. The zero average offset has not erased the movement, and the clear flag means the chosen threshold was not exceeded.
Circularity and angular coverage
Rotation observations are divided into 24 equal direction bins, each 15 degrees wide. Only positions with a radius of at least 0.5 qualify, and each observed bin contributes its largest radius. This reduces the influence of movements through the centre when assessing the outer path.
E is the displayed error percentage, k is the number of observed bins, and each ρ is that bin's maximum radius. Unobserved bins contribute no invented values; with no qualifying bins, the error is unavailable. A radius above 1 is possible even when each coordinate stays within its allowed range. Square or clamped responses can have a large error without proving a fault. The statistic compares the reported shape with a unit circle and does not establish a manufacturer's tolerance or a physical gate shape.
The same error with different rotation coverage
Suppose the largest recorded radius is 0.92 in every one of 24 direction bins. Each bin differs from the unit circle by 0.08, producing an 8.0% circularity error with full coverage. If only 12 bins were observed at that same radius, the error would still be 8.0%, but coverage would remain partial. Continue rotating through the missing directions before comparing the result with another session; the percentage alone does not describe how much was tested.
Decision rules and adjustable bounds
The thresholds below are test heuristics. Their boundaries determine the labels, but they are not controller certification requirements.
| Check | Boundary | Meaning |
|---|---|---|
| Drift flag | Maximum resting radius > threshold; default 0.05 | Equality is not flagged. No rest observations means not tested. |
| Complete rest | At least one uninterrupted window reaches its duration; default 2000 ms | Requires at least one valid observation while connected and visible. |
| Full rotation | 24 of 24 bins | Fewer bins remain partial, regardless of the error percentage. |
| Trigger reach | Maximum during Pull triggers ≥ 0.95 | Equality reaches the target. No pull observations means not tested. |
| Sampling interruption | Gap > 250 ms | Exactly 250 ms is not flagged. Missing movement is not filled in. |
All override values must be finite. The drift threshold accepts 0 to 0.99, the rest window accepts 250 to 10,000 ms, and the deadzone margin accepts 0 to 0.5, including both endpoints. Changing the drift threshold changes the classification of the retained movement; changing the margin changes the suggested deadzone. Changing the rest window reevaluates which resting observations fall within each window and whether its elapsed time is sufficient. These edits do not change the recorded input.
Mapping, buttons and triggers
Standard mapping assigns positions consistently across recognized layouts. Positive X points right and positive Y points down, so upward stick movement has negative Y. These are the principal numbered positions used for identification.
| Input | Indices | Positions in order |
|---|---|---|
| Left stick axes | 0, 1 | Horizontal, vertical |
| Right stick axes | 2, 3 | Horizontal, vertical |
| Face buttons | 0 to 3 | Bottom, right, left, top |
| Shoulders | 4, 5 | Left, right |
| Triggers | 6, 7 | Left, right |
| Centre buttons | 8, 9 | Left, right |
| Stick clicks | 10, 11 | Left, right |
| D-pad | 12 to 15 | Up, down, left, right |
| Home button | 16 | Centre home position |
With an unknown mapping, the first two available axis pairs remain raw axes 0/1 and 2/3 rather than assumed left and right sticks. Automatic trigger identification is unavailable. Every exposed axis remains in Axis ledger, including extra or unpaired axes. Zero or one exposed axis cannot provide a two-dimensional stick measurement, although button observations remain useful. The accepted device limits are 64 axes and 128 buttons.
Button coverage counts each eligible button whose browser-reported pressed state was observed at least once. A button held at capture start counts as registered, but its initial hold adds no new press. Press count increases only for an observed released-to-pressed transition with a known preceding state. Excluded positions remain listed but are removed from both eligible counts. A reported touched state is separate from registration and does not prove the presence of a dedicated touch sensor.
Button maximum values cover the whole retained session. Standard trigger analysis uses buttons 6 and 7 when present: the resting value averages hands-off observations, while minimum, maximum and reach use only Pull triggers. An intermediate value strictly between 0 and 1 establishes observed analog behaviour. Seeing both endpoints without intermediate values means only 0/1 was observed; it cannot establish that the hardware is digital. A pull with insufficient variation remains unclear.
Observation timing and retained attempts
Each resting window begins at its first accepted observation and includes readings exactly at the window endpoint. A controller that reports only changes can complete the window with one reading held unchanged. Repeated positive device timestamps are not counted as new updates. The resting window uses elapsed browser observation time; when a usable device timestamp is absent or zero, samples also use the browser's monotonic clock.
Resting statistics retain accepted observations from complete and partial attempts. The complete label means at least one uninterrupted window finished, while the reported elapsed duration sums the observed duration of attempts, capped at the window length for each. Rotation coverage also accumulates across attempts. Consequently, repeating a step does not remove an earlier outlier.
Loss of focus, a hidden tab or disconnection pauses collection and clears live holds. A scheduling gap above the stated limit is recorded as an interruption, and rotation traces break across missing evidence. The observation cadence cannot establish hardware polling frequency, missed physical presses or end-to-end input latency.
A session is bounded to 6000 records, including events, with capture ending slightly earlier to leave room for closing records. Statistics use the retained session.
Precision and comparative reference values
Classification uses the calculated values before display rounding. Normalized measurements generally show three decimals, while circularity error and elapsed times generally show one. Additional digits appear when needed to preserve a consequential threshold comparison. Numeric table exports retain the underlying precision; the text report uses the readable display values.
The XInput references compare Microsoft's suggested stick deadzones and trigger activation threshold with normalized scales. They are not the defaults used for these checks.
| Reference | Constant | Divisor | Approximate value |
|---|---|---|---|
| Left stick deadzone | 7849 | 32767 | 0.239540 |
| Right stick deadzone | 8689 | 32767 | 0.265175 |
| Trigger activation | 30 | 255 | 0.117647 |
Each approximate value is the constant divided by its scale divisor. The trigger activation reference concerns when an input is treated as pressed; it is unrelated to the 0.95 full-pull target. These references are not Gamepad API requirements or universal settings for other controllers.
Limitations and Privacy:
Only inputs exposed to this browser can be observed. The test cannot inspect electrical contacts, identify a worn part or recover movement that was filtered before reaching the browser.
- Compatibility and filtering: current Chrome, Firefox and Safari support the basic Gamepad API, but exposed controls and haptics depend on the controller, operating system and browser. A button press with the page visible may be needed before a connected controller appears, particularly in Firefox. USB and Bluetooth can expose different identifiers, mappings or features. Operating-system, driver, firmware or controller-profile deadzones can suppress movement before it reaches the page, and remapping can reassign buttons. A perfectly centred reading can therefore reflect an earlier deadzone. Some wireless modes and vendor-specific features are unavailable; motion sensing, touchpad gestures and adaptive trigger resistance are outside these checks.
- Vibration: an explicit test requests a half-second effect at a requested intensity of 0.5 where supported. Trigger rumble also requires that effect to be advertised. The software outcome and your sensation are recorded separately; neither measures physical vibration strength. An unsupported or declined request does not diagnose a broken motor.
- Local data: controller identifiers, observations, exclusions, model and notes are processed in the browser and are not uploaded or saved for a later session by this test. They remain in the current tab until Reset or the page is reloaded or closed. Only the three numeric Advanced overrides enter the URL; a shared link restores settings, not recorded evidence. Ordinary page resources may still require network access.
- Keeping a record: export evidence before clearing or leaving the page. The sample and event log displays and exports only its latest 200 rows; the measurements still use the retained session. Reset clears the observations and optional notes but preserves numeric overrides; clear those fields separately to restore defaults. A deliberately shared report includes controller and browser details and any notes you entered, so review its contents first.
References:
- Gamepad specification, W3C Working Draft, 10 July 2025.
- Using the Gamepad API, MDN Web Docs, 13 April 2026.
- Gamepad haptic actuator support, MDN Web Docs, 28 September 2026.
- Getting Started With XInput in Windows applications, Microsoft Learn, 14 July 2025.
- XInput gamepad state and input ranges, Microsoft Learn, 27 October 2023.
- Dead Zone input modifier, Epic Games.
- How to set profiles for your DualSense Edge wireless controller on PC, PlayStation Support.
- How to use DualSense wireless controllers with PC, Mac and mobile devices, PlayStation Support.
- The Xbox February Update is Starting to Roll Out, Xbox Wire, 14 February 2024.
- Here's Why PS5 Joysticks Drift (and Why They'll Only Get Worse), iFixit, 17 February 2021.