# nikhilmaity00/pulsarnav architecture

> Architecture diagram of the GitHub repository nikhilmaity00/pulsarnav, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/nikhilmaity00/pulsarnav
- Repository: https://github.com/nikhilmaity00/pulsarnav

## Overview

PulsarNav is an offline Android companion for Bajaj/Rouser motorcycle clusters. Its main workflow receives navigation notifications, parses maneuvers, builds OTC frames, and sends them to the bike over BLE. The app also provides call and handlebar media controls, bike/ride utilities, maintenance and fuel logs, settings, and backup/restore. Edges are limited to calls supported by excerpts, the source index, or README; some secondary feature wiring is not shown.

Main entry points: [`app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt) (App interface), [`app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt`](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt) (BLE manager), [`app/src/main/java/com/pulsarnav/app/data/AppSettings.kt`](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/AppSettings.kt) (App settings), [`app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt) (Backup and restore)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_navigation["Navigation bridge"]
  node_listener["Navigation listener"]
  node_parser["Notification parser"]
  node_matcher["Maneuver matcher<br/>[ManeuverMatcher.kt]"]
  node_maneuver["Maneuver model<br/>[Maneuver.kt]"]
  node_packet["OTC packet builder"]
end

subgraph group_connectivity["Bike connectivity"]
  node_ble_service["BLE foreground service"]
  node_ble["BLE manager<br/>[BajajBleManager.kt]"]
  node_ignition["Ignition receiver"]
end

subgraph group_companion["Rider companion"]
  node_calls["Call controls<br/>[CallManager.kt]"]
  node_media["Media controls"]
  node_telemetry["Phone telemetry"]
  node_parking["Parking location<br/>[ParkingManager.kt]"]
  node_rides["Ride tracking<br/>[RideTracker.kt]"]
  node_maintenance["Maintenance records"]
  node_fuel["Fuel log<br/>[FuelLogManager.kt]"]
  node_ui["App interface<br/>[MainActivity.kt]"]
end

subgraph group_data["Settings and records"]
  node_catalog["Vehicle catalog<br/>[VehicleCatalog.kt]"]
  node_settings[("App settings<br/>[AppSettings.kt]")]
  node_vault["Backup and restore"]
end

node_rider(("Rider"))
node_navigation_app["Google Maps / Waze"]
node_bike["Motorcycle cluster"]

node_navigation_app -->|"posts directions"| node_listener
node_listener -->|"parses notices"| node_parser
node_parser -->|"matches maneuvers"| node_matcher
node_parser -->|"produces steps"| node_maneuver
node_matcher -->|"selects opcode"| node_maneuver
node_listener -->|"dispatches steps"| node_ble
node_ble -->|"builds frames"| node_packet
node_packet -->|"encodes opcode"| node_maneuver
node_ble -->|"writes frames"| node_bike
node_rider -->|"uses app"| node_ui
node_ui -->|"selects bike"| node_catalog
node_ui -->|"configures"| node_settings
node_ui -->|"backs up data"| node_vault
node_ui -->|"manages parking"| node_parking
node_ui -->|"manages services"| node_maintenance
node_ui -->|"logs refuels"| node_fuel
node_ui -->|"views rides"| node_rides
node_vault -->|"exports settings"| node_settings
node_vault -->|"exports records"| node_maintenance
node_vault -->|"exports entries"| node_fuel
node_vault -->|"exports trips"| node_rides
node_ignition -->|"starts service"| node_ble_service
node_ble_service -->|"initializes calls"| node_calls
node_calls -->|"sends call alerts"| node_ble
node_ble -->|"dispatches buttons"| node_media
node_media -->|"reads preferences"| node_settings
node_telemetry -->|"reads bike data"| node_ble
node_parking -->|"reads auto-park"| node_settings
node_maintenance -->|"reads settings"| node_settings
node_rides -->|"reads settings"| node_settings
node_fuel -->|"shares odometer"| node_maintenance

