]> sigrok.org Git - libsigrok.git/blame - trigger.c
Code drop from DreamSourceLabs first source release.
[libsigrok.git] / trigger.c
CommitLineData
f1b296fc
BV
1/*
2 * This file is part of the DSLogic project.
3 */
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <unistd.h>
8#include <string.h>
9#include <assert.h>
10#include <glib.h>
11#include "libsigrok.h"
12#include "libsigrok-internal.h"
13
14/* Message logging helpers with subsystem-specific prefix string. */
15#define LOG_PREFIX "session: "
16#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args)
17#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args)
18#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args)
19#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args)
20#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args)
21#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
22
23/**
24 * @file
25 *
26 * init, set DSLogic trigger.
27 */
28
29/**
30 * @defgroup Trigger handling
31 *
32 * init, set DSLogic trigger
33 *
34 * @{
35 */
36
37struct ds_trigger *trigger;
38
39/**
40 * recovery trigger to initial status.
41 *
42 * @return SR_OK upon success.
43 */
44SR_API int ds_trigger_init(void)
45{
46 int i, j;
47
48 if (!(trigger = g_try_malloc0(sizeof(struct ds_trigger)))) {
49 sr_err("Trigger malloc failed.");
50 return SR_ERR_MALLOC;
51 }
52
53 trigger->trigger_en = 0;
54 trigger->trigger_mode = SIMPLE_TRIGGER;
55 trigger->trigger_pos = 0;
56 trigger->trigger_stages = 0;
57
58 for (i = 0; i <= TriggerStages; i++) {
59 for (j = 0; j < TriggerProbes; j++) {
60 trigger->trigger0[i][j] = 'X';
61 trigger->trigger1[i][j] = 'X';
62 }
63 trigger->trigger0_count[i] = 0;
64 trigger->trigger1_count[i] = 0;
65 trigger->trigger0_inv[i] = 0;
66 trigger->trigger1_inv[i] = 0;
67 trigger->trigger_logic[i] = 1;
68 }
69
70
71 return SR_OK;
72}
73
74SR_API int ds_trigger_destroy(void)
75{
76 if (trigger)
77 g_free(trigger);
78
79 return SR_OK;
80}
81
82/**
83 * set trigger based on stage
84 *
85 * @return SR_OK upon success.
86 */
87SR_API int ds_trigger_stage_set_value(uint16_t stage, uint16_t probes, char *trigger0, char *trigger1)
88{
89 assert(stage < TriggerStages);
90 assert(probes <= TriggerProbes);
91
92 int j;
93
94 for (j = 0; j< probes; j++) {
95 trigger->trigger0[stage][probes - j - 1] = *(trigger0 + j * 2);
96 trigger->trigger1[stage][probes - j - 1] = *(trigger1 + j * 2);
97 }
98
99 return SR_OK;
100}
101SR_API int ds_trigger_stage_set_logic(uint16_t stage, uint16_t probes, unsigned char trigger_logic)
102{
103 assert(stage < TriggerStages);
104 assert(probes <= TriggerProbes);
105
106 trigger->trigger_logic[stage] = trigger_logic;
107
108 return SR_OK;
109}
110SR_API int ds_trigger_stage_set_inv(uint16_t stage, uint16_t probes, unsigned char trigger0_inv, unsigned char trigger1_inv)
111{
112 assert(stage < TriggerStages);
113 assert(probes <= TriggerProbes);
114
115 trigger->trigger0_inv[stage] = trigger0_inv;
116 trigger->trigger1_inv[stage] = trigger1_inv;
117
118 return SR_OK;
119}
120SR_API int ds_trigger_stage_set_count(uint16_t stage, uint16_t probes, uint16_t trigger0_count, uint16_t trigger1_count)
121{
122 assert(stage < TriggerStages);
123 assert(probes <= TriggerProbes);
124
125 trigger->trigger0_count[stage] = trigger0_count;
126 trigger->trigger1_count[stage] = trigger1_count;
127
128 return SR_OK;
129}
130
131/**
132 * set trigger based on probe
133 *
134 * @return SR_OK upon success.
135 */
136SR_API int ds_trigger_probe_set(uint16_t probe, unsigned char trigger0, unsigned char trigger1)
137{
138 assert(probe < TriggerProbes);
139
140 trigger->trigger0[TriggerStages][probe] = trigger0;
141 trigger->trigger1[TriggerStages][probe] = trigger1;
142
143 return SR_OK;
144}
145
146/**
147 * set trigger stage
148 *
149 * @return SR_OK upon success.
150 */
151SR_API int ds_trigger_set_stage(uint16_t stages)
152{
153 assert(stages <= TriggerStages);
154
155 trigger->trigger_stages = stages;
156
157 return SR_OK;
158}
159
160/**
161 * set trigger position
162 *
163 * @return SR_OK upon success.
164 */
165SR_API int ds_trigger_set_pos(uint16_t position)
166{
167 assert(position <= 100);
168 assert(position >= 0);
169
170 trigger->trigger_pos = position;
171
172 return SR_OK;
173}
174
175/**
176 * set trigger en
177 *
178 * @return SR_OK upon success.
179 */
180SR_API int ds_trigger_set_en(uint16_t enable)
181{
182
183 trigger->trigger_en = enable;
184
185 return SR_OK;
186}
187
188/**
189 * set trigger mode
190 *
191 * @return SR_OK upon success.
192 */
193SR_API int ds_trigger_set_mode(uint16_t mode)
194{
195
196 trigger->trigger_mode = mode;
197
198 return SR_OK;
199}
200
201/*
202 *
203 */
204SR_PRIV uint64_t ds_trigger_get_mask0(uint16_t stage)
205{
206 assert(stage <= TriggerStages);
207
208 uint64_t mask = 0;
209 int i;
210
211 for (i = TriggerProbes - 1; i >= 0 ; i--) {
212 mask = (mask << 1);
213 mask += (trigger->trigger0[stage][i] == 'X' | trigger->trigger0[stage][i] == 'C');
214 }
215
216 return mask;
217}
218SR_PRIV uint64_t ds_trigger_get_mask1(uint16_t stage)
219{
220 assert(stage <= TriggerStages);
221
222 uint64_t mask = 0;
223 int i;
224
225 for (i = TriggerProbes - 1; i >= 0 ; i--) {
226 mask = (mask << 1);
227 mask += (trigger->trigger1[stage][i] == 'X' | trigger->trigger1[stage][i] == 'C');
228 }
229
230 return mask;
231}
232SR_PRIV uint64_t ds_trigger_get_value0(uint16_t stage)
233{
234 assert(stage <= TriggerStages);
235
236 uint64_t value = 0;
237 int i;
238
239 for (i = TriggerProbes - 1; i >= 0 ; i--) {
240 value = (value << 1);
241 value += (trigger->trigger0[stage][i] == '1' | trigger->trigger0[stage][i] == 'R');
242 }
243
244 return value;
245}
246SR_PRIV uint64_t ds_trigger_get_value1(uint16_t stage)
247{
248 assert(stage <= TriggerStages);
249
250 uint64_t value = 0;
251 int i;
252
253 for (i = TriggerProbes - 1; i >= 0 ; i--) {
254 value = (value << 1);
255 value += (trigger->trigger1[stage][i] == '1' | trigger->trigger1[stage][i] == 'R');
256 }
257
258 return value;
259}
260SR_PRIV uint64_t ds_trigger_get_edge0(uint16_t stage)
261{
262 assert(stage <= TriggerStages);
263
264 uint64_t edge = 0;
265 int i;
266
267 for (i = TriggerProbes - 1; i >= 0 ; i--) {
268 edge = (edge << 1);
269 edge += (trigger->trigger0[stage][i] == 'R' | trigger->trigger0[stage][i] == 'F' |
270 trigger->trigger0[stage][i] == 'C');
271 }
272
273 return edge;
274}
275SR_PRIV uint64_t ds_trigger_get_edge1(uint16_t stage)
276{
277 assert(stage <= TriggerStages);
278
279 uint64_t edge = 0;
280 int i;
281
282 for (i = TriggerProbes - 1; i >= 0 ; i--) {
283 edge = (edge << 1);
284 edge += (trigger->trigger1[stage][i] == 'R' | trigger->trigger1[stage][i] == 'F' |
285 trigger->trigger1[stage][i] == 'C');
286 }
287
288 return edge;
289}
290
291/** @} */