#ifndef SCPI_ERRQ_H
#define SCPI_ERRQ_H

#include "app/queue/queue.h"
#include "app/queue/queue_ex.h"

typedef queue_t errq_t;

///
/// \brief Initialize SCPI error queue
/// \param self Pointer to the queue.
/// \param buffer Pointer to the user buffer to be used as storage
/// \param capacity Capacity of the user buffer storage
/// \return true if no error or false otherwise
///
static inline bool errq_init(queue_t * self, void * buffer, size_t capacity )
{
    return( QUEUE_RC_NOERROR == queue_init(self, buffer, capacity ) );
}

// errq_push
// @self - Pointer to the record queue. 
// @errorCode - SCPI error code
// @message - error textual description, null-terminated string
// Return: true if no error occurred, false otherwise
bool errq_push( errq_t * self, int16_t errorCode, const char * message );

// errq_peek
// Retrieves an information about SCPI error stored in the top of SCPI Error FIFO.
// DO NOT remove element from the log.
// @self - Pointer to the record queue. 
// @errorCode - pointer to the variable to store SCPI error code
// @message - pointer to buffer to store error textual description
// @msgBufSize - pointer to the variable where the size of the buffer @message is stored. After successful operation
// the value will be modified to the length of message stored to @message
// Return: true if no error occurred, false otherwise
bool errq_peek( errq_t * self, int16_t * perrorCode, char * message, size_t * msgBufSize );

// errq_pop
// Retrieves an information about SCPI error stored in the top of SCPI Error FIFO.
// DO remove element from the log.
// @self - Pointer to the record queue. 
// @errorCode - pointer to the variable to store SCPI error code
// @message - pointer to buffer to store error textual description
// @msgBufSize - pointer to the variable where the size of the buffer @message is stored. After successful operation
// the value will be modified to the length of message stored to @message
// Return: true if no error occurred, false otherwise
bool errq_pop( errq_t * self, int16_t * perrorCode, char * message, size_t * msgBufSize );

// errq_removetop
// Remove element from the SCPI Error log.
// @self - Pointer to the record queue. 
// Return: true if no error occurred, false otherwise
bool errq_removetop( errq_t * self );

// errq_isempty
// Check is the error queue is empty
// @self - Pointer to the record queue. 
// Return: true if no error records is stored in queue, false otherwise
bool errq_isempty( errq_t * self );

// errq_clear
// Clears error queue
// @self - Pointer to the record queue. 
// Return: none
void errq_clear( errq_t * self );

#endif
