19#if PC_ENABLE_TRACE_CAPTURE
32 uint16_t pretrigger_samples;
33 uint16_t posttrigger_samples;
37 uint32_t trigger_cycles;
44void ring_push(uint16_t sample)
46 if (s_tc.pretrigger_samples == 0)
50 s_tc.pre_ring[s_tc.pre_head] = sample;
52 if (s_tc.pre_head >= s_tc.pretrigger_samples)
59bool pc_tc_begin(
const pc_tc_config *cfg)
61 if (!cfg || !cfg->sink)
65 if (cfg->pretrigger_samples == 0 && cfg->posttrigger_samples == 0)
69 uint32_t total = (uint32_t)cfg->pretrigger_samples + (uint32_t)cfg->posttrigger_samples;
75 memset(&s_tc, 0,
sizeof(s_tc));
76 s_tc.sink = cfg->sink;
78 s_tc.pretrigger_samples = cfg->pretrigger_samples;
79 s_tc.posttrigger_samples = cfg->posttrigger_samples;
80 s_tc.configured =
true;
84uint16_t pc_tc_feed(
const uint16_t *samples, uint16_t n)
86 if (!s_tc.configured || !samples)
88 s_tc.stats.samples_dropped += n;
91 for (uint16_t i = 0; i < n; i++)
93 uint16_t s = samples[i];
95 if (s_tc.capturing && s_tc.post_count < s_tc.posttrigger_samples)
97 s_tc.window[s_tc.pretrigger_samples + s_tc.post_count] = s;
99 if (s_tc.post_count == s_tc.posttrigger_samples)
102 win.samples = s_tc.window;
103 win.n_samples = (uint16_t)(s_tc.pretrigger_samples + s_tc.posttrigger_samples);
104 win.pretrigger_samples = s_tc.pretrigger_samples;
105 win.trace_id = s_tc.trace_id++;
106 win.assembly_cycles =
pc_cycles() - s_tc.trigger_cycles;
107 s_tc.capturing =
false;
108 s_tc.stats.windows_completed++;
109 s_tc.sink(&win, s_tc.ctx);
116bool pc_tc_trigger(
void)
118 if (!s_tc.configured)
124 s_tc.stats.triggers_dropped++;
127 for (uint16_t i = 0; i < s_tc.pretrigger_samples; i++)
129 s_tc.window[i] = s_tc.pre_ring[(s_tc.pre_head + i) % s_tc.pretrigger_samples];
132 s_tc.capturing =
true;
137void pc_tc_get_stats(pc_tc_stats *out)
145bool pc_tc_capturing(
void)
147 return s_tc.configured && s_tc.capturing;
152 s_tc.configured =
false;
153 s_tc.capturing =
false;
Pluggable monotonic clock for all library timing.
uint32_t pc_cycles(void)
Free-running CPU cycle count. ISR-safe. On ARDUINO/ESP32 this is the hardware cycle counter (CCOUNT);...
#define PC_TC_MAX_WINDOW_SAMPLES
Max samples a window may hold (pretrigger_samples + posttrigger_samples), static-allocated.
Pre/post-trigger sample-window assembler (PC_ENABLE_TRACE_CAPTURE) - the v5 high-rate acquisition pri...