/*
 * camtransport.h - GStreamer CAM (EN50221) transport layer
 * Copyright (C) 2007 Alessandro Decina
 * 
 * Authors:
 *   Alessandro Decina <alessandro@nnva.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef CAM_TRANSPORT_H
#define CAM_TRANSPORT_H

#include <gst/gst.h>
#include "cam.h"
#include "camutils.h"

#define HOST_BUFFER_SIZE 1024

#define CAM_TL(obj) ((CamTL *) obj)
#define CAM_TL_CONNECTION(obj) ((CamTLConnection *) obj)

typedef struct _CamTL CamTL;
typedef struct _CamTLPrivate CamTLPrivate;

typedef struct _CamTLConnection CamTLConnection;
typedef struct _CamTLConnectionPrivate CamTLConnectionPrivate;

typedef enum
{
  CAM_TL_CONNECTION_STATE_CLOSED,
  CAM_TL_CONNECTION_STATE_IN_CREATION,
  CAM_TL_CONNECTION_STATE_OPEN,
  CAM_TL_CONNECTION_STATE_IN_DELETION
} CamTLConnectionState;

struct _CamTL
{
  int fd;
  guint connection_ids;

  GHashTable *connections;
  
  guint expected_tpdus;
  
  /* buffer containing module data */
  guint8 buffer [HOST_BUFFER_SIZE];
  /* number of bytes written in the buffer */
  guint buffer_size;
  /* index pointing to the first byte of a TPDU's body */
  guint8 *body;
  /* length of the body part */
  guint body_length;
  
  /* callbacks */
  void (*request_connection) (CamTL *tl, CamTLConnection *connection);
  void (*connection_created) (CamTL *tl, CamTLConnection *connection);
  void (*connection_deleted) (CamTL *tl, CamTLConnection *connection);
  CamReturn (*connection_data) (CamTL *tl, CamTLConnection *connection,
    guint8 *data, guint length);
  
  /* used by the upper layer to extend this layer */
  gpointer user_data;
};

struct _CamTLConnection
{
  CamTL *tl;

  guint8 slot;
  guint id;
  CamTLConnectionState state;
  /* TRUE if the last status byte was 0x80, FALSE otherwise */
  gboolean has_data;
  /* NCAS 1.0 sometimes reports that it has data even if it doesn't. After
   * MAX_EMPTY_DATA times that we don't get any data we assume that there's
   * actually no data.
   */
  guint empty_data;
  /* timer restarted every time the connection is polled */
  GTimer *last_poll;

  gpointer user_data;
};

CamTL *cam_tl_new (int cam_device_fd);
void cam_tl_destroy (CamTL *tl);

CamReturn cam_tl_create_connection (CamTL *tl,
  guint8 slot, CamTLConnection **connnection);
CamReturn cam_tl_connection_delete (CamTLConnection *connection);

void cam_tl_calc_buffer_size (CamTL *tl,
  guint body_length, guint *buffer_size, guint *offset);

CamReturn cam_tl_connection_write (CamTLConnection *connection,
  guint8 *data, guint buffer_size, guint body_length);

CamReturn cam_tl_connection_poll (CamTLConnection *connection, gboolean force);
CamReturn cam_tl_read_all (CamTL *tl, gboolean poll);

#endif /* CAM_TRANSPORT_H */
