// RH_TcpProtocol.h
// Author: Mike McCauley (mikem@aierspayce.com)
// Definition of protocol messages sent and received by RH_TCP
// Copyright (C) 2014 Mike McCauley
// $Id: RHTcpProtocol.h,v 1.3 2014/05/22 06:07:09 mikem Exp $

/// This file contains the definitions of message structures passed between
/// RH_TCP and the etherSimulator
#ifndef RH_TcpProtocol_h
#define RH_TcpProtocol_h

#define RH_TCP_MESSAGE_TYPE_NOP               0
#define RH_TCP_MESSAGE_TYPE_THISADDRESS       1
#define RH_TCP_MESSAGE_TYPE_PACKET            2

// Maximum message length (including the headers) we are willing to support
#define RH_TCP_MAX_PAYLOAD_LEN 255

// The length of the headers we add.
// The headers are inside the RF69's payload and are therefore encrypted if encryption is enabled
#define RH_TCP_HEADER_LEN 4


// This is the maximum message length that can be supported by this protocol. 
#define RH_TCP_MAX_MESSAGE_LEN (RH_TCP_MAX_PAYLOAD_LEN - RH_TCP_HEADER_LEN)

#pragma pack(push, 1) // No padding

/// \brief Generic RH_TCP simulator message structure
typedef struct
{
    uint32_t        length; ///< Number of octets following, in network byte order
    uint8_t         payload[RH_TCP_MAX_PAYLOAD_LEN + 1]; ///< Payload
}   RHTcpMessage;

/// \brief Generic RH_TCP  message structure with message type
typedef struct
{
    uint32_t        length; ///< Number of octets following, in network byte order
    uint8_t         type;  ///< One of RH_TCP_MESSAGE_TYPE_*
    uint8_t         payload[RH_TCP_MAX_PAYLOAD_LEN]; ///< Payload
}   RHTcpTypeMessage;

/// \brief RH_TCP message Notifies the server of thisAddress of this client
typedef struct
{
    uint32_t        length; ///< Number of octets following, in network byte order
    uint8_t         type;   ///< == RH_TCP_MESSAGE_TYPE_THISADDRESS
    uint8_t         thisAddress; ///< Node address
}   RHTcpThisAddress;

/// \brief RH_TCP radio message passed to or from the simulator
typedef struct
{
    uint32_t        length; ///< Number of octets following, in network byte order
    uint8_t         type;   ///< == RH_TCP_MESSAGE_TYPE_PACKET
    uint8_t         to;     ///< Node address of the recipient
    uint8_t         from;   ///< Node address of the sender
    uint8_t         id;     ///< Message sequence number
    uint8_t         flags;  ///< Message flags
    uint8_t         payload[RH_TCP_MAX_MESSAGE_LEN]; ///< 0 or more, length deduced from length above
}   RHTcpPacket;

#pragma pack(pop)

#endif