click node_listener "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/service/GoogleMapsNotificationListener.kt"
click node_parser "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/parser/GoogleMapsNotificationParser.kt"
click node_matcher "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/parser/ManeuverMatcher.kt"
click node_maneuver "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/model/Maneuver.kt"
click node_packet "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/protocol/OtcPacketBuilder.kt"
click node_ble_service "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/service/BikeBleForegroundService.kt"
click node_ble "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt"
click node_ignition "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/receiver/BluetoothIgnitionReceiver.kt"
click node_calls "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/telephony/CallManager.kt"
click node_media "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/media/MediaControlManager.kt"
click node_telemetry "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/telemetry/PhoneTelemetryManager.kt"
click node_parking "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/location/ParkingManager.kt"
click node_rides "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/tracking/RideTracker.kt"
click node_maintenance "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/maintenance/MaintenanceManager.kt"
click node_fuel "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/maintenance/FuelLogManager.kt"
click node_ui "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt"
click node_catalog "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/VehicleCatalog.kt"
click node_settings "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/AppSettings.kt"
click node_vault "https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_listener,node_parser,node_matcher,node_maneuver,node_packet toneBlue
class node_ble_service,node_ble,node_ignition toneAmber
class node_calls,node_media,node_telemetry,node_parking,node_rides,node_maintenance,node_fuel,node_ui toneMint
class node_catalog,node_settings,node_vault toneRose
class node_rider,node_navigation_app,node_bike toneIndigo
```

## Components

### Navigation bridge

- [Navigation listener](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/service/GoogleMapsNotificationListener.kt): `app/src/main/java/com/pulsarnav/app/service/GoogleMapsNotificationListener.kt`
- [Notification parser](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/parser/GoogleMapsNotificationParser.kt): `app/src/main/java/com/pulsarnav/app/parser/GoogleMapsNotificationParser.kt`
- [Maneuver matcher](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/parser/ManeuverMatcher.kt): `app/src/main/java/com/pulsarnav/app/parser/ManeuverMatcher.kt`
- [Maneuver model](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/model/Maneuver.kt): `app/src/main/java/com/pulsarnav/app/model/Maneuver.kt`
- [OTC packet builder](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/protocol/OtcPacketBuilder.kt): `app/src/main/java/com/pulsarnav/app/protocol/OtcPacketBuilder.kt`

### Bike connectivity

- [BLE foreground service](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/service/BikeBleForegroundService.kt): `app/src/main/java/com/pulsarnav/app/service/BikeBleForegroundService.kt`
- [BLE manager](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt): `app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt`
- [Ignition receiver](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/receiver/BluetoothIgnitionReceiver.kt): `app/src/main/java/com/pulsarnav/app/receiver/BluetoothIgnitionReceiver.kt`

### Rider companion

- [Call controls](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/telephony/CallManager.kt): `app/src/main/java/com/pulsarnav/app/telephony/CallManager.kt`
- [Media controls](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/media/MediaControlManager.kt): `app/src/main/java/com/pulsarnav/app/media/MediaControlManager.kt`
- [Phone telemetry](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/telemetry/PhoneTelemetryManager.kt): `app/src/main/java/com/pulsarnav/app/telemetry/PhoneTelemetryManager.kt`
- [Parking location](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/location/ParkingManager.kt): `app/src/main/java/com/pulsarnav/app/location/ParkingManager.kt`
- [Ride tracking](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/tracking/RideTracker.kt): `app/src/main/java/com/pulsarnav/app/tracking/RideTracker.kt`
- [Maintenance records](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/maintenance/MaintenanceManager.kt): `app/src/main/java/com/pulsarnav/app/maintenance/MaintenanceManager.kt`
- [Fuel log](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/maintenance/FuelLogManager.kt): `app/src/main/java/com/pulsarnav/app/maintenance/FuelLogManager.kt`
- [App interface](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt): `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`

### Settings and records

- [Vehicle catalog](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/VehicleCatalog.kt): `app/src/main/java/com/pulsarnav/app/data/VehicleCatalog.kt`
- [App settings](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/AppSettings.kt): `app/src/main/java/com/pulsarnav/app/data/AppSettings.kt`
- [Backup and restore](https://github.com/nikhilmaity00/pulsarnav/blob/master/app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt): `app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`

### Other components

- **Rider**
- **Google Maps / Waze**
- **Motorcycle cluster**

## Connections

- Google Maps / Waze → Navigation listener: posts directions
- Navigation listener → Notification parser: parses notices (evidence: `app/src/main/java/com/pulsarnav/app/service/GoogleMapsNotificationListener.kt`)
- Notification parser → Maneuver matcher: matches maneuvers (evidence: `app/src/main/java/com/pulsarnav/app/parser/GoogleMapsNotificationParser.kt`)
- Notification parser → Maneuver model: produces steps (evidence: `app/src/main/java/com/pulsarnav/app/parser/GoogleMapsNotificationParser.kt`)
- Maneuver matcher → Maneuver model: selects opcode (evidence: `app/src/main/java/com/pulsarnav/app/parser/ManeuverMatcher.kt`)
- Navigation listener → BLE manager: dispatches steps (evidence: `app/src/main/java/com/pulsarnav/app/service/GoogleMapsNotificationListener.kt`)
- BLE manager → OTC packet builder: builds frames (evidence: `app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt`)
- OTC packet builder → Maneuver model: encodes opcode (evidence: `app/src/main/java/com/pulsarnav/app/protocol/OtcPacketBuilder.kt`)
- BLE manager → Motorcycle cluster: writes frames
- Rider → App interface: uses app
- App interface → Vehicle catalog: selects bike (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → App settings: configures (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → Backup and restore: backs up data (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → Parking location: manages parking (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → Maintenance records: manages services (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → Fuel log: logs refuels (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- App interface → Ride tracking: views rides (evidence: `app/src/main/java/com/pulsarnav/app/ui/MainActivity.kt`)
- Backup and restore → App settings: exports settings (evidence: `app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`)
- Backup and restore → Maintenance records: exports records (evidence: `app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`)
- Backup and restore → Fuel log: exports entries (evidence: `app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`)
- Backup and restore → Ride tracking: exports trips (evidence: `app/src/main/java/com/pulsarnav/app/data/DataVaultManager.kt`)
- Ignition receiver → BLE foreground service: starts service (evidence: `app/src/main/java/com/pulsarnav/app/receiver/BluetoothIgnitionReceiver.kt`)
- BLE foreground service → Call controls: initializes calls (evidence: `app/src/main/java/com/pulsarnav/app/service/BikeBleForegroundService.kt`)
- Call controls → BLE manager: sends call alerts (evidence: `app/src/main/java/com/pulsarnav/app/telephony/CallManager.kt`)
- BLE manager → Media controls: dispatches buttons (evidence: `app/src/main/java/com/pulsarnav/app/ble/BajajBleManager.kt`)
- Media controls → App settings: reads preferences (evidence: `app/src/main/java/com/pulsarnav/app/media/MediaControlManager.kt`)
- Phone telemetry → BLE manager: reads bike data (evidence: `app/src/main/java/com/pulsarnav/app/telemetry/PhoneTelemetryManager.kt`)
- Parking location → App settings: reads auto-park (evidence: `app/src/main/java/com/pulsarnav/app/location/ParkingManager.kt`)
- Maintenance records → App settings: reads settings (evidence: `app/src/main/java/com/pulsarnav/app/maintenance/MaintenanceManager.kt`)
- Ride tracking → App settings: reads settings (evidence: `app/src/main/java/com/pulsarnav/app/tracking/RideTracker.kt`)
- Fuel log → Maintenance records: shares odometer (evidence: `app/src/main/java/com/pulsarnav/app/maintenance/FuelLogManager.kt`)
