/*******************************************************************************
 * Tracealyzer v2.5.0 Recorder Library
 * Percepio AB, www.percepio.com
 *
 * trcBase.h
 *
 * Core functionality of the Tracealyzer recorder library.
 *
 * Terms of Use
 * This software is copyright Percepio AB. The recorder library is free for
 * use together with Percepio products. You may distribute the recorder library
 * in its original form, including modifications in trcHardwarePort.c/.h
 * given that these modification are clearly marked as your own modifications
 * and documented in the initial comment section of these source files.
 * This software is the intellectual property of Percepio AB and may not be
 * sold or in other ways commercially redistributed without explicit written
 * permission by Percepio AB.
 *
 * Disclaimer
 * The trace tool and recorder library is being delivered to you AS IS and
 * Percepio AB makes no warranty as to its use or performance. Percepio AB does
 * not and cannot warrant the performance or results you may obtain by using the
 * software or documentation. Percepio AB make no warranties, express or
 * implied, as to noninfringement of third party rights, merchantability, or
 * fitness for any particular purpose. In no event will Percepio AB, its
 * technology partners, or distributors be liable to you for any consequential,
 * incidental or special damages, including any lost profits or lost savings,
 * even if a representative of Percepio AB has been advised of the possibility
 * of such damages, or for any claim by any third party. Some jurisdictions do
 * not allow the exclusion or limitation of incidental, consequential or special
 * damages, or the exclusion of implied warranties or limitations on how long an
 * implied warranty may last, so the above limitations may not apply to you.
 *
 * Copyright Percepio AB, 2013.
 * www.percepio.com
 ******************************************************************************/

#ifndef TRCBASE_H
#define TRCBASE_H

#define TRACE_MINOR_VERSION 2
#define TRACE_STORE_MODE_STOP_WHEN_FULL 1
#define TRACE_STORE_MODE_RING_BUFFER 2
#define TRACE_DATA_ALLOCATION_STATIC 1
#define TRACE_DATA_ALLOCATION_DYNAMIC 2
#define TRACE_DATA_ALLOCATION_CUSTOM 3

#include "trcKernelPort.h"

#if (USE_TRACEALYZER_RECORDER == 1)

#include <stdio.h>
#include <string.h>

#ifndef USE_SEPARATE_USER_EVENT_BUFFER
#define USE_SEPARATE_USER_EVENT_BUFFER 0
#endif

/* Max number of event codes supported */
#define NEventCodes 0x100

extern volatile int recorder_busy; // This is used to keep track of the recorder's critical sections, to determine if it is busy
// Our local critical sections for the recorder - updates an internal busy flag
#define trcCRITICAL_SECTION_BEGIN() {TRACE_ENTER_CRITICAL_SECTION(); recorder_busy++;}
#define trcCRITICAL_SECTION_END() {recorder_busy--; TRACE_EXIT_CRITICAL_SECTION();}

/* Structure to handle the exclude flags for all objects and tasks. We add some extra objects since index 0 is not used for each object class. */
extern uint8_t excludedObjects[(TRACE_KERNEL_OBJECT_COUNT + TRACE_NCLASSES) / 8 + 1];

/* Structure to handle the exclude flags for all event codes */
extern uint8_t excludedEventCodes[NEventCodes / 8 + 1];

/******************************************************************************
 * ObjectHandleStack
 * This data-structure is used to provide a mechanism for 1-byte trace object
 * handles. This way, only 1 byte is necessary instead of 4 bytes (a pointer)
 * when storing a reference to an object. This allows for up to 255 objects of
 * each object class active at any given moment. There can be more "historic"
 * objects, that have been deleted - that number is only limited by the size of
 * the symbol table.
 * Note that handle zero (0) is not used, it is a code for an invalid handle.
 *
 * This data structure keeps track of the FREE handles, not the handles in use.
 * This data structure contains one stack per object class. When a handle is
 * allocated to an object, the next free handle is popped from the stack. When
 * a handle is released (on object delete), it is pushed back on the stack.
 * Note that there is no initialization code that pushed the free handles
 * initially, that is not necessary due to the following optimization:
 *
 * The stack of handles (objectHandles) is initially all zeros. Since zero
 * is not a valid handle, that is a signal of additional handles needed.
 * If a zero is received when popping a new handle, it is replaced by the
 * index of the popped handle instead.
 *
 *****************************************************************************/
