Dawn Framework 1.0
Universal data acquisition framework for embedded systems
trigger.cxx
1// dawn/src/io/trigger.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/io/trigger.hxx"
7
8#include <errno.h>
9
10#include "dawn/debug.hxx"
11#include "dawn/io/common.hxx"
12
13using namespace dawn;
14
15int CIOTrigger::configureDesc(const CDescObject &desc)
16{
17 const SObjectCfg::SObjectCfgItem *item = nullptr;
18 size_t offset = 0;
19 size_t i = 0;
20
21 for (i = 0; i < desc.getSize(); i++)
22 {
23 item = desc.objectCfgItemAtOffset(offset);
24
26 {
27 DAWNERR("unsupported trigger cfg 0x%" PRIx32 "\n", item->cfgid.v);
28 return -EINVAL;
29 }
30
31 switch (item->cfgid.s.id)
32 {
34 {
35 offset += 1;
36
37 for (size_t j = 0; j < item->cfgid.s.size; j++)
38 {
39 const SObjectCfg::SObjectCfgItem *obj = desc.objectCfgItemAtOffset(offset);
40
41 ids.push_back(static_cast<SObjectId::ObjectId>(obj->cfgid.v));
42
43 offset += 1;
44 }
45
46 break;
47 }
48
50 {
51 const uint32_t *tmp = reinterpret_cast<const uint32_t *>(&item->data);
52
53 allowed = *tmp;
54 offset += 2;
55 break;
56 }
57
58 default:
59 {
60 DAWNERR("unsupported trigger cfg 0x%" PRIx32 "\n", item->cfgid.v);
61 return -EINVAL;
62 }
63 }
64 }
65
66 return OK;
67}
68
69CIOTrigger::~CIOTrigger()
70{
71 deinit();
72}
73
75{
76 int ret;
77
78 // Configure object
79
80 ret = configureDesc(getDesc());
81 if (ret != OK)
82 {
83 return ret;
84 }
85
86 return OK;
87}
88
90{
91 return OK;
92}
93
94int CIOTrigger::getDataImpl(IODataCmn &data, size_t len)
95{
96 UNUSED(data);
97 UNUSED(len);
98 return -ENOTSUP;
99}
100
102{
103 uint8_t cmd = *reinterpret_cast<const uint8_t *>(data.getDataPtr());
104 uint32_t mask = 0;
105 int ret = OK;
106
107 switch (cmd)
108 {
110 {
111 mask = TRIG_ALLOW_RESET;
112 break;
113 }
114
116 {
117 mask = TRIG_ALLOW_TRIGGER1;
118 break;
119 }
120
122 {
123 mask = TRIG_ALLOW_TRIGGER2;
124 break;
125 }
126
128 {
129 mask = TRIG_ALLOW_TRIGGER3;
130 break;
131 }
132
133 default:
134 {
135 DAWNERR("invalid trigger command %d\n", cmd);
136 return -EINVAL;
137 }
138 }
139
140 if (!(allowed & mask))
141 {
142 DAWNERR("trigger command %d not allowed\n", cmd);
143 return -EACCES;
144 }
145
146 if (targets.empty())
147 {
148 DAWNERR("no bound targets\n");
149 return -ENOENT;
150 }
151
152 for (CObject *target : targets)
153 {
154 int r = target->trigger(cmd);
155
156 if (r < 0 && r != -ENOTSUP)
157 {
158 DAWNERR("trigger failed %d\n", r);
159 ret = r;
160 }
161 }
162
163 return ret;
164}
165
167{
168 return sizeof(uint8_t);
169}
170
172{
173 return 1;
174}
175
176int CIOTrigger::bind(CObject *obj)
177{
178 targets.push_back(obj);
179 return OK;
180}
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemAtOffset(size_t offset) const
Get configuration item at specified offset.
@ IO_CLASS_TRIGGER
Trigger I/O.
Definition common.hxx:91
int configure()
Configure object from descriptor data.
Definition trigger.cxx:74
size_t getDataDim() const
Get data vector dimension.
Definition trigger.cxx:171
@ IO_TRIGGER_CFG_ALLOCOBJ
Bound object ID list.
Definition trigger.hxx:24
@ IO_TRIGGER_CFG_ALLOWED
Allowed commands bitmask.
Definition trigger.hxx:25
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
Definition trigger.cxx:101
std::vector< SObjectId::ObjectId > ids
Object IDs to resolve; populated during configure().
Definition trigger.hxx:81
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
Definition trigger.cxx:94
int deinit()
De-initialize object.
Definition trigger.cxx:89
@ TRIG_ALLOW_TRIGGER3
Allow CMD_TRIGGER3 command.
Definition trigger.hxx:34
@ TRIG_ALLOW_TRIGGER1
Allow CMD_TRIGGER1 command.
Definition trigger.hxx:32
@ TRIG_ALLOW_RESET
Allow CMD_RESET command.
Definition trigger.hxx:31
@ TRIG_ALLOW_TRIGGER2
Allow CMD_TRIGGER2 command.
Definition trigger.hxx:33
size_t getDataSize() const
Get data size in bytes.
Definition trigger.cxx:166
Base class for all Dawn objects (IOs, Programs, Protocols).
Definition object.hxx:28
CDescObject & getDesc()
Get descriptor object for this object.
Definition object.cxx:190
@ CMD_RESET
Reset object internal state.
Definition object.hxx:42
@ CMD_TRIGGER3
Object-specific trigger slot 3.
Definition object.hxx:45
@ CMD_TRIGGER2
Object-specific trigger slot 2.
Definition object.hxx:44
@ CMD_TRIGGER1
Object-specific trigger slot 1.
Definition object.hxx:43
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
Base interface for I/O data buffers (static and dynamic).
Definition idata.hxx:21
virtual void * getDataPtr(size_t batch=0)=0
Get pointer to data only (skips timestamp if present).
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).
uint32_t ObjectId
ObjectID type - single 32-bit value.
Definition objectid.hxx:44
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
Definition objectcfg.hxx:82
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
Definition objectcfg.hxx:94
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.