14#include "dawn/io/ddata.hxx"
15#include "dawn/io/common.hxx"
16#include "dawn/porting/config.hxx"
17#include "dawn/prog/common.hxx"
18#include "dawn/prog/process.hxx"
34 PROG_MOVAVG_CFG_WINDOW = 2,
43#ifdef CONFIG_DAWN_OBJECT_HAS_NAME
44 const char *getClassNameStr()
const override
73 return CProgMovingAverage::cfgId(
false, 1, PROG_MOVAVG_CFG_WINDOW);
79 size_t &offset)
override
86 case PROG_MOVAVG_CFG_WINDOW:
92 DAWNERR(
"movingavg: invalid WINDOW size %u\n", item->
cfgid.
s.
size);
100 DAWNERR(
"movingavg: window must be > 0\n");
118 SBindState **state)
override
125#ifdef CONFIG_DAWN_DTYPE_INT8
127 return allocState<int8_t, int64_t, int64_t>(ioData->
getItems(), state);
129#ifdef CONFIG_DAWN_DTYPE_UINT8
131 return allocState<uint8_t, uint64_t, uint64_t>(ioData->
getItems(), state);
133#ifdef CONFIG_DAWN_DTYPE_INT16
135 return allocState<int16_t, int64_t, int64_t>(ioData->
getItems(), state);
137#ifdef CONFIG_DAWN_DTYPE_UINT16
139 return allocState<uint16_t, uint64_t, uint64_t>(ioData->
getItems(), state);
141#ifdef CONFIG_DAWN_DTYPE_INT32
143 return allocState<int32_t, int64_t, int64_t>(ioData->
getItems(), state);
145#ifdef CONFIG_DAWN_DTYPE_UINT32
147 return allocState<uint32_t, uint64_t, uint64_t>(ioData->
getItems(), state);
149#ifdef CONFIG_DAWN_DTYPE_INT64
151 return allocState<int64_t, int64_t, int64_t>(ioData->
getItems(), state);
153#ifdef CONFIG_DAWN_DTYPE_UINT64
155 return allocState<uint64_t, uint64_t, uint64_t>(ioData->
getItems(), state);
157#ifdef CONFIG_DAWN_DTYPE_FLOAT
159 return allocState<float, float, float>(ioData->
getItems(), state);
161#ifdef CONFIG_DAWN_DTYPE_DOUBLE
163 return allocState<double, double, double>(ioData->
getItems(), state);
167 DAWNERR(
"movingavg: unsupported dtype %d\n", src->
getDtype());
177 bool &initsample)
override
179 handleWithState(output, data, ioData, outputData, initsample,
nullptr);
187 void *state)
override
189 if (state ==
nullptr)
191 DAWNERR(
"movingavg: missing state\n");
197 static_cast<SBindState *
>(state)->reset();
203#ifdef CONFIG_DAWN_DTYPE_INT8
205 handleTyped<int8_t, int64_t, int64_t>(output, data, ioData, outputData, state);
208#ifdef CONFIG_DAWN_DTYPE_UINT8
210 handleTyped<uint8_t, uint64_t, uint64_t>(output, data, ioData, outputData, state);
213#ifdef CONFIG_DAWN_DTYPE_INT16
215 handleTyped<int16_t, int64_t, int64_t>(output, data, ioData, outputData, state);
218#ifdef CONFIG_DAWN_DTYPE_UINT16
220 handleTyped<uint16_t, uint64_t, uint64_t>(output, data, ioData, outputData, state);
223#ifdef CONFIG_DAWN_DTYPE_INT32
225 handleTyped<int32_t, int64_t, int64_t>(output, data, ioData, outputData, state);
228#ifdef CONFIG_DAWN_DTYPE_UINT32
230 handleTyped<uint32_t, uint64_t, uint64_t>(output, data, ioData, outputData, state);
233#ifdef CONFIG_DAWN_DTYPE_INT64
235 handleTyped<int64_t, int64_t, int64_t>(output, data, ioData, outputData, state);
238#ifdef CONFIG_DAWN_DTYPE_UINT64
240 handleTyped<uint64_t, uint64_t, uint64_t>(output, data, ioData, outputData, state);
243#ifdef CONFIG_DAWN_DTYPE_FLOAT
245 handleTyped<float, float, float>(output, data, ioData, outputData, state);
248#ifdef CONFIG_DAWN_DTYPE_DOUBLE
250 handleTyped<double, double, double>(output, data, ioData, outputData, state);
255 DAWNERR(
"movingavg: unsupported dtype %d\n", data->
getDtype());
262 template<
typename T,
typename HistT,
typename SumT>
263 struct SState final :
public SBindState
268 std::vector<HistT> hist;
269 std::vector<SumT> sum;
271 void reset()
override
275 std::fill(hist.begin(), hist.end(),
static_cast<HistT
>(0));
276 std::fill(sum.begin(), sum.end(),
static_cast<SumT
>(0));
280 template<
typename T,
typename HistT,
typename SumT>
281 int allocState(
size_t items, SBindState **state)
283 SState<T, HistT, SumT> *st;
285 st =
new (std::nothrow) SState<T, HistT, SumT>();
292 st->hist.assign(items * window,
static_cast<HistT
>(0));
293 st->sum.assign(items,
static_cast<SumT
>(0));
294 if (st->hist.size() != items * window || st->sum.size() != items)
304 template<
typename T,
typename HistT,
typename SumT>
305 void handleTyped(CIOCommon *output,
308 io_ddata_t *outputData,
311 SState<T, HistT, SumT> *st =
static_cast<SState<T, HistT, SumT> *
>(state);
312 const size_t items = ioData->getItems();
313 const uint32_t used = (st->count < window) ? st->count : window;
315 std::memcpy(ioData->getDataPtr(), data->getDataPtr(), ioData->getDataSize());
317 if (st->items != items)
319 DAWNERR(
"movingavg: item count changed from %u to %zu\n", st->items, items);
323 for (
size_t i = 0; i < items; i++)
325 const size_t hidx = i * window + st->pos;
326 const HistT x =
static_cast<HistT
>(ioData->get<T>(i));
330 st->sum[i] -= st->hist[hidx];
337 if (st->count < window)
342 st->pos = (st->pos + 1) % window;
344 for (
size_t i = 0; i < items; i++)
346 outputData->get<T>(i) =
static_cast<T
>(st->sum[i] /
static_cast<SumT
>(st->count));
349 output->setData(*outputData);
Descriptor wrapper for individual object configuration.
Base class for all I/O objects.
uint8_t getDtype() const
Get data type field.
@ PROG_CLASS_MOVING_AVG
Moving average filter.
Notify-driven sliding window moving average filter.
int bindStateAlloc(CIOCommon *src, CIOCommon *output, io_ddata_t *ioData, io_ddata_t *outputData, SBindState **state)
Allocate optional per-binding derived state.
void handleWithState(CIOCommon *output, io_ddata_t *data, io_ddata_t *ioData, io_ddata_t *outputData, bool &initsample, void *state)
Process incoming sample with optional per-binding state.
int configureExtraCfgItem(const CDescObject &desc, const SObjectCfg::SObjectCfgItem *item, size_t &offset)
Parse program-specific config item (optional extension hook).
void handle(CIOCommon *output, io_ddata_t *data, io_ddata_t *ioData, io_ddata_t *outputData, bool &initsample)
Process incoming sample.
Base class for callback-driven sample processing Program objects.
@ PROG_STATS_CFG_IOBIND
I/O binding configuration.
static ObjectCfgId objectCfg(uint8_t type, uint16_t cls, uint8_t dtype, bool rw, uint16_t size, uint8_t id)
Construct 32-bit ConfigID from component fields.
uint32_t ObjectCfgId
ConfigID type - single 32-bit value.
uint32_t ObjectCfgData_t
Configuration data element - single 32-bit word.
static uint32_t cfgToU32(ObjectCfgData_t x)
Convert ObjectCfgData_t to uint32_t.
Out-of-tree user-extension hooks for Dawn.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
@ OBJTYPE_PROG
Program/algorithm object type.
@ DTYPE_FLOAT
IEEE 754 single-precision floating point (32-bit).
@ DTYPE_INT32
Signed 32-bit integer (-2147483648 to 2147483647).
@ DTYPE_UINT8
Unsigned 8-bit integer (0 to 255).
@ DTYPE_INT16
Signed 16-bit integer (-32768 to 32767).
@ DTYPE_INT8
Signed 8-bit integer (-128 to 127).
@ DTYPE_ANY
Wildcard data type (matches any actual type).
@ DTYPE_UINT64
Unsigned 64-bit integer.
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
@ DTYPE_DOUBLE
IEEE 754 double-precision floating point (64-bit).
@ DTYPE_INT64
Signed 64-bit integer.
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
uint32_t ObjectId
ObjectID type - single 32-bit value.
static ObjectId objectId(uint8_t type, uint16_t cls, uint8_t dtype, uint8_t flags, uint16_t priv)
Construct 32-bit ObjectID from component fields.
Heap-allocated dynamic I/O data buffer.
uint8_t getDtype() const
Get data type enum for introspection.
size_t getItems()
Get number of items per batch.
uint32_t id
Configuration identifier (bits 0-4, max 31).
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.