Forked from
Anders Blomdell / LabComm
466 commits behind the upstream repository.
-
Sven Robertz authoredSven Robertz authored
labcomm_thr_reader_writer.c 2.35 KiB
#include <errno.h>
#include <unistd.h>
#include "labcomm.h"
#include "ThrottleDrv/throttle_drv.h"
#define BUFFER_SIZE 2048
int labcomm_thr_reader(labcomm_reader_t *r, labcomm_reader_action_t action)
{
int result = -EINVAL;
struct thr_chn_t *ctx = r->context;
switch (action)
{
case labcomm_reader_alloc:
{
r->data = malloc(BUFFER_SIZE);
if (r->data)
{
r->data_size = BUFFER_SIZE;
result = r->data_size;
}
else
{
r->data_size = 0;
result = -ENOMEM;
}
r->count = 0;
r->pos = 0;
}
break;
case labcomm_reader_start:
case labcomm_reader_continue:
{
if (r->pos < r->count)
{
result = r->count - r->pos;
}
else
{
int err;
r->pos = 0;
err = thr_read(ctx, r->data, r->data_size);
if (err <= 0)
{
r->count = 0;
result = -1;
} else
{
r->count = err;
result = r->count - r->pos;
}
}
}
break;
case labcomm_reader_end:
{
result = 0;
}
break;
case labcomm_reader_free:
{
free(r->data);
r->data = 0;
r->data_size = 0;
r->count = 0;
r->pos = 0;
result = 0;
}
break;
}
return result;
}
int labcomm_thr_writer(labcomm_writer_t *w, labcomm_writer_action_t action)
{
int result = 0;
struct thr_chn_t *ctx = w->context;
switch (action)
{
case labcomm_writer_alloc:
{
w->data = malloc(BUFFER_SIZE);
if (! w->data)
{
result = -ENOMEM;
w->data_size = 0;
w->count = 0;
w->pos = 0;
}
else
{
w->data_size = BUFFER_SIZE;
w->count = BUFFER_SIZE;
w->pos = 0;
}
} break;
case labcomm_writer_free:
{
free(w->data);
w->data = 0;
w->data_size = 0;
w->count = 0;
w->pos = 0;
}
break;
case labcomm_writer_start:
{
w->pos = 0;
}
break;
case labcomm_writer_continue:
{
result = thr_send(ctx, w->data, w->pos);
w->pos = 0;
}
break;
case labcomm_writer_end:
{
result = thr_send(ctx, w->data, w->pos);
w->pos = 0;
}
break;
case labcomm_writer_available:
{
result = w->count - w->pos;
}
break;
}
return result;
}