Skip to content

Commit a012857

Browse files
Teo Perisanuadisuciu
authored andcommitted
adalm2000: Add functionality for starting the acquisition.
Configure the digital trigger. Set the oversampling ratio. Synchronize the OSC with the LA. Start the acquisition in the streaming mode. Acquire the exact number of samples to fit in the given boundaries. Signed-off-by: Teo Perisanu <[email protected]>
1 parent b4f1739 commit a012857

File tree

2 files changed

+155
-10
lines changed

2 files changed

+155
-10
lines changed

src/hardware/adalm2000/api.c

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -535,10 +535,57 @@ static int config_list(uint32_t key, GVariant **data,
535535

536536
static int dev_acquisition_start(const struct sr_dev_inst *sdi)
537537
{
538-
/* TODO: configure hardware, reset acquisition state, set up
539-
* callbacks and send header packet. */
538+
struct dev_context *devc;
539+
GSList *l;
540+
gboolean analog_enabled, digital_enabled;
541+
struct sr_channel *ch;
542+
543+
devc = sdi->priv;
544+
devc->sent_samples = 0;
545+
analog_enabled = (adalm2000_nb_enabled_channels(sdi, SR_CHANNEL_ANALOG) > 0) ? TRUE : FALSE;
546+
digital_enabled = (adalm2000_nb_enabled_channels(sdi, SR_CHANNEL_LOGIC) > 0) ? TRUE : FALSE;
547+
548+
for (l = sdi->channels; l; l = l->next) {
549+
ch = l->data;
550+
if (ch->type == SR_CHANNEL_ANALOG) {
551+
sr_libm2k_analog_channel_enable(devc->m2k, ch->index, 1);
552+
}
553+
}
554+
555+
if (adalm2000_convert_trigger(sdi) != SR_OK) {
556+
sr_err("Failed to configure triggers.");
557+
return SR_ERR;
558+
}
559+
560+
if (analog_enabled) {
561+
if (devc->avg) {
562+
sr_libm2k_analog_oversampling_ratio_set(devc->m2k, devc->avg_samples);
563+
}
564+
sr_libm2k_analog_kernel_buffers_count_set(devc->m2k, 64);
565+
sr_libm2k_analog_streaming_flag_set(devc->m2k, 0);
566+
}
567+
if (digital_enabled) {
568+
sr_libm2k_digital_kernel_buffers_count_set(devc->m2k, 64);
569+
sr_libm2k_digital_streaming_flag_set(devc->m2k, 0);
570+
}
571+
572+
if (sr_libm2k_has_mixed_signal(devc->m2k)) {
573+
sr_libm2k_mixed_signal_acquisition_start(devc->m2k, devc->buffersize);
574+
} else {
575+
if (analog_enabled) {
576+
sr_libm2k_analog_acquisition_start(devc->m2k, devc->buffersize);
577+
}
578+
if (digital_enabled) {
579+
sr_libm2k_digital_acquisition_start(devc->m2k, devc->buffersize);
580+
}
581+
}
582+
583+
std_session_send_df_header(sdi);
584+
sr_session_source_add(sdi->session, -1, G_IO_IN, 0, adalm2000_receive_data,
585+
(struct sr_dev_inst *) sdi);
540586

541-
(void)sdi;
587+
devc->start_time = g_get_monotonic_time();
588+
devc->spent_us = 0;
542589

543590
return SR_OK;
544591
}

src/hardware/adalm2000/protocol.c

Lines changed: 105 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,120 @@ SR_PRIV int adalm2000_convert_trigger(const struct sr_dev_inst *sdi)
8181
return SR_OK;
8282
}
8383

