Skip to content
Snippets Groups Projects
Select Git revision
1 result Searching

labcomm_decoder.c

Blame
  • Forked from Anders Blomdell / LabComm
    Source project has a limited visibility.
    labcomm_decoder.c 12.29 KiB
    /*
      labcomm_decoder.c -- runtime for handling decoding of labcomm samples.
    
      Copyright 2006-2013 Anders Blomdell <anders.blomdell@control.lth.se>
    
      This file is part of LabComm.
    
      LabComm is free software: you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation, either version 3 of the License, or
      (at your option) any later version.
    
      LabComm is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
    
      You should have received a copy of the GNU General Public License
      along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */
    #define CURRENT_VERSION "LabComm20141009"
    
    #include <errno.h>
    #include "labcomm.h"
    #include "labcomm_private.h"
    #include "labcomm_ioctl.h"
    #include "labcomm_dynamic_buffer_writer.h"
    #include "labcomm_bytearray_reader.h"
    
    struct sample_entry {
      int remote_index;
      struct labcomm_signature *signature;
      labcomm_decoder_function decode;
      labcomm_handler_function handler;
      void *context;
    };
    
    struct labcomm_decoder {
      struct labcomm_reader *reader;
      int reader_allocated;
      int version_ok;
      struct labcomm_error_handler *error;
      struct labcomm_memory *memory;
      struct labcomm_scheduler *scheduler;
      labcomm_error_handler_callback on_error;
      labcomm_handle_new_datatype_callback on_new_datatype;
      LABCOMM_SIGNATURE_ARRAY_DEF(local, struct sample_entry);
      LABCOMM_SIGNATURE_ARRAY_DEF(remote_to_local, int);
    };
    
    struct labcomm_decoder *labcomm_decoder_new(
      struct labcomm_reader *reader,
      struct labcomm_error_handler *error,
      struct labcomm_memory *memory,
      struct labcomm_scheduler *scheduler)
    {
      struct labcomm_decoder *result;
    
      result = labcomm_memory_alloc(memory, 0, sizeof(*result));
      if (result) {
        result->reader = reader;
        result->reader->decoder = result;
        result->reader->data = 0;
        result->reader->data_size = 0;
        result->reader->count = 0;
        result->reader->pos = 0;
        result->reader->error = 0;
        result->reader_allocated = 0;
        result->version_ok = 0;
        result->error = error;