typedef struct
{
    /* For each object class, the index of the next handle to allocate */
    int16_t indexOfNextAvailableHandle[ TRACE_NCLASSES ];

    /* The lowest index of this class (constant) */
    int16_t lowestIndexOfClass[ TRACE_NCLASSES ];

    /* The highest index of this class (constant) */
    int16_t highestIndexOfClass[ TRACE_NCLASSES ];

    /* The highest use count for this class (for statistics) */
    int16_t handleCountWaterMarksOfClass[ TRACE_NCLASSES ];

    /* The free object handles - a set of stacks within this array */
    objectHandleType objectHandles[ TRACE_KERNEL_OBJECT_COUNT ];

} objectHandleStackType;

extern objectHandleStackType objectHandleStacks;

/******************************************************************************
 * Object Property Table
 * The Object Table contains name and other properties of the objects (tasks,
 * queues, mutexes, etc). The below data structures defines the properties of
 * each object class and are used to cast the byte buffer into a cleaner format.
 *
 * The values in the object table are continuously overwritten and always
 * represent the current state. If a property is changed during runtime, the OLD
 * value should be stored in the trace buffer, not the new value (since the new
 * value is found in the Object Property Table).
 * For close events this mechanism is the old names are stored in the symbol
 * table), for "priority set" (the old priority is stored in the event data)
 * and for "isActive", where the value decides if the task switch event type
 * should be "new" or "resume".
 ******************************************************************************/

typedef struct
{
    /* = NCLASSES */
    uint32_t NumberOfObjectClasses;

    uint32_t ObjectPropertyTableSizeInBytes;

    /* This is used to calculate the index in the dynamic object table
    (handle - 1 - nofStaticObjects = index)*/
    uint8_t NumberOfObjectsPerClass[ 4*((TRACE_NCLASSES+3)/4)];

    /* Allocation size rounded up to the closest multiple of 4 */
    uint8_t NameLengthPerClass[ 4*((TRACE_NCLASSES+3)/4) ];

    uint8_t TotalPropertyBytesPerClass[ 4*((TRACE_NCLASSES+3)/4) ];

    /* Allocation size rounded up to the closest multiple of 2 */
    uint16_t StartIndexOfClass[ 2*((TRACE_NCLASSES+1)/2) ];

    /* The actual handles issued, should be Initiated to all zeros */
    uint8_t objbytes[ 4*((TRACE_OBJECT_TABLE_SIZE+3)/4) ];
} ObjectPropertyTableType;

/* Symbol table data structure */
typedef struct
{
    /* = SYMBOL_HISTORY_TABLE_SIZE_IN_BYTES */
    uint32_t symTableSize;

    /* Entry 0 is reserved. Any reference to entry 0 implies NULL*/
    uint32_t nextFreeSymbolIndex;

    /* Size rounded up to closest multiple of 4, to avoid alignment issues*/
    uint8_t symbytes[4*((SYMBOL_TABLE_SIZE+3)/4)];

    /* Used for lookups - Up to 64 linked lists within the symbol table
    connecting all entries with the same 6 bit checksum.
    This field holds the current list heads. Should be initiated to zeros */
    uint16_t latestEntryOfChecksum[64];
} symbolTableType;


/*******************************************************************************
 * The data structures of the different events, all 4 bytes long
 ******************************************************************************/

typedef struct
{
    uint8_t type;
    objectHandleType objHandle;
    uint16_t dts;    /* differential timestamp - time since last event */
} TSEvent, TREvent;

typedef struct
{
	uint8_t type;
	uint8_t dummy;
	uint16_t dts;    /* differential timestamp - time since last event */
} LPEvent;

typedef struct
{
    uint8_t type;
    uint8_t objHandle;
    uint16_t dts;    /* differential timestamp - time since last event */
} KernelCall;

typedef struct
{
    uint8_t type;
    objectHandleType objHandle;
    uint8_t param;
    uint8_t dts;    /* differential timestamp - time since last event */
} KernelCallWithParamAndHandle;

typedef struct
{
    uint8_t type;
    uint8_t dts;    /* differential timestamp - time since last event */
    uint16_t param;
} KernelCallWithParam16;

typedef struct
{
    uint8_t type;
    objectHandleType objHandle;    /* the handle of the closed object */
    uint16_t symbolIndex;          /* the name of the closed object */
} ObjCloseNameEvent;

typedef struct
{
    uint8_t type;
    uint8_t arg1;
    uint8_t arg2;
    uint8_t arg3;
} ObjClosePropEvent;

typedef struct
{
    uint8_t type;
    uint8_t dts;
    uint16_t payload;         /* the name of the user event */
} UserEvent;

typedef struct
{
    uint8_t type;

    /* 8 bits extra for storing DTS, if it does not fit in ordinary event
    (this one is always MSB if used) */
    uint8_t xts_8;

    /* 16 bits extra for storing DTS, if it does not fit in ordinary event. */
    uint16_t xts_16;
} XTSEvent;

typedef struct
{
	uint8_t type;

	uint8_t xps_8;
	uint16_t xps_16;
} XPSEvent;

