packages feed

mercury-api-0.1.0.0: cbits/api/tmr_serial_transport.h

#ifndef _TMR_SERIAL_TRANSPORT_H
#define _TMR_SERIAL_TRANSPORT_H
/**
 *  @file tmr_serial_transport.h
 *  @brief Mercury API - Serial Transport Interface
 *  @author Nathan Williams
 *  @date 10/20/2009
 */

/*
 * Copyright (c) 2009 ThingMagic, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef TMR_ENABLE_SERIAL_TRANSPORT_LLRP
#include <sys/types.h>
#include <sys/socket.h>
#endif

#if defined(WIN32) || defined(WINCE)
#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
#include <winsock2.h>
#endif
#endif

#ifdef OSDEP_SERIAL_INCLUDE
#include "osdep_serial_transport.h"
#endif

#ifndef PLATFORM_HANDLE
# ifdef WIN32
#  define PLATFORM_HANDLE HANDLE
# else
#if defined(ARDUINO) || defined(FREERTOS_USED)
#   define PLATFORM_HANDLE void*
# else
#  define PLATFORM_HANDLE int
# endif
# endif
#endif
typedef struct TMR_SR_SerialTransport TMR_SR_SerialTransport;
/**
 * The TMR_SR_SerialTransport structure is the mechanism that the
 * SerialReader layer uses to conduct low-level communications with
 * the device. Users may create their own SerialTransport objects for
 * systems with custom serial communication needs, and then use
 * TMR_SR_SerialReader_init() to complete the construction of the
 * reader object, as an alternative to using TMR_create().
 *
 * @see TMR_SR_SerialPortTransportInit and
 * TMR_SR_LlrpEapiTransportInit for pre-existing
 * TMR_SR_SerialTransport implementations.
 */
struct TMR_SR_SerialTransport
{
  /** Context value made avaliable to callback functions */
  void *cookie;

  /**
   * This callback causes the communication interface to be opened but
   * does not transmit any serial-layer data. This should perform
   * actions such as opening a serial port device or establishing a
   * network connection within a wrapper protocol.
   *
   * @param this The TMR_SR_SerialTransport structure.
   */
  TMR_Status (*open)(TMR_SR_SerialTransport *);

  /**
   * This callback transmits the provided bytes on the serial
   * transport. If the operation takes longer than timeoutMs to
   * complete, TMR_ERROR_TIMEOUT should be returned.
   *
   * @param this The TMR_SR_SerialTransport structure.
   * @param length The number of bytes to send.
   * @param message Pointer to the bytes to send.
   * @param timeoutMs The duration for the operation to complete.
   */
  TMR_Status (*sendBytes)(TMR_SR_SerialTransport *, uint32_t length, 
                          uint8_t* message, const uint32_t timeoutMs);

  /**
   * This callback recieves bytes message on the serial transport. The
   * length parameter contains the size of the buffer pointed to by
   * message. If the operation takes longer than timeoutMs to receive
   * length bytes, TMR_ERROR_TIMEOUT should be returned.
   *
   * @param this The TMR_SR_SerialTransport structure.
   * @param length The number of bytes to receive.
   * @param[out] messageLength The number of bytes received.
   * @param[out] message Pointer to the location to store received bytes.
   * @param timeoutMs The duration for the operation to complete.
   */
  TMR_Status (*receiveBytes)(TMR_SR_SerialTransport *, uint32_t length,
                             uint32_t *messageLength, uint8_t* message, const uint32_t timeoutMs);
  /**
   * This callback causes the underlying serial transport connected to
   * the device to the provided baud rate.
   *
   * @param this The TMR_SR_SerialTransport structure.
   * @param rate The baud rate to set.
   */
  TMR_Status (*setBaudRate)(TMR_SR_SerialTransport *, uint32_t rate);

  /**
   * This callback releases any resources allocated by the transport
   * layer and informs the other end, if necessary, that the
   * connection is ending.
   *
   * @param this The TMR_SR_SerialTransport structure.
   */
  TMR_Status (*shutdown)(TMR_SR_SerialTransport *);

