{{ example ? 'Example session' : 'Controller observations' }}
{{ summaryValue }}

{{ finding }}

{{ summaryLine }}

{{ chip }}

{{ summaryValue }}

Example controller — synthetic evidence

{{ t.index === 6 ? 'LT / L2' : 'RT / R2' }}{{ t.maximum === null ? 'Not tested' : 'Max '+num(t.maximum,3,0.95) }}
{{ b.index }} · {{ b.label }}{{ b.mark }} {{ b.status === 'Tested; held at start' ? 'Held at start' : b.status }}

✓ tested · ? never pressed · H held at start · × excluded · blue = live

{{ 'Axis '+index+': '+liveAxis(value) }}
{{ !computation.ok ? (hasRecordedEvidence ? 'Check settings · evidence retained' : 'Check settings') : example ? 'Example session · Stopped' : state === 'running' ? step.label : stageState === 'unavailable' ? 'Unavailable' : state === 'paused' ? 'Paused' : state === 'completed' ? 'Stopped' : 'Press a controller button' }} · {{ restReady ? 'Window ended' : 'Sampling' }}
{{ state }}: {{ step.label }}
Controller test device facts
Tested device:
Press a controller button with this page visible, then Start. Only exposed devices can appear. Reset before changing controllers.

{{ example || hasRecordedEvidence || devices.length ? device.id : 'No controller exposed yet' }}

{{ apiMessage }}

Buttons absent on my controller

Exclude only physically absent positions while stopped. Rows remain in the report, labelled as your exclusions.

Expose a controller first.

Guided steps

{{ state === 'running' ? step.instruction : 'Start hands off, rotate each stick, press all buttons, then pull triggers. Use Next, Skip or Repeat; partial tests stay partial.' }}

Stop, focus loss and disconnect clear live input while keeping evidence. Start resumes with a fresh step window. Pair a physical controller to your phone; touch-screen gamepads do not count.

Method and browser limits

{{ limits }}

Drift 0.05, rest 2000 ms and margin 0.02 are tool heuristics. XInput deadzones are reference values, not required Gamepad API settings. No motor, latency or physical-angle measurement.

{{ settings.drift }}
Blank uses 0.05 normalized radius (tool heuristic). Flag only when maximum resting radius is strictly greater. Equality is not flagged.
{{ settings.window_ms }} ms
Blank uses 2000 ms (tool heuristic). Completion uses elapsed connected, visible time from the first observation. A value held unchanged is valid; repeated timestamps are not new updates.
{{ settings.margin }}
Blank uses 0.02 normalized radius (tool heuristic). Added to maximum rest radius; round up by 0.01, cap 0.99.
Model and notes appear only in the local report. They are never saved or query-synced.
Vibration (optional)

Explicit clicks only. API support and your sensation are separate observations; the motor is never measured.

{{ vibrationStatus }} · {{ vibrationConfirmation }}

{{ exportStatus }}

{{ reportText }}

{{ exportStatus }}

Stick / axesMax radiusDrift flagDeadzoneRotation binsError (%)Rest windowUpdates / msMean X / YMean radiusJitter RMSXInput 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 }}

Index / buttonStatusPress countMax valueHeld at startHeld nowTouchedNever pressedExcludedCopy
{{ row.index }} · {{ row.name }}{{ buttonStatus(row) }}{{ row.press_count }}{{ num(row.maximum) }}{{ row.held_at_start ? 'Yes' : 'No' }}{{ row.held_now ? 'Yes' : 'No' }}{{ row.touched ? 'Yes' : 'No' }}{{ row.never_pressed ? 'Yes' : 'No' }}{{ row.excluded ? 'By you' : 'No' }}

{{ exportStatus }}

TriggerPull maxReach ≥0.95Rest valuePull minBehaviourUpdatesXInput 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 }}

AxisMaximumMinimumLast valueIndexCopy
{{ 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 / stepObserved msDevice msClockAxes (index:value)Buttons / eventCopy
{{ 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

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.
Concentric stick input zones: an inner deadzone around centre, usable travel between the boundaries, and an outer deadzone near the edge.
Conceptual zones with illustrative sizes, not measured controller limits.

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.

  1. 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.
  2. 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.
  3. Rotate each stick slowly around its outer edge with gentle pressure during Rotate sticks. Select Next after covering the full path.
  4. Press and release every button during Press buttons, including both stick clicks and each D-pad direction. Select Next when finished.
  5. Release each trigger, slowly pull it fully and release it again during Pull triggers. Select Finish to retain the completed or partial observations.
  6. 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.

ri=xi2+yi2 (x¯,y¯)=1n∑i=1n(xi,yi) r¯=1n∑i=1nri R=max1≤i≤nri J=1n∑i=1n[(xi−x¯)2+(yi−y¯)2]

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.

D=min(0.99,⌈100(R+m−ε)⌉100),ε=10−12

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=100k∑j=1k|ρj−1|

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.

Rules used to classify recorded gamepad observations
CheckBoundaryMeaning
Drift flagMaximum resting radius > threshold; default 0.05Equality is not flagged. No rest observations means not tested.
Complete restAt least one uninterrupted window reaches its duration; default 2000 msRequires at least one valid observation while connected and visible.
Full rotation24 of 24 binsFewer bins remain partial, regardless of the error percentage.
Trigger reachMaximum during Pull triggers ≥ 0.95Equality reaches the target. No pull observations means not tested.
Sampling interruptionGap > 250 msExactly 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.

Standard Gamepad axis and button positions
InputIndicesPositions in order
Left stick axes0, 1Horizontal, vertical
Right stick axes2, 3Horizontal, vertical
Face buttons0 to 3Bottom, right, left, top
Shoulders4, 5Left, right
Triggers6, 7Left, right
Centre buttons8, 9Left, right
Stick clicks10, 11Left, right
D-pad12 to 15Up, down, left, right
Home button16Centre 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.

XInput reference constants expressed on normalized scales
ReferenceConstantDivisorApproximate value
Left stick deadzone7849327670.239540
Right stick deadzone8689327670.265175
Trigger activation302550.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: