Skip to content
Snippets Groups Projects
Forked from Anders Blomdell / LabComm
466 commits behind the upstream repository.
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;
}