@@ -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+
84106SR_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