84+
static void send_analog_packet(struct sr_dev_inst *sdi, float *data, int index, uint64_t sending_now)
85+
{
86+
struct dev_context *devc;
87+
struct sr_channel *ch;
88+
struct sr_datafeed_packet packet;
89+
90+
if (!(devc = sdi->priv)) {
91+
return;
92+
}
93+
94+
ch = g_slist_nth_data(sdi->channels, DEFAULT_NUM_LOGIC_CHANNELS + index);
95+
devc->meaning.channels = g_slist_append(NULL, ch);
96+
97+
devc->packet.data = data;
98+
devc->packet.num_samples = sending_now;
99+
100+
packet.payload = &devc->packet;
101+
packet.type = SR_DF_ANALOG;
102+
103+
sr_session_send(sdi, &packet);
104+
}
105+
84106
SR_PRIV int adalm2000_receive_data(int fd, int revents, void *cb_data)
85107
{
86-
const struct sr_dev_inst *sdi;
108+
struct sr_dev_inst *sdi;
87109
struct dev_context *devc;
110+
struct sr_channel *ch;
111+
struct sr_datafeed_packet packet;
112+
struct sr_datafeed_logic logic;
113+
uint64_t samples_todo, logic_done, analog_done, sending_now, analog_sent;
114+
int64_t elapsed_us, limit_us, todo_us;
115+
uint32_t *logic_data;
116+
float **analog_data;
117+
GSList *l;
88118

89-
(void)fd;
119+
(void) fd;
120+
(void) revents;
90121

91-
if (!(sdi = cb_data))
122+
if (!(sdi = cb_data)) {
92123
return TRUE;
124+
}
93125

94-
if (!(devc = sdi->priv))
126+
if (!(devc = sdi->priv)) {
95127
return TRUE;
128+
}
129+
130+
elapsed_us = g_get_monotonic_time() - devc->start_time;
131+
limit_us = 1000 * devc->limit_msec;
132+
133+
if (limit_us > 0 && limit_us < elapsed_us) {
134+
todo_us = MAX(0, limit_us - devc->spent_us);
135+
} else {
136+
todo_us = MAX(0, elapsed_us - devc->spent_us);
137+
}
138+
139+
samples_todo = (todo_us * sr_libm2k_digital_samplerate_get(devc->m2k) + G_USEC_PER_SEC - 1)
140+
/ G_USEC_PER_SEC;
141+
142+
if (devc->limit_samples > 0) {
143+
if (devc->limit_samples < devc->sent_samples) {
144+
samples_todo = 0;
145+
} else if (devc->limit_samples - devc->sent_samples < samples_todo) {
146+
samples_todo = devc->limit_samples - devc->sent_samples;
147+
}
148+
}
149+
150+
if (samples_todo == 0) {
151+
return G_SOURCE_CONTINUE;
152+
}
153+
154+
todo_us = samples_todo * G_USEC_PER_SEC / sr_libm2k_digital_samplerate_get(devc->m2k);
155+
156+
logic_done = 0;
157+
analog_done = 0;
158+
159+
while (logic_done < samples_todo || analog_done < samples_todo) {
160+
if (analog_done < samples_todo) {
161+
analog_sent = MIN(samples_todo - analog_done, devc->buffersize);
162+
163+
analog_data = sr_libm2k_analog_samples_get(devc->m2k, devc->buffersize);
164+
for (l = sdi->channels; l; l = l->next) {
165+
ch = l->data;
166+
if (ch->type == SR_CHANNEL_ANALOG) {
167+
if (ch->enabled) {
168+
send_analog_packet(sdi, analog_data[ch->index],
169+
ch->index, analog_sent);
170+
}
171+
}
172+
}
173+
analog_done += analog_sent;
174+
}
175+
if (logic_done < samples_todo) {
176+
logic_data = sr_libm2k_digital_samples_get(devc->m2k, devc->buffersize);
177+
178+
packet.type = SR_DF_LOGIC;
179+
packet.payload = &logic;
180+
logic.unitsize = devc->logic_unitsize;
181+
182+
sending_now = MIN(samples_todo - logic_done, devc->buffersize);
183+
184+
logic.length = sending_now * devc->logic_unitsize;
185+
logic.data = logic_data;
186+
sr_session_send(sdi, &packet);
187+
logic_done += sending_now;
188+
}
189+
190+
}
96191

97-
if (revents == G_IO_IN) {
98-
/* TODO */
192+
devc->sent_samples += logic_done;
193+
devc->spent_us += todo_us;
194+
if ((devc->limit_samples > 0 && devc->sent_samples >= devc->limit_samples)
195+
|| (limit_us > 0 && devc->spent_us >= limit_us)) {
196+
sr_dev_acquisition_stop(sdi);
99197
}
100198

101-
return TRUE;
199+
return G_SOURCE_CONTINUE;
102200
}

0 commit comments

Comments
 (0)