hantek-4032l: Add option to abort acquisition.

Signed-off-by: Andrej Valek <andy@skyrain.eu>
This commit is contained in:
Andrej Valek 2018-04-04 22:59:52 +02:00 committed by Uwe Hermann
parent 74c4c1747f
commit a5b9880eb2
3 changed files with 39 additions and 3 deletions

View File

@ -400,6 +400,8 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
struct sr_trigger *trigger = sr_session_trigger_get(sdi->session);
struct h4032l_cmd_pkt *cmd_pkt = &devc->cmd_pkt;
devc->acq_aborted = FALSE;
/* Calculate packet ratio. */
cmd_pkt->pre_trigger_size = (cmd_pkt->sample_size * devc->capture_ratio) / 100;
@ -501,9 +503,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
static int dev_acquisition_stop(struct sr_dev_inst *sdi)
{
(void)sdi;
struct dev_context *devc = sdi->priv;
/* TODO: stop acquisition. */
devc->acq_aborted = TRUE;
if (devc->usb_transfer)
libusb_cancel_transfer(devc->usb_transfer);
devc->status = H4032L_STATUS_IDLE;
return SR_OK;
}

View File

@ -37,6 +37,26 @@ struct h4032l_status_packet {
uint32_t status;
};
static void finish_acquisition(struct sr_dev_inst *sdi)
{
struct drv_context *drvc = sdi->driver->context;
std_session_send_df_end(sdi);
usb_source_remove(sdi->session, drvc->sr_ctx);
}
static void free_transfer(struct libusb_transfer *transfer)
{
struct sr_dev_inst *sdi = transfer->user_data;
struct dev_context *devc = sdi->priv;
transfer->buffer = NULL;
libusb_free_transfer(transfer);
devc->usb_transfer = NULL;
finish_acquisition(sdi);
}
SR_PRIV int h4032l_receive_data(int fd, int revents, void *cb_data)
{
struct timeval tv;
@ -68,6 +88,15 @@ void LIBUSB_CALL h4032l_usb_callback(struct libusb_transfer *transfer)
uint32_t number_samples;
int ret;
/*
* If acquisition has already ended, just free any queued up
* transfers that come in.
*/
if (devc->acq_aborted) {
free_transfer(transfer);
return;
}
if (transfer->status != LIBUSB_TRANSFER_COMPLETED)
sr_dbg("%s error: %d.", __func__, transfer->status);
@ -175,7 +204,7 @@ void LIBUSB_CALL h4032l_usb_callback(struct libusb_transfer *transfer)
}
if (devc->status == H4032L_STATUS_IDLE)
libusb_free_transfer(transfer);
free_transfer(transfer);
}
uint16_t h4032l_voltage2pwm(double voltage)

View File

@ -121,6 +121,7 @@ struct h4032l_cmd_pkt {
struct dev_context {
enum h4032l_status status;
uint32_t remaining_samples;
gboolean acq_aborted;
struct h4032l_cmd_pkt cmd_pkt;
struct libusb_transfer *usb_transfer;
uint8_t buffer[512];