X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=hardware%2Frigol-ds1xx2%2Fprotocol.c;h=19e402c386c4b60aff34c957061b1fd862107ad7;hb=88e429c97f4fa482f8897c4795ad14f0afa96b56;hp=d8b0de720e4071abb1c8fbd4fe14ef61bc5b0ce9;hpb=e0b7d23ce884f03ecb693943c5bd822879c68d65;p=libsigrok.git diff --git a/hardware/rigol-ds1xx2/protocol.c b/hardware/rigol-ds1xx2/protocol.c index d8b0de72..19e402c3 100644 --- a/hardware/rigol-ds1xx2/protocol.c +++ b/hardware/rigol-ds1xx2/protocol.c @@ -2,6 +2,7 @@ * This file is part of the libsigrok project. * * Copyright (C) 2012 Martin Ling + * Copyright (C) 2013 Bert Vermeulen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +22,7 @@ #include #include #include +#include #include #include "libsigrok.h" #include "libsigrok-internal.h" @@ -44,11 +46,19 @@ SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data) if (revents == G_IO_IN) { len = read(fd, buf, WAVEFORM_SIZE); - sr_dbg("received %d", len); + sr_dbg("Received %d bytes.", len); if (len == -1) return TRUE; + + if (devc->num_frame_samples == 0) { + /* Start of a new frame. */ + packet.type = SR_DF_FRAME_BEGIN; + sr_session_send(sdi, &packet); + } + for (i = 0; i < len; i++) data[i] = devc->scale / 25.6 * (128 - buf[i]) - devc->offset; + analog.probes = devc->enabled_probes; analog.num_samples = len; analog.data = data; analog.mq = SR_MQ_VOLTAGE; @@ -57,10 +67,17 @@ SR_PRIV int rigol_ds1xx2_receive_data(int fd, int revents, void *cb_data) packet.type = SR_DF_ANALOG; packet.payload = &analog; sr_session_send(cb_data, &packet); - if (++devc->num_frames == devc->limit_frames) - sdi->driver->dev_acquisition_stop(sdi, cb_data); - else - rigol_ds1xx2_send_data(fd, ":WAV:DATA?\n"); + + if (len == WAVEFORM_SIZE) { + /* End of the frame. */ + packet.type = SR_DF_FRAME_END; + sr_session_send(sdi, &packet); + + if (++devc->num_frames == devc->limit_frames) + sdi->driver->dev_acquisition_stop(sdi, cb_data); + else + rigol_ds1xx2_send_data(fd, ":WAV:DATA?"); + } } return TRUE; @@ -70,10 +87,22 @@ SR_PRIV int rigol_ds1xx2_send_data(int fd, const char *format, ...) { va_list args; char buf[256]; + int len, out, ret; + va_start(args, format); - int len = vsprintf(buf, format, args); + len = vsprintf(buf, format, args); va_end(args); - len = write(fd, buf, len); - sr_dbg("sent %s", buf); - return len; + strcat(buf, "\n"); + len++; + out = write(fd, buf, len); + buf[len - 1] = '\0'; + if (out != len) { + sr_dbg("Only sent %d/%d bytes of '%s'.", out, len, buf); + ret = SR_ERR; + } else { + sr_dbg("Sent '%s'.", buf); + ret = SR_OK; + } + + return ret; }