# markr42/malenki-nano architecture

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

- Interactive diagram: https://gitdiagram.com/markr42/malenki-nano
- Repository: https://github.com/markr42/malenki-nano

## Overview

Malenki-Nano is a small-robot ESC and receiver compatible with Flysky/Turnigy AFHDS-2A transmitters. Its principal runtime is the nano2 firmware: initialization leads into a recurring radio, voltage-sensing, stick-processing, watchdog, and motor-control loop. Radio packet handling and SPI transport are distinct internal layers; mixing, weapons, configuration, and sensing are additional product capabilities represented in the source tree. Separate A7105, receiver, transmitter, and motor test firmware are included. Some subsystem connections are omitted because their implementation was not excerpted.

Main entry points: [`firmware/nano2/main.c`](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/main.c) (Firmware loop), [`firmware/nano2/radio.c`](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/radio.c) (AFHDS-2A radio), [`firmware/rx_test/main.c`](https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/main.c) (Receiver test entry), [`firmware/tx_test/main.c`](https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/main.c) (Transmitter test entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["ESC Receiver"]
  node_controller["Firmware loop<br/>[main.c]"]
  node_radio["AFHDS-2A radio<br/>[radio.c]"]
  node_spi["A7105 SPI<br/>[a7105_spi.c]"]
  node_sensing["Voltage sensing<br/>[vsense.c]"]
  node_sticks["Stick processing<br/>[sticks.c]"]
  node_mixing["Control mixing<br/>[mixing.c]"]
  node_motors["Motor control<br/>[motors.c]"]
  node_scarab_motors["Scarab motors<br/>[motors_scarab.c]"]
  node_weapons["Weapon control<br/>[weapons.c]"]
  node_nvconfig["Nonvolatile config<br/>[nvconfig.c]"]
end

subgraph group_radio_tests["Radio Test Firmware"]
  node_rx_main["Receiver test entry<br/>[main.c]"]
  node_rx_radio["Receiver scanner<br/>[radio.c]"]
  node_rx_spi["Receiver test SPI<br/>[a7105_spi.c]"]
  node_tx_main["Transmitter test entry<br/>[main.c]"]
  node_tx_radio["Transmitter test<br/>[radio.c]"]
  node_tx_spi["Transmitter test SPI<br/>[a7105_spi.c]"]
end

subgraph group_hardware_tests["Hardware Tests"]
  node_a7105_test_main["A7105 test entry<br/>[main.c]"]
  node_a7105_test_radio["A7105 radio test<br/>[radio.c]"]
  node_a7105_test_spi["A7105 test SPI<br/>[a7105_spi.c]"]
  node_motor_test_main["Motor test entry<br/>[main.c]"]
  node_motor_test["Motor test driver<br/>[motors.c]"]
end

node_tx(("AFHDS-2A transmitter"))

node_controller -->|"runs loop"| node_radio
node_controller -->|"runs loop"| node_sensing
node_controller -->|"runs loop"| node_sticks
node_controller -->|"runs loop"| node_motors
node_radio -->|"accesses radio"| node_spi
node_tx -.->|"sends packets"| node_radio
node_a7105_test_main -->|"initializes SPI"| node_a7105_test_spi
node_a7105_test_main -->|"runs radio test"| node_a7105_test_radio
node_a7105_test_radio -->|"uses SPI"| node_a7105_test_spi
node_rx_main -->|"initializes SPI"| node_rx_spi
node_rx_main -->|"runs scanner"| node_rx_radio
node_rx_radio -->|"reads radio"| node_rx_spi
node_tx_main -->|"initializes SPI"| node_tx_spi
node_tx_main -->|"runs test"| node_tx_radio
node_tx_radio -->|"writes radio"| node_tx_spi
node_motor_test_main -->|"drives motors"| node_motor_test

click node_controller "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/main.c"
click node_radio "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/radio.c"
click node_spi "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/a7105_spi.c"
click node_sensing "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/vsense.c"
click node_sticks "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/sticks.c"
click node_mixing "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/mixing.c"
click node_motors "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/motors.c"
click node_scarab_motors "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/motors_scarab.c"
click node_weapons "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/weapons.c"
click node_nvconfig "https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/nvconfig.c"
click node_a7105_test_main "https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/main.c"
click node_a7105_test_radio "https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/radio.c"
click node_a7105_test_spi "https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/a7105_spi.c"
click node_rx_main "https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/main.c"
click node_rx_radio "https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/radio.c"
click node_rx_spi "https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/a7105_spi.c"
click node_tx_main "https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/main.c"
click node_tx_radio "https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/radio.c"
click node_tx_spi "https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/a7105_spi.c"
click node_motor_test_main "https://github.com/markr42/malenki-nano/blob/master/firmware/motor_test/main.c"
click node_motor_test "https://github.com/markr42/malenki-nano/blob/master/firmware/motor_test/motors.c"

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_controller,node_radio,node_spi,node_sensing,node_sticks,node_mixing,node_motors,node_scarab_motors,node_weapons,node_nvconfig toneBlue
class node_rx_main,node_rx_radio,node_rx_spi,node_tx_main,node_tx_radio,node_tx_spi toneAmber
class node_a7105_test_main,node_a7105_test_radio,node_a7105_test_spi,node_motor_test_main,node_motor_test toneMint
class node_tx toneIndigo
```

## Components

### ESC Receiver

- [Firmware loop](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/main.c): `firmware/nano2/main.c`
- [AFHDS-2A radio](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/radio.c): `firmware/nano2/radio.c`
- [A7105 SPI](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/a7105_spi.c): `firmware/nano2/a7105_spi.c`
- [Voltage sensing](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/vsense.c): `firmware/nano2/vsense.c`
- [Stick processing](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/sticks.c): `firmware/nano2/sticks.c`
- [Control mixing](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/mixing.c): `firmware/nano2/mixing.c`
- [Motor control](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/motors.c): `firmware/nano2/motors.c`
- [Scarab motors](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/motors_scarab.c): `firmware/nano2/motors_scarab.c`
- [Weapon control](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/weapons.c): `firmware/nano2/weapons.c`
- [Nonvolatile config](https://github.com/markr42/malenki-nano/blob/master/firmware/nano2/nvconfig.c): `firmware/nano2/nvconfig.c`

### Radio Test Firmware

- [Receiver test entry](https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/main.c): `firmware/rx_test/main.c`
- [Receiver scanner](https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/radio.c): `firmware/rx_test/radio.c`
- [Receiver test SPI](https://github.com/markr42/malenki-nano/blob/master/firmware/rx_test/a7105_spi.c): `firmware/rx_test/a7105_spi.c`
- [Transmitter test entry](https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/main.c): `firmware/tx_test/main.c`
- [Transmitter test](https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/radio.c): `firmware/tx_test/radio.c`
- [Transmitter test SPI](https://github.com/markr42/malenki-nano/blob/master/firmware/tx_test/a7105_spi.c): `firmware/tx_test/a7105_spi.c`

### Hardware Tests

- [A7105 test entry](https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/main.c): `firmware/a7105_test/main.c`
- [A7105 radio test](https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/radio.c): `firmware/a7105_test/radio.c`
- [A7105 test SPI](https://github.com/markr42/malenki-nano/blob/master/firmware/a7105_test/a7105_spi.c): `firmware/a7105_test/a7105_spi.c`
- [Motor test entry](https://github.com/markr42/malenki-nano/blob/master/firmware/motor_test/main.c): `firmware/motor_test/main.c`
- [Motor test driver](https://github.com/markr42/malenki-nano/blob/master/firmware/motor_test/motors.c): `firmware/motor_test/motors.c`

### Other components

- **AFHDS-2A transmitter**

## Connections

- Firmware loop → AFHDS-2A radio: runs loop (evidence: `firmware/nano2/main.c`)
- Firmware loop → Voltage sensing: runs loop (evidence: `firmware/nano2/main.c`)
- Firmware loop → Stick processing: runs loop (evidence: `firmware/nano2/main.c`)
- Firmware loop → Motor control: runs loop (evidence: `firmware/nano2/main.c`)
- AFHDS-2A radio → A7105 SPI: accesses radio (evidence: `firmware/nano2/radio.c`)
- AFHDS-2A transmitter → AFHDS-2A radio: sends packets (evidence: `README.md`)
- A7105 test entry → A7105 test SPI: initializes SPI (evidence: `firmware/a7105_test/main.c`)
- A7105 test entry → A7105 radio test: runs radio test (evidence: `firmware/a7105_test/main.c`)
- A7105 radio test → A7105 test SPI: uses SPI (evidence: `firmware/a7105_test/radio.c`)
- Receiver test entry → Receiver test SPI: initializes SPI (evidence: `firmware/rx_test/main.c`)
- Receiver test entry → Receiver scanner: runs scanner (evidence: `firmware/rx_test/main.c`)
- Receiver scanner → Receiver test SPI: reads radio (evidence: `firmware/rx_test/radio.c`)
- Transmitter test entry → Transmitter test SPI: initializes SPI (evidence: `firmware/tx_test/main.c`)
- Transmitter test entry → Transmitter test: runs test (evidence: `firmware/tx_test/main.c`)
- Transmitter test → Transmitter test SPI: writes radio (evidence: `firmware/tx_test/radio.c`)
- Motor test entry → Motor test driver: drives motors (evidence: `firmware/motor_test/main.c`)
