Commit 2ef88fe4 authored by Federico Vaga's avatar Federico Vaga

lib: make the code simpler to read

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 716b7a61
...@@ -620,6 +620,46 @@ static void fmctdc_ts_convert_n(struct fmctdc_time *t, ...@@ -620,6 +620,46 @@ static void fmctdc_ts_convert_n(struct fmctdc_time *t,
fmctdc_ts_convert(&t[i], &o[i]); fmctdc_ts_convert(&t[i], &o[i]);
} }
/**
* It reads up to *max* timestamps from the buffer
* @param[in] userb TDC board instance token
* @param[in] channel channel to use [0, 4]
* @param[out] t array of time-stamps
* @param[in] n number of elements to save in the array
* @return the number of samples read
*/
static int __fmctdc_read(struct fmctdc_board *userb, unsigned int channel,
struct fmctdc_time *t, int max)
{
__define_board(b, userb);
struct ft_hw_timestamp *data;
int n;
data = calloc(max, sizeof(*data));
if (!data) {
errno = ENOMEM;
return -1;
}
n = read(b->fdd[channel], data, sizeof(*data) * max);
if (n < 0)
goto err;
if (n % sizeof(*data) != 0) {
errno = EIO;
goto err;
}
n /= sizeof(*data); /* convert to number of samples */
fmctdc_ts_convert_n(t, data, n);
free(data);
return n;
err:
free(data);
return -1;
}
/** /**
* It reads a given number of time-stamps from the driver. It will wait at * It reads a given number of time-stamps from the driver. It will wait at
* most once and return the number of samples that it received from a given * most once and return the number of samples that it received from a given
...@@ -653,38 +693,29 @@ int fmctdc_read(struct fmctdc_board *userb, unsigned int channel, ...@@ -653,38 +693,29 @@ int fmctdc_read(struct fmctdc_board *userb, unsigned int channel,
int i; int i;
int n_ts; int n_ts;
fd_set set; fd_set set;
struct ft_hw_timestamp *data;
if (channel >= FMCTDC_NUM_CHANNELS) { if (channel >= FMCTDC_NUM_CHANNELS) {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
data = calloc(n, sizeof(*data));
if (!data) {
errno = ENOMEM;
return -1;
}
i = 0; i = 0;
while (i < n) { while (i < n) {
n_ts = read(b->fdd[channel], &data[i], sizeof(*data) * (n - i)); n_ts = __fmctdc_read(userb, channel, &t[i], 1);
if (n_ts < 0 && errno != EAGAIN) { if (n_ts < 0 && errno != EAGAIN) {
if (i == 0) if (i == 0)
goto err; return -1;
else else
goto out; break;
} }
if (n_ts % sizeof(*data) == 0) { /* Good samples here */ if (n_ts > 0) {
n_ts /= sizeof(*data);
fmctdc_ts_convert_n(&t[i], &data[i], n_ts);
i += n_ts; i += n_ts;
continue; /* the while loop */ continue;
} }
if (i) /* error but before we got something */ if (i) /* error but before we got something */
goto out; break;
/* EAGAIN at first sample */ /* EAGAIN at first sample */
if (n_ts < 0 && flags == O_NONBLOCK) if (n_ts < 0 && flags == O_NONBLOCK)
...@@ -694,16 +725,10 @@ int fmctdc_read(struct fmctdc_board *userb, unsigned int channel, ...@@ -694,16 +725,10 @@ int fmctdc_read(struct fmctdc_board *userb, unsigned int channel,
FD_ZERO(&set); FD_ZERO(&set);
FD_SET(b->fdc[channel], &set); FD_SET(b->fdc[channel], &set);
if (select(b->fdc[channel] + 1, &set, NULL, NULL, NULL) < 0) if (select(b->fdc[channel] + 1, &set, NULL, NULL, NULL) < 0)
goto err; return -1;
} }
out:
free(data);
return i; return i;
err:
free(data);
return -1;
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment