Gibt es Frameworks oder Tools, die ADR für Embedded C/C++ unterstützen?

Nein, ADR wird derzeit kaum explizit für Embedded C/C++ unterstützt, da es primär aus der Webentwicklung stammt. Die Struktur lässt sich aber leicht manuell nachbilden, insbesondere in C++ mit Klassen oder in C mit Funktionsgruppen und getrennten Modulen. Unit-Test-Frameworks wie GoogleTest, Ceedling oder Catch2 helfen, die einzelnen Komponenten sauber testbar zu halten.

Hier ist ein einfaches Beispiel zu Punkt 6 – wie man das Action-Domain-Responder (ADR)-Pattern in C++ für ein Embedded-System umsetzen könnte.

Szenario:
Ein Taster wird gedrückt. Wenn der Taster mindestens 2 Sekunden gedrückt bleibt, soll eine LED eingeschaltet werden. Die Software ist in drei Teile aufgeteilt:

  • Action: Reagiert auf den Taster-Interrupt.
  • Domain: Bewertet die Drückdauer.
  • Responder: Steuert die LED.

1. Domain (Geschäftslogik)

// domain/ButtonPressEvaluator.h
#pragma once

enum class ButtonAction {
    NONE,
    TURN_ON_LED
};

class ButtonPressEvaluator {
public:
    ButtonAction evaluatePressDuration(int durationMs) {
        if (durationMs >= 2000) {
            return ButtonAction::TURN_ON_LED;
        }
        return ButtonAction::NONE;
    }
};

2. Responder (Ausgabe)

// responder/LedController.h
#pragma once
#include <iostream>

class LedController {
public:
    void handle(ButtonAction action) {
        if (action == ButtonAction::TURN_ON_LED) {
            turnOn();
        }
    }

private:
    void turnOn() {
        // In echtem Embedded-Code wäre das z. B. GPIO_SetPin(LED_PIN)
        std::cout << "LED ON\n";
    }
};

3. Action (Eingabeereignis)

// action/ButtonInterruptHandler.h
#pragma once
#include "domain/ButtonPressEvaluator.h"
#include "responder/LedController.h"

class ButtonInterruptHandler {
public:
    ButtonInterruptHandler(ButtonPressEvaluator& evaluator, LedController& responder)
        : evaluator(evaluator), responder(responder) {}

    void onButtonReleased(int pressDurationMs) {
        auto result = evaluator.evaluatePressDuration(pressDurationMs);
        responder.handle(result);
    }

private:
    ButtonPressEvaluator& evaluator;
    LedController& responder;
};

4. Main/Test (z. B. in Unit Test oder Main Loop)

#include "action/ButtonInterruptHandler.h"
#include "domain/ButtonPressEvaluator.h"
#include "responder/LedController.h"

int main() {
    ButtonPressEvaluator evaluator;
    LedController responder;
    ButtonInterruptHandler handler(evaluator, responder);

    handler.onButtonReleased(2500);  // Beispiel: 2,5 Sekunden gedrückt → LED ON
    handler.onButtonReleased(1000);  // Beispiel: 1 Sekunde gedrückt → Keine Aktion
}

Hinweise:

  • Unit-Tests wären sehr leicht möglich, da jede Komponente isoliert testbar ist.
  • Für Embedded C wäre der Aufbau ähnlich, nur ohne Klassen – man würde mit Funktionszeigern und Modulen arbeiten.
  • In einem echten Projekt würde std::cout natürlich durch GPIO-Funktionen oder Hardware-Abstraktionen ersetzt.
com

Newsletter Anmeldung

Bleiben Sie informiert! Wir informieren Sie über alle neuen Beiträge (max. 1 Mail pro Woche – versprochen)