KymoCore · C++11 / C-API

Telemetrie für deinen Mikrocontroller, ohne Ballast.

KymoCore liest deine Messwerte im eingestellten Takt, packt sie in Binärframes von 9 bis 21 Byte und übergibt sie an jede beliebige Schnittstelle – ohne Heap, ohne RTOS und ohne die Hauptschleife zu blockieren. Am PC zeigt KymoStudio die Signale live.

256 Kanäle, eigener Takt

Jeder Kanal hat sein eigenes Abtastintervall; ein Round-Robin-Scheduler entscheidet, wer an der Reihe ist.

Y, XY oder XYZ

Optional mit Zeitstempel und CRC-8. float32, Little Endian, ein festes und dokumentiertes Protokoll.

Blockiert nie

Kymo_Init() einmal, Kymo_Main() in der Schleife. Kein Heap, kein RTOS, keine Exceptions, kein RTTI.

Jede Schnittstelle

UART, USB CDC, WLAN mit TCP oder UDP, MQTT, CAN – du lieferst einen Write-Callback, KymoCore die Bytes.

Auch langsame Leitungen

Teilweise Übertragungen, Backpressure und geliehene DMA-Puffer werden sauber behandelt.

Runtime-Tracing

Optionale Makros für Scopes, Marker, ISRs und Scheduler-Wechsel. KYMO_ENABLED=0 entfernt alles für Produktions-Builds.

Schnellstart

Aus der PlatformIO Registry installieren

Trage KymoCore in die platformio.ini deines Projekts ein:

lib_deps =
    codename666/KymoCore

Vollständiges Beispiel für Arduino und ESP32

Diese src/main.cpp sendet mit den Standardeinstellungen alle 20 ms einen Sägezahn zwischen 0 und knapp 1 auf Kanal 0. Die serielle Schnittstelle trägt nur Binärdaten – Diagnoseausgaben würden den Datenstrom stören.

#include <Arduino.h>
#include <kymo_runtime.h>

static KymoContext context = {};
static KymoStatus lastStatus = KYMO_BAD_CONFIG;
static uint32_t lastSampleMs[1] = {};
static const KymoChannel channels[] = {{20U, 0U, 0U}};

static uint32_t readClockMs(void *user)
{
    (void)user;
    return static_cast<uint32_t>(millis());
}

static uint8_t readSample(void *user, uint8_t id, KymoSample *out)
{
    (void)user;
    (void)id;
    if (out == nullptr) {
        return 0U;
    }
    out->value = static_cast<float>(millis() % 1000UL) / 1000.0f;
    return 1U;
}

static uint8_t writeBytes(void *user, const uint8_t *bytes, uint8_t length)
{
    int available = Serial.availableForWrite();
    (void)user;
    if ((bytes == nullptr) || (available <= 0)) {
        return 0U;
    }
    if (available < length) {
        length = static_cast<uint8_t>(available);
    }
    return static_cast<uint8_t>(Serial.write(bytes, length));
}

static const KymoConfig config = {
    channels, lastSampleMs, readClockMs, nullptr, readSample, nullptr,
    writeBytes, nullptr, nullptr, nullptr, 1U
};

void setup()
{
    Serial.begin(115200);
    lastStatus = Kymo_Init(&context, &config);
}

void loop()
{
    if ((lastStatus != KYMO_BAD_CONFIG) && (lastStatus != KYMO_IO_ERROR)) {
        lastStatus = Kymo_Main(&context);
    }
}

Mit pio run bauen, mit pio run -t upload flashen, einen offenen seriellen Monitor schließen und KymoStudio mit 115200 Baud, 8N1 verbinden. Kanal 0 einem Diagramm zuweisen.

Unterstützte Zielsysteme

KymoCore enthält keine Hardwaretreiber: Du bindest dein Zielsystem über Callbacks für Zeit, Abtastung und Transport an. Dadurch bleibt die Bibliothek vom Arduino Uno bis zum STM32 mit DMA gleich. Die KymoProbe-Beispiele decken Arduino Uno, Nano und Mega ab, ESP32, ESP32-S3 und ESP32-C3 sowie STM32 Nucleo F401RE, F411RE und Blue Pill F103C8 – das sind Beispielportierungen, keine Einschränkung.

Lizenz

KymoCore ist doppelt lizenziert: GPLv3, kostenlos für Hobby-, Lern- und Open-Source-Projekte, oder eine kommerzielle Lizenz für Firmware und Geräte, die ohne Offenlegung des eigenen Quellcodes vertrieben werden. Details in den Lizenzbedingungen.

Protokollspezifikation →   Leitfaden und API-Referenz →   Alle KymoCore-Funktionen →