| /* |
| * 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 */ |