rbs_demo – Beispiel-App für das rbs-Regelsystem

Zusammenfassung

rbs_demo ist die Beispiel-App für die rbs-Bibliothek (rbs – Regel-Engine): ein klassisches Wetter-Programm, das Fakten, Regeln, Effekte und den sm-Lebenszyklus in einer lauffähigen App zeigt.

Wenn es regnet oder bewölkt ist → nass. Wenn man nass ist → Schirm. Wenn man erwachsen ist → bezahlt man (Effekt: −10 Geld).

Projektstruktur

src/
├── app.h      # deklarative Programmstrukturen: Token-/Value-Enums, Namen,
│              #   Regeln, Effekte, Zustands-Slots, Handler-Prototypen
├── app.c      # alle Handler (Slot-Handler, Schritt-Callback) + Konstruktor/
│              #   Destruktor sm_on_start/sm_on_stop (Lebenszyklus)
└── main.c     # main(): rbs-Konfiguration + fsm-Verdrahtung + Start

Die Trennung folgt der rbs-Semantik: Daten (Wissen) liegen deklarativ in app.h, Handlungslogik (externe Faktenquellen, Lebenszyklus) in app.c, der Einstieg verdrahtet nur noch (main.c).

Lebenszyklus (Konstruktor/Destruktor)

Der Lebenszyklus ist über die sm-Callbacks sm_on_start/sm_on_stop umgesetzt (weak, api-Muster; werden in app.c stark definiert). Sie laufen im Worker-Thread von sm ganz am Anfang bzw. Ende:

  • sm_on_start = Konstruktor: legt die rbs-Buffer an (rbs_create_facts_buffer/rbs_create_memory_buffer), initialisiert sie, setzt die Welt-Konstanten (AGE, MONEY) und die Ausgangslage (RAIN, CLOUDY).
  • sm_on_stop = Destruktor: bilanziert die Endfakten (z. B. UMBRELLA gesetzt?) und gibt die Buffer wieder frei.

Damit ist die Speicherverwaltung im Thread-Lebenszyklus angesiedelt: Aufbau im Konstruktor, Abbau im Destruktor; main speist keine Fakten mehr ein, sondern nur die statische Verkabelung.

CMake-Muster

add_subdirectory(../../libraries/rbs ${CMAKE_BINARY_DIR}/rbs)
target_link_libraries(rbs_demo PUBLIC m rbs)

Die rbs-Bibliothek zieht ihre Abhängigkeiten (sm, logging, m) transitiv per PUBLIC-Link mit. app.h liegt im src/-Include-Pfad; Bibliotheks-Header kommen mit spitzen Klammern (<rbs/rbs.h>, <sm/sm.h>).

Ausgabe

app: fsm startet (wetter: es regnet und ist bewoelkt)
step 1 | UMBRELLA: false | MONEY: 100
wetter: regen klaert auf
step 2 | UMBRELLA: true | MONEY: 90
app: UMBRELLA ist gesetzt (fsm beendet)
rbs main end

Quellen

  • Repo: https://github.com/deppenkaiser/rbs_demo (public, Apache-2.0)
  • apps/rbs_demo/{CMakeLists.txt,src/*}, libraries/rbs (Bibliothek)
  • Build & Test: cmake -S . -B build && cmake --build build && ./build/bin/rbs_demo

Verwandte Artikel