/*******************************************************************************
 * The separate user event buffer structure. Can be enabled in trcConfig.h.
 ******************************************************************************/

#if (USE_SEPARATE_USER_EVENT_BUFFER == 1)
typedef struct
{
	traceLabel name;
	traceLabel defaultFormat;
} ChannelFormatPair;

typedef struct
{
	uint16_t bufferID;
	uint16_t version;
	uint32_t wraparoundCounter;
	uint32_t numberOfSlots;
	uint32_t nextSlotToWrite;
	uint8_t numberOfChannels;
	uint8_t padding1;
	uint8_t padding2;
	uint8_t padding3;
	ChannelFormatPair channels[CHANNEL_FORMAT_PAIRS+1];
	uint8_t channelBuffer[(USER_EVENT_BUFFER_SIZE + 3) & 0xFFFFFFFC]; /* 1 byte per slot, with padding for 4 byte alignment */
	uint8_t dataBuffer[USER_EVENT_BUFFER_SIZE * 4]; /* 4 bytes per slot */

} UserEventBuffer;
#endif

/*******************************************************************************
 * The main data structure, read by Tracealyzer from the RAM dump
 ******************************************************************************/

typedef struct
{
    uint8_t startmarker0;
    uint8_t startmarker1;
    uint8_t startmarker2;
    uint8_t startmarker3;
    uint8_t startmarker4;
    uint8_t startmarker5;
    uint8_t startmarker6;
    uint8_t startmarker7;
    uint8_t startmarker8;
    uint8_t startmarker9;
    uint8_t startmarker10;
    uint8_t startmarker11;

    /* Used to determine Kernel and Endianess */
    uint16_t version;

    /* Currently 1 for v2.2.2 (0 earlier)*/
    uint8_t minor_version;

    /* This should be 0 if lower IRQ priority values implies higher priority
    levels, such as on ARM Cortex M. If the opposite scheme is used, i.e.,
    if higher IRQ priority values means higher priority, this should be 1. */
    uint8_t irq_priority_order;

    /* sizeof(RecorderDataType) - just for control */
    uint32_t filesize;

    /* Current number of events recorded */
    uint32_t numEvents;

    /* The buffer size, in number of event records */
    uint32_t maxEvents;

    /* The event buffer index, where to write the next event */
    uint32_t nextFreeIndex;

    /* 1 if the buffer is full, 0 otherwise */
    uint32_t bufferIsFull;

    /* The frequency of the clock/timer/counter used as time base */
    uint32_t frequency;

    /* The absolute timestamp of the last stored event, in the native
    timebase, modulo frequency! */
    uint32_t absTimeLastEvent;

    /* The number of seconds in total - lasts for 136 years */
    uint32_t absTimeLastEventSecond;

    /* 1 if the recorder has been started, 0 if not yet started or stopped.
    This is a 32 bit variable due to alignment issues. */
    uint32_t recorderActive;

    /* For storing a Team License key */
    uint8_t teamLicenceKey[32];

    /* 0xF0F0F0F0 - for control only */
    int32_t debugMarker0;

    /* The Object Property Table holds information about currently active
    tasks, queues, and other recorded objects. This is updated on each
    create call and includes object name and other properties. */
    ObjectPropertyTableType ObjectPropertyTable;

    /* 0xF1F1F1F1 - for control only */
    int32_t debugMarker1;

    /* The Symbol Table stores strings for User Events and is also used to
    store names of deleted objects, which still may be in the trace but no
    longer are available. */
    symbolTableType SymbolTable;

    /* For inclusion of float support, and for endian detection of floats.
    The value should be (float)1 or (uint32_t)0 */
#if (INCLUDE_FLOAT_SUPPORT == 1)
    float exampleFloatEncoding;
#else
    uint32_t exampleFloatEncoding;
#endif
    /* This is non-zero if an internal error occurred in the recorder, e.g., if
    one of the Nxxx constants was too small. The systemInfo string will then
    contain an error message that is displayed when attempting to view the
    trace file. */
    uint32_t internalErrorOccured;

    /* 0xF2F2F2F2 - for control only */
    int32_t debugMarker2;

    /* Generic system information string, presented in the tool. Note that this
    is also used for storing any internal error messages from the recorder, so
    do not make TRACE_DESCRIPTION_MAX_LENGTH too small. 80 is recommended. */
    char systemInfo[TRACE_DESCRIPTION_MAX_LENGTH];

    /* 0xF3F3F3F3 - for control only */
    int32_t debugMarker3;

    /* The event data, in 4-byte records */
    uint8_t eventData[ EVENT_BUFFER_SIZE * 4 ];

#if (USE_SEPARATE_USER_EVENT_BUFFER == 1)
	UserEventBuffer userEventBuffer;
#endif

	/* This should always be 0 */
	uint32_t endOfSecondaryBlocks;

    uint8_t endmarker0;
    uint8_t endmarker1;
    uint8_t endmarker2;
    uint8_t endmarker3;
    uint8_t endmarker4;
    uint8_t endmarker5;
    uint8_t endmarker6;
    uint8_t endmarker7;
    uint8_t endmarker8;
    uint8_t endmarker9;
    uint8_t endmarker10;
    uint8_t endmarker11;
} RecorderDataType;

