/////////////////////////////////////////////////////////////////////
//                                                                 //
// file: PDChannelLogger_CCA.h                                     //
//                                                                 //
/////////////////////////////////////////////////////////////////////
//                                                                 //
// Copyright (c) 2024 Acroname Inc. - All Rights Reserved          //
//                                                                 //
// This file is part of the BrainStem release. See the license.txt //
// file included with this package or go to                        //
// https://acroname.com/software/brainstem-development-kit         //
// for full license details.                                       //
/////////////////////////////////////////////////////////////////////
#ifndef __PDChannelLogger_CCA_H__
#define __PDChannelLogger_CCA_H__

#include "CCA_Core.h"


#ifdef CCA_PACK
    #pragma pack(push, CCA_PACK)
#endif

/** BrainStem Power Delivery Packet Structure - Contains information representing a
 * Power Delivery packet along with contextual device information */
struct BS_PD_Packet_CCA {
    unsigned char channel;      /**< Channel/Index */
    unsigned int seconds;       /**< Seconds in device time since power on. */
    unsigned int uSeconds;      /**< Micro Seconds in device time since power on .*/
    unsigned char direction;    /**< Direction of packet transmission relative to the device. */
    unsigned char sop;          /**< See bs_pd_packet.h for more details */
    unsigned int event;         /**< Packet type - See powerdeliveryLogEvent in aProtocolDefs.h */
    unsigned int payloadSize;   /**< Length of the payload. */
    unsigned char* payload;     /**< Raw PD Packet data */
    unsigned char ccChannel;    /**< CC Channel type */
    unsigned int crc;           /**< CRC of payload */
};

#ifdef CCA_PACK
    #pragma pack(pop)
#endif


/// \defgroup PDChannelLogger PD Channel Logger
/// PDChannelLogger:
/// Provides an interface for managing BrainStem Power Delivery Packets.
/// Packets are accepted and decoded asynchronously.
/// Pay careful attention to packet cleanup. Portions of the structure do not belong
/// to the caller.
///

#ifdef __cplusplus
extern "C" {
#endif

    /// Creates internal object for managing BrainStem Power Delivery logging packets.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param index The index of the entity in question.
    /// \param bufferLength Number of packets the class should queue before dropping.
    /// \details Returns \ref EntityReturnValues "common entity" return values
    aLIBEXPORT void __stdcall PDChannelLogger_create(unsigned int* id, struct Result* result, const int index, const unsigned int bufferLength);

    /// Destroys internal object for managing BrainStem Power Delivery logging packets.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param index The index of the entity in question.
    /// \details Returns \ref EntityReturnValues "common entity" return values
    aLIBEXPORT void __stdcall PDChannelLogger_destroy(unsigned int* id, struct Result* result, const int index);

    /// Enables Power Delivery logging.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param index The index of the entity in question.
    /// \param enable True enables logging; False disables logging
    /// \details True on success.
    aLIBEXPORT void __stdcall PDChannelLogger_setEnabled(unsigned int* id, struct Result* result, const int index, const bool enable);

    /// Attempts to takes a packet from the internal buffer.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param index The index of the entity in question.
    /// \param packet Reference to a packet to be filled by the function.
    /// \details True if the function successfully acquired any number of packets. False if no packets were available.
    aLIBEXPORT void __stdcall PDChannelLogger_getPacket(unsigned int* id, struct Result* result, const int index, struct BS_PD_Packet_CCA* packet);

    /// Attempts to take a multiple packets (up to a maximum) from the internal buffer.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param index The index of the entity in question.
    /// \param packetBuffer pointer to a buffer to be filled
    /// \param bufferLength The length of the buffer provided.
    /// \details True if the function successfully acquired any number of packets. False if no packets were available.
    aLIBEXPORT void __stdcall PDChannelLogger_getPackets(unsigned int* id, struct Result* result, const int index, struct BS_PD_Packet_CCA* packetBuffer, const unsigned int bufferLength);

    /// Releases the internal memory contained within the payload parameter.
    /// \param id ID assigned through "module_createStem"
    /// \param result Object containing aErrNone and the requested value on success.
    /// Non-zero error code on failure.
    ///    The current upstream port.
    /// \param packet Reference to a packet to have its memory freed.
    /// \details Returns \ref EntityReturnValues "common entity" return values
    aLIBEXPORT void __stdcall PDChannelLogger_freePayloadBuffer(unsigned int* id, struct Result* result, struct BS_PD_Packet_CCA* packet);

#ifdef __cplusplus
}
#endif

#endif
