+ if (!(buf = g_try_malloc(BUFSIZE*sizeof(uint16_t)))) {
+ sr_err("buf for receive_data malloc failed.");
+ return FALSE;
+ }
+
+ /* How many "virtual" samples should we have collected by now? */
+ time = g_get_monotonic_time();
+ elapsed = time - devc->starttime;
+ devc->starttime = time;
+ expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
+ /* Of those, how many do we still have to send? */
+ //samples_to_send = (expected_samplenum - devc->samples_counter) / CONST_LEN * CONST_LEN;
+ samples_to_send = expected_samplenum / CONST_LEN * CONST_LEN;
+
+ if (devc->limit_samples) {
+ if (sdi->mode == LOGIC)
+ samples_to_send = MIN(samples_to_send,
+ devc->limit_samples - devc->samples_counter);
+ else if (sdi->mode == ANALOG)
+ samples_to_send = MIN(samples_to_send,
+ devc->limit_samples);
+ }
+
+ while (samples_to_send > 0) {
+ sending_now = MIN(samples_to_send, BUFSIZE);
+ samples_generator(buf, sending_now, devc);
+
+ if (devc->trigger_stage != 0) {
+ for (i = 0; i < sending_now; i++) {
+ if (devc->trigger_edge == 0) {
+ if ((*(buf + i) | devc->trigger_mask) ==
+ (devc->trigger_value | devc->trigger_mask)) {
+ devc->trigger_stage = 0;
+ break;
+ }
+ } else {
+ cur_sample = *(buf + i);
+ if (((last_sample & devc->trigger_edge) ==
+ (~devc->trigger_value & devc->trigger_edge)) &&
+ ((cur_sample | devc->trigger_mask) ==
+ (devc->trigger_value | devc->trigger_mask)) &&
+ ((cur_sample & devc->trigger_edge) ==
+ (devc->trigger_value & devc->trigger_edge))) {
+ devc->trigger_stage = 0;
+ break;
+ }
+ last_sample = cur_sample;
+ }
+ }
+ if (devc->trigger_stage == 0) {
+ struct ds_trigger_pos demo_trigger_pos;
+ demo_trigger_pos.real_pos = i;
+ packet.type = SR_DF_TRIGGER;
+ packet.payload = &demo_trigger_pos;
+ sr_session_send(sdi, &packet);
+ }
+ }
+
+ if (devc->trigger_stage == 0){
+ samples_to_send -= sending_now;
+ if (sdi->mode == LOGIC) {
+ packet.type = SR_DF_LOGIC;
+ packet.payload = &logic;
+ logic.length = sending_now * (NUM_PROBES >> 3);
+ logic.unitsize = (NUM_PROBES >> 3);
+ logic.data = buf;
+ } else if (sdi->mode == ANALOG) {
+ packet.type = SR_DF_ANALOG;
+ packet.payload = &analog;
+ analog.probes = sdi->probes;
+ analog.num_samples = sending_now;
+ analog.mq = SR_MQ_VOLTAGE;
+ analog.unit = SR_UNIT_VOLT;
+ analog.mqflags = SR_MQFLAG_AC;
+ analog.data = buf;
+ }
+
+ sr_session_send(sdi, &packet);
+ if (sdi->mode == LOGIC)
+ devc->samples_counter += sending_now;
+ else if (sdi->mode == ANALOG)
+ devc->samples_counter = (devc->samples_counter + sending_now) % devc->limit_samples;
+ } else {
+ break;
+ }
+ }