extern RecorderDataType* RecorderDataPtr;

/* Internal functions */

uint16_t prvTraceGetDTS(uint16_t param_maxDTS);

void prvTraceGetChecksum(const char *pname, uint8_t* pcrc, uint8_t* plength);

traceLabel prvTraceCreateSymbolTableEntry(const char* name,
                                          uint8_t crc6,
                                          uint8_t len,
                                          traceLabel channel);

traceLabel prvTraceLookupSymbolTableEntry(const char* name,
                                          uint8_t crc6,
                                          uint8_t len,
                                          traceLabel channel);

traceLabel prvTraceOpenSymbol(const char* name, traceLabel userEventChannel);

void prvTraceUpdateCounters(void);

void prvCheckDataToBeOverwrittenForMultiEntryEvents(uint8_t nEntries);

objectHandleType xTraceGetObjectHandle(traceObjectClass objectclass);

void vTraceFreeObjectHandle(traceObjectClass objectclass,
                            objectHandleType handle);

void vTraceSetObjectName(traceObjectClass objectclass,
                           objectHandleType handle,
                           const char* name);

void* xTraceNextFreeEventBufferSlot(void);

uint16_t uiIndexOfObject(objectHandleType objecthandle,
                         uint8_t objectclass);


/*******************************************************************************
 * vTraceError
 *
 * Called by various parts in the recorder. Stops the recorder and stores a
 * pointer to an error message, which is printed by the monitor task.
 ******************************************************************************/
void vTraceError(const char* msg);

/*******************************************************************************
 * prvTraceInitTraceData
 *
 * Allocates and initializes the recorder data structure, based on the constants
 * in trcConfig.h. This allows for allocating the data on the heap, instead of
 * using a static declaration.
 ******************************************************************************/
void prvTraceInitTraceData(void);

/* Internal macros */

#define TRACE_PROPERTY_NAME_GET(objectclass, objecthandle) \
(const char*)(& RecorderDataPtr->ObjectPropertyTable.objbytes \
[uiIndexOfObject(objecthandle, objectclass)])

#define TRACE_PROPERTY_OBJECT_STATE(objectclass, handle) \
RecorderDataPtr->ObjectPropertyTable.objbytes[uiIndexOfObject(handle, objectclass) \
+ RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[objectclass]]

#define TRACE_PROPERTY_ACTOR_PRIORITY(objectclass, handle) \
RecorderDataPtr->ObjectPropertyTable.objbytes[uiIndexOfObject(handle, objectclass) \
+ RecorderDataPtr->ObjectPropertyTable.NameLengthPerClass[objectclass] + 1]

#define TRACE_SET_FLAG_ISEXCLUDED(flags, bitIndex) flags[(bitIndex) >> 3] |= (1 << ((bitIndex) & 7))
#define TRACE_CLEAR_FLAG_ISEXCLUDED(flags, bitIndex) flags[(bitIndex) >> 3] &= ~(1 << ((bitIndex) & 7))
#define TRACE_GET_FLAG_ISEXCLUDED(flags, bitIndex) (flags[(bitIndex) >> 3] & (1 << ((bitIndex) & 7)))

#define TRACE_SET_EVENT_CODE_FLAG_ISEXCLUDED(eventCode) TRACE_SET_FLAG_ISEXCLUDED(excludedEventCodes, eventCode)
#define TRACE_CLEAR_EVENT_CODE_FLAG_ISEXCLUDED(eventCode) TRACE_CLEAR_FLAG_ISEXCLUDED(excludedEventCodes, eventCode)
#define TRACE_GET_EVENT_CODE_FLAG_ISEXCLUDED(eventCode) TRACE_GET_FLAG_ISEXCLUDED(excludedEventCodes, eventCode)

/* DEBUG ASSERTS */
#if defined USE_TRACE_ASSERT && USE_TRACE_ASSERT != 0
#define TRACE_ASSERT(eval, msg, defRetVal) \
if (!(eval)) \
{ \
	vTraceError("TRACE_ASSERT: " msg); \
	return defRetVal; \
}
#else
#define TRACE_ASSERT(eval, msg, defRetVal)
#endif

#endif

#endif