Skip to main content

API Tiers

OSynaptic-TX provides three independent API tiers. All tiers produce identical frames; the choice is purely about RAM and code size.

Tier Comparison

TierFunctionStack peakStatic RAMFlash (~1 sensor)
Aostx_sensor_pack()~137 B96 B~600 B
Bostx_static_pack()~51 B96 B~430 B
Costx_stream_pack()~21 B0 B~760 B

When to Use Each Tier

Tier A — Dynamic strings

Use when sensor ID or unit is determined at runtime (e.g., read from EEPROM, received from a config packet, or generated in a loop).

int len = ostx_sensor_pack(aid, "T1", "Cel", tid, ts_sec, value, out_buf);

Tier B — Static descriptor

Use when every sensor property is known at compile time. The OSTX_STATIC_DEFINE macro places the descriptor in program memory (Flash / ROM), avoiding SRAM. Tier B has lower stack than A and is the recommended default for most projects.

OSTX_STATIC_DEFINE(s_temp, aid, "T1", "Cel");
int len = ostx_static_pack(&s_temp, tid, ts_sec, value, out_buf);

Tier C — Streaming callback

Use on devices where SRAM is extremely scarce. No output buffer is needed — you provide a byte-emit callback. Tier C uses the most Flash (byte-by-byte write overhead) but the least RAM of all three tiers.

OSTX_STATIC_DEFINE(s_temp, aid, "T1", "Cel");
ostx_stream_pack(&s_temp, tid, ts_sec, value, emit_fn, ctx);

Combining Tiers

You can use multiple tiers in the same project. The linker drops the compiled objects for tiers whose functions are never referenced, so unused tiers impose no Flash cost.

/* Use Tier C for temperature (RAM budget critical) */
ostx_stream_pack(&s_temp, tid++, ts, temp_scaled, emit, NULL);

/* Use Tier A for a dynamic sensor ID read from EEPROM */
char id[OSTX_ID_MAX];
eeprom_read_block(id, EE_SENSOR_ID, sizeof(id));
ostx_sensor_pack(aid, id, "Cel", tid++, ts, temp_scaled, out_buf);