  /**
   * This callback takes any actions necessary (possibly none) to
   * remove unsent data from the output path.
   *
   * @param this The TMR_SR_SerialTransport structure.
   */
  TMR_Status (*flush)(TMR_SR_SerialTransport *);
};

#ifdef TMR_ENABLE_SERIAL_TRANSPORT_NATIVE
/**
 * The context structure used by the provided serial port transport interface.
 */
typedef struct TMR_SR_SerialPortNativeContext
{
  /** @privatesection */
  /** The file handle for the serial device */
  PLATFORM_HANDLE handle;
  /** The filesystem name of the serial device */
  char devicename[TMR_MAX_READER_NAME_LENGTH];
} TMR_SR_SerialPortNativeContext;
#endif

#ifdef TMR_ENABLE_SERIAL_TRANSPORT_LLRP
/**
 * The context structure used by the provided
 * serial-encapsulated-in-LLRP transport interface.
 */
typedef struct TMR_SR_LlrpEapiTransportContext
{
  /** @privatesection */
  /** The network address of the remote device */
  struct sockaddr_storage addr;
  /** The length of the contents of addr */
  socklen_t addrlen;
  /** Whether or not to power-cycle the reader upon opening a connection */
  bool powerCycleAtOpen;
  /** The file handle for the network socket */
  int socket;
  /** The current LLRP message ID */
  int sequenceId;
  /** Temporary buffer for receiving and processing a LLRP packet */
  uint8_t buf[270];
  /** Pointers into the buffer */
  uint16_t bufstart, buflen;
} TMR_SR_LlrpEapiTransportContext;
#endif

#ifdef TMR_ENABLE_SERIAL_TRANSPORT_NATIVE
/**
 * Initialize a TMR_SR_SerialTransport structure with a given serial device.
 *
 * @param transport The TMR_SR_SerialTransport structure to initialize.
 * @param context A TMR_SR_SerialPortNativeContext structure for the callbacks to use.
 * @param device The path or name of the serial device (@c /dev/ttyS0, @c COM1)
 */
#if defined(WIN32) || defined(WINCE)
__declspec(dllexport)
#endif
TMR_Status TMR_SR_SerialTransportNativeInit(TMR_SR_SerialTransport *transport,
                                            TMR_SR_SerialPortNativeContext *context,
                                            const char *device);
#if defined(WIN32) || defined(WINCE)
__declspec(dllexport)
#endif
TMR_Status TMR_SR_SerialTransportTcpNativeInit(TMR_SR_SerialTransport *transport,
                                            TMR_SR_SerialPortNativeContext *context,
                                            const char *device);
#endif /* TMR_ENABLE_SERIAL_TRANSPORT_NATIVE */

#ifdef TMR_ENABLE_SERIAL_TRANSPORT_LLRP
/**
 * Initialize a TMR_SR_SerialTransport structure with a LLRP+EAPI
 * connection to the given host and port.
 *
 * @param transport The TMR_SR_SerialTransport structure to initialize.
 * @param context A TMR_SR_LlrpEapiTransportContext structure for the callbacks to use.
 * @param host The name or address of the network device implementing LLRP+EAPI.
 * @param port The TCP port to use for the connection.
 * @param powerCycleAtOpen Whether or not to power-cycle the reader upon opening a connection.
 */
TMR_Status TMR_SR_LlrpEapiTransportInit(TMR_SR_SerialTransport *transport,
                                        TMR_SR_LlrpEapiTransportContext *context,
                                        const char *host, int port,
                                        bool powerCycleAtOpen);

/**
 * Power-cycle a device attached via LLRP transport
 * @param transport The TMR_SR_SerialTransport connected to the device
 */
TMR_Status TMR_LlrpEapiPowerCycle(TMR_SR_SerialTransport *this);
#endif

#ifdef __cplusplus
}
#endif

#endif /* _TMR_SERIAL_TRANSPORT_H */