Designing a Software Dashboard

At this stage of the project, I had already built a working sensor network and a data logging system that could receive, parse, and store data from multiple onboard modules. The next logical step was to make that data visible in real time.

This meant designing and building a dashboard—not just a visual interface, but a system that could consume fused sensor data and present only what actually mattered to the rider.


Backend Data Fusion and Frontend

One of the first design decisions I made was to separate responsibilities:

  • the backend would collect, parse, and fuse sensor data
  • the frontend would request that data and render it

The data logging engine was already:

  • receiving sensor data wirelessly
  • parsing incoming packets
  • storing logs in JSONL format

What was missing was a real-time access layer for the dashboard.



Exposing fused data over UDP

To solve this, I added a dedicated UDP socket to the data logging engine.

This socket had a very specific role:

  • expose the current fused data frame
  • allow any client to request that data on demand

The logic was intentionally simple:

  • a client sends a REQ message
  • the logging engine responds with one aggregated data frame
  • the frame contains the latest values from all active sensors

This same port could be used by:

  • the dashboard frontend
  • a laptop for debugging
  • a Jupyter Notebook session

I chose UDP over TCP because it is connectionless. There’s no session state to manage, and clients can connect or disconnect freely without additional logic. For stateless, on-demand data streaming, UDP was a better fit.



Conceptualizing , Design and Implementation

Before writing any dashboard code, I needed to answer a harder question:

What should the dashboard actually show?

A dashboard can look impressive and still be unusable in practice. A visually “cool” dashboard is not automatically a practical one.

The rider needs to:

  • understand information at a glance
  • avoid distraction
  • see the most important signals clearly

This meant resisting the temptation to display everything.


Drawing Ideas and Inspiration

To ground my design decisions, I studied dashboards from several manufacturers:

The BMW S1000RR dashboard stood out in particular. Its layout felt balanced, readable, and intentional. Information was grouped logically, colors were restrained, and nothing felt oversized or cluttered.

It became a strong reference point for what good dashboard design looks like.



Sketching and planning the dashboard layout

With references in mind, I started sketching dashboard layouts.

At this stage, the goal wasn’t aesthetics—it was information hierarchy:

  • what needs to be central
  • what can be secondary
  • what can be hidden entirely

I sketched widget placements and experimented with different layouts before committing to any implementation.



Deciding what information actually mattered

Once I had real sensor data flowing, I made a list of everything I could display—and then cut it down.

Some data was better suited for logging and offline analysis rather than real-time display.

The core information that stayed on the dashboard was:

  • speed
  • RPM
  • gear indicator
  • date and time

On top of that, I added:

  • tyre temperature indicators
  • brake disc temperature indicators
  • suspension level indicators
  • lap timer

Anything that didn’t clearly help the rider in the moment was removed.



Feature Addition & Substraction

Not everything survived testing.

Some features that were implemented and later removed:

  • a shift indicator widget
  • early, low-resolution suspension indicators
  • a startup “sweep test” animation

The sweep animation looked cool, but:

  • it didn’t add functional value
  • it introduced unnecessary rendering load
  • it caused visible UI jank

This was an important lesson: visual effects can hurt usability and performance.


Managing information density and cognitive load

As the dashboard matured, I added:

  • headlight indicators
  • GPS lock status
  • lap mode indicator
  • custom sensor error codes

These error codes were not Suzuki ECU errors, but internal diagnostics so I could see which sensor modules were offline or misbehaving.

One important design decision involved lap mode:

  • when lap mode is active, the clock is hidden
  • when lap mode is disabled, the clock returns

This prevented two time-based widgets from competing for attention.



Iteration taught restraint

Over time, the dashboard became simpler.

Elements that felt important early on were removed after real usage. Each iteration forced a question:

Does this actually help the rider right now?

If the answer was no, it didn’t belong on the screen.

Balancing:

  • imagination
  • integration
  • restraint

turned out to be one of the hardest parts of the project.


Why this mattered for an older bike

What made this especially satisfying was seeing the dashboard running on a 2003 GSX-R1000.

This bike was never designed to support:

  • telemetry
  • modern dashboards
  • software-driven behavior

Yet with a layered system—sensors, backend fusion, frontend display—it was possible to give it a modern, data-driven interface without touching the ECU.



What this part of the project taught me

Designing the dashboard taught me that:

  • presentation matters as much as data
  • fewer signals, shown well, beat many signals shown poorly
  • dashboards should be opinionated
  • integration is as much a design problem as a technical one

It also gave me a new appreciation for how much invisible engineering goes into OEM motorcycle dashboards.