From c986807e7512ba34ee24af0c0f3f21804d058344 Mon Sep 17 00:00:00 2001 From: Hannes Date: Thu, 8 Apr 2021 16:08:12 +0200 Subject: [PATCH] initial commit --- .gitignore | 40 + mss/mss_main.c | 2587 ++++++++++++++++++++++++++++++++ mss/pcount3D_cli.c | 1195 +++++++++++++++ mss/pcount3D_mss.cfg | 90 ++ mss/pcount3D_mss.h | 394 +++++ mss/pcount3D_mss_linker.cmd | 16 + mss/r4f_linker.cmd | 43 + mss/src/.exclude | 1 + mss/src/makefile.libs | 62 + mss/src/sysbios/makefile | 82 + mss/src/sysbios/sysbios.aer4ft | Bin 0 -> 1981108 bytes mss/tracker_output.h | 99 ++ mss/tracker_utils.c | 580 +++++++ mss/tracker_utils.h | 212 +++ objdetrangehwa.c | 1209 +++++++++++++++ 15 files changed, 6610 insertions(+) create mode 100644 .gitignore create mode 100644 mss/mss_main.c create mode 100644 mss/pcount3D_cli.c create mode 100644 mss/pcount3D_mss.cfg create mode 100644 mss/pcount3D_mss.h create mode 100644 mss/pcount3D_mss_linker.cmd create mode 100644 mss/r4f_linker.cmd create mode 100644 mss/src/.exclude create mode 100644 mss/src/makefile.libs create mode 100644 mss/src/sysbios/makefile create mode 100644 mss/src/sysbios/sysbios.aer4ft create mode 100644 mss/tracker_output.h create mode 100644 mss/tracker_utils.c create mode 100644 mss/tracker_utils.h create mode 100644 objdetrangehwa.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc13d7f --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Folder +.settings/ +Debug/ +.xdchelp +.ccsproject +.cproject +.project diff --git a/mss/mss_main.c b/mss/mss_main.c new file mode 100644 index 0000000..bc91308 --- /dev/null +++ b/mss/mss_main.c @@ -0,0 +1,2587 @@ +/** + * @file mss_main.c + * + * @brief + * This is the main file which implements the millimeter wave Demo + * + * \par + * NOTE: + * (C) Copyright 2019 Texas Instruments, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** @mainpage 3D People Counting Demo for XWR68XX + * [TOC] + * @section intro_sec Introduction + * + * The 3D People Counting Demo shows the indoor people counting capabilities using XWR68xx SoC. + * The demo uses adapted range HWA DPU and DPC offerred by the mmWave SDK (Software Development Kit) + * for range processing on R4F and HWA, and uses advanced Capon beamforming on DSP to estimate + * range, Doppler, azimuth angle and elevation angle of indoor targets. + * + * Please refer to SDK documentation for range HWA DPU and DPC details. The additional adaptions are + * the following: + * - In rangeHWA DPU, modified range FFT scaling settings for HWA to maximize the SNR and dynamic + * range for indoor environment and the particular FFT size we use. + * - In rangeHWA DPC, added support for radar cube format 2. + * - Modified mmwdemo_rfparser.c to output chirp interval and frame period. Also fixed the error + * in Doppler step calculation. + * + * For Capon beamforming technique on DSP, please refer to document included in the packages for details. + * + * Please refer to the users guide for UART output format and chirp configuration details. + * + */ + +/************************************************************************** + *************************** Include Files ******************************** + **************************************************************************/ + +/* Standard Include Files. */ +#include +#include +#include +#include +#include +#include + + +/* BIOS/XDC Include Files. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* mmWave SDK Include Files: */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Demo Include Files */ +#include +#include + +#include +#include +#include +#include + + +/* Profiler Include Files */ +#include +#include +#include +#include +#include +/** + * @brief Task Priority settings: + * Mmwave task is at higher priority because of potential async messages from BSS + * that need quick action in real-time. + * + * CLI task must be at a lower priority than object detection + * dpm task priority because the dynamic CLI command handling in the objection detection + * dpm task assumes CLI task is held back during this processing. The alternative + * is to use a semaphore between the two tasks. + */ +#define MMWDEMO_CLI_TASK_PRIORITY 2 +#define MMWDEMO_TRACKERDPU_TASK_PRIORITY 3 +#define MMWDEMO_UARTTX_TASK_PRIORITY 4 +#define MMWDEMO_DPC_OBJDET_DPM_TASK_PRIORITY 5 +#define MMWDEMO_MMWAVE_CTRL_TASK_PRIORITY 6 + +#if (MMWDEMO_CLI_TASK_PRIORITY >= MMWDEMO_DPC_OBJDET_DPM_TASK_PRIORITY) +#error CLI task priority must be < Object Detection DPM task priority +#endif + +#define DPC_OBJDET_R4F_INSTANCEID (0xFEEDFEED) +#define DEBUG(_x) _x + +/** + * @brief + * Global Variable for LDO BYPASS config, PLease consult your + * board/EVM user guide before changing the values here + */ +rlRfLdoBypassCfg_t gRFLdoBypassCfg = +{ + .ldoBypassEnable = 0, /* 1.0V RF supply 1 and 1.0V RF supply 2 */ + .supplyMonIrDrop = 0, /* IR drop of 3% */ + .ioSupplyIndicator = 0, /* 3.3 V IO supply */ +}; + +/************************************************************************** + *************************** Global Definitions *************************** + **************************************************************************/ + +/** + * @brief + * Global Variable for tracking information required by the mmw Demo + */ +Pcount3DDemo_MSS_MCB gMmwMssMCB; + +extern ObjDetObj *gObjDetObj; + + /*! TCMB RAM buffer for object detection DPC */ +#define MMWDEMO_OBJDET_LOCALRAM_SIZE (8U * 1024U) +uint8_t gDPCTCM[MMWDEMO_OBJDET_LOCALRAM_SIZE]; +#pragma DATA_SECTION(gDPCTCM, ".dpcLocalRam"); +#pragma DATA_ALIGN(gDPCTCM, 4); + +/*! L3 RAM buffer for object detection DPC */ +#pragma DATA_SECTION(gMmwL3, ".l3ram"); +uint8_t gMmwL3[MMWAVE_MSSUSED_L3RAM_SIZE]; + +/************************************************************************** + *************************** Extern Definitions *************************** + **************************************************************************/ + +extern void MmwDemo_CLIInit(uint8_t taskPriority); + +/************************************************************************** + ************************* Millimeter Wave Demo Functions prototype ************* + **************************************************************************/ + +/* MMW demo functions for datapath operation */ +static void Pcount3DDemo_dataPathOpen(void); +static int32_t Pcount3DDemo_dataPathConfig (void); +static void Pcount3DDemo_dataPathStart (void); +static void Pcount3DDemo_dataPathStop (void); +static void Pcount3DDemo_handleObjectDetResult(DPM_Buffer *ptrResult); +static void Pcount3DDemo_DPC_ObjectDetection_reportFxn +( + DPM_Report reportType, + uint32_t instanceId, + int32_t errCode, + uint32_t arg0, + uint32_t arg1 +); +#ifdef TRACKERPROC_EN +static void MmwDemo_trackerDPUTask(UArg arg0, UArg arg1); +#endif +static void MmwDemo_uartTxTask(UArg arg0, UArg arg1); +/*Pcount3DDemo_transmitProcessedOutput +( + UART_Handle uartHandle, + Pcount3DDemo_output_message_UARTpointCloud *result, + uint32_t frameIdx, + uint8_t subFrameIdx, + Pcount3DDemo_output_message_stats *timingInfo +);*/ +static int32_t Pcount3DDemo_DPM_ioctl_blocking +( + DPM_Handle handle, + uint32_t cmd, + void* arg, + uint32_t argLen +); +static int32_t Pcount3DDemo_processPendingDynamicCfgCommands(uint8_t subFrameIndx); + +static void Pcount3DDemo_initTask(UArg arg0, UArg arg1); +static void Pcount3DDemo_platformInit(Pcount3DDemo_platformCfg *config); + +/* Mmwave control functions */ +static void Pcount3DDemo_mmWaveCtrlTask(UArg arg0, UArg arg1); +static int32_t Pcount3DDemo_mmWaveCtrlStop (void); +static int32_t Pcount3DDemo_eventCallbackFxn(uint16_t msgId, uint16_t sbId, uint16_t sbLen, uint8_t *payload); + +/* external sleep function when in idle (used in .cfg file) */ +void Pcount3DDemo_sleep(void); + +/* Edma related functions */ +static void Pcount3DDemo_edmaInit(Pcount3DDemo_DataPathObj *obj, uint8_t instance); +static void Pcount3DDemo_edmaOpen(Pcount3DDemo_DataPathObj *obj, uint8_t instance); +static void Pcount3DDemo_EDMA_transferControllerErrorCallbackFxn(EDMA_Handle handle, + EDMA_transferControllerErrorInfo_t *errorInfo); +static void Pcount3DDemo_EDMA_errorCallbackFxn(EDMA_Handle handle, EDMA_errorInfo_t *errorInfo); + + +/************************************************************************** + ************************* Millimeter Wave Demo Functions ********************** + **************************************************************************/ + +/** + * @b Description + * @n + * EDMA driver init + * + * @param[in] obj Pointer to data path object + * @param[in] instance EDMA instance + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_edmaInit(Pcount3DDemo_DataPathObj *obj, uint8_t instance) +{ + int32_t errorCode; + + errorCode = EDMA_init(instance); + if (errorCode != EDMA_NO_ERROR) + { + System_printf ("Debug: EDMA instance %d initialization returned error %d\n", errorCode); + Pcount3DDemo_debugAssert (0); + return; + } + + memset(&obj->EDMA_errorInfo, 0, sizeof(obj->EDMA_errorInfo)); + memset(&obj->EDMA_transferControllerErrorInfo, 0, sizeof(obj->EDMA_transferControllerErrorInfo)); +} + +/** + * @b Description + * @n + * Call back function for EDMA CC (Channel controller) error as per EDMA API. + * Declare fatal error if happens, the output errorInfo can be examined if code + * gets trapped here. + */ +static void Pcount3DDemo_EDMA_errorCallbackFxn(EDMA_Handle handle, EDMA_errorInfo_t *errorInfo) +{ + gMmwMssMCB.dataPathObj.EDMA_errorInfo = *errorInfo; + Pcount3DDemo_debugAssert(0); +} + +/** + * @b Description + * @n + * Call back function for EDMA transfer controller error as per EDMA API. + * Declare fatal error if happens, the output errorInfo can be examined if code + * gets trapped here. + */ +static void Pcount3DDemo_EDMA_transferControllerErrorCallbackFxn +( + EDMA_Handle handle, + EDMA_transferControllerErrorInfo_t *errorInfo +) +{ + gMmwMssMCB.dataPathObj.EDMA_transferControllerErrorInfo = *errorInfo; + Pcount3DDemo_debugAssert(0); +} + +/** + * @b Description + * @n + * Open EDMA driver instance + * + * @param[in] obj Pointer to data path object + * @param[in] instance EDMA instance + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_edmaOpen(Pcount3DDemo_DataPathObj *obj, uint8_t instance) +{ + int32_t errCode; + EDMA_instanceInfo_t edmaInstanceInfo; + EDMA_errorConfig_t errorConfig; + + obj->edmaHandle = EDMA_open(instance, &errCode, &edmaInstanceInfo); + + if (obj->edmaHandle == NULL) + { + Pcount3DDemo_debugAssert (0); + return; + } + + errorConfig.isConfigAllEventQueues = true; + errorConfig.isConfigAllTransferControllers = true; + errorConfig.isEventQueueThresholdingEnabled = true; + errorConfig.eventQueueThreshold = EDMA_EVENT_QUEUE_THRESHOLD_MAX; + errorConfig.isEnableAllTransferControllerErrors = true; + errorConfig.callbackFxn = Pcount3DDemo_EDMA_errorCallbackFxn; + errorConfig.transferControllerCallbackFxn = Pcount3DDemo_EDMA_transferControllerErrorCallbackFxn; + if ((errCode = EDMA_configErrorMonitoring(obj->edmaHandle, &errorConfig)) != EDMA_NO_ERROR) + { + //System_printf("Error: EDMA_configErrorMonitoring() failed with errorCode = %d\n", errCode); + Pcount3DDemo_debugAssert (0); + return; + } +} + +/** + * @b Description + * @n + * Close EDMA driver instance + * + * @param[in] obj Pointer to data path object + * + * @retval + * Not Applicable. + */ +void Pcount3DDemo_edmaClose(Pcount3DDemo_DataPathObj *obj) +{ + EDMA_close(obj->edmaHandle); +} + +/** + * @b Description + * @n + * HWA driver init + * + * @param[in] obj Pointer to data path object + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_hwaInit(Pcount3DDemo_DataPathObj *obj) +{ + /* Initialize the HWA */ + HWA_init(); +} + +/** + * @b Description + * @n + * Open HWA driver instance + * + * @param[in] obj Pointer to data path object + * @param[in] socHandle SOC driver handle + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_hwaOpen(Pcount3DDemo_DataPathObj *obj, SOC_Handle socHandle) +{ + int32_t errCode; + + /* Open the HWA Instance */ + obj->hwaHandle = HWA_open(0, socHandle, &errCode); + if (obj->hwaHandle == NULL) + { + //System_printf("Error: Unable to open the HWA Instance err:%d\n",errCode); + Pcount3DDemo_debugAssert (0); + return; + } +} + +/** + * @b Description + * @n + * Close HWA driver instance + * + * @param[in] obj Pointer to data path object + * + * @retval + * Not Applicable. + */ +void Pcount3DDemo_hwaClose(Pcount3DDemo_DataPathObj *obj) +{ + int32_t errCode; + + /* Close the HWA Instance */ + errCode = HWA_close(obj->hwaHandle); + if (errCode != 0) + { + Pcount3DDemo_debugAssert (0); + return; + } +} + +/** + * @b Description + * @n + * Send assert information through CLI. + * + * @param[in] expression Expression for evaluation + * @param[in] file C file that caused assertion + * @param[in] line Line number in C fine that caused assertion + * + */ +void _Pcount3DDemo_debugAssert(int32_t expression, const char *file, int32_t line) +{ + if (!expression) { + CLI_write ("Exception: %s, line %d.\n",file,line); + } +} + +/** + * @b Description + * @n + * Utility function to set the pending state of configuration. + * + * @param[in] subFrameCfg Pointer to Sub-frame specific configuration + * @param[in] offset Configuration structure offset that uniquely identifies the + * configuration to set to the pending state. + * + * @retval None + */ +static void Pcount3DDemo_setSubFramePendingState(Pcount3DDemo_SubFrameCfg *subFrameCfg, uint32_t offset) +{ + switch (offset) + { + case PCOUNT3DDEMO_ADCBUFCFG_OFFSET: + subFrameCfg->isAdcBufCfgPending = 1; + break; + default: + Pcount3DDemo_debugAssert(0); + break; + } +} + + +/** + * @b Description + * @n + * Resets (clears) all pending static (non-dynamic) configuration + * + */ +void Pcount3DDemo_resetStaticCfgPendingState(void) +{ + uint8_t indx; + + for(indx = 0; indx < gMmwMssMCB.objDetCommonCfg.numSubFrames; indx++) + { + gMmwMssMCB.subFrameCfg[indx].isAdcBufCfgPending = 0; + } + +} + +/** + * @b Description + * @n + * Utility function to find out if all configuration (common and sub-frame + * specific dynamic config) is in pending state. + * + * @retval 1 if all configuration (common and sub-frame specific dynamic config) + * is in pending state, else return 0 + */ +uint8_t Pcount3DDemo_isAllCfgInPendingState(void) +{ + uint8_t indx, flag = 1; + + for(indx = 0; indx < gMmwMssMCB.objDetCommonCfg.numSubFrames; indx++) + { + flag = flag && (gMmwMssMCB.subFrameCfg[indx].isAdcBufCfgPending == 1); + } + + return(flag); +} + +/** + * @b Description + * @n + * Utility function to find out if all configuration (common and sub-frame + * specific dynamic config) is in non-pending (cleared) state. + * + * @retval 1 if all configuration (common and sub-frame specific dynamic config) + * is in non-pending state, else return 0 + */ +uint8_t Pcount3DDemo_isAllCfgInNonPendingState(void) +{ + uint8_t indx, flag = 1; + + for(indx = 0; indx < gMmwMssMCB.objDetCommonCfg.numSubFrames; indx++) + { + flag = flag && (gMmwMssMCB.subFrameCfg[indx].isAdcBufCfgPending == 0); + } + + return(flag); +} + +/** + * @b Description + * @n + * Utility function to apply configuration to specified sub-frame + * + * @param[in] srcPtr Pointer to configuration + * @param[in] offset Offset of configuration within the parent structure + * @param[in] size Size of configuration + * @param[in] subFrameNum Sub-frame Number (0 based) to apply to, broadcast to + * all sub-frames if special code MMWDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +void Pcount3DDemo_CfgUpdate(void *srcPtr, uint32_t offset, uint32_t size, int8_t subFrameNum) +{ + /* if subFrameNum undefined, broadcast to all sub-frames */ + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + memcpy((void *)((uint32_t) &gMmwMssMCB.subFrameCfg[indx] + offset), srcPtr, size); + Pcount3DDemo_setSubFramePendingState(&gMmwMssMCB.subFrameCfg[indx], offset); + } + } + else + { + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + memcpy((void *)((uint32_t) &gMmwMssMCB.subFrameCfg[subFrameNum] + offset), srcPtr, size); + Pcount3DDemo_setSubFramePendingState(&gMmwMssMCB.subFrameCfg[subFrameNum], offset); + } +} + +/** @brief Transmits detection data over UART +* +* @param[in] uartHandle UART driver handle +* @param[in] result Pointer to result from object detection DPC processing +* @param[in] timingInfo Pointer to timing information provided from core that runs data path +*/ +void MmwDemo_uartTxTask(UArg arg0, UArg arg1) +/*static void Pcount3DDemo_transmitProcessedOutput +( + UART_Handle uartHandle, + Pcount3DDemo_output_message_UARTpointCloud *result, + uint32_t frameIdx, + uint8_t subFrameIdx, + Pcount3DDemo_output_message_stats *timingInfo +)*/ +{ + UART_Handle uartHandle; + Pcount3DDemo_output_message_header header; + uint32_t tlvIdx = 0; + uint32_t packetLen, subFrameIdx, frameIdx; + uint16_t *headerPtr; + Pcount3DDemo_output_message_stats *timingInfo; + + Pcount3DDemo_output_message_UARTpointCloud *objOut; + uint32_t sum, n, targetListLength=0, targetIndexLength=0, presenceIndLength=0; + volatile uint32_t startTime; + Pcount3DDemo_output_message_tl tl; + + /* Clear message header */ + memset((void *)&header, 0, sizeof(Pcount3DDemo_output_message_header)); + + + /* Header: */ + header.platform = 0xA6843; + header.magicWord[0] = 0x0102; + header.magicWord[1] = 0x0304; + header.magicWord[2] = 0x0506; + header.magicWord[3] = 0x0708; + header.version = MMWAVE_SDK_VERSION_BUILD | + (MMWAVE_SDK_VERSION_BUGFIX << 8) | + (MMWAVE_SDK_VERSION_MINOR << 16) | + (MMWAVE_SDK_VERSION_MAJOR << 24); + + + /* wait for new message and process all the messages received from the peer */ + while(1) + { + uint32_t numTargets, numIndices; + uint8_t *tList; + uint8_t *tIndex; + + + Semaphore_pend(gMmwMssMCB.uartTxSemHandle, BIOS_WAIT_FOREVER); + startTime = Cycleprofiler_getTimeStamp(); + + tlvIdx = 0; + uartHandle = gMmwMssMCB.loggingUartHandle; + objOut = &(gMmwMssMCB.pointCloudToUart); + subFrameIdx = gMmwMssMCB.currSubFrameIdx; + timingInfo = &gMmwMssMCB.subFrameStats[subFrameIdx].outputStats; + frameIdx = gMmwMssMCB.frameStatsFromDSP->frameStartIntCounter; + + packetLen = sizeof(Pcount3DDemo_output_message_header); + header.chirpProcessingMargin = timingInfo->interChirpProcessingMargin; + header.frameProcessingTimeInUsec = timingInfo->frameProcessingTimeInUsec; + header.trackingProcessingTimeInUsec = gMmwMssMCB.trackerProcessingTimeInUsec; + header.uartSendingTimeInUsec = gMmwMssMCB.uartProcessingTimeInUsec; + numTargets = gMmwMssMCB.numTargets; + numIndices = gMmwMssMCB.numIndices; + tList = (uint8_t*)gMmwMssMCB.trackerOutput.tList[gMmwMssMCB.trackerOutput.currentDescr]; + tIndex = (uint8_t*)gMmwMssMCB.trackerOutput.tIndex[gMmwMssMCB.trackerOutput.currentDescr]; + + if (objOut->header.length > 0) + { + packetLen += objOut->header.length; + tlvIdx++; + } + if (numTargets > 0) + { + targetListLength = sizeof(Pcount3DDemo_output_message_tl) + numTargets*sizeof(trackerProc_Target); + packetLen += targetListLength; + tlvIdx++; + } + if ((numIndices > 0) && (numTargets > 0)) + { + targetIndexLength = sizeof(Pcount3DDemo_output_message_tl) + numIndices*sizeof(trackerProc_TargetIndex); + packetLen += targetIndexLength; + tlvIdx++; + } + if(gMmwMssMCB.presenceDetEnabled) + { + presenceIndLength = sizeof(Pcount3DDemo_output_message_tl) + sizeof(uint32_t);; + packetLen += presenceIndLength; + tlvIdx++; + } + + header.numTLVs = tlvIdx; + header.totalPacketLen = packetLen; + header.frameNumber = frameIdx; + header.subFrameNumber = subFrameIdx; + header.checkSum = 0; + + + headerPtr = (uint16_t *)&header; + for(n=0, sum = 0; n < sizeof(Pcount3DDemo_output_message_header)/sizeof(uint16_t); n++) + sum += *headerPtr++; + header.checkSum = ~((sum >> 16) + (sum & 0xFFFF)); + + /* Send packet header */ + UART_write (uartHandle, + (uint8_t*)&header, + sizeof(Pcount3DDemo_output_message_header)); + + /* Send detected Objects */ + if (objOut->header.length > 0) + { + UART_write (uartHandle, + (uint8_t*)objOut, + objOut->header.length); + } + Task_sleep(1); + /*Send Tracker information*/ + if (numTargets > 0) + { + tl.type = MMWDEMO_OUTPUT_MSG_TARGET_LIST; + tl.length = targetListLength; + UART_write(uartHandle, (uint8_t*)&tl, sizeof(Pcount3DDemo_output_message_tl)); + UART_write(uartHandle, tList, targetListLength-sizeof(Pcount3DDemo_output_message_tl)); + GPIO_toggle(gMmwMssMCB.cfg.platformCfg.SensorStatusGPIO); + } + /*Send Tracker Index Information*/ + if ((numIndices > 0) && (numTargets > 0)) + { + tl.type = MMWDEMO_OUTPUT_MSG_TARGET_INDEX; + tl.length = targetIndexLength; + UART_write(uartHandle, (uint8_t*)&tl, sizeof(Pcount3DDemo_output_message_tl)); + UART_write(uartHandle, tIndex, targetIndexLength-sizeof(Pcount3DDemo_output_message_tl)); + } + + /* Send Presence TLV if presence detect is enabled */ + if(gMmwMssMCB.presenceDetEnabled) + { + tl.type = MMWDEMO_OUTPUT_PRESENCE_IND; + tl.length = presenceIndLength; + + UART_write(uartHandle, (uint8_t*)&tl, sizeof(Pcount3DDemo_output_message_tl)); + UART_write(uartHandle, (uint8_t*)&(gMmwMssMCB.presenceInd), sizeof(uint32_t)); + } + + gMmwMssMCB.uartProcessingTimeInUsec = (Cycleprofiler_getTimeStamp() - startTime)/R4F_CLOCK_MHZ; + } +} + + + +/************************************************************************** + ******************** Millimeter Wave Demo control path Functions ***************** + **************************************************************************/ +/** + * @b Description + * @n + * The function is used to trigger the Front end to stop generating chirps. + * + * @retval + * Not Applicable. + */ +static int32_t Pcount3DDemo_mmWaveCtrlStop (void) +{ + int32_t errCode = 0; + + DebugP_log0("App: Issuing MMWave_stop\n"); + + /* Stop the mmWave module: */ + if (MMWave_stop (gMmwMssMCB.ctrlHandle, &errCode) < 0) + { + MMWave_ErrorLevel errorLevel; + int16_t mmWaveErrorCode; + int16_t subsysErrorCode; + + /* Error/Warning: Unable to stop the mmWave module */ + MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode); + if (errorLevel == MMWave_ErrorLevel_ERROR) + { + /* Error: Display the error message: */ + System_printf ("Error: mmWave Stop failed [Error code: %d Subsystem: %d]\n", + mmWaveErrorCode, subsysErrorCode); + + /* Not expected */ + Pcount3DDemo_debugAssert(0); + } + else + { + /* Warning: This is treated as a successful stop. */ + System_printf ("mmWave Stop error ignored [Error code: %d Subsystem: %d]\n", + mmWaveErrorCode, subsysErrorCode); + } + } + + return errCode; +} + +/** + * @b Description + * @n + * The task is used to provide an execution context for the mmWave + * control task + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_mmWaveCtrlTask(UArg arg0, UArg arg1) +{ + int32_t errCode; + + while (1) + { + /* Execute the mmWave control module: */ + if (MMWave_execute (gMmwMssMCB.ctrlHandle, &errCode) < 0) + { + //System_printf ("Error: mmWave control execution failed [Error code %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + } + } +} + +/************************************************************************** + ******************** Millimeter Wave Demo data path Functions ******************* + **************************************************************************/ + +/** + * @b Description + * @n + * Help function to make DPM_ioctl blocking until response is reported + * + * @retval + * Success -0 + * Failed <0 + */ +static int32_t Pcount3DDemo_DPM_ioctl_blocking +( + DPM_Handle handle, + uint32_t cmd, + void* arg, + uint32_t argLen +) +{ + int32_t retVal = 0; + + DebugP_log3("Pcount3DDemo_DPM_ioctl_blocking: cmd = %d, *arg = %d, len = %d\n", cmd, *(uint8_t *)arg, argLen); + retVal = DPM_ioctl(handle, + cmd, + arg, + argLen); + + if(retVal == 0) + { + /* Wait until ioctl completed */ + Semaphore_pend(gMmwMssMCB.DPMioctlSemHandle, BIOS_WAIT_FOREVER); + } + + return(retVal); +} + +/** + * @b Description + * @n + * Perform Data path driver open + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_dataPathOpen(void) +{ + gMmwMssMCB.adcBufHandle = MmwDemo_ADCBufOpen(gMmwMssMCB.socHandle); + if(gMmwMssMCB.adcBufHandle == NULL) + { + Pcount3DDemo_debugAssert(0); + } +} + + + +/** + * @b Description + * @n + * The function is used to configure the data path based on the chirp profile. + * After this function is executed, the data path processing will ready to go + * when the ADC buffer starts receiving samples corresponding to the chirps. + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_dataPathConfig (void) +{ + int32_t errCode; + MMWave_CtrlCfg *ptrCtrlCfg; + Pcount3DDemo_DPC_ObjDet_CommonCfg *objDetCommonCfgDSP; + Pcount3DDemo_SubFrameCfg *subFrameCfg; + int8_t subFrameIndx; + MmwDemo_RFParserOutParams RFparserOutParams; + DPC_ObjectDetectionRangeHWA_PreStartCfg objDetPreStartR4fCfg; + DPC_ObjectDetectionRangeHWA_StaticCfg *staticCfgR4F; + DPC_ObjectDetection_PreStartCfg objDetPreStartDspCfg; + DPC_ObjectDetectionRangeHWA_PreStartCommonCfg preStartCommonCfgHWA; + uint8_t radarCubeFormat = DPIF_RADARCUBE_FORMAT_2; + + /* Get data path object and control configuration */ + ptrCtrlCfg = &gMmwMssMCB.cfg.ctrlCfg; + + objDetCommonCfgDSP = &gMmwMssMCB.objDetCommonCfg; + staticCfgR4F = &objDetPreStartR4fCfg.staticCfg; + + /* Get RF frequency scale factor */ + gMmwMssMCB.rfFreqScaleFactor = SOC_getDeviceRFFreqScaleFactor(gMmwMssMCB.socHandle, &errCode); + if (errCode < 0) + { + System_printf ("Error: Unable to get RF scale factor [Error:%d]\n", errCode); + Pcount3DDemo_debugAssert(0); + } + + objDetCommonCfgDSP->numSubFrames = MmwDemo_RFParser_getNumSubFrames(ptrCtrlCfg); + + DEBUG(System_printf("App: Issuing Pre-start Common Config IOCTL to R4F\n");) + + /* DPC pre-start common config */ + + DEBUG(System_printf("App: Issuing Pre-start Common Config IOCTL to DSP\n");) + errCode = Pcount3DDemo_DPM_ioctl_blocking (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDET_IOCTL__STATIC_PRE_START_COMMON_CFG, + objDetCommonCfgDSP, + sizeof (Pcount3DDemo_DPC_ObjDet_CommonCfg)); + + if (errCode < 0) + { + System_printf ("Error: Unable to send DPC_OBJDET_IOCTL__STATIC_PRE_START_COMMON_CFG [Error:%d]\n", errCode); + goto exit; + } + + preStartCommonCfgHWA.numSubFrames = objDetCommonCfgDSP->numSubFrames; + errCode = Pcount3DDemo_DPM_ioctl_blocking (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_COMMON_CFG, + &preStartCommonCfgHWA, + sizeof (preStartCommonCfgHWA)); + if (errCode < 0) + { + System_printf ("Error: Unable to send DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_COMMON_CFG [Error:%d]\n", errCode); + goto exit; + } + + /* Reason for reverse loop is that when sensor is started, the first sub-frame + * will be active and the ADC configuration needs to be done for that sub-frame + * before starting (ADC buf hardware does not have notion of sub-frame, it will + * be reconfigured every sub-frame). This cannot be alternatively done by calling + * the Pcount3DDemo_ADCBufConfig function only for the first sub-frame because this is + * a utility API that computes the rxChanOffset that is part of ADC dataProperty + * which will be used by range DPU and therefore this computation is required for + * all sub-frames. + */ + for(subFrameIndx = objDetCommonCfgDSP->numSubFrames -1; subFrameIndx >= 0; + subFrameIndx--) + { + subFrameCfg = &gMmwMssMCB.subFrameCfg[subFrameIndx]; + + /***************************************************************************** + * Data path :: Algorithm Configuration + *****************************************************************************/ + + DEBUG(System_printf("App: Calling MmwDemo_RFParser_parseConfig\n");) + /* Parse the profile and chirp configs and get the valid number of TX Antennas */ + errCode = MmwDemo_RFParser_parseConfig(&RFparserOutParams, subFrameIndx, + &gMmwMssMCB.cfg.openCfg, ptrCtrlCfg, + &subFrameCfg->adcBufCfg, + gMmwMssMCB.rfFreqScaleFactor, + 0); + + if (errCode != 0) + { + System_printf ("Error: MmwDemo_RFParser_parseConfig [Error:%d]\n", errCode); + goto exit; + } + + /* The following code is to enable processing for number of doppler chirps that are + * less than 16 (the minimal numDopplerBins supported in doppler DPU DSP). + * In this case, interpolate to detect better with CFAR tuning. E.g. a 2 -pt FFT will + * be problematic in terms of distinguishing direction of motion */ + if (RFparserOutParams.numDopplerChirps <= 8) + { + RFparserOutParams.dopplerStep = RFparserOutParams.dopplerStep / (16 / RFparserOutParams.numDopplerBins); + RFparserOutParams.numDopplerBins = 16; + } + + /* Workaround for range DPU limitation for FFT size 1024 and 12 virtual antennas case*/ + if ((RFparserOutParams.numVirtualAntennas == 12) && (RFparserOutParams.numRangeBins == 1024)) + { + RFparserOutParams.numRangeBins = 1022; + } + + subFrameCfg->numChirpsPerChirpEvent = RFparserOutParams.numChirpsPerChirpEvent; + subFrameCfg->adcBufChanDataSize = RFparserOutParams.adcBufChanDataSize; + subFrameCfg->numAdcSamples = RFparserOutParams.numAdcSamples; + subFrameCfg->numChirpsPerSubFrame = RFparserOutParams.numChirpsPerFrame; + subFrameCfg->numVirtualAntennas = RFparserOutParams.numVirtualAntennas; + + DEBUG(System_printf("App: Calling MmwDemo_ADCBufConfig\n");) + errCode = MmwDemo_ADCBufConfig(gMmwMssMCB.adcBufHandle, + gMmwMssMCB.cfg.openCfg.chCfg.rxChannelEn, + subFrameCfg->numChirpsPerChirpEvent, + subFrameCfg->adcBufChanDataSize, + &subFrameCfg->adcBufCfg, + &staticCfgR4F->ADCBufData.dataProperty.rxChanOffset[0]); + if (errCode < 0) + { + System_printf("Error: ADCBuf config failed with error[%d]\n", errCode); + Pcount3DDemo_debugAssert (0); + } + + if (errCode < 0) + { + goto exit; + } + + /* DPC pre-start config R4F HWA*/ + { + + /*********************************************************************** + Pre-start preparation for objdetR4FHWA + ***********************************************************************/ + objDetPreStartR4fCfg.subFrameNum = subFrameIndx; + + /* Fill static configuration */ + staticCfgR4F->ADCBufData.data = (void *)SOC_XWR68XX_MSS_ADCBUF_BASE_ADDRESS; + staticCfgR4F->ADCBufData.dataProperty.adcBits = 2; /* 16-bit */ + + /* only complex format supported */ + Pcount3DDemo_debugAssert(subFrameCfg->adcBufCfg.adcFmt == 0); + + if (subFrameCfg->adcBufCfg.iqSwapSel == 1) + { + staticCfgR4F->ADCBufData.dataProperty.dataFmt = DPIF_DATAFORMAT_COMPLEX16_IMRE; + } + else + { + staticCfgR4F->ADCBufData.dataProperty.dataFmt = DPIF_DATAFORMAT_COMPLEX16_REIM; + } + if (subFrameCfg->adcBufCfg.chInterleave == 0) + { + staticCfgR4F->ADCBufData.dataProperty.interleave = DPIF_RXCHAN_INTERLEAVE_MODE; + } + else + { + staticCfgR4F->ADCBufData.dataProperty.interleave = DPIF_RXCHAN_NON_INTERLEAVE_MODE; + } + staticCfgR4F->radarCubeFormat = radarCubeFormat; + + staticCfgR4F->ADCBufData.dataProperty.numAdcSamples = RFparserOutParams.numAdcSamples; + staticCfgR4F->ADCBufData.dataProperty.numChirpsPerChirpEvent = RFparserOutParams.numChirpsPerChirpEvent; + staticCfgR4F->ADCBufData.dataProperty.numRxAntennas = RFparserOutParams.numRxAntennas; + staticCfgR4F->ADCBufData.dataSize = RFparserOutParams.numRxAntennas * RFparserOutParams.numAdcSamples * sizeof(cmplx16ImRe_t); + staticCfgR4F->numChirpsPerFrame = RFparserOutParams.numChirpsPerFrame; + staticCfgR4F->numDopplerChirps = RFparserOutParams.numDopplerChirps; + staticCfgR4F->numRangeBins = RFparserOutParams.numRangeBins; + staticCfgR4F->numTxAntennas = RFparserOutParams.numTxAntennas; + staticCfgR4F->numVirtualAntennas = RFparserOutParams.numVirtualAntennas; + + if (RFparserOutParams.numRangeBins >= 1022) + { + staticCfgR4F->rangeFFTtuning.fftOutputDivShift = 1; + /*scale 2 stages */ + staticCfgR4F->rangeFFTtuning.numLastButterflyStagesToScale = 2; + } + else if (RFparserOutParams.numRangeBins == 512) + { + staticCfgR4F->rangeFFTtuning.fftOutputDivShift = 2; + /*scale last stages */ + staticCfgR4F->rangeFFTtuning.numLastButterflyStagesToScale = 1; + } + else + { + /*NS: Changed this value to 2 to match ming's version */ + //staticCfgR4F->rangeFFTtuning.fftOutputDivShift = 3; + staticCfgR4F->rangeFFTtuning.fftOutputDivShift = 2; + + /*no scaling needed as ADC data is 16-bit and we have 8 bits to grow */ + staticCfgR4F->rangeFFTtuning.numLastButterflyStagesToScale = 0; + } + + /* Fill dynamic configuration for the sub-frame */ + objDetPreStartR4fCfg.dynCfg = subFrameCfg->objDetDynCfg.r4fDynCfg; + + DebugP_log1("App: Issuing Pre-start Config IOCTL (subFrameIndx = %d)\n", subFrameIndx); + + /* send pre-start config to R4F chain, using blocking call here */ + errCode = Pcount3DDemo_DPM_ioctl_blocking (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG, + &objDetPreStartR4fCfg, + sizeof (DPC_ObjectDetectionRangeHWA_PreStartCfg)); + if (errCode < 0) + { + System_printf ("Error: Unable to send DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG [Error:%d]\n", errCode); + goto exit; + } + DebugP_log0("App: DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG is processed \n"); + } + + /* DPC pre-start config DSP*/ + DEBUG(System_printf("App: pre-start config for DSP \n");) + { + DPU_radarProcessConfig_t *pParam_s; + + /*********************************************************************** + Pre-start preparation for objdetdsp + ***********************************************************************/ + /* Reset preStart config */ + memset((void *)&objDetPreStartDspCfg, 0, sizeof(DPC_ObjectDetection_PreStartCfg)); + + /* DPC configuration */ + objDetPreStartDspCfg.subFrameNum = subFrameIndx; + objDetPreStartDspCfg.dynCfg = subFrameCfg->objDetDynCfg.dspDynCfg; + pParam_s = &objDetPreStartDspCfg.dynCfg.caponChainCfg; + memcpy((void *)pParam_s, &(gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg), sizeof(DPU_radarProcessConfig_t)); + + pParam_s->numRangeBins = RFparserOutParams.numRangeBins; + pParam_s->numTxAntenna = RFparserOutParams.numTxAntennas; + pParam_s->numPhyRxAntenna = RFparserOutParams.numRxAntennas; + pParam_s->numAntenna = pParam_s->numTxAntenna * pParam_s->numPhyRxAntenna; + if (pParam_s->numTxAntenna > 1) + pParam_s->mimoModeFlag = 1; + else + pParam_s->mimoModeFlag = 0; + pParam_s->numAdcSamplePerChirp = RFparserOutParams.numAdcSamples; + pParam_s->dynamicCfarConfig.rangeRes = RFparserOutParams.rangeStep; + pParam_s->staticCfarConfig.rangeRes = pParam_s->dynamicCfarConfig.rangeRes; + pParam_s->numChirpPerFrame = RFparserOutParams.numDopplerChirps ; + gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg.numChirpPerFrame = RFparserOutParams.numDopplerChirps ; + pParam_s->framePeriod = RFparserOutParams.framePeriod; + pParam_s->chirpInterval = RFparserOutParams.chirpInterval; + pParam_s->bandwidth = RFparserOutParams.bandwidth; + pParam_s->centerFreq = RFparserOutParams.centerFreq; + gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg.chirpInterval = RFparserOutParams.chirpInterval; + gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg.framePeriod = RFparserOutParams.framePeriod; + gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg.bandwidth = RFparserOutParams.bandwidth; + gMmwMssMCB.subFrameCfg[subFrameIndx].objDetDynCfg.dspDynCfg.caponChainCfg.centerFreq = RFparserOutParams.centerFreq; + + pParam_s->dynamicCfarConfig.dopplerRes = RFparserOutParams.dopplerStep; + pParam_s->dynamicCfarConfig.cfarType = RADARDEMO_DETECTIONCFAR_RA_CASOCFAR; //hardcoded, only method can be used in this chain + pParam_s->dynamicCfarConfig.inputType = RADARDEMO_DETECTIONCFAR_INPUTTYPE_SP; //hardcoded, only method can be used in this chain + pParam_s->staticCfarConfig.cfarType = RADARDEMO_DETECTIONCFAR_RA_CASOCFAR; //hardcoded, only method can be used in this chain + pParam_s->staticCfarConfig.inputType = RADARDEMO_DETECTIONCFAR_INPUTTYPE_SP; //hardcoded, only method can be used in this chain + pParam_s->maxNumDetObj = (uint16_t)MAX_RESOLVED_OBJECTS_PER_FRAME; + + /* The L3 memory and radarCube memory usage are reported and saved in @ref Pcount3DDemo_DPC_ObjectDetection_reportFxn. + The memory information is configured here and passed to objdetdsp chain. + */ + objDetPreStartDspCfg.dynCfg.radarCubeFormat = radarCubeFormat; + if(gMmwMssMCB.dataPathObj.radarCubeMem.addr != 0) + { + /* Update DPC radar cube configuration */ + objDetPreStartDspCfg.shareMemCfg.radarCubeMem.addr = gMmwMssMCB.dataPathObj.radarCubeMem.addr; + objDetPreStartDspCfg.shareMemCfg.radarCubeMem.size = gMmwMssMCB.dataPathObj.radarCubeMem.size; + + /* Update DPC L3 RAM configuration */ + objDetPreStartDspCfg.shareMemCfg.L3Ram.addr = (void *)((uint32_t)(gMmwMssMCB.dataPathObj.radarCubeMem.addr) + + gMmwMssMCB.dataPathObj.memUsage.L3RamUsage); + objDetPreStartDspCfg.shareMemCfg.L3Ram.size =gMmwMssMCB.dataPathObj.memUsage.L3RamTotal - gMmwMssMCB.dataPathObj.memUsage.L3RamUsage; + + /* Convert address for DSP core */ + objDetPreStartDspCfg.shareMemCfg.radarCubeMem.addr = (void *) SOC_translateAddress((uint32_t)objDetPreStartDspCfg.shareMemCfg.radarCubeMem.addr, + SOC_TranslateAddr_Dir_TO_OTHER_CPU, + &errCode); + DebugP_assert ((uint32_t)objDetPreStartDspCfg.shareMemCfg.radarCubeMem.addr != SOC_TRANSLATEADDR_INVALID); + + objDetPreStartDspCfg.shareMemCfg.L3Ram.addr = (void *) SOC_translateAddress((uint32_t)objDetPreStartDspCfg.shareMemCfg.L3Ram.addr, + SOC_TranslateAddr_Dir_TO_OTHER_CPU, + &errCode); + DebugP_assert ((uint32_t)objDetPreStartDspCfg.shareMemCfg.L3Ram.addr != SOC_TRANSLATEADDR_INVALID); + + /* Enable shared memory configuration */ + objDetPreStartDspCfg.shareMemCfg.shareMemEnable = true; + } + + /* send pre-start config */ + DEBUG(System_printf("App: pre-start config ready to be set to DSP \n");) + errCode = Pcount3DDemo_DPM_ioctl_blocking (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG, + &objDetPreStartDspCfg, + sizeof (DPC_ObjectDetection_PreStartCfg)); + DebugP_log0("App: DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG is processed \n"); + + if (errCode < 0) + { + System_printf ("Error: Unable to send DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG [Error:%d]\n", errCode); + goto exit; + } + } + + + } +exit: + return errCode; +} +#ifdef TRACKERPROC_EN +/** + * @b Description + * @n + * The function is used to configure the tracker DPU. + * + * @retval + * 0 if no error, error code otherwise. + */ +int32_t MmwDemo_trackerConfig (void) +{ + int32_t errCode; + + DebugP_log0("App: Issuing Tracker Static Config IOCTL\n"); + + /* DPC pre-start common config */ + //errCode = DPM_ioctl (dataPathObj->objDetDpmHandle, + errCode = DPM_ioctl (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG, + &(gMmwMssMCB.trackerCfg), + sizeof (DPC_ObjectDetection_TrackerConfig)); + + if (errCode < 0) + { + System_printf ("Error: Unable to send DPC_OBJDETRANGEHWA_IOCTL__TRACKER_STATIC_CFG [Error:%d]\n", errCode); + goto exit; + } + +exit: + return errCode; +} +#endif + +/** + * @b Description + * @n + * This function is used to start data path to handle chirps from front end. + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_dataPathStart (void) +{ + int32_t retVal; + int32_t pointCloudSize; + + DebugP_log0("App: Issuing DPM_start\n"); + + pointCloudSize = MAX_RESOLVED_OBJECTS_PER_FRAME * sizeof(DPIF_PointCloudSpherical); + gMmwMssMCB.pointCloudFromDSP = (DPIF_PointCloudSpherical *)MemoryP_ctrlAlloc(pointCloudSize, sizeof(float)); + gMmwMssMCB.pointCloudSideInfoFromDSP = (DPIF_PointCloudSideInfo *)MemoryP_ctrlAlloc(MAX_RESOLVED_OBJECTS_PER_FRAME * sizeof(DPIF_PointCloudSideInfo), sizeof(int16_t)); + + /* Start the DPM Profile: */ + if ((retVal = DPM_start(gMmwMssMCB.objDetDpmHandle)) < 0) + { + /* Error: Unable to start the profile */ + System_printf("Error: Unable to start the DPM [Error: %d]\n", retVal); + Pcount3DDemo_debugAssert(0); + } + + /* Wait until start completed */ + Semaphore_pend(gMmwMssMCB.DPMstartSemHandle, BIOS_WAIT_FOREVER); + + DebugP_log0("App: DPM_start Done (post Semaphore_pend on reportFxn reporting start)\n"); +} + +/** + * @b Description + * @n + * This function is used to stop data path. + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_dataPathStop (void) +{ + int32_t retVal; + int32_t pointCloudSize; + + DebugP_log0("App: Issuing DPM_stop\n"); + + pointCloudSize = MAX_RESOLVED_OBJECTS_PER_FRAME * sizeof(Pcount3DDemo_output_message_point); + MemoryP_ctrlFree(gMmwMssMCB.pointCloudFromDSP, pointCloudSize); + + retVal = DPM_stop (gMmwMssMCB.objDetDpmHandle); + if (retVal < 0) + { + System_printf ("DPM_stop failed[Error code %d]\n", retVal); + Pcount3DDemo_debugAssert(0); + } +} + +/** + * @b Description + * @n + * Registered event function to mmwave which is invoked when an event from the + * BSS is received. + * + * @param[in] msgId + * Message Identifier + * @param[in] sbId + * Subblock identifier + * @param[in] sbLen + * Length of the subblock + * @param[in] payload + * Pointer to the payload buffer + * + * @retval + * Always return 0 + */ +static int32_t Pcount3DDemo_eventCallbackFxn(uint16_t msgId, uint16_t sbId, uint16_t sbLen, uint8_t *payload) +{ + uint16_t asyncSB = RL_GET_SBID_FROM_UNIQ_SBID(sbId); + + /* Process the received message: */ + switch (msgId) + { + case RL_RF_ASYNC_EVENT_MSG: + { + /* Received Asychronous Message: */ + switch (asyncSB) + { + case RL_RF_AE_CPUFAULT_SB: + { + Pcount3DDemo_debugAssert(0); + break; + } + case RL_RF_AE_ESMFAULT_SB: + { + Pcount3DDemo_debugAssert(0); + break; + } + case RL_RF_AE_ANALOG_FAULT_SB: + { + Pcount3DDemo_debugAssert(0); + break; + } + case RL_RF_AE_INITCALIBSTATUS_SB: + { + rlRfInitComplete_t* ptrRFInitCompleteMessage; + uint32_t calibrationStatus; + + /* Get the RF-Init completion message: */ + ptrRFInitCompleteMessage = (rlRfInitComplete_t*)payload; + calibrationStatus = ptrRFInitCompleteMessage->calibStatus & 0xFFFU; + + /* Display the calibration status: */ + CLI_write ("Debug: Init Calibration Status = 0x%x\n", calibrationStatus); + break; + } + case RL_RF_AE_FRAME_TRIGGER_RDY_SB: + { + gMmwMssMCB.stats.frameTriggerReady++; + break; + } + case RL_RF_AE_MON_TIMING_FAIL_REPORT_SB: + { + gMmwMssMCB.stats.failedTimingReports++; + break; + } + case RL_RF_AE_RUN_TIME_CALIB_REPORT_SB: + { + gMmwMssMCB.stats.calibrationReports++; + break; + } + case RL_RF_AE_FRAME_END_SB: + { + gMmwMssMCB.stats.sensorStopped++; + DebugP_log0("App: BSS stop (frame end) received\n"); + + Pcount3DDemo_dataPathStop(); + break; + } + default: + { + System_printf ("Error: Asynchronous Event SB Id %d not handled\n", asyncSB); + break; + } + } + break; + } + /* Async Event from MMWL */ + case RL_MMWL_ASYNC_EVENT_MSG: + { + switch (asyncSB) + { + case RL_MMWL_AE_MISMATCH_REPORT: + { + /* link reports protocol error in the async report from BSS */ + Pcount3DDemo_debugAssert(0); + break; + } + case RL_MMWL_AE_INTERNALERR_REPORT: + { + /* link reports internal error during BSS communication */ + Pcount3DDemo_debugAssert(0); + break; + } + } + break; + } + default: + { + System_printf ("Error: Asynchronous message %d is NOT handled\n", msgId); + break; + } + } + return 0; +} + +/** + * @b Description + * @n + * DPM Registered Report Handler. The DPM Module uses this registered function to notify + * the application about DPM reports. + * + * @param[in] reportType + * Report Type + * @param[in] instanceId + * Instance Identifier which generated the report + * @param[in] errCode + * Error code if any. + * @param[in] arg0 + * Argument 0 interpreted with the report type + * @param[in] arg1 + * Argument 1 interpreted with the report type + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_DPC_ObjectDetection_reportFxn +( + DPM_Report reportType, + uint32_t instanceId, + int32_t errCode, + uint32_t arg0, + uint32_t arg1 +) +{ + /* Only errors are logged on the console: */ + if ((errCode != 0) ) + { + /* Error: Detected log on the console and die all errors are FATAL currently. */ + System_printf ("Error: DPM Report %d received with error:%d arg0:0x%x arg1:0x%x\n", + reportType, errCode, arg0, arg1); + DebugP_assert (0); + } + + /* Processing further is based on the reports received: This is the control of the profile + * state machine: */ + switch (reportType) + { + case DPM_Report_IOCTL: + { + /***************************************************************** + * DPC has been configured without an error: + * - This is an indication that the profile configuration commands + * went through without any issues. + *****************************************************************/ + DebugP_log1("App: DPM Report IOCTL, command = %d\n", arg0); + + if (arg0 == DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG) + { + DPC_ObjectDetectionRangeHWA_PreStartCfg *cfg; + DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage *memUsage; + + cfg = (DPC_ObjectDetectionRangeHWA_PreStartCfg*)arg1; + + /* Save radar cube memory information, it will be passed to objdetdsp chain for inter-frame processing */ + memcpy((void *)&gMmwMssMCB.dataPathObj.radarCubeMem, (void *)&cfg->radarCubeMem, + sizeof(DPC_ObjectDetectionRangeHWA_preStartCfg_radarCubeMem)); + + /* Get memory usage and print the usage */ + memUsage = &cfg->memUsage; + + /* Save memory usage, it will be passed to objdetdsp chain for inter-frame processing */ + memcpy((void *)&gMmwMssMCB.dataPathObj.memUsage, (void *)memUsage, + sizeof(DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage)); + + System_printf("============ Heap Memory Stats ============\n"); + System_printf("%20s %12s %12s %12s %12s\n", " ", "Size", "Used", "Free", "DPCUsed"); + System_printf("%20s %12d %12d %12d %12d\n", "System Heap(TCMB)", + memUsage->SystemHeapTotal, memUsage->SystemHeapUsed, + memUsage->SystemHeapTotal - memUsage->SystemHeapUsed, + memUsage->SystemHeapDPCUsed); + + System_printf("%20s %12d %12d %12d\n", "L3", + memUsage->L3RamTotal, + memUsage->L3RamUsage, + memUsage->L3RamTotal - memUsage->L3RamUsage); + + System_printf("%20s %12d %12d %12d\n", "localRam(TCMB)", + memUsage->CoreLocalRamTotal, + memUsage->CoreLocalRamUsage, + memUsage->CoreLocalRamTotal - memUsage->CoreLocalRamUsage); + } + + switch(arg0) + { + /* The following ioctls take longer time to finish. It causes DPM to queue IOCTL requests on DSS before + * they are handled. However DPM has limited pipe queues, hence adding sync points in demo to avoid + * sending too many such ioctls to DSS at a time. + * The semaphore blocks CLI task to wait for the response from DSS before sending the next ioctl. + */ + case DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_COMMON_CFG: + case DPC_OBJDET_IOCTL__STATIC_PRE_START_COMMON_CFG: + case DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG: +#ifdef TRACKERPROC_EN + case DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG: +#endif + /* The following ioctl returns memory information needs to be used in configuration follows the ioctl. + * The semaphore blocks CLI task to wiat for the response from DPC before further execution. + */ + case DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG: + System_printf("DPM IOCTL report msg = %d\n", arg0 ); + Semaphore_post(gMmwMssMCB.DPMioctlSemHandle); + break; + default: + break; + } + break; + } + case DPM_Report_DPC_STARTED: + { + /***************************************************************** + * DPC has been started without an error: + * - notify sensor management task that DPC is started. + *****************************************************************/ + DebugP_log0("App: DPM Report DPC Started\n"); + gMmwMssMCB.stats.dpmStartEvents++; + /* every sensor start should cause 2 DPM start events due to distributed domain + Wait for both the events before proceeding with remaining steps */ + if (gMmwMssMCB.stats.dpmStartEvents % 2 == 0) + { + Semaphore_post(gMmwMssMCB.DPMstartSemHandle); + } + break; + } + case DPM_Report_NOTIFY_DPC_RESULT: + { + /***************************************************************** + * datapath has finished frame processing, results are reported + *****************************************************************/ + DPM_Buffer* ptrResult; + + /* Get the result: */ + ptrResult = (DPM_Buffer*)arg0; + + Pcount3DDemo_handleObjectDetResult(ptrResult); + break; + } + case DPM_Report_DPC_ASSERT: + { + DPM_DPCAssert* ptrAssert; + + /***************************************************************** + * DPC Fault has been detected: + * - This implies that the DPC has crashed. + * - The argument0 points to the DPC assertion information + *****************************************************************/ + ptrAssert = (DPM_DPCAssert*)arg0; + CLI_write("Obj Det DPC Exception: %s, line %d.\n", ptrAssert->fileName, + ptrAssert->lineNum); + break; + } + case DPM_Report_DPC_STOPPED: + { + /***************************************************************** + * DPC has been stopped without an error: + * - This implies that the DPC can either be reconfigured or + * restarted. + *****************************************************************/ + DebugP_log0("App: DPM Report DPC Stopped\n"); + gMmwMssMCB.stats.dpmStopEvents++; + /* every sensor stop should cause 2 DPM stop events due to distributed domain + Wait for both the events before proceeding with remaining steps */ + if (gMmwMssMCB.stats.dpmStopEvents % 2 == 0) + { + Semaphore_post(gMmwMssMCB.DPMstopSemHandle); + } + break; + } + case DPM_Report_DPC_INFO: + case DPM_Report_NOTIFY_DPC_RESULT_ACKED: + { + /* Currently objDetDsp does not use this feature. */ + break; + } + default: + { + DebugP_assert (0); + break; + } + } + return; +} + +/** + * @b Description + * @n + * Utility function to get next sub-frame index + * + * @param[in] currentIndx Current sub-frame index + * @param[in] numSubFrames Number of sub-frames + * + * @retval + * Index of next sub-frame. + */ +static uint8_t Pcount3DDemo_getNextSubFrameIndx(uint8_t currentIndx, uint8_t numSubFrames) +{ + uint8_t nextIndx; + + if (currentIndx == (numSubFrames - 1)) + { + nextIndx = 0; + } + else + { + nextIndx = currentIndx + 1; + } + return(nextIndx); +} + +/** + * @b Description + * @n + * Utility function to get previous sub-frame index + * + * @param[in] currentIndx Current sub-frame index + * @param[in] numSubFrames Number of sub-frames + * + * @retval + * Index of previous sub-frame + */ +/* +static uint8_t Pcount3DDemo_getPrevSubFrameIndx(uint8_t currentIndx, uint8_t numSubFrames) +{ + uint8_t prevIndx; + + if (currentIndx == 0) + { + prevIndx = numSubFrames - 1; + } + else + { + prevIndx = currentIndx - 1; + } + return(prevIndx); +} +*/ +/** + * @b Description + * @n + * Processes any pending dynamic configuration commands for the specified + * sub-frame by fanning out to the respective DPUs using IOCTL interface, and + * resets (clears) the pending state after processing. + * + * @param[in] subFrameIndx Sub-frame index of desired sub-frame to process + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_processPendingDynamicCfgCommands(uint8_t subFrameIndx) +{ + int32_t retVal =0; + + return(retVal); +} + + +/** + * @b Description + * @n + * Function to handle frame processing results from DPC + * + * @param[in] ptrResult Pointer to DPC result + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_handleObjectDetResult +( + DPM_Buffer *ptrResult +) +{ + int32_t retVal; + + int32_t pntIdx; + DPC_ObjectDetection_ExecuteResultExportedInfo exportInfo; + DPC_ObjectDetection_ExecuteResult *dpcResults; + volatile uint32_t startTime; + uint8_t nextSubFrameIdx; + uint8_t numSubFrames; + uint8_t currSubFrameIdx; + Pcount3DDemo_SubFrameStats *currSubFrameStats; + float * heatmapBuff; + radarProcessOutput * outputFromDSP; + + /***************************************************************** + * datapath has finished frame processing, results are reported + *****************************************************************/ + + /* Validate DPC results buffer */ + DebugP_assert (ptrResult->size[0] == sizeof(DPC_ObjectDetection_ExecuteResult)); + + /* Translate the address: */ + dpcResults = (DPC_ObjectDetection_ExecuteResult *)SOC_translateAddress((uint32_t)ptrResult->ptrBuffer[0], + SOC_TranslateAddr_Dir_FROM_OTHER_CPU, + &retVal); + DebugP_assert ((uint32_t)dpcResults != SOC_TRANSLATEADDR_INVALID); + + /* Translate the address: */ + gMmwMssMCB.frameStatsFromDSP = (DPC_ObjectDetection_Stats *)SOC_translateAddress((uint32_t)ptrResult->ptrBuffer[1], + SOC_TranslateAddr_Dir_FROM_OTHER_CPU, + &retVal); + DebugP_assert ((uint32_t)(gMmwMssMCB.frameStatsFromDSP) != SOC_TRANSLATEADDR_INVALID); + + outputFromDSP = &(dpcResults->objOut); + + heatmapBuff = outputFromDSP->heatMapOut.data; + heatmapBuff = (float *)SOC_translateAddress((uint32_t)heatmapBuff, + SOC_TranslateAddr_Dir_FROM_OTHER_CPU, + &retVal); + //DebugP_log2("Pcount3DDemo_handleObjectDetResult: heatmap = (float *)0x%x, size = %d \n", (uint32_t)heatmapBuff, outputFromDSP->heatMapOut.dataSize ); + + gMmwMssMCB.heatMapOutFromDSP.dataSize = outputFromDSP->heatMapOut.dataSize; + gMmwMssMCB.heatMapOutFromDSP.data = outputFromDSP->heatMapOut.data; + + //copy to the format for output, and to future tracker + gMmwMssMCB.pointCloudToUart.header.length = sizeof(Pcount3DDemo_output_message_tl) + sizeof(Pcount3DDemo_output_message_point_unit) + sizeof(Pcount3DDemo_output_message_UARTpoint) * outputFromDSP->pointCloudOut.object_count; + if ( outputFromDSP->pointCloudOut.object_count == 0) + gMmwMssMCB.pointCloudToUart.header.length = 0; + gMmwMssMCB.pointCloudToUart.header.type = MMWDEMO_OUTPUT_MSG_POINT_CLOUD; + gMmwMssMCB.pointCloudToUart.pointUint.azimuthUnit = 0.01f; + gMmwMssMCB.pointCloudToUart.pointUint.elevationUnit = 0.01f; + gMmwMssMCB.pointCloudToUart.pointUint.rangeUnit = 0.00025f; + gMmwMssMCB.pointCloudToUart.pointUint.dopplerUnit = 0.00028f; + gMmwMssMCB.pointCloudToUart.pointUint.snrUint = 0.04f; + gMmwMssMCB.numDetectedPoints = outputFromDSP->pointCloudOut.object_count; + for (pntIdx = 0; pntIdx < (int32_t)outputFromDSP->pointCloudOut.object_count; pntIdx++ ) + { + //output to host + gMmwMssMCB.pointCloudToUart.point[pntIdx].azimuth = (int8_t)round(outputFromDSP->pointCloudOut.pointCloud[pntIdx].azimuthAngle/ gMmwMssMCB.pointCloudToUart.pointUint.azimuthUnit); + gMmwMssMCB.pointCloudToUart.point[pntIdx].elevation = (int8_t)round((outputFromDSP->pointCloudOut.pointCloud[pntIdx].elevAngle)/ gMmwMssMCB.pointCloudToUart.pointUint.elevationUnit); + gMmwMssMCB.pointCloudToUart.point[pntIdx].range = (uint16_t)round(outputFromDSP->pointCloudOut.pointCloud[pntIdx].range / gMmwMssMCB.pointCloudToUart.pointUint.rangeUnit); + gMmwMssMCB.pointCloudToUart.point[pntIdx].doppler = (int16_t)round(outputFromDSP->pointCloudOut.pointCloud[pntIdx].velocity / gMmwMssMCB.pointCloudToUart.pointUint.dopplerUnit); + gMmwMssMCB.pointCloudToUart.point[pntIdx].snr = (uint16_t)round((float)outputFromDSP->pointCloudOut.snr[pntIdx].snr * 0.125f / gMmwMssMCB.pointCloudToUart.pointUint.snrUint); + + //future tracker input + gMmwMssMCB.pointCloudFromDSP[pntIdx].azimuthAngle = outputFromDSP->pointCloudOut.pointCloud[pntIdx].azimuthAngle;// - gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sensorAzimuthTilt; + gMmwMssMCB.pointCloudFromDSP[pntIdx].elevAngle = outputFromDSP->pointCloudOut.pointCloud[pntIdx].elevAngle; + gMmwMssMCB.pointCloudFromDSP[pntIdx].range = outputFromDSP->pointCloudOut.pointCloud[pntIdx].range; + gMmwMssMCB.pointCloudFromDSP[pntIdx].velocity = outputFromDSP->pointCloudOut.pointCloud[pntIdx].velocity; + gMmwMssMCB.pointCloudSideInfoFromDSP[pntIdx].snr = (float)outputFromDSP->pointCloudOut.snr[pntIdx].snr * 0.125f; + } + + numSubFrames = gMmwMssMCB.objDetCommonCfg.numSubFrames; + currSubFrameIdx = dpcResults->subFrameIdx; + currSubFrameStats = &gMmwMssMCB.subFrameStats[currSubFrameIdx]; + gMmwMssMCB.currSubFrameIdx = currSubFrameIdx; + + /***************************************************************** + * Transmit results + *****************************************************************/ + startTime = Cycleprofiler_getTimeStamp(); + + currSubFrameStats->outputStats.interChirpProcessingMargin = gMmwMssMCB.subFrameStats[currSubFrameIdx].outputStats.interChirpProcessingMargin; + currSubFrameStats->outputStats.interFrameProcessingTime = gMmwMssMCB.frameStatsFromDSP->interFrameExecTimeInUsec; + currSubFrameStats->outputStats.interFrameCPULoad = (uint32_t) (100.f * (float) gMmwMssMCB.frameStatsFromDSP->interFrameExecTimeInUsec / gMmwMssMCB.subFrameCfg[currSubFrameIdx].objDetDynCfg.dspDynCfg.caponChainCfg.framePeriod); + currSubFrameStats->outputStats.frameProcessingTimeInUsec = gMmwMssMCB.frameStatsFromDSP->activeFrameProcTimeInUsec; + currSubFrameStats->outputStats.activeFrameCPULoad = (uint32_t) (100.f * (float) gMmwMssMCB.frameStatsFromDSP->activeFrameProcTimeInUsec / + (gMmwMssMCB.subFrameCfg[currSubFrameIdx].objDetDynCfg.dspDynCfg.caponChainCfg.framePeriod - gMmwMssMCB.subFrameCfg[currSubFrameIdx].objDetDynCfg.dspDynCfg.caponChainCfg.chirpInterval + * (float)gMmwMssMCB.subFrameCfg[currSubFrameIdx].objDetDynCfg.dspDynCfg.caponChainCfg.numChirpPerFrame) ) ; + + /***************************************************************** + * Send notification to data path after results are handled -- + * all data are local now, release the memory to DSP + *****************************************************************/ + /* Indicate result consumed and end of frame/sub-frame processing */ + exportInfo.subFrameIdx = currSubFrameIdx; + retVal = DPM_ioctl (gMmwMssMCB.objDetDpmHandle, + DPC_OBJDET_IOCTL__DYNAMIC_EXECUTE_RESULT_EXPORTED, + &exportInfo, + sizeof (DPC_ObjectDetection_ExecuteResultExportedInfo)); + if (retVal < 0) { + System_printf ("Error: DPM DPC_OBJDET_IOCTL__DYNAMIC_EXECUTE_RESULT_EXPORTED failed [Error code %d]\n", + retVal); + Pcount3DDemo_debugAssert (0); + } + + /* Run the tracker DPU */ + #ifdef TRACKERPROC_EN + /* Run the tracker DPU*/ + + Semaphore_post(gMmwMssMCB.trackerDPUSemHandle); + #endif + + /* Transmit processing results for the frame */ + Semaphore_post(gMmwMssMCB.uartTxSemHandle); + + /* + Pcount3DDemo_transmitProcessedOutput(gMmwMssMCB.loggingUartHandle, + &(gMmwMssMCB.pointCloudToUart), + frameStatsDSS->frameStartIntCounter, + dpcResults->subFrameIdx, + &currSubFrameStats->outputStats);*/ + + /* Update current frame transmit time */ + currSubFrameStats->outputStats.transmitOutputTime = (Cycleprofiler_getTimeStamp() - startTime)/R4F_CLOCK_MHZ; /* In micro seconds */ + + + /***************************************************************** + * Handle dynamic pending configuration + * For non-advanced frame case: + * process all pending dynamic config commands. + * For advanced-frame case: + * Process next sub-frame related pending dynamic config commands. + * If the next sub-frame was the first sub-frame of the frame, + * then process common (sub-frame independent) pending dynamic config + * commands. + *****************************************************************/ + startTime = Cycleprofiler_getTimeStamp(); + + nextSubFrameIdx = Pcount3DDemo_getNextSubFrameIndx(currSubFrameIdx, numSubFrames); + retVal = Pcount3DDemo_processPendingDynamicCfgCommands(nextSubFrameIdx); + if (retVal != 0) + { + System_printf ("Error: Executing Pending Dynamic Configuration Commands [Error code %d]\n", + retVal); + Pcount3DDemo_debugAssert (0); + } + currSubFrameStats->pendingConfigProcTime = (Cycleprofiler_getTimeStamp() - startTime)/R4F_CLOCK_MHZ; + + /***************************************************************** + * Prepare for subFrame switch + *****************************************************************/ + if(numSubFrames > 1) + { + Pcount3DDemo_SubFrameCfg *nextSubFrameCfg; + uint16_t dummyRxChanOffset[SYS_COMMON_NUM_RX_CHANNEL]; + + startTime = Cycleprofiler_getTimeStamp(); + + nextSubFrameCfg = &gMmwMssMCB.subFrameCfg[nextSubFrameIdx]; + + /* Configure ADC for next sub-frame */ + retVal = MmwDemo_ADCBufConfig(gMmwMssMCB.adcBufHandle, + gMmwMssMCB.cfg.openCfg.chCfg.rxChannelEn, + nextSubFrameCfg->numChirpsPerChirpEvent, + nextSubFrameCfg->adcBufChanDataSize, + &nextSubFrameCfg->adcBufCfg, + &dummyRxChanOffset[0]); + if(retVal < 0) + { + System_printf("Error: ADCBuf config failed with error[%d]\n", retVal); + Pcount3DDemo_debugAssert (0); + } + + currSubFrameStats->subFramePreparationTime = (Cycleprofiler_getTimeStamp() - startTime)/R4F_CLOCK_MHZ; + } + else + { + currSubFrameStats->subFramePreparationTime = 0; + } + + +} + + +#ifdef TRACKERPROC_EN +void MmwDemo_trackerDPUTask(UArg arg0, UArg arg1) +{ + volatile uint32_t startTime; + int32_t retVal; + DPU_TrackerProc_OutParams outTrackerProc; + //DPC_TrackerResults trackerResults; + //int32_t errCode; + + while(1) + { + Semaphore_pend(gMmwMssMCB.trackerDPUSemHandle, BIOS_WAIT_FOREVER); + + startTime = Cycleprofiler_getTimeStamp(); + retVal = DPU_TrackerProc_process(gObjDetObj->dpuTrackerObj, gMmwMssMCB.numDetectedPoints, + gMmwMssMCB.pointCloudFromDSP, gMmwMssMCB.pointCloudSideInfoFromDSP, &outTrackerProc); + DebugP_assert(retVal == 0); + + gMmwMssMCB.trackerOutput.currentDescr = outTrackerProc.currentTargetDesc; + gMmwMssMCB.numTargets = outTrackerProc.numTargets[outTrackerProc.currentTargetDesc]; + gMmwMssMCB.trackerOutput.tList[gMmwMssMCB.trackerOutput.currentDescr] = ((trackerProcObjType*)gObjDetObj->dpuTrackerObj)->targetDescrHandle->tList[outTrackerProc.currentTargetDesc]; + gMmwMssMCB.numIndices = outTrackerProc.numIndices[outTrackerProc.currentTargetDesc]; + gMmwMssMCB.trackerOutput.tIndex[gMmwMssMCB.trackerOutput.currentDescr] = ((trackerProcObjType*)gObjDetObj->dpuTrackerObj)->targetDescrHandle->tIndex[outTrackerProc.currentTargetDesc]; + gMmwMssMCB.presenceInd = outTrackerProc.presenceInd[outTrackerProc.currentTargetDesc]; + gMmwMssMCB.trackerProcessingTimeInUsec = (float)(Cycleprofiler_getTimeStamp() - startTime)/(float)R4F_CLOCK_MHZ; + } +} +#endif + +/** + * @b Description + * @n + * DPM Execution Task which executes the DPM Instance which manages the + * HL Profiles executing on the MSS. + * + * @retval + * Not Applicable. + */ +static void mmwDemo_mssDPMTask(UArg arg0, UArg arg1) +{ + int32_t errCode; + DPM_Buffer result; + + while (1) + { + /* Execute the DPM module: */ + errCode = DPM_execute (gMmwMssMCB.objDetDpmHandle, &result); + if (errCode < 0) + { + System_printf ("Error: DPM execution failed [Error code %d]\n", errCode); + } + } +} + + +/************************************************************************** + ******************** Millimeter Wave Demo sensor management Functions ********** + **************************************************************************/ + +/** + * @b Description + * @n + * mmw demo helper Function to do one time sensor initialization. + * User need to fill gMmwMssMCB.cfg.openCfg before calling this function + * + * @param[in] isFirstTimeOpen If true then issues MMwave_open + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t Pcount3DDemo_openSensor(bool isFirstTimeOpen) +{ + int32_t errCode; + MMWave_ErrorLevel errorLevel; + int16_t mmWaveErrorCode; + int16_t subsysErrorCode; + int32_t retVal; + + /* Open mmWave module, this is only done once */ + if (isFirstTimeOpen == true) + { + /*Set LDO bypas configuration */ + System_printf ("Debug: Sending rlRfSetLdoBypassConfig with %d %d %d\n", + gRFLdoBypassCfg.ldoBypassEnable, + gRFLdoBypassCfg.supplyMonIrDrop, + gRFLdoBypassCfg.ioSupplyIndicator); + retVal = rlRfSetLdoBypassConfig(RL_DEVICE_MAP_INTERNAL_BSS, (rlRfLdoBypassCfg_t*)&gRFLdoBypassCfg); + if(retVal != 0) + { + System_printf("Error: rlRfSetLdoBypassConfig retVal=%d\n", retVal); + return -1; + } + + /* Open mmWave module, this is only done once */ + /* Setup the calibration frequency: */ + gMmwMssMCB.cfg.openCfg.freqLimitLow = 600U; + gMmwMssMCB.cfg.openCfg.freqLimitHigh = 640U; + + /* start/stop async events */ + gMmwMssMCB.cfg.openCfg.disableFrameStartAsyncEvent = false; + gMmwMssMCB.cfg.openCfg.disableFrameStopAsyncEvent = false; + + /* No custom calibration: */ + gMmwMssMCB.cfg.openCfg.useCustomCalibration = false; + gMmwMssMCB.cfg.openCfg.customCalibrationEnableMask = 0x0; + + /* calibration monitoring base time unit + * setting it to one frame duration as the demo doesnt support any + * monitoring related functionality + */ + gMmwMssMCB.cfg.openCfg.calibMonTimeUnit = 1; + + + /* Open the mmWave module: */ + if (MMWave_open (gMmwMssMCB.ctrlHandle, &gMmwMssMCB.cfg.openCfg, NULL, &errCode) < 0) + { + /* Error: decode and Report the error */ + MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode); + System_printf ("Error: mmWave Open failed [Error code: %d Subsystem: %d]\n", + mmWaveErrorCode, subsysErrorCode); + return -1; + } +#if 0 // seems to be LVDS related only + /*Set up HSI clock*/ + if(MmwDemo_mssSetHsiClk() < 0) + { + System_printf ("Error: MmwDemo_mssSetHsiClk failed.\n"); + return -1; + } +#endif + /* Open the datapath modules that runs on MSS */ + Pcount3DDemo_dataPathOpen(); + } + return 0; +} + +/** + * @b Description + * @n + * MMW demo helper Function to configure sensor. User need to fill gMmwMssMCB.cfg.ctrlCfg and + * add profiles/chirp to mmWave before calling this function + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t Pcount3DDemo_configSensor(void) +{ + int32_t errCode = 0; + + /* Configure the mmWave module: */ + if (MMWave_config (gMmwMssMCB.ctrlHandle, &gMmwMssMCB.cfg.ctrlCfg, &errCode) < 0) + { + MMWave_ErrorLevel errorLevel; + int16_t mmWaveErrorCode; + int16_t subsysErrorCode; + + /* Error: Report the error */ + MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode); + System_printf ("Error: mmWave Config failed [Error code: %d Subsystem: %d]\n", + mmWaveErrorCode, subsysErrorCode); + } + else + { + errCode = Pcount3DDemo_dataPathConfig(); + if (errCode < 0) + goto exit; +#ifdef TRACKERPROC_EN + errCode = MmwDemo_trackerConfig(); + if (errCode < 0) + goto exit; +#endif + } + +exit: + return errCode; +} + +/** + * @b Description + * @n + * mmw demo helper Function to start sensor. + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t Pcount3DDemo_startSensor(void) +{ + int32_t errCode; + MMWave_CalibrationCfg calibrationCfg; + + /***************************************************************************** + * Data path :: start data path first - this will pend for DPC to ack + *****************************************************************************/ + Pcount3DDemo_dataPathStart(); + + /***************************************************************************** + * RF :: now start the RF and the real time ticking + *****************************************************************************/ + /* Initialize the calibration configuration: */ + memset ((void *)&calibrationCfg, 0, sizeof(MMWave_CalibrationCfg)); + /* Populate the calibration configuration: */ + calibrationCfg.dfeDataOutputMode = gMmwMssMCB.cfg.ctrlCfg.dfeDataOutputMode; + calibrationCfg.u.chirpCalibrationCfg.enableCalibration = false;//true; + calibrationCfg.u.chirpCalibrationCfg.enablePeriodicity = false;//true; + calibrationCfg.u.chirpCalibrationCfg.periodicTimeInFrames = 10U; + + DebugP_log0("App: MMWave_start Issued\n"); + + System_printf("Starting Sensor (issuing MMWave_start)\n"); + + /* Start the mmWave module: The configuration has been applied successfully. */ + if (MMWave_start(gMmwMssMCB.ctrlHandle, &calibrationCfg, &errCode) < 0) + { + MMWave_ErrorLevel errorLevel; + int16_t mmWaveErrorCode; + int16_t subsysErrorCode; + + /* Error/Warning: Unable to stop the mmWave module */ + MMWave_decodeError (errCode, &errorLevel, &mmWaveErrorCode, &subsysErrorCode); + System_printf ("Error: mmWave Start failed [mmWave Error: %d Subsys: %d]\n", mmWaveErrorCode, subsysErrorCode); + return -1; + } + + /***************************************************************************** + * The sensor has been started successfully. Switch on the LED + *****************************************************************************/ + GPIO_write (gMmwMssMCB.cfg.platformCfg.SensorStatusGPIO, 1U); + + gMmwMssMCB.sensorStartCount++; + return 0; +} + +/** + * @b Description + * @n + * Epilog processing after sensor has stopped + * + * @retval None + */ +static void Pcount3DDemo_sensorStopEpilog(void) +{ + Task_Stat stat; + Hwi_StackInfo stackInfo; + Bool stackOverflow; + + /* Print task statistics, note data path has completely stopped due to + * end of frame, so we can do non-real time processing like prints on + * console */ + System_printf("Data Path Stopped (last frame processing done)\n"); + + System_printf("============================================\n"); + System_printf("MSS Task Stack Usage (Note: Task Stack Usage) ==========\n"); + System_printf("%20s %12s %12s %12s\n", "Task Name", "Size", "Used", "Free"); + + + Task_stat(gMmwMssMCB.taskHandles.initTask, &stat); + System_printf("%20s %12d %12d %12d\n", "Init", + stat.stackSize, stat.used, stat.stackSize - stat.used); + + Task_stat(gMmwMssMCB.taskHandles.mmwaveCtrl, &stat); + System_printf("%20s %12d %12d %12d\n", "Mmwave Control", + stat.stackSize, stat.used, stat.stackSize - stat.used); + + Task_stat(gMmwMssMCB.taskHandles.objDetDpmTask, &stat); + System_printf("%20s %12d %12d %12d\n", "ObjDet DPM", + stat.stackSize, stat.used, stat.stackSize - stat.used); + + System_printf("HWI Stack (same as System Stack) Usage ============\n"); + stackOverflow = Hwi_getStackInfo(&stackInfo, TRUE); + if (stackOverflow == TRUE) + { + System_printf("HWI Stack overflowed\n"); + Pcount3DDemo_debugAssert(0); + } + else + { + System_printf("%20s %12s %12s %12s\n", " ", "Size", "Used", "Free"); + System_printf("%20s %12d %12d %12d\n", " ", + stackInfo.hwiStackSize, stackInfo.hwiStackPeak, + stackInfo.hwiStackSize - stackInfo.hwiStackPeak); + } +} + + +/** + * @b Description + * @n + * Stops the RF and datapath for the sensor. Blocks until both operation are completed. + * Prints epilog at the end. + * + * @retval None + */ +void Pcount3DDemo_stopSensor(void) +{ + /* Stop sensor RF , data path will be stopped after RF stop is completed */ + Pcount3DDemo_mmWaveCtrlStop(); + + /* Wait until DPM_stop is completed */ + Semaphore_pend(gMmwMssMCB.DPMstopSemHandle, BIOS_WAIT_FOREVER); + + + + /* Print epilog */ + Pcount3DDemo_sensorStopEpilog(); + + /* The sensor has been stopped successfully. Switch off the LED */ + GPIO_write (gMmwMssMCB.cfg.platformCfg.SensorStatusGPIO, 0U); + + gMmwMssMCB.sensorStopCount++; + + /* print for user */ + System_printf("Sensor has been stopped: startCount: %d stopCount %d\n", + gMmwMssMCB.sensorStartCount,gMmwMssMCB.sensorStopCount); +} + +/** + * @b Description + * @n + * Call back function that was registered during config time and is going + * to be called in DPC processing at the beginning of frame/sub-frame processing, + * we use this to issue BIOS calls for computing CPU load during inter-frame + * + * @param[in] subFrameIndx Sub-frame index of the sub-frame during which processing + * this function was called. + * + * @retval None + */ +static void Pcount3DDemo_DPC_ObjectDetection_processFrameBeginCallBackFxn(uint8_t subFrameIndx) +{ + Load_update(); + gMmwMssMCB.subFrameStats[subFrameIndx].outputStats.interFrameCPULoad = Load_getCPULoad(); +} + +/** + * @b Description + * @n + * Call back function that was registered during config time and is going + * to be called in DPC processing at the beginning of inter-frame/inter-sub-frame processing, + * we use this to issue BIOS calls for computing CPU load during active frame (chirping) + * + * @param[in] subFrameIndx Sub-frame index of the sub-frame during which processing + * this function was called. + * + * @retval None + */ +static void Pcount3DDemo_DPC_ObjectDetection_processInterFrameCallBackFxn(uint8_t subFrameIndx) +{ + Load_update(); + gMmwMssMCB.subFrameStats[subFrameIndx].outputStats.activeFrameCPULoad = Load_getCPULoad(); +} + +/************************************************************************** + ******************** Millimeter Wave Demo init Functions ************************ + **************************************************************************/ + +/** + * @b Description + * @n + * Platform specific hardware initialization. + * + * @param[in] config Platform initialization configuraiton + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_platformInit(Pcount3DDemo_platformCfg *config) +{ + + /* Setup the PINMUX to bring out the UART-1 */ + Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN5_PADBE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); + Pinmux_Set_FuncSel(SOC_XWR68XX_PINN5_PADBE, SOC_XWR68XX_PINN5_PADBE_MSS_UARTA_TX); + Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN4_PADBD, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); + Pinmux_Set_FuncSel(SOC_XWR68XX_PINN4_PADBD, SOC_XWR68XX_PINN4_PADBD_MSS_UARTA_RX); + + /* Setup the PINMUX to bring out the UART-3 */ + Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); + Pinmux_Set_FuncSel(SOC_XWR68XX_PINF14_PADAJ, SOC_XWR68XX_PINF14_PADAJ_MSS_UARTB_TX); + + /********************************************************************** + * Setup the PINMUX: + * - GPIO Output: Configure pin K13 as GPIO_2 output + **********************************************************************/ + Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINK13_PADAZ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); + Pinmux_Set_FuncSel(SOC_XWR68XX_PINK13_PADAZ, SOC_XWR68XX_PINK13_PADAZ_GPIO_2); + + /********************************************************************** + * Setup the GPIO: + * - GPIO Output: Configure pin K13 as GPIO_2 output + **********************************************************************/ + config->SensorStatusGPIO = SOC_XWR68XX_GPIO_2; + + /* Initialize the DEMO configuration: */ + config->sysClockFrequency = MSS_SYS_VCLK; + config->loggingBaudRate = 921600; + config->commandBaudRate = 115200; + + /********************************************************************** + * Setup the DS3 LED on the EVM connected to GPIO_2 + **********************************************************************/ + GPIO_setConfig (config->SensorStatusGPIO, GPIO_CFG_OUTPUT); +} + +/** + * @b Description + * @n + * System Initialization Task which initializes the various + * components in the system. + * + * @retval + * Not Applicable. + */ +static void Pcount3DDemo_initTask(UArg arg0, UArg arg1) +{ + int32_t errCode; + MMWave_InitCfg initCfg; + UART_Params uartParams; + Task_Params taskParams; + Semaphore_Params semParams; + DPM_InitCfg dpmInitCfg; + DMA_Params dmaParams; + DMA_Handle dmaHandle; + + DPC_ObjectDetectionRangeHWA_InitParams objDetInitParams; +// int32_t i; + + /* Debug Message: */ + System_printf("Debug: Launched the Initialization Task\n"); + + /***************************************************************************** + * Initialize the mmWave SDK components: + *****************************************************************************/ + /* Initialize the UART */ + UART_init(); + + /* Initialize the DMA for UART */ + DMA_init (); + + /* Open the DMA Instance */ + DMA_Params_init(&dmaParams); + dmaHandle = DMA_open(0, &dmaParams, &errCode); + if (dmaHandle == NULL) + { + printf ("Error: Unable to open the DMA Instance [Error code %d]\n", errCode); + return; + } + + /* Initialize the GPIO */ + GPIO_init(); + + /* Initialize the Mailbox */ + Mailbox_init(MAILBOX_TYPE_MSS); + + /* Platform specific configuration */ + Pcount3DDemo_platformInit(&gMmwMssMCB.cfg.platformCfg); + + /***************************************************************************** + * Open the mmWave SDK components: + *****************************************************************************/ + /* Setup the default UART Parameters */ + UART_Params_init(&uartParams); + uartParams.clockFrequency = gMmwMssMCB.cfg.platformCfg.sysClockFrequency; + uartParams.baudRate = gMmwMssMCB.cfg.platformCfg.commandBaudRate; + uartParams.isPinMuxDone = 1; + + /* Open the UART Instance */ + gMmwMssMCB.commandUartHandle = UART_open(0, &uartParams); + if (gMmwMssMCB.commandUartHandle == NULL) + { + Pcount3DDemo_debugAssert (0); + return; + } + + /* Setup the default UART Parameters */ + UART_Params_init(&uartParams); + uartParams.writeDataMode = UART_DATA_BINARY; + uartParams.readDataMode = UART_DATA_BINARY; + uartParams.clockFrequency = gMmwMssMCB.cfg.platformCfg.sysClockFrequency; + uartParams.baudRate = gMmwMssMCB.cfg.platformCfg.loggingBaudRate; + uartParams.isPinMuxDone = 1U; + + uartParams.dmaHandle = dmaHandle; + uartParams.txDMAChannel = UART_DMA_TX_CHANNEL; + uartParams.rxDMAChannel = UART_DMA_RX_CHANNEL; + + /* Open the Logging UART Instance: */ + gMmwMssMCB.loggingUartHandle = UART_open(1, &uartParams); + if (gMmwMssMCB.loggingUartHandle == NULL) + { + System_printf("Error: Unable to open the Logging UART Instance\n"); + Pcount3DDemo_debugAssert (0); + return; + } + + /* Create binary semaphores which is used to signal DPM_start/DPM_stop/DPM_ioctl is done + * to the sensor management task. The signalling (Semaphore_post) will be done + * from DPM registered report function (which will execute in the DPM execute task context). */ + Semaphore_Params_init(&semParams); + semParams.mode = Semaphore_Mode_BINARY; + gMmwMssMCB.DPMstartSemHandle = Semaphore_create(0, &semParams, NULL); + gMmwMssMCB.DPMstopSemHandle = Semaphore_create(0, &semParams, NULL); + gMmwMssMCB.DPMioctlSemHandle = Semaphore_create(0, &semParams, NULL); + + /* Open EDMA driver */ + Pcount3DDemo_edmaInit(&gMmwMssMCB.dataPathObj, DPC_OBJDET_R4F_EDMA_INSTANCE); + + /* Use EDMA instance 0 on MSS */ + Pcount3DDemo_edmaOpen(&gMmwMssMCB.dataPathObj, DPC_OBJDET_R4F_EDMA_INSTANCE); + + Pcount3DDemo_hwaInit(&gMmwMssMCB.dataPathObj); + Pcount3DDemo_hwaOpen(&gMmwMssMCB.dataPathObj, gMmwMssMCB.socHandle); + + /***************************************************************************** + * mmWave: Initialization of the high level module + *****************************************************************************/ + + /* Initialize the mmWave control init configuration */ + memset ((void*)&initCfg, 0 , sizeof(MMWave_InitCfg)); + + /* Populate the init configuration: */ + initCfg.domain = MMWave_Domain_MSS; + initCfg.socHandle = gMmwMssMCB.socHandle; + initCfg.eventFxn = Pcount3DDemo_eventCallbackFxn; + initCfg.linkCRCCfg.useCRCDriver = 1U; + initCfg.linkCRCCfg.crcChannel = CRC_Channel_CH1; + initCfg.cfgMode = MMWave_ConfigurationMode_FULL; + initCfg.executionMode = MMWave_ExecutionMode_ISOLATION; + + /* Initialize and setup the mmWave Control module */ + gMmwMssMCB.ctrlHandle = MMWave_init (&initCfg, &errCode); + if (gMmwMssMCB.ctrlHandle == NULL) + { + /* Error: Unable to initialize the mmWave control module */ + System_printf ("Error: mmWave Control Initialization failed [Error code %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + return; + } + System_printf ("Debug: mmWave Control Initialization was successful\n"); + + /* Synchronization: This will synchronize the execution of the control module + * between the domains. This is a prerequiste and always needs to be invoked. */ + if (MMWave_sync (gMmwMssMCB.ctrlHandle, &errCode) < 0) + { + /* Error: Unable to synchronize the mmWave control module */ + System_printf ("Error: mmWave Control Synchronization failed [Error code %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + return; + } + System_printf ("Debug: mmWave Control Synchronization was successful\n"); + + /***************************************************************************** + * Launch the mmWave control execution task + * - This should have a higher priroity than any other task which uses the + * mmWave control API + *****************************************************************************/ + Task_Params_init(&taskParams); + taskParams.priority = MMWDEMO_MMWAVE_CTRL_TASK_PRIORITY; + taskParams.stackSize = 2800; + gMmwMssMCB.taskHandles.mmwaveCtrl = Task_create(Pcount3DDemo_mmWaveCtrlTask, &taskParams, NULL); + + + /***************************************************************************** + * Create a task to do DMA based UART data transfer + *****************************************************************************/ + /* Create a binary semaphore for application task to pend */ + Semaphore_Params_init(&semParams); + semParams.mode = Semaphore_Mode_BINARY; + gMmwMssMCB.uartTxSemHandle = Semaphore_create(0, &semParams, NULL); + + Task_Params_init(&taskParams); + taskParams.priority = MMWDEMO_UARTTX_TASK_PRIORITY; + taskParams.stackSize = 800; + Task_create(MmwDemo_uartTxTask, &taskParams, NULL); + + /***************************************************************************** + * Initialization of the DPM Module: + *****************************************************************************/ + memset ((void *)&objDetInitParams, 0, sizeof(DPC_ObjectDetectionRangeHWA_InitParams)); + + /* Note this must be after Pcount3DDemo_dataPathOpen() above which opens the hwa */ + objDetInitParams.L3ramCfg.addr = (void *)&gMmwL3[0]; + objDetInitParams.L3ramCfg.size = sizeof(gMmwL3); + objDetInitParams.CoreLocalRamCfg.addr = &gDPCTCM[0]; + objDetInitParams.CoreLocalRamCfg.size = sizeof(gDPCTCM); + objDetInitParams.edmaHandle = gMmwMssMCB.dataPathObj.edmaHandle; + objDetInitParams.hwaHandle = gMmwMssMCB.dataPathObj.hwaHandle; + + /* DPC Call-back config */ + objDetInitParams.processCallBackFxn.processInterFrameBeginCallBackFxn = + Pcount3DDemo_DPC_ObjectDetection_processInterFrameCallBackFxn; + + objDetInitParams.processCallBackFxn.processFrameBeginCallBackFxn = + Pcount3DDemo_DPC_ObjectDetection_processFrameBeginCallBackFxn; + + /* Setup the configuration: */ + memset ((void *)&dpmInitCfg, 0, sizeof(DPM_InitCfg)); + dpmInitCfg.socHandle = gMmwMssMCB.socHandle; + dpmInitCfg.ptrProcChainCfg = &gDPC_ObjDetRangeHWACfg;; + dpmInitCfg.instanceId = DPC_OBJDET_R4F_INSTANCEID; + dpmInitCfg.domain = DPM_Domain_DISTRIBUTED; + dpmInitCfg.reportFxn = Pcount3DDemo_DPC_ObjectDetection_reportFxn; + dpmInitCfg.arg = &objDetInitParams; + dpmInitCfg.argSize = sizeof(DPC_ObjectDetectionRangeHWA_InitParams); + + /* Initialize the DPM Module: */ + gMmwMssMCB.objDetDpmHandle = DPM_init (&dpmInitCfg, &errCode); + if (gMmwMssMCB.objDetDpmHandle == NULL) + { + System_printf ("Error: Unable to initialize the DPM Module [Error: %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + return; + } + + /* Synchronization: This will synchronize the execution of the datapath module + * between the domains. This is a prerequiste and always needs to be invoked. */ + while (1) + { + int32_t syncStatus; + + /* Get the synchronization status: */ + syncStatus = DPM_synch (gMmwMssMCB.objDetDpmHandle, &errCode); + if (syncStatus < 0) + { + /* Error: Unable to synchronize the framework */ + System_printf ("Error: DPM Synchronization failed [Error code %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + return; + } + if (syncStatus == 1) + { + /* Synchronization acheived: */ + break; + } + /* Sleep and poll again: */ + Task_sleep(1); + } + +#ifdef TRACKERPROC_EN + /***************************************************************************** + * Create a task to run tracker DPU at lower priority than HWA DPC + *****************************************************************************/ + /* Create a binary semaphore for application task to pend */ + Semaphore_Params_init(&semParams); + semParams.mode = Semaphore_Mode_BINARY; + gMmwMssMCB.trackerDPUSemHandle = Semaphore_create(0, &semParams, NULL); + + Task_Params_init(&taskParams); + taskParams.priority = MMWDEMO_TRACKERDPU_TASK_PRIORITY; + taskParams.stackSize = 7*1024; + Task_create(MmwDemo_trackerDPUTask, &taskParams, NULL); +#endif + + /* Launch the DPM Task */ + Task_Params_init(&taskParams); + taskParams.priority = MMWDEMO_DPC_OBJDET_DPM_TASK_PRIORITY; + taskParams.stackSize = 7*1024; + gMmwMssMCB.taskHandles.objDetDpmTask = Task_create(mmwDemo_mssDPMTask, &taskParams, NULL); + + /***************************************************************************** + * Initialize the Profiler + *****************************************************************************/ + Cycleprofiler_init(); + + /***************************************************************************** + * Initialize the CLI Module: + *****************************************************************************/ + Pcount3DDemo_CLIInit(MMWDEMO_CLI_TASK_PRIORITY); + + return; +} + +/** + * @b Description + * @n + * Function to sleep the R4F using WFI (Wait For Interrupt) instruction. + * When R4F has no work left to do, + * the BIOS will be in Idle thread and will call this function. The R4F will + * wake-up on any interrupt (e.g chirp interrupt). + * + * @retval + * Not Applicable. + */ +void Pcount3DDemo_sleep(void) +{ + /* issue WFI (Wait For Interrupt) instruction */ + asm(" WFI "); +} + +/** + * @b Description + * @n + * Entry point into the Millimeter Wave Demo + * + * @retval + * Not Applicable. + */ +int main (void) +{ + Task_Params taskParams; + int32_t errCode; + SOC_Handle socHandle; + SOC_Cfg socCfg; + + /* Initialize the ESM: Dont clear errors as TI RTOS does it */ + ESM_init(0U); + + /* Initialize the SOC confiugration: */ + memset ((void *)&socCfg, 0, sizeof(SOC_Cfg)); + + /* Populate the SOC configuration: */ + socCfg.clockCfg = SOC_SysClock_INIT; + socCfg.mpuCfg = SOC_MPUCfg_CONFIG; + socCfg.dssCfg = SOC_DSSCfg_UNHALT; + + /* Initialize the SOC Module: This is done as soon as the application is started + * to ensure that the MPU is correctly configured. */ + socHandle = SOC_init (&socCfg, &errCode); + if (socHandle == NULL) + { + System_printf ("Error: SOC Module Initialization failed [Error code %d]\n", errCode); + Pcount3DDemo_debugAssert (0); + return -1; + } + + /* Initialize and populate the demo MCB */ + memset ((void*)&gMmwMssMCB, 0, sizeof(Pcount3DDemo_MSS_MCB)); + + gMmwMssMCB.socHandle = socHandle; + + /* Debug Message: */ + System_printf ("**********************************************\n"); + System_printf ("Debug: Launching the MMW Demo on MSS\n"); + System_printf ("**********************************************\n"); + + /* Initialize the Task Parameters. */ + Task_Params_init(&taskParams); + gMmwMssMCB.taskHandles.initTask = Task_create(Pcount3DDemo_initTask, &taskParams, NULL); + + /* Start BIOS */ + BIOS_start(); + return 0; +} + diff --git a/mss/pcount3D_cli.c b/mss/pcount3D_cli.c new file mode 100644 index 0000000..13c5efa --- /dev/null +++ b/mss/pcount3D_cli.c @@ -0,0 +1,1195 @@ +/* + * @file mmw_cli.c + * + * @brief + * Mmw (Milli-meter wave) DEMO CLI Implementation + * + * \par + * NOTE: + * (C) Copyright 2018 Texas Instruments, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/************************************************************************** + *************************** Include Files ******************************** + **************************************************************************/ + +/* Standard Include Files. */ +#include +#include +#include +#include +#include + +/* BIOS/XDC Include Files. */ +#include + +/* mmWave SDK Include Files: */ +#include +#include +#include +#include +#include +#include + +/* Demo Include Files */ +#include +#include + +#include +#include +#include + +#define DEBUG(_x) //_x + +/************************************************************************** + *************************** Local function prototype**************************** + **************************************************************************/ + +/* CLI Extended Command Functions */ +static int32_t Pcount3DDemo_CLIDynRACfarCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIStaticRACfarCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIDynRngAngleCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIStaticRngAngleCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIDynAngleEstCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIDopplerCFARCfg (int32_t argc, char* argv[]); + +static int32_t Pcount3DDemo_CLIBoardAntGeometry0 (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIBoardAntGeometry1 (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIBoardAntPhaseRot (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIAntAngleFoV (int32_t argc, char* argv[]); + +static int32_t Pcount3DDemo_CLISensorStart (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLISensorStop (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLIADCBufCfg (int32_t argc, char* argv[]); +static int32_t Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg (int32_t argc, char* argv[]); + +/************************************************************************** + *************************** Extern Definitions ******************************* + **************************************************************************/ + +extern Pcount3DDemo_MSS_MCB gMmwMssMCB; + +/************************************************************************** + *************************** Local Definitions **************************** + **************************************************************************/ + + +/************************************************************************** + *************************** CLI Function Definitions ************************** + **************************************************************************/ +/** + * @b Description + * @n + * This is the CLI Handler for the sensor start command + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLISensorStart (int32_t argc, char* argv[]) +{ + bool doReconfig = true; + int32_t retVal = 0; + + /* Only following command syntax will be supported + sensorStart + sensorStart 0 + */ + if (argc == 2) + { + doReconfig = (bool) atoi (argv[1]); + + if (doReconfig == true) + { + CLI_write ("Error: Reconfig is not supported, only argument of 0 is\n" + "(do not reconfig, just re-start the sensor) valid\n"); + return -1; + } + } + else + { + /* In case there is no argument for sensorStart, always do reconfig */ + doReconfig = true; + } + + /*********************************************************************************** + * Do sensor state management to influence the sensor actions + ***********************************************************************************/ + + /* Error checking initial state */ + if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT) + { + MMWave_CtrlCfg ctrlCfg; + + /* need to get number of sub-frames so that next function to check + * pending state can work */ + CLI_getMMWaveExtensionConfig (&ctrlCfg); + gMmwMssMCB.objDetCommonCfg.numSubFrames = + MmwDemo_RFParser_getNumSubFrames(&ctrlCfg); + + if (Pcount3DDemo_isAllCfgInPendingState() == 0) + { + CLI_write ("Error: Full configuration must be provided before sensor can be started " + "the first time\n"); + + /* Although not strictly needed, bring back to the initial value since we + * are rejecting this first time configuration, prevents misleading debug. */ + gMmwMssMCB.objDetCommonCfg.numSubFrames = 0; + + return -1; + } + } + + if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STARTED) + { + CLI_write ("Ignored: Sensor is already started\n"); + return 0; + } + + if (doReconfig == false) + { + /* User intends to issue sensor start without config, check if no + config was issued after stop and generate error if this is the case. */ + if (Pcount3DDemo_isAllCfgInNonPendingState() == 0) + { + /* Message user differently if all config was issued or partial config was + issued. */ + if (Pcount3DDemo_isAllCfgInPendingState()) + { + CLI_write ("Error: You have provided complete new configuration, " + "issue \"sensorStart\" (without argument) if you want it to " + "take effect\n"); + } + else + { + CLI_write ("Error: You have provided partial configuration between stop and this " + "command and partial configuration cannot be undone." + "Issue the full configuration and do \"sensorStart\" \n"); + } + return -1; + } + } + else + { + /* User intends to issue sensor start with full config, check if all config + was issued after stop and generate error if is the case. */ + if (Pcount3DDemo_isAllCfgInPendingState() == 0) + { + /* Message user differently if no config was issued or partial config was + issued. */ + if (Pcount3DDemo_isAllCfgInNonPendingState()) + { + CLI_write ("Error: You have provided no configuration, " + "issue \"sensorStart 0\" OR provide " + "full configuration and issue \"sensorStart\"\n"); + } + else + { + CLI_write ("Error: You have provided partial configuration between stop and this " + "command and partial configuration cannot be undone." + "Issue the full configuration and do \"sensorStart\" \n"); + } + return -1; + } + } + + /*********************************************************************************** + * Retreive and check mmwave Open related config before calling openSensor + ***********************************************************************************/ + + /* Fill demo's MCB mmWave openCfg structure from the CLI configs*/ + if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT) + { + /* Get the open configuration: */ + CLI_getMMWaveExtensionOpenConfig (&gMmwMssMCB.cfg.openCfg); + } + else + { + /* openCfg related configurations like chCfg, lowPowerMode, adcCfg + * are only used on the first sensor start. If they are different + * on a subsequent sensor start, then generate a fatal error + * so the user does not think that the new (changed) configuration + * takes effect, the board needs to be reboot for the new + * configuration to be applied. + */ + MMWave_OpenCfg openCfg; + CLI_getMMWaveExtensionOpenConfig (&openCfg); + /* Compare openCfg->chCfg*/ + if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.chCfg, (void *)&openCfg.chCfg, + sizeof(rlChanCfg_t)) != 0) + { + Pcount3DDemo_debugAssert(0); + } + + /* Compare openCfg->lowPowerMode*/ + if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.lowPowerMode, (void *)&openCfg.lowPowerMode, + sizeof(rlLowPowerModeCfg_t)) != 0) + { + Pcount3DDemo_debugAssert(0); + } + /* Compare openCfg->adcOutCfg*/ + if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.adcOutCfg, (void *)&openCfg.adcOutCfg, + sizeof(rlAdcOutCfg_t)) != 0) + { + Pcount3DDemo_debugAssert(0); + } + } + + retVal = Pcount3DDemo_openSensor(gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT); + if(retVal != 0) + { + return -1; + } + + /*********************************************************************************** + * Retrieve mmwave Control related config before calling startSensor + ***********************************************************************************/ + /* Get the mmWave ctrlCfg from the CLI mmWave Extension */ + if(doReconfig) + { + CLI_getMMWaveExtensionConfig (&gMmwMssMCB.cfg.ctrlCfg); + retVal = Pcount3DDemo_configSensor(); + if(retVal != 0) + { + return -1; + } + } + retVal = Pcount3DDemo_startSensor(); + if(retVal != 0) + { + return -1; + } + + /*********************************************************************************** + * Set the state + ***********************************************************************************/ + gMmwMssMCB.sensorState = Pcount3DDemo_SensorState_STARTED; + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for the sensor stop command + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLISensorStop (int32_t argc, char* argv[]) +{ + if ((gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STOPPED) || + (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT)) + { + CLI_write ("Ignored: Sensor is already stopped\n"); + return 0; + } + + Pcount3DDemo_stopSensor(); + + Pcount3DDemo_resetStaticCfgPendingState(); + + gMmwMssMCB.sensorState = Pcount3DDemo_SensorState_STOPPED; + return 0; +} + +/** + * @b Description + * @n + * Utility function to get sub-frame number + * + * @param[in] argc Number of arguments + * @param[in] argv Arguments + * @param[in] expectedArgc Expected number of arguments + * @param[out] subFrameNum Sub-frame Number (0 based) + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIGetSubframe (int32_t argc, char* argv[], int32_t expectedArgc, + int8_t* subFrameNum) +{ + int8_t subframe; + + /* Sanity Check: Minimum argument check */ + if (argc != expectedArgc) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /*Subframe info is always in position 1*/ + subframe = (int8_t) atoi(argv[1]); + + if(subframe >= (int8_t)RL_MAX_SUBFRAMES) + { + CLI_write ("Error: Subframe number is invalid\n"); + return -1; + } + + *subFrameNum = (int8_t)subframe; + + return 0; +} + + + +/** + * @b Description + * @n + * This is the CLI Handler for dynamic scene RA CFAR configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIDynRACfarCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 15, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynRACfarCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));) + return -1; + } + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.K0 = (float) atof (argv[10]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicSideLobeThr = (float) atof (argv[12]); + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.K0 = (float) atof (argv[10]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicSideLobeThr = (float) atof (argv[12]); + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for static scene RA CFAR configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIStaticRACfarCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 15, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIStaticRACfarCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));) + return -1; + } + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.K0 = (float) atof (argv[10]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticSideLobeThr = (float) atof (argv[12]); + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.K0 = (float) atof (argv[10]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticSideLobeThr = (float) atof (argv[12]); + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for dynamic scene range-angle config + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIDynRngAngleCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 6, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynRngAngleCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));) + return -1; + } + + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.searchStep = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.mvdr_alpha = (float) atof (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod = (uint8_t) atoi (argv[5]); + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.searchStep = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.mvdr_alpha = (float) atof (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod = (uint8_t) atoi (argv[5]); + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for dynamic scene 2D angle estimation config + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIDynAngleEstCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + subFrameNum = (int8_t) atoi(argv[1]); + + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg all detectionMethod = %d\n", gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod);) + if (gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod <= 1) + { + if (argc != 10) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));) + return -1; + } + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevSearchStep = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.mvdr_alpha = (float) atof (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.maxNpeak2Search = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples = (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevOnly = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.sideLobThr = (float) atof (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpRelThr = (float) atof (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSNRThr = (float) atof (argv[9]); + } + } + else + { + if (argc != 8) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));) + return -1; + } + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominFactor = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominNn8bors = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpRelThr = (float) atof (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSNRThr = (float) atof (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.localMaxCheckFlag = (uint8_t) atoi(argv[7]); + } + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + if (gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod <= 1) + { + if (argc != 10) + { + return -1; + } + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevSearchStep = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.mvdr_alpha = (float) atof (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.maxNpeak2Search = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples = (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevOnly = (uint8_t) atoi (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.sideLobThr = (float) atof (argv[7]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpRelThr = (float) atof (argv[8]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSNRThr = (float) atof (argv[9]); + } + else + { + if (argc != 8) + { + return -1; + } + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominFactor = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominNn8bors = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpRelThr = (float) atof (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSNRThr = (float) atof (argv[6]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.localMaxCheckFlag = (uint8_t) atoi(argv[7]); + + } + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for Doppler Estimation configuration if the Doppler estimation method is CFAR + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIDopplerCFARCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 7, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIDopplerCFARCfg argc = %d, argv2\n", argc, (uint8_t) atoi (argv[2]));) + return -1; + } + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + if (gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod == 1) + { + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardLeft = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardRight = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.guardWinSize = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.refWinSize = (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.thre = (float) atof (argv[6]); + } + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + if (gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod == 1) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardLeft = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardRight = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.guardWinSize = (uint8_t) atoi (argv[4]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.refWinSize = (uint8_t) atoi (argv[5]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.thre = (float) atof (argv[6]); + } + } + return 0; +} + + +/** + * @b Description + * @n + * This is the CLI Handler for static scene range-angle config + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIStaticRngAngleCfg (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 5, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIStaticRngAngleCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));) + return -1; + } + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticProcEnabled = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticAzimStepDeciFactor = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticElevStepDeciFactor = (uint8_t) atoi (argv[4]); + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticProcEnabled = (uint8_t) atoi (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticAzimStepDeciFactor = (uint8_t) atoi (argv[3]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticElevStepDeciFactor = (uint8_t) atoi (argv[4]); + } + return 0; +} + + + +/** + * @b Description + * @n + * This is the CLI Handler for ADC buffer command + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIADCBufCfg (int32_t argc, char* argv[]) +{ + MmwDemo_ADCBufCfg adcBufCfg; + int8_t subFrameNum; + + if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STARTED) + { + CLI_write ("Ignored: This command is not allowed after sensor has started\n"); + return 0; + } + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 6, &subFrameNum) < 0) + { + return -1; + } + + /* Initialize the ADC Output configuration: */ + memset ((void *)&adcBufCfg, 0, sizeof(adcBufCfg)); + + /* Populate configuration: */ + adcBufCfg.adcFmt = (uint8_t) atoi (argv[2]); + adcBufCfg.iqSwapSel = (uint8_t) atoi (argv[3]); + adcBufCfg.chInterleave = (uint8_t) atoi (argv[4]); + adcBufCfg.chirpThreshold = (uint8_t) atoi (argv[5]); + + /* This demo is using HWA for 1D processing which does not allow multi-chirp + * processing */ + if (adcBufCfg.chirpThreshold != 1) + { + CLI_write("Error: chirpThreshold must be 1, multi-chirp is not allowed\n"); + return -1; + } + /* Save Configuration to use later */ + Pcount3DDemo_CfgUpdate((void *)&adcBufCfg, + PCOUNT3DDEMO_ADCBUFCFG_OFFSET, + sizeof(MmwDemo_ADCBufCfg), subFrameNum); + return 0; +} + + +/** + * @b Description + * @n + * This is the CLI Handler for compensation of range bias and channel phase offsets + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg (int32_t argc, char* argv[]) +{ + int32_t argInd; + int32_t i; + uint8_t indx; + + /* Sanity Check: Minimum argument check */ + if (argc != (1+1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL*2)) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + DEBUG(System_printf ("Error: Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg argc = %d, argv2=%f\n", argc, (float)atof (argv[2]));) + return -1; + } + + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + argInd = 2; + for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseCompVect[i].real = (float)atof (argv[argInd++]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseCompVect[i].imag = (float)atof (argv[argInd++]); + } + } + + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for board antenna geometry matrix row 0 + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIBoardAntGeometry0 (int32_t argc, char* argv[]) +{ + int32_t argInd; + int32_t i; + uint8_t indx; + + /* Sanity Check: Minimum argument check */ + if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL)) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntGeometry0 argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));) + return -1; + } + + + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + argInd = 1; + for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.m_ind[i] = (int8_t)atoi (argv[argInd++]); + } + } + + return 0; +} + + +/** + * @b Description + * @n + * This is the CLI Handler for board antenna geometry matrix row 1 + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIBoardAntGeometry1 (int32_t argc, char* argv[]) +{ + int32_t argInd; + int32_t i; + uint8_t indx; + + /* Sanity Check: Minimum argument check */ + if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL)) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntGeometry1 argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));) + return -1; + } + + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + argInd = 1; + for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.n_ind[i] = (int8_t)atoi (argv[argInd++]); + } + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for board antenna phase rotation + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIBoardAntPhaseRot (int32_t argc, char* argv[]) +{ + int32_t argInd; + int32_t i; + uint8_t indx; + + /* Sanity Check: Minimum argument check */ + if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL)) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntPhaseRot argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));) + return -1; + } + + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + argInd = 1; + for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseRot[i] = (int8_t)atoi (argv[argInd++]); + } + } + return 0; +} + +/** + * @b Description + * @n + * This is the CLI Handler for angle FOV config + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t Pcount3DDemo_CLIAntAngleFoV (int32_t argc, char* argv[]) +{ + int8_t subFrameNum; + + if(Pcount3DDemo_CLIGetSubframe(argc, argv, 4, &subFrameNum) < 0) + { + DEBUG(System_printf ("Error: Pcount3DDemo_CLIAntAngleFoV argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));) + return -1; + } + + if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG) + { + uint8_t indx; + for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++) + { + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[0] = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[1] = (float) atof (argv[3]); + } + } + else + { + uint8_t indx = subFrameNum; + /* Apply configuration to specific subframe (or to position zero for the legacy case + where there is no advanced frame config) */ + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[0] = (float) atof (argv[2]); + gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[1] = (float) atof (argv[3]); + } + return 0; +} + + + +/** + * @b Description + * @n + * This is the CLI Execution Task + * + * @retval + * Not Applicable. + */ +void Pcount3DDemo_CLIInit (uint8_t taskPriority) +{ + CLI_Cfg cliCfg; + char demoBanner[110]; + uint32_t cnt; + + /* Create Demo Banner to be printed out by CLI */ + sprintf(&demoBanner[0], + "***********************************\n" \ + "IWR68xx Indoor people counting demo" \ + "***********************************\n" + ); + + /* Initialize the CLI configuration: */ + memset ((void *)&cliCfg, 0, sizeof(CLI_Cfg)); + + /* Populate the CLI configuration: */ + cliCfg.cliPrompt = "mmwDemo:/>"; + cliCfg.cliBanner = demoBanner; + cliCfg.cliUartHandle = gMmwMssMCB.commandUartHandle; + cliCfg.taskPriority = taskPriority; + cliCfg.socHandle = gMmwMssMCB.socHandle; + cliCfg.mmWaveHandle = gMmwMssMCB.ctrlHandle; + cliCfg.enableMMWaveExtension = 1U; + cliCfg.usePolledMode = true; + cliCfg.overridePlatform = false; + cliCfg.overridePlatformString = NULL; + + cnt=0; + cliCfg.tableEntry[cnt].cmd = "sensorStart"; + cliCfg.tableEntry[cnt].helpString = "[doReconfig(optional, default:enabled)]"; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLISensorStart; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "sensorStop"; + cliCfg.tableEntry[cnt].helpString = "No arguments"; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLISensorStop; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "dynamicRACfarCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynRACfarCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "staticRACfarCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIStaticRACfarCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "dynamicRangeAngleCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynRngAngleCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "dynamic2DAngleCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynAngleEstCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "dopplerCfarCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDopplerCFARCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "staticRangeAngleCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIStaticRngAngleCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "fovCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIAntAngleFoV; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "antGeometry0"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntGeometry0; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "antGeometry1"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntGeometry1; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "antPhaseRot"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntPhaseRot; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "adcbufCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIADCBufCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "compRangeBiasAndRxChanPhase"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "trackingCfg"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLITrackingCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "staticBoundaryBox"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIStaticBoundaryBoxCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "boundaryBox"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIBoundaryBoxCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "sensorPosition"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLISensorPositionCfg; + cnt++; + cliCfg.tableEntry[cnt].cmd = "gatingParam";// PC: 4 gating volume, Limits are set to 3m in length, 2m in width, 0 no limit in doppler + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIGatingParamCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "stateParam";// PC: 10 frames to activate, 5 to forget, 10 active to free, 1000 static to free, 5 exit to free, 6000 sleep to free + cliCfg.tableEntry[cnt].helpString = " ";//det2act, det2free, act2free, stat2free, exit2free, sleep2free + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIStateParamCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "allocationParam";// PC: 250 SNR, 0.1 minimal velocity, 5 points, 1m in distance, 2m/s in velocity + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIAllocationParamCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "maxAcceleration"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemoCLIMaxAccelerationParamCfg; + cnt++; + + cliCfg.tableEntry[cnt].cmd = "presenceBoundaryBox"; + cliCfg.tableEntry[cnt].helpString = " "; + cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIPresenceParamCfg; + cnt++; + + /* Open the CLI: */ + if (CLI_open (&cliCfg) < 0) + { + System_printf ("Error: Unable to open the CLI\n"); + return; + } + System_printf ("Debug: CLI is operational\n"); + return; +} + + diff --git a/mss/pcount3D_mss.cfg b/mss/pcount3D_mss.cfg new file mode 100644 index 0000000..0efe5e6 --- /dev/null +++ b/mss/pcount3D_mss.cfg @@ -0,0 +1,90 @@ +/* + * Copyright 2011 by Texas Instruments Incorporated. + * + * All rights reserved. Property of Texas Instruments Incorporated. + * Restricted rights to use, duplicate or disclose this code are + * granted through contract. + * + */ +environment['xdc.cfg.check.fatal'] = 'false'; + +/******************************************************************** + ************************** BIOS Modules **************************** + ********************************************************************/ +var Memory = xdc.useModule('xdc.runtime.Memory'); +var BIOS = xdc.useModule('ti.sysbios.BIOS'); +var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem'); +var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf'); +var Task = xdc.useModule('ti.sysbios.knl.Task'); +var Idle = xdc.useModule('ti.sysbios.knl.Idle'); +var SEM = xdc.useModule('ti.sysbios.knl.Semaphore'); +var Event = xdc.useModule('ti.sysbios.knl.Event'); +var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.vim.Hwi'); +var System = xdc.useModule('xdc.runtime.System'); +var SysStd = xdc.useModule('xdc.runtime.SysStd'); +var clock = xdc.useModule('ti.sysbios.knl.Clock'); +var Pmu = xdc.useModule('ti.sysbios.family.arm.v7a.Pmu'); +var Load = xdc.useModule('ti.sysbios.utils.Load'); + +System.SupportProxy = SysStd; + +/* FIQ Stack Usage: */ +Hwi.fiqStackSize = 2048; +Hwi.fiqStackSection = ".myFiqStack" +Program.sectMap[".myFiqStack"] = "DATA_RAM"; + +/* Default Heap Creation: Local L2 memory */ +var heapMemParams = new HeapMem.Params(); +heapMemParams.size = 130*1024; +heapMemParams.sectionName = "systemHeap"; +Program.global.heap0 = HeapMem.create(heapMemParams); +Memory.defaultHeapInstance = Program.global.heap0; +System.extendedFormats = '%$L%$S%$F%f'; + +/* Enable BIOS Task Scheduler */ +BIOS.taskEnabled = true; + +/* Reduce the size of BIOS */ +BIOS.swiEnabled = false; /* We don't use SWIs */ +BIOS.libType = BIOS.LibType_Custom; +Program.stack = 2048; /* for isr context */ +Task.idleTaskStackSize = 800; +var Text = xdc.useModule('xdc.runtime.Text'); +Text.isLoaded = false; + +/* do not call update for load - Application will call it at inter-frame boundary */ +Load.updateInIdle = false; + +/* Install idle function to sleep the R4F (using WFI instruction). Note above + Load.updateInIdle is false which allows to sleep the R4F in idle. + Also, no other book-keeping etc functions should be installed in the idle thread */ +Idle.addFunc('&Pcount3DDemo_sleep'); + +Program.sectMap[".vecs"] = "VECTORS"; + +/* Make sure libraries are built with 32-bit enum types to be compatible with DSP enum types*/ +BIOS.includeXdcRuntime = true; +BIOS.libType = BIOS.LibType_Custom; +BIOS.customCCOpts += " --enum_type=int "; + +/******************************************************************** + * Enabling DebugP Log Support + ********************************************************************/ +var Log = xdc.useModule('xdc.runtime.Log'); +var Main = xdc.useModule('xdc.runtime.Main'); +var Diags = xdc.useModule('xdc.runtime.Diags'); +var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf'); + +/* Configure the Logger Buffer: */ +var loggerBufParams = new LoggerBuf.Params(); +loggerBufParams.bufType = LoggerBuf.BufType_CIRCULAR; +loggerBufParams.exitFlush = false; +loggerBufParams.instance.name = "_logInfo"; +loggerBufParams.numEntries = 200; + +/* Create the Logger and attach this to the application */ +MyAppLogger = LoggerBuf.create(loggerBufParams); +Main.common$.logger = MyAppLogger; +Main.common$.diags_USER1 = Diags.RUNTIME_ON; +Task.common$.diags_USER1 = Diags.RUNTIME_ON; + diff --git a/mss/pcount3D_mss.h b/mss/pcount3D_mss.h new file mode 100644 index 0000000..5def42c --- /dev/null +++ b/mss/pcount3D_mss.h @@ -0,0 +1,394 @@ +/** + * @file pcount3D_mss.h + * + * @brief + * This is the main header file for the 3D people counting demo + * + * \par + * NOTE: + * (C) Copyright 2016 Texas Instruments, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef MMW_MSS_H +#define MMW_MSS_H + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +//#include + +#include +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +/*! @brief For advanced frame config, below define means the configuration given is + * global at frame level and therefore it is broadcast to all sub-frames. + */ +#define PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG (-1) + +/** + * @defgroup configStoreOffsets Offsets for storing CLI configuration + * @brief Offsets of config fields within the parent structures, note these offsets will be + * unique and hence can be used to differentiate the commands for processing purposes. + * @{ + */ +#define PCOUNT3DDEMO_ADCBUFCFG_OFFSET (offsetof(Pcount3DDemo_SubFrameCfg, adcBufCfg)) + +#define PCOUNT3DDEMO_SUBFRAME_DSPDYNCFG_OFFSET (offsetof(Pcount3DDemo_SubFrameCfg, objDetDynCfg) + \ + offsetof(Pcount3DDemo_DPC_ObjDet_DynCfg, dspDynCfg)) + +#define PCOUNT3DDEMO_SUBFRAME_R4FDYNCFG_OFFSET (offsetof(Pcount3DDemo_SubFrameCfg, objDetDynCfg) + \ + offsetof(Pcount3DDemo_DPC_ObjDet_DynCfg, r4fDynCfg)) + +#define PCOUNT3DDEMO_CALIBDCRANGESIG_OFFSET (PCOUNT3DDEMO_SUBFRAME_R4FDYNCFG_OFFSET + \ + offsetof(DPC_ObjectDetectionRangeHWA_DynCfg, calibDcRangeSigCfg)) + +#define PCOUNT3DDEMO_CAPONCHAINCFG_OFFSET (PCOUNT3DDEMO_SUBFRAME_DSPDYNCFG_OFFSET + \ + offsetof(DPC_ObjectDetection_DynCfg, caponChainCfg)) + +#define PCOUNT3DDEMO_DYNRACFARCFG_OFFSET (PCOUNT3DDEMO_CAPONCHAINCFG_OFFSET + \ + offsetof(caponChainCfg, dynamicCfarConfig)) + +#define PCOUNT3DDEMO_STATICRACFARCFG_OFFSET (PCOUNT3DDEMO_CAPONCHAINCFG_OFFSET + \ + offsetof(caponChainCfg, staticCfarConfig)) + +#define PCOUNT3DDEMO_DOACAPONCFG_OFFSET (PCOUNT3DDEMO_CAPONCHAINCFG_OFFSET + \ + offsetof(caponChainCfg, doaConfig)) + +#define PCOUNT3DDEMO_DOACAPONRACFG_OFFSET (PCOUNT3DDEMO_DOACAPONCFG_OFFSET + \ + offsetof(doaConfig, rangeAngleCfg)) + +#define PCOUNT3DDEMO_DOA2DESTCFG_OFFSET (PCOUNT3DDEMO_DOACAPONCFG_OFFSET + \ + offsetof(doaConfig, angle2DEst)) + +#define PCOUNT3DDEMO_DOAFOVCFG_OFFSET (PCOUNT3DDEMO_DOACAPONCFG_OFFSET + \ + offsetof(doaConfig, fovCfg)) + +#define PCOUNT3DDEMO_STATICANGESTCFG_OFFSET (PCOUNT3DDEMO_DOACAPONCFG_OFFSET + \ + offsetof(doaConfig, staticEstCfg)) + +#define PCOUNT3DDEMO_DOPCFARCFG_OFFSET (PCOUNT3DDEMO_DOACAPONCFG_OFFSET + \ + offsetof(doaConfig, dopCfarCfg)) + + + +/** @}*/ /* configStoreOffsets */ + +/** + * @brief + * 3D people counting Demo Sensor State + * + * @details + * The enumeration is used to define the sensor states used in 3D people counting Demo + */ +typedef enum Pcount3DDemo_SensorState_e +{ + /*! @brief Inital state after sensor is initialized. + */ + Pcount3DDemo_SensorState_INIT = 0, + + /*! @brief Indicates sensor is started */ + Pcount3DDemo_SensorState_STARTED, + + /*! @brief State after sensor has completely stopped */ + Pcount3DDemo_SensorState_STOPPED +}Pcount3DDemo_SensorState; + +/** + * @brief + * 3D people counting Demo statistics + * + * @details + * The structure is used to hold the statistics information for the + * 3D people counting Demo + */ +typedef struct Pcount3DDemo_MSS_Stats_t +{ + /*! @brief Counter which tracks the number of frame trigger events from BSS */ + uint64_t frameTriggerReady; + + /*! @brief Counter which tracks the number of failed calibration reports + * The event is triggered by an asynchronous event from the BSS */ + uint32_t failedTimingReports; + + /*! @brief Counter which tracks the number of calibration reports received + * The event is triggered by an asynchronous event from the BSS */ + uint32_t calibrationReports; + + /*! @brief Counter which tracks the number of sensor stop events received + * The event is triggered by an asynchronous event from the BSS */ + uint32_t sensorStopped; + + /*! @brief Counter which tracks the number of dpm stop events received + * The event is triggered by DPM_Report_DPC_STOPPED from DPM */ + uint32_t dpmStopEvents; + + /*! @brief Counter which tracks the number of dpm start events received + * The event is triggered by DPM_Report_DPC_STARTED from DPM */ + uint32_t dpmStartEvents; + +}Pcount3DDemo_MSS_Stats; + +/** + * @brief + * 3D people counting Demo Data Path Information. + * + * @details + * The structure is used to hold all the relevant information for + * the data path. + */ +typedef struct Pcount3DDemo_SubFrameCfg_t +{ + /*! @brief ADC buffer configuration storage */ + MmwDemo_ADCBufCfg adcBufCfg; + + /*! @brief Flag indicating if @ref adcBufCfg is pending processing. */ + uint8_t isAdcBufCfgPending : 1; + + /*! @brief Dynamic configuration storage for object detection DPC */ + Pcount3DDemo_DPC_ObjDet_DynCfg objDetDynCfg; + + /*! @brief ADCBUF will generate chirp interrupt event every this many chirps - chirpthreshold */ + uint8_t numChirpsPerChirpEvent; + + /*! @brief Number of bytes per RX channel, it is aligned to 16 bytes as required by ADCBuf driver */ + uint32_t adcBufChanDataSize; + + /*! @brief Number of ADC samples */ + uint16_t numAdcSamples; + + /*! @brief Number of chirps per sub-frame */ + uint16_t numChirpsPerSubFrame; + + /*! @brief Number of virtual antennas */ + uint8_t numVirtualAntennas; +} Pcount3DDemo_SubFrameCfg; + +/*! + * @brief + * Structure holds message stats information from data path. + * + * @details + * The structure holds stats information. This is a payload of the TLV message item + * that holds stats information. + */ +typedef struct Pcount3DDemo_SubFrameStats_t +{ + /*! @brief Frame processing stats */ + Pcount3DDemo_output_message_stats outputStats; + + /*! @brief Dynamic CLI configuration time in usec */ + uint32_t pendingConfigProcTime; + + /*! @brief SubFrame Preparation time on MSS in usec */ + uint32_t subFramePreparationTime; +} Pcount3DDemo_SubFrameStats; + +/** + * @brief Task handles storage structure + */ +typedef struct Pcount3DDemo_TaskHandles_t +{ + /*! @brief MMWAVE Control Task Handle */ + Task_Handle mmwaveCtrl; + + /*! @brief ObjectDetection DPC related dpmTask */ + Task_Handle objDetDpmTask; + + /*! @brief Demo init task */ + Task_Handle initTask; +} Pcount3DDemo_taskHandles; + +typedef struct Pcount3DDemo_DataPathObj_t +{ + /*! @brief Handle to hardware accelerator driver. */ + HWA_Handle hwaHandle; + + /*! @brief Handle of the EDMA driver. */ + EDMA_Handle edmaHandle; + + /*! @brief Radar cube memory information from range DPC */ + DPC_ObjectDetectionRangeHWA_preStartCfg_radarCubeMem radarCubeMem; + + /*! @brief Memory usage after the preStartCfg range DPC is applied */ + DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage memUsage; + + /*! @brief EDMA error Information when there are errors like missing events */ + EDMA_errorInfo_t EDMA_errorInfo; + + /*! @brief EDMA transfer controller error information. */ + EDMA_transferControllerErrorInfo_t EDMA_transferControllerErrorInfo; + +} Pcount3DDemo_DataPathObj; + +/** + * @brief + * 3D people counting Demo MCB + * + * @details + * The structure is used to hold all the relevant information for the + * 3D people counting Demo + */ +typedef struct Pcount3DDemo_MSS_MCB_t +{ + /*! @brief Configuration which is used to execute the demo */ + Pcount3DDemo_Cfg cfg; + + /*! * @brief Handle to the SOC Module */ + SOC_Handle socHandle; + + /*! @brief UART Logging Handle */ + UART_Handle loggingUartHandle; + + /*! @brief UART Command Rx/Tx Handle */ + UART_Handle commandUartHandle; + + /*! @brief This is the mmWave control handle which is used + * to configure the BSS. */ + MMWave_Handle ctrlHandle; + + /*! @brief ADCBuf driver handle */ + ADCBuf_Handle adcBufHandle; + + /*! @brief DSP chain DPM Handle */ + DPM_Handle objDetDpmHandle; + + /*! @brief Object Detection DPC common configuration */ + Pcount3DDemo_DPC_ObjDet_CommonCfg objDetCommonCfg; + + /*! @brief Data path object */ + Pcount3DDemo_DataPathObj dataPathObj; + + /*! @brief Tracker DPU Static Configuration */ + DPC_ObjectDetection_TrackerConfig trackerCfg; + + /*! @brief Object Detection DPC subFrame configuration */ + Pcount3DDemo_SubFrameCfg subFrameCfg[RL_MAX_SUBFRAMES]; + + /*! @brief sub-frame stats */ + Pcount3DDemo_SubFrameStats subFrameStats[RL_MAX_SUBFRAMES]; + + /*! @brief Demo Stats */ + Pcount3DDemo_MSS_Stats stats; + + Pcount3DDemo_output_message_UARTpointCloud pointCloudToUart; + DPIF_DetMatrix heatMapOutFromDSP; + DPIF_PointCloudSpherical *pointCloudFromDSP; + DPIF_PointCloudSideInfo *pointCloudSideInfoFromDSP; + DPC_ObjectDetection_Stats *frameStatsFromDSP; + uint32_t currSubFrameIdx; + + trackerProc_TargetDescrHandle trackerOutput; + uint8_t numTargets; + uint16_t numIndices; + bool presenceDetEnabled; + uint32_t presenceInd; + uint16_t numDetectedPoints; + uint32_t trackerProcessingTimeInUsec; + uint32_t uartProcessingTimeInUsec; + + + /*! @brief Task handle storage */ + Pcount3DDemo_taskHandles taskHandles; + + /*! @brief RF frequency scale factor, = 2.7 for 60GHz device, = 3.6 for 76GHz device */ + double rfFreqScaleFactor; + + /*! @brief Semaphore handle to signal DPM started from DPM report function */ + Semaphore_Handle DPMstartSemHandle; + + /*! @brief Semaphore handle to signal DPM stopped from DPM report function. */ + Semaphore_Handle DPMstopSemHandle; + + /*! @brief Semaphore handle to signal DPM ioctl from DPM report function. */ + Semaphore_Handle DPMioctlSemHandle; + + /*! @brief Semaphore handle to run UART DMA task. */ + Semaphore_Handle uartTxSemHandle; + + /*! @brief Semaphore handle to trigger tracker DPU. */ + Semaphore_Handle trackerDPUSemHandle; + + /*! @brief Sensor state */ + Pcount3DDemo_SensorState sensorState; + + /*! @brief Tracks the number of sensor start */ + uint32_t sensorStartCount; + + /*! @brief Tracks the number of sensor sop */ + uint32_t sensorStopCount; + +} Pcount3DDemo_MSS_MCB; + +/************************************************************************** + *************************** Extern Definitions *************************** + **************************************************************************/ + +/* Functions to handle the actions need to move the sensor state */ +extern int32_t Pcount3DDemo_openSensor(bool isFirstTimeOpen); +extern int32_t Pcount3DDemo_configSensor(void); +extern int32_t Pcount3DDemo_startSensor(void); +extern void Pcount3DDemo_stopSensor(void); + +/* functions to manage the dynamic configuration */ +extern uint8_t Pcount3DDemo_isAllCfgInPendingState(void); +extern uint8_t Pcount3DDemo_isAllCfgInNonPendingState(void); +extern void Pcount3DDemo_resetStaticCfgPendingState(void); +extern void Pcount3DDemo_CfgUpdate(void *srcPtr, uint32_t offset, uint32_t size, int8_t subFrameNum); + +extern void Pcount3DDemo_CLIInit (uint8_t taskPriority); + +/* Debug Functions */ +extern void _Pcount3DDemo_debugAssert(int32_t expression, const char *file, int32_t line); +#define Pcount3DDemo_debugAssert(expression) { \ + _Pcount3DDemo_debugAssert(expression, \ + __FILE__, __LINE__); \ + DebugP_assert(expression); \ + } + +#ifdef __cplusplus +} +#endif + +#endif /* MMW_MSS_H */ + diff --git a/mss/pcount3D_mss_linker.cmd b/mss/pcount3D_mss_linker.cmd new file mode 100644 index 0000000..3c64c1f --- /dev/null +++ b/mss/pcount3D_mss_linker.cmd @@ -0,0 +1,16 @@ +/*----------------------------------------------------------------------------*/ +/* Linker Settings */ +--retain="*(.intvecs)" + +/*----------------------------------------------------------------------------*/ +/* Section Configuration */ +SECTIONS +{ + systemHeap : {} > DATA_RAM + .hwaBufs: load = HWA_RAM, type = NOINIT + .dpcLocalRam: {} > DATA_RAM + .l3ram: {} >> L3_RAM + .demoSharedMem: { } >> HS_RAM +} +/*----------------------------------------------------------------------------*/ + diff --git a/mss/r4f_linker.cmd b/mss/r4f_linker.cmd new file mode 100644 index 0000000..9280ac1 --- /dev/null +++ b/mss/r4f_linker.cmd @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------------*/ +/* r4f_linker.cmd */ +/* */ +/* (c) Texas Instruments 2016, All rights reserved. */ +/* */ + +/* USER CODE BEGIN (0) */ +/* USER CODE END */ + + +/*----------------------------------------------------------------------------*/ +/* Linker Settings */ +--retain="*(.intvecs)" + +/*----------------------------------------------------------------------------*/ +/* Memory Map */ +#define MMWAVE_L3RAM_SIZE (MMWAVE_L3RAM_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE - MMWAVE_MSSUSED_L3RAM_SIZE) +MEMORY{ +PAGE 0: + VECTORS (X) : origin=0x00000000 length=0x00000100 + PROG_RAM (RX) : origin=0x00000100 length=0x0007FF00+(MMWAVE_SHMEM_TCMA_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) + DATA_RAM (RW) : origin=0x08000000 length=0x00030000+(MMWAVE_SHMEM_TCMB_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE) + L3_RAM (RW) : origin=0x51000000 length=0x00000000+(MMWAVE_MSSUSED_L3RAM_SIZE) + HWA_RAM (RW) : origin=0x52030000 length=0x00010000 + HS_RAM (RW) : origin=0x52080000 length=0x8000 +PAGE 1: + L3_RAM (RW) : origin=0x51000000 length=0x00000000+(MMWAVE_MSSUSED_L3RAM_SIZE) +} + +/*----------------------------------------------------------------------------*/ +/* Section Configuration */ +SECTIONS{ + .intvecs : {} > VECTORS + .text : {} > PROG_RAM + .const : {} > PROG_RAM + .cinit : {} > PROG_RAM + .pinit : {} > PROG_RAM + .bss : {} > DATA_RAM + .data : {} > DATA_RAM + .stack : {} > DATA_RAM +} +/*----------------------------------------------------------------------------*/ + diff --git a/mss/src/.exclude b/mss/src/.exclude new file mode 100644 index 0000000..8c86331 --- /dev/null +++ b/mss/src/.exclude @@ -0,0 +1 @@ +This file exists to prevent Eclipse/CDT from adding the C sources contained in this directory (or below) to any enclosing project. diff --git a/mss/src/makefile.libs b/mss/src/makefile.libs new file mode 100644 index 0000000..e03f88f --- /dev/null +++ b/mss/src/makefile.libs @@ -0,0 +1,62 @@ +# +# This file was generated based on the configuration script: +# C:\Users\Daunair\workspace_v10\3D_people_count_68xx_mss\mss\pcount3D_mss.cfg +# +# This makefile may be included in other makefiles that need to build +# the libraries containing the compiled source files generated as +# part of the configuration step. + +# +# ======== GEN_SRC_DIR ========= +# The path to the sources generated during configuration +# +# This path must be either absolute or relative to the build directory. +# +# The absolute path to the generated source directory (at the time the +# sources were generated) is: +# C:\Users\Daunair\workspace_v10\3D_people_count_68xx_mss\mss\src +# +GEN_SRC_DIR ?= ../mss/src + +ifeq (,$(wildcard $(GEN_SRC_DIR))) +$(error "ERROR: GEN_SRC_DIR must be set to the directory containing the generated sources") +endif + +# +# ======== .force ======== +# The .force goal is used to force the build of any goal that names it as +# a prerequisite +# +.PHONY: .force + +# +# ======== library macros ======== +# +sysbios_SRC = $(GEN_SRC_DIR)/sysbios +sysbios_LIB = $(GEN_SRC_DIR)/sysbios/sysbios.aer4ft + +# +# ======== dependencies ======== +# +all: $(sysbios_LIB) +clean: .sysbios_clean + + +# ======== convenient build goals ======== +.PHONY: sysbios +sysbios: $(GEN_SRC_DIR)/sysbios/sysbios.aer4ft + +# CDT managed make executables depend on $(OBJS) +OBJS += $(sysbios_LIB) + +# +# ======== rules ======== +# +$(sysbios_LIB): .force + @echo making $@ ... + @$(MAKE) -C $(sysbios_SRC) + +.sysbios_clean: + @echo cleaning $(sysbios_SRC) ... + -@$(MAKE) --no-print-directory -C $(sysbios_SRC) clean + diff --git a/mss/src/sysbios/makefile b/mss/src/sysbios/makefile new file mode 100644 index 0000000..0acff14 --- /dev/null +++ b/mss/src/sysbios/makefile @@ -0,0 +1,82 @@ +# This is a generated file. +# +# Do not edit this file. Any modifications to this file +# will be overwritten whenever makefiles are re-generated. +# +# template: ti.sysbios/makefile.xdt +# target: ti.targets.arm.elf.R4Ft + +vpath % C:/ti/bios_6_73_01_01/packages/ti/sysbios/ +vpath %.c C:/ti/xdctools_3_50_08_24_core/packages/ + +XOPTS = -I"C:/ti/xdctools_3_50_08_24_core/packages/" -Dxdc_target_types__=C:/ti/bios_6_73_01_01/packages/ti/targets/arm/elf/std.h -Dxdc_target_name__=R4Ft + +BIOS_DEFS = -Dti_sysbios_BIOS_swiEnabled__D=FALSE -Dti_sysbios_BIOS_taskEnabled__D=TRUE -Dti_sysbios_BIOS_clockEnabled__D=TRUE -Dti_sysbios_BIOS_runtimeCreatesEnabled__D=TRUE -Dti_sysbios_knl_Task_moduleStateCheckFlag__D=FALSE -Dti_sysbios_knl_Task_objectCheckFlag__D=FALSE -Dti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS -Dti_sysbios_knl_Swi_DISABLE_ALL_HOOKS -Dti_sysbios_BIOS_smpEnabled__D=FALSE -Dti_sysbios_BIOS_mpeEnabled__D=FALSE -Dti_sysbios_Build_useHwiMacros -Dti_sysbios_knl_Swi_numPriorities__D=16 -Dti_sysbios_knl_Task_deleteTerminatedTasks__D=FALSE -Dti_sysbios_knl_Task_numPriorities__D=16 -Dti_sysbios_knl_Task_checkStackFlag__D=TRUE -Dti_sysbios_knl_Task_initStackFlag__D=TRUE -Dti_sysbios_knl_Clock_TICK_SOURCE=ti_sysbios_knl_Clock_TickSource_TIMER -Dti_sysbios_knl_Clock_TICK_MODE=ti_sysbios_knl_Clock_TickMode_PERIODIC -Dti_sysbios_hal_Core_delegate_getId=ti_sysbios_family_arm_v7r_tms570_Core_getId__E -Dti_sysbios_hal_Core_delegate_interruptCore=ti_sysbios_family_arm_v7r_tms570_Core_interruptCore__E -Dti_sysbios_hal_Core_delegate_lock=ti_sysbios_family_arm_v7r_tms570_Core_lock__E -Dti_sysbios_hal_Core_delegate_unlock=ti_sysbios_family_arm_v7r_tms570_Core_unlock__E -Dti_sysbios_hal_Core_numCores__D=1 -Dti_sysbios_family_arm_v7r_tms570_Core_numCores__D=1 -Dti_sysbios_utils_Load_taskEnabled__D=TRUE -Dti_sysbios_utils_Load_swiEnabled__D=FALSE -Dti_sysbios_utils_Load_hwiEnabled__D=FALSE -Dti_sysbios_family_arm_v7r_vim_Hwi_dispatcherSwiSupport__D=FALSE -Dti_sysbios_family_arm_v7r_vim_Hwi_dispatcherTaskSupport__D=TRUE -Dti_sysbios_family_arm_v7r_vim_Hwi_dispatcherAutoNestingSupport__D=TRUE -Dti_sysbios_family_arm_v7r_vim_Hwi_dispatcherIrpTrackingSupport__D=TRUE -Dti_sysbios_knl_Semaphore_supportsEvents__D=FALSE -Dti_sysbios_knl_Semaphore_supportsPriority__D=TRUE + +CCOPTS = --code_state=16 --float_support=vfpv3d16 --endian=little -mv7R4 --abi=eabi -q -ms --opt_for_speed=2 --program_level_compile -o3 -g --enum_type=int -Dti_sysbios_family_arm_exc_Exception_enableDecode__D=TRUE -Dti_sysbios_knl_Clock_stopCheckNext__D=FALSE -Dti_sysbios_family_arm_v7r_vim_Hwi_lockstepDevice__D=TRUE -Dti_sysbios_family_arm_v7r_vim_Hwi_errataInitEsm__D=TRUE -Dti_sysbios_family_arm_v7r_vim_Hwi_resetVIM__D=TRUE -Dti_sysbios_hal_Core_numCores__D=1 -Dti_sysbios_knl_Task_ENABLE_SWITCH_HOOKS -Dti_sysbios_knl_Task_minimizeLatency__D=FALSE + +BIOS_INC = -I"C:/ti/bios_6_73_01_01/packages/" +ANNEX_INCS = +INCS = $(BIOS_INC) $(ANNEX_INCS) -I"C:/ti/bios_6_73_01_01/packages/" -I"C:/ti/xdctools_3_50_08_24_core/packages/" -I"../" -I"/packages//" -IC:/ti/ti-cgt-arm_16.9.6.LTS/include + +CC = C:/ti/ti-cgt-arm_16.9.6.LTS/bin/armcl -c $(CCOPTS) +ASM = C:/ti/ti-cgt-arm_16.9.6.LTS/bin/armcl -c $(CCOPTS) +AR = C:/ti/ti-cgt-arm_16.9.6.LTS/bin/armar rq + +DEL = C:/ti/xdctools_3_50_08_24_core/packages/../bin/rm -f +CP = C:/ti/xdctools_3_50_08_24_core/packages/../bin/cp -f + +define RM + $(if $(wildcard $1),$(DEL) $1,:) +endef + +define ASSEMBLE + @echo asmer4ft $< ... + @$(ASM) $(BIOS_DEFS) $(XOPTS) $(INCS) $< +endef + +all: sysbios.aer4ft + +arm_IntrinsicsSupport_asm.obj: family/arm/IntrinsicsSupport_asm.asm makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=arm_IntrinsicsSupport_asm.obj + +arm_TaskSupport_asm.obj: family/arm/TaskSupport_asm.asm makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=arm_TaskSupport_asm.obj + +vim_Hwi_asm.obj: family/arm/v7r/vim/Hwi_asm.sv7R makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=vim_Hwi_asm.obj + +vim_Hwi_asm_switch.obj: family/arm/v7r/vim/Hwi_asm_switch.sv7R makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=vim_Hwi_asm_switch.obj + +exc_Exception_asm.obj: family/arm/exc/Exception_asm.asm makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=exc_Exception_asm.obj + +tms570_Core_asm.obj: family/arm/v7r/tms570/Core_asm.sv7R makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=tms570_Core_asm.obj + +a15_TimestampProvider_asm.obj: family/arm/a15/TimestampProvider_asm.asm makefile + @-$(call RM, $@) + $(ASSEMBLE) --output_file=a15_TimestampProvider_asm.obj + + +BIOS.obj: BIOS.c family/arm/IntrinsicsSupport.c family/arm/TaskSupport.c knl/Clock.c knl/Idle.c knl/Intrinsics.c knl/Event.c knl/Queue.c knl/Semaphore.c knl/Task.c heaps/HeapBuf.c heaps/HeapMem.c family/arm/v7r/vim/Hwi.c family/arm/exc/Exception.c hal/Cache.c hal/CacheNull.c hal/Core.c hal/Hwi.c hal/Hwi_stack.c hal/Hwi_startup.c family/arm/v7a/Pmu.c utils/Load.c utils/Load_CPU.c gates/GateHwi.c gates/GateMutex.c family/arm/v7r/tms570/Core.c timers/rti/Timer.c family/arm/a15/TimestampProvider.c xdc/runtime/xdc_noinit.c xdc/runtime/Assert.c xdc/runtime/Core-mem.c xdc/runtime/Core-smem.c xdc/runtime/Core-label.c xdc/runtime/Core-params.c xdc/runtime/Diags.c xdc/runtime/Error.c xdc/runtime/Gate.c xdc/runtime/Log.c xdc/runtime/LoggerBuf.c xdc/runtime/Memory.c xdc/runtime/Registry.c xdc/runtime/Startup.c xdc/runtime/System.c xdc/runtime/SysStd.c xdc/runtime/Text.c xdc/runtime/Timestamp.c xdc/runtime/TimestampNull.c makefile + @-$(call RM, $@) + @echo cler4ft $< ... + @$(CC) $(BIOS_DEFS) $(XOPTS) $(INCS) $(subst makefile,,$^) + +sysbios.aer4ft: BIOS.obj arm_IntrinsicsSupport_asm.obj arm_TaskSupport_asm.obj vim_Hwi_asm.obj vim_Hwi_asm_switch.obj exc_Exception_asm.obj tms570_Core_asm.obj a15_TimestampProvider_asm.obj + @-$(call RM, $@) + @echo arer4ft $^ ... + @$(AR) $@ $^ + + +clean: + @$(DEL) ..\makefile.libs + @-$(call RM, *) diff --git a/mss/src/sysbios/sysbios.aer4ft b/mss/src/sysbios/sysbios.aer4ft new file mode 100644 index 0000000000000000000000000000000000000000..e05b6fa7e6cb70da41613af9c1a55950425f49b3 GIT binary patch literal 1981108 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

OpHVP| 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 z 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

VNwc+!q1U3u~-PlobjEKd@7GM6W>@MJYl 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

ZcGq}D6yYxf9r`x3!+}{j(>?^qC zhnwXcE4bC*f`)kiF1W@cignq-?Q*a}a9(g8gS@W<*9;Cr;=*Ig+Xnr&u5TAOe}O8- zd$8b^gFDN>ohG=JBhCH(KLpnS&ZNh4g6neNz7<@z1Gg#s3titu;QAW$*iCTD!J!Hl z9@~CX1=o0#d4BR@!8L=sr68?n=Z6Ki2AsZ-W5@fYgdd{oyF6iT4~7bE z6*x^?q5O3UZZ)_b20bnj+!}E0hI;g%;965keXm7q>-&-9#+%E_dYBy1_3Z$6r6GNL z3a-zDVjfty9dD=L8o`;``^yE_49--Z9}rv%I8!_Rq2M|k;;n^WsO#J9!0jZsCE!f? zcBtT%gEQ%Ivfx&M+r(h!YXr9j+y(~j3BmPgGuO*Cg7bo#U?^7`!nx4xvS^}Gv)sjq z?feZ3u5q$i-<06I;7s{u`N4X;E#RzocJ0TG_a4D@Pf_YK8^Wi}eImH74zpc0hCiyu zy9nHkhIoexu4Srue!Np~i@<5svXH*31h)j7$u7$Uw+dV@gT9{%ZnXoq-T|fhu5pNW zkl^}sn%C)$7Th9mrgDF#;Ff?h>2aIjmOIFMRdB1o*?Di7$Nv7C;8ue}Q(1Uyt{=u5 zdO2vBX4Yeb;99|%^q3*I4hQZk!F7S#p^&+#HV~}^a;99_$ z+WRvF*9vZTgS^`Ww+LL9fqPqUjkC;tQ{9+SeY?Ol7~~BSTsJuDU3L4hb#E73^YP~S z(+dUH0nSwJ?-yJbxE&1fekHgiCz{uBHaVzN-#&9NZ)<3uhYPOdB=fw$v4UF!uCGDf z)q-2zWv(A91-A;^K-(Ekty=R;4>=#@!IFtPj7F>&iye`4DI>@_La2*cvUJzWD1GoO) zO7-n_;0_YpB5fYT!N-TjoDz$a_$5s~pnzo#0l3Yqb)b zf9&$IeQT*6&E4jFJ5+Ej;F|NYtPfk>IjyDgy207M>D>K-TLdm;0r|%c^K)ydygnD0 z*TJIkQmz%;m9{W^+VUm~PR%!SHw$hNxXldm-WA+(aHjISVWKpBtHAAVkhh=U8ZR{0 z-xCGr1!t<4_Xw^ToNWs$di(pAf@^V*w@tECk5&h6tl&DpncB&Dg6jrn+IRSb;94&> z>-(GFI>4vroU$Y1Lp@{etoDT3>|)I1+{i{ScPX0Asc2(A&_?sla3 zwBzlY7U=_L%HI~jbvVR(p5VH`4Ku|1jNn#*L)TS!?DYLExYoFkzQa#pyd#WI< zsP9C zPjJh@nfkYATd5w_lTE9&_Sq&S=bBoh-X*xzoi*w?g1dEkje3#bPMTSxUM0AL zXV<7D1Xp`}joM2$bY5Yp@9-0A)Cht*|D+n#li)5pxu#_Qm6M&jPvz`9`ScpK9TD#Z zXV$2%2)mp#w?S{vXwYPKSZ~r@L zR5xLlx9_Y`*4fGOk@chH?i%$2A#d+{YSeH--Z}TyDC_K1`N(+Be5gj%5%T6OuTgsv z+;flAD5z5Q$aqhAtVTr%dG|fR^)qKaRih3e`iB5%Ruz9?CM@ z3pMIK!Y((y#Pu_Gyi%ifBI14fwHoz*1otT_`DO(72O8aaf~$iQfvhWgq@AC8uSSIk zd9DvQF7gp)=Wjl)Q3Hv1xBRR|p@}Jbq#jTF8|@3hjYlWL*l)^zYLs=>yL@E4SA5O+ zb;o~GqYfbCJ^fvcY9P3m&{#zXt^u3THzl}jf2~pI;>sSW??dR!&m*|~{#T>WRF*wb zp6ibqbrHc`f=bT#O}o2X>M}y!%Wjvtf#8luXUX`*2ci)_hp_Y8aANiMYi$EbyUaqP z@gR}D&|h37?9YAvJxWJ>G$hX(GcB$S3_X(WSn~3yv_j9Rb1UDQnog7QVd(Qxu z8bfeBcXX*O39dgnH^v{@d>5BO(^2+FJ8!tFi|Q{2`&{ZxLf&Qplq+{xv`WVNLD;2s zBe<;wxfH5M*(2rcyt_-)5Zo?+)EftGydNO!(8e~Lf#vD zyVMti9*^zoqQ>3NVervJ*!jPsT&jhLcRxT^65OXK^bZo;wFkQtT)?tN+Ic!I>VXSb z_DF8u!(5af(Q<@KT}PzvhofASA2zU+tLG;qT-11fV9KRXmC7Ee?@<{*3^&20(1nye zQr_f=E_DzwK6-evOWi``$D|If-Q9F5XP3u2Ij(cMOT9Tdc)HVcn>pxryLx!?P%Dd%eq>qp{`ZgCepZ&+} zE(KS+?2+;Iy3?h`5?t$2m%57J{mdjun+2!;{ zTnbY}WskJqsK>beyx~cgLQ`4xNO`9{?NVqu${xvWh?nUYyR5&`rT$6i@$~Z?ck&DH z!w7lpFS)33_b)G_91!x>yy{Z>5q8<_4Hq@fzsXxJbr>OU$~!J~2+=P*z8V}MZ_5u| z3R6jCkIY~7u}d`*@iu?vQmY7geLi<7Od*s#GTsf**uPB3`}999^&BB@=^C_ugdTT& z?^0(H@&=*NV9I^;7xY_%9{vC8qSiHD|IMWyCgffIyGvP9yz-HDo}kTZc5d#b##_U;bW`)d-}H4;_450z-PCyS@kY)r7xr^g{`0PO_qhXdVI|Ix9tTm6H`x6LuwXXfP}+tsZ;BGPxG->u#!;+>0&JmDgg zJ+j=7in!IIguFg6w|bo5UKzx33wC!aEUA<|GJUfLyA_Ib*(14&_HtA6j*Ex7)jot> z{=K)GnwMX+4_6LGjNtU$VL!LRl1kYl_1$Vl2mf zf3REKN~G`VL*3N8-s;2L+aI{;UN|e84ag=+4J3j4J-xB&x!lVE*e?Pj- zt*#^FeLvAn&Hvpo$*t}r^hh4-ru>rrooe!$2oJ{CHtD~0Fpbj%dMU!6deM zx$O$K>QCtV;@{nBBO=~Uu6CE48)Yjb^*H+)x55^-vPW{8T?apm;GVnQO^xGEztK&N zKgQm~mDBZcfj8qHthp8K6`{xC+qrh*_&eO{M?&7Qce$zc_}aVO>JCEQvSn^+y?e|* z-PHbrukUp$YzZlQWI1^4ez)3+D1YBS=%(hS9{87A-9^MZQ+re`u0TU ziz)K5N9z0RlWw(!i1&e~x$)Nd&v5e?=f8*XIT7!>AGj5!F3KKR4px8cR;@((nm==^--zgXxMzNFtA_}AbANJE>va46 ziguFF)MEZW-&_lJmpKa`+=0&gE)I<5t>CHWqA2Do8 z4>fxF z+s>R_KH0^iuqC+ck>&ouT{-(5Y@DIw!J;-5+dLJ81A9`@eB9$C~Unhdt|wq zInqPT?>6qwmFH(hc__bl&S9Y^^P=4phhjRMve3*xtSN{5N z&d!$|>7nLTQb&8J`Jp{pJ=FZw?{SZ6CfdotDUaHl;7-kWsC}giCwLULs+K*noIW z@1gcTPdw41;zatMImx4j5Zqr*;mY62Q#n89($hT(Tgl2EX}`v^Jkg`}74|fBwjY=-&vt%)P{;o+0{$v6pf3w!Fflu;g9#$o$xLp@({Z zX4E3C{o8yo*ZQRRi^3HnPqxK-U$Dj154T*SPf5t=YtABK*M|p{OzgvZID8W7dl82h7+4)tEnn%dH z?{yEgzO}us^1dHfTe<$`?b3gjT6H*)zjK;uEB8lvd6T@gmB-zAZYw|RQd_RDw9EWRZRK+f z^76Kb)v68h-*u@{-p;$#R$iCP%Q$(D+RE$pd2VoXZRPp8Jh#V?+RF1edCohGleg>e z+RF25d3n9}MR_6e_nQ&5>hencM_%692h^&GM8180P_6n+&xrhYnICJ$)~Z_xc~>3I zmFMS{^L+EkUjkT5EW6sOl=O#|ynYWHI5#@fwGA`eqxrgIM-OF*$-&d>7?Wvd0+;>?{k9e%Msxv5u{UegKtkWI-m0~(zAk&DzT3Zza#co^`>}U{W9s?fcWc!v zguD&kt5w4Z?l5qS9`i}=8E`uj@%}_|+pXs0jRto%5$_wMyxRA!A&IQH}?ImRyFTfE>O0UXZ7u&HY4UY7H!u2~xjwNv zHJgw(7u@Xx7adera<8f#MA~IJxH;HGH5+g~NO=bl{pZUx84>)TwX zp0*>?K4rWggL^>x-To@MtM{r?AK5=@pOQO$2$#O^!7=h)AIg=Ny@qk+SyhD z`>W*k8p);aZg5O{I&eR(-MA6lsdl2YPno`*_ODYPYQNiGCD(ft%CliSD7h5}a(e7J zrcN1-*)Hpk8V;&copz$MPZ{rt;BXZ}*(14)#&Y?46*$xUnv{3_!RCHia(f@b^$X8| zn^C4kdH*)_&^mPz!94ET?za3;7ni1f7{ z!PTR8!7=tb=*YT~`+w~u$a1jTQJlObB=^^&Ie81fG5NdkI4WJ<0m=1Baq{Mn+!~Tgq&YjU24_0&LF#+# zc&>f^2pq1`DSM>6nG@<1uFNWXBDeQ!1etZUQcS2tO6YA9IguH)%W5yrXpU837%;C!4 z)+ce?<=}oG^qAL$`4Yk|b*I#+<%GN^!F@$=cc03&Ljz8$Q>PH}ZUo1a)4r#3_PZ3E z={>%2NOo+wv0 z&Z|>f65ONb!+)_O(>`UqW4r5&?;}cXkNI_K3nJb_FRW9qYVp}$rMz7(s#8Z0^3J-L zn>YIb95WA>yoB@r-UpW?(l_if#G79mwRN>VrM`DAs8bmo$bXmIW>?gy)dcr5IA%UE zeI++9^)fhSo?)M>>eQ`7`o0Ipj2qh))~PE9d7i)5skaGkHMn+y+kX*fzk9(k<)H84 zI^%v7nZGw(Q)hh7Msmkp2Y-ktS5Mzir=BGA?Y^;2Jx6dy{iDwK9tMaLoLD_)e}pxDwokgk5gGiyJrY zzLcByz7E_sgq<(ByRPK^P&&=D&*|KLe*ClmR$@3UOI zcY|a6s~w)JQx9wTV1JeR{u>;l?;$I>ao!4Wj9)kN`8xFqVVC`1;Ofys;4UQO9rzNb z??WWF)61N^%fK=1Q14gjjOUHWd~14*+i!6LxGp>MwNEK;``0-=E+V;_H@I>-4IDGy z`3X2?p5gE}x%S{0a7?+6zQu9Zk=zDvbN$Sj;Fx}Y>N{LJ`93%oQ9nL>w@!^DxLsCb zo`L9RF8YAWxB3q`J!XPq`lFA*na-<{<^GzF>r}Vl{Tayx{>_!s>%cMj*8Mpr&-DdY zkEVlT?D8QvW*z77FS+zROLBw%!}XUpfn&x!TYSZpm$~4W_T|6en02sOU)LGm!#2RYE5SvH`qrbi zUj551blRsZe~*J>=2-{zsHeuOcYPszM_E(v{KK1p+{rr;a-?Ls_W((0i zCHDY0W*oI^L%s1nLn$xPtDaiFd;lC{m!`ketJ{hEeW!OlHP8RxdiCl$%^vnwsYjwu zy_!bE`|A4j#`hqlysiy7eZK|A%!5qasGiy{@G&^X&WCQyaZi)nZkurRvUAgV<9P+r ze%ozcZ#*|tay_@KS8gKTdiCY>odb^P7rq9^tdktE6~{eEa)GVusrl0@Nv?JqPTpj2 zciNRl`;__7*jR5or$cgYfn(-@hi%K*Zwblu?Z?SG3mlWaZ%BDZZO6s?G`Mdy``TZn z{qFD2_0t3X%C+~GgJb%^-UI5@L_1O1r%c~0lKX(<_TQe1cNsXwZ`yVTjysp+ej>TV zj$FLYkz8~jC+`}P>%9|KPLCtGPe^Xe&Ro0?k=(#tIC+>%>K!`Ks~j8@>Fo=XziK(Rkmxr zgIv6G!7=+bYeV(a{L3jM_Xjv;KjCR%PLDsp-9Y$P*GD-&cI#NZy4*Id_9^Xr4>%@& z{e!r1-Z$WweP6wH=ko0=a1U$gx4%j~M(n}W^QXWu`VJjjPraw~COAgk!FzJtDw5l; znX})M;F$Cc*^A>I1Xn}M%Re-flNTFSuQn&j{g}P$)o_BlYPO8%_0;=YCxN@rj!gTM@oq4-o_a54Avh*~`yE`b&e!6zzsh*;0LQ$Cw(B8W zJ9HDt{q;~z-Xd^J`nLWXH~u{n9J4R?KO}e1VfB^w3*_7Qr@(#;9@Ag;8 zodd4X{!#ms+|A&|YQNiGCHDuoit{CTeJ31M#lO#UFN3RCuJYWVqw6cLo94Njz)i3d zuYF2AHW*j0658+fSIJESS8*OBAMd;1j!9cD+Sead(r0LSP%Ai>qQIpCQ5_yinN&-X~ytE08_+h3&~SAb*e_cOSP`7(G4?ySjjO*)Np8c5T)fAEW6JYNa24kx@^&71 zOub5K_OQQ7yW9${;(SwH-uCVFmG|A`xrN{uJO2i*;`&xz-sDMK{;mX{B=;G~9dQch54{4e;y&cO9{Zol)$?WGm~qtBr*ZPm0>{|-CvZ%> z<4)(~tpvxkYtb{R>^scc?|N`d|IzbIuG~)qXVUj>Y&OuRH(vy&&zE@eWm<9r&f>V^ zNNy#`^_$DZJA>p_fYa-*lfF%7m$u_h+&q%|3fz%ed*LK+z9qTg=W+2aAi1wdZpb{&ehWzMTW~2Ne-AmIi}yBgjJyrHIe8OF?h$ZId$7p` zT)dOPF?zfRu9dK#e|~AZ=2Y$%fMe>%x8U@7M<;nlU&zT@29Bxc8(hT6n@DnxfMep_ z`r^|0XD5B>?AL730JO`fn&5dd0St_#XA)o z6YolJO#U`4P2iaPbzRHFdkD$hL~_5A+?eY)eQzVVhU>ZdJCWp8 zkler>EaCK642~K1^uB{jUjiIszeh-Uo7~Bjm&xE5`#nO++u|;+{+c126i)LN%fK=I_<*-L`yEGeD@m^3J6!talbq{a zPLD&tG2^`ZNO`^A&1@2cLjr%HNPLxOguixz9;% z@Ryt(mw;p1p&tL?^i6d_WobKG&@7=2fQW9&S54Hxf1 za7?`4f@9)Me8aWlE5I>+Nz=Dnew+=C8K?XRj?s7IcU-*JgJbIX@8Fnt$9&Im*OT0@ z;Fx@y_yfni363fEgMQ@l<9cw6U4A9G1AgMrK5$D_@o}2Bo!pD7M=QZG zoxW? zo>wZl4w8EToax+9DR02GJ&osdNUodYeg)T}E1Lf<<&Esu(|F#TTeOU~U;m!Q^F}0hIyfeM{{v?_4@Jrw|5q-3FM(t1yxoAF#&d;ayeETW()R^8 z#(sxx&&hij9Am%O4jgv}IMaE3Qs03)a`F~~W8`f)u&42!8X4~y;23#-fMfEbZ6{8T z_rWpo9=H8Tt(>bJ4k3^8;-Ues7 zmqN-rG{o8EQE*K9_6T#_JtXIgaPn>j$F!&0MLGXq7C5G!{{fD%%j{TB<9UoSKb{50 z#Cy;n&Tm=@j_EHwyK#EVA-SKyna*F6`i|e7i}!t!J7Nz`-Yei3J0Cfi%eULXHEZpe z{Z;DwH8|6Ghmsq$Czo$mfis==FXjCX&U7BA zc5sZp_BzQ88_LOBLUMhFaq`Xr$Fwi5y*cg#lKT-HW52|3F5b7nG4l4^hbsq{fn)rL zZTIEUcLlf;?MkbC%KEX{2(Dc_ljME`$K-FvNX~w5gJasYiYT>wx!7=&q2Ptpnfn2%zkmN>>;q3P` zIHvxNIfyF<&w*p?y!Tj6-#frD@^(C!Yp-U5WAg1oa7=lgcnGJ*t0Xt%P)^=$B)7%i zI6bZg$BehOIE>4W`QRA)ZGJcx?|g7fIcPY7EBB|7-0$F+@-pE_F5VBoG5zlWM{(SJ zBsbt_&dz@)xy{CL^=$$;#(po7^7^%M@lFM2y2nKN5zm8T%Kg4^&fmQY93yY%1XrG~ z1;^O0caq~~fn)mBZ^1G3ZDNY!J|MZn)115)Np56@%a2FFG4*oS@tnLHNp9N-T)v$H zj>!*q8#k_vlia_+F?QK$A~!F3COD>ksAD*NXMsy<;{^Mwtmki$@(ya};(Z1jQ!hi4 zIQv}RKq zCf?sjE^`8Bm;Zoc;yv_4uH3H%$H*HwhvSx#+}0;?2uYqIygV9%V<=|d$Ogps0Ra`rM4mhUV|3Gr%7ION&29Ak$ zufKD4ehM68=jKIRxw;q}(|>GzHOJimj!EA(i#fZ@1;?~&u4}mZ+X{}!j};^ryq2q% zi%725b)39e;21lv0mtO;?CZJq;5(9=bOTp^-v-C*m)iA4ZXUB69Mf+6LCS0W2N&r^n4Cr*7lg zm)YQ$e*a@|OustrcFr$;6C6`Nc3HyNpW9w~54zp#>&xAT2mew+o4DOazOT>twyJ?4?z&m@<4fNRHB zlH8yNIX$i=x!w$&`<&zsd6bLy5t3_qjMH}xIHrC13>-5qi$BiAdj~kC-QDR4 zZalLT9HYn9Pjcm@9UN2No&v{|tIeL`N`<|{qb77g~V#m_>#dG7o7daCtmioe_6q&)Zg=w~*ye=UAWc_;kb zQ{7qox$sTOYx)KCqpt9C;fs`aw`x#_7k({%k@D87X;6)|#oz63Qr@mTz!Cb6u4_=+ zZ(~a-eoA>W25{+H1+I@FUMX+&_ME&yJ2a>oLf&pWHmLc<ll z*ST|pGMGh4dGo>jstd}0m-5ctr9r)6;H12CQ-kW)vmBK2&Wtn|=MSX3&%o6Y<>l+$ z8`OT~(U$2uXpaWfLdZLN2q*6qaCZ^%&f2#@olK;!=ZFTiV~=uB+Rr~4jfSCIN&ER* z8q@{7tIK=z=!TMW(CiRWUSM2Ly!=_9^Afy|h8S zLzL&t!Uok}lVg9C^3DcVPv|>;af7TUJJ)Ll$$ypY!B>wps8h?avi{@P$5B6s^j-06L&^D~wrH6j zqn~R~3BrDN{C~{de|(km|3C1n8LFMF(w1;A4B=2QDUQqvBDI)%)T3&-Zrw?)K)L&b{aB^?bgb zuh(^*v(wo+-F{1oJ6F*!g&TG89uRkq;(S^AneIF-+T7N-N-@7D8`~ONt)jvIJL`A* zwzfu%VttQF=<*#U?rBB79e>pAx0txTitBH7s|@3P$kY0zGvCePkik|?@Mu`75QF%REFw&*(mM~#r&>3E<<(yyjWbLB3`&_hU)%)LbnX#O2vNr zu&1tH4(gSmy1%-pw=Un8#NDjOw@Z<3eSP9I>$~JU-Td5rGmJwO^Xt`5`asdoi^Yvp z?2ltF%`om)#9JtCg(BX>0lM{FCT^=@e>`=Su72tM4C5(9{hk@3J5R@!W*9|^>+h?> zb@>`2GK?*X`fV90c_`MSVpN7PKykmZX@YKkc{gSle#QJIPtwI(C9b_9-lwDh4?j1$EelP0c%@p^VBHl#{bn#}1TdIh64T=jO&cI zN?d0}{kFZW%Xj~!8OF7W`Hg%>7w;i)-|i(3XZ>!g)5WV6cbH;+OPA^5HHrI4F~1G< zx_EzxOIOVA@8!C9N3F;((iHKIepeUod~urZS6r}Cx8EKXH(oKn*6-`)=Mi^=B3{2$ zx_D#7?d|(&&iEgX5P7`l=gD&3J;xzT!^|3CVdwqtnucCfOY|zC!M_i5~ z-k^=Tc(;jbqlkCUCf)h6R@^s=^ZCtBeCG41;zYcjO*h4C~mmo`a5Wg zF5VO3$`tokY1?$`ag4YDihOTv(#`K3af=oC-tv`heou-UsF>fc+ja9hj zlCRTMD_xz^H7Z@&>ALwHsdR-(SE_UsN>{CPbxPN$bZKWO>!);uN>{3M6-rmFbahJC zsB~#wW&M<{Q0YpQu0rXmm99?d8kH{XOlAF)u2AVpm99eRs+F!z=^B+Tt+%p%N>`|K zrAk+!bk#~%r*w@)+sSEqE1N|#okte?^qDqX44RVZDx($y(l zqtd0Ft*oEY6)Ih+(p4y3wbIooU8B;a6)NkebcIS+s&o}fSFLn)O4q1#X?>LSQ@TQ> zD^8h2kPU#wzF0HS!eo9xU zbfrpHp>)+sSEqE1N|$!NvVKZesC1=DSD|#(N>`_JjY^kxfwF!|SEzKQN>`zD)k;^V zbd5@vcA>I`|KrAk+!bk#~%r*w@Xfcg>C*Zs>!);u zN>{3M6-rmFbahJCsB~!;DeI?ng-TbdbQMZht#oxt*Qj)97c1+hbcIS+s&o}fSFLn) zO4q1#Y5kS;Q@TQ>D^8h2k zPU#wzF70w<{gkdy=}MKZLg}iNu1@J1l`icHW&M<{Q0YpQu0rXmm99?d8kH_>fU`zD)k;^Vbd5@vHc(kVr7KjrQl+aFx>BX9P`YZR zt5dp0rAr&6te?^qDqX44RVZDx($y(lqtc~arL3RQ6)Ih+(p4y3wbIooU8B;a`IYrk zxD^`zD)k;^Vbd5@vHbhxJ zr7KjrQl+aXfcg>C%QO>!);uN>{3M6-rmF zbahJCsB~#%%K9l?q0*HqU4_zBD_xz^H7Z@&FlGIeu2AVpm99eRs+F!z=^B+T?OJ91 zl&(8h2kPU#wzF6}yH{gkdy=}MKZLg}iNu1@J1l`d_#vVKZesC1=DSD|#( zN>`_JjY^j`LRmkhD^$8trK?c7YNe}Fx<;i-yIxs8r7KjrQl+aFx>BX9P`YZRt5dp0rArGa>!);uN>{3M6-rmFbahJCsB~!~mGx7)LZvHJx(cPM zR=PT+YgD?lQOf!$U7^yI{tvgq`S}szPTR}pM>yRZ;`a8rc~1A8(j7J0Wt^cH_Zo4% z6z)-_TO+QABHn&uTt>daoi0ujZ;aB-6L+R!+->6a_Bkic^*D5_%P3UD8!YY=g_|z! zWQD62r|Fm9lWH;PSaQW-=wR{nc_6-J6fEke%0bMeYHWH=DL+NQMVpviPPjURvE8a zoTkp}#cAr&=4M@8dW+MHJ5HRYe$R^2oClwa)6}oyBwb&fFHUn#-l>fDhB(dqz7eO{ zzwTRfb?z@t)6aK_)0{&~l<{^d;~f*!_1~4^G=1=pI89%z6sK8_-^FR_*Y#Fi{f3Ft z+;`3qr5iDJJ72C6ca~z@$HZywOV)|g?DIBv= zgT!g#g~Vz4^c``Ue1BBV@8~;q&liS@)2#0-rCY6Z`&R14JwxfnitDE6gSp}~&!e`8 z)2v(eUAleVUz}##2gPan;B9f5`8A8v>^INdy8Rmvr|Fk!ahh{-lQ>OX4!lSAIzzEI z&GU+f#cBFwxj4=J?k;hfbvtf~u6~2XY1X$&oaP+=K%C~h`dgePk8bzs>M~U69#OjY z#A)(PyHD4Dy_9Z@I8FVkmGL$yUHkiW*Zm8`Y4+u0rF%`B=KkeJahm;cbVzr9RU%Gv zUdKY^Lo=^Gj#E;5~q5;B~H@^>&0oFhjysa z&F>ato~f#UpY_lRzv_fxw2#cBHBeWh#j zsP1+23&m;fcSGVd^IIiOvmUKy>aH{W#GR{Hj~U`L*YgeHH0OQJEM2@S#cBFJEKYNO zuuYuiKJ1{!boWg@ahm&$yTobE`^8H4y*SPN?h&(f*N=hXH2ZR!KamOlXBdwCv@}cBTn-?;1+S3`n@bp zvyXO&)0{6|p445BhKkeF`B8D2b9|#X&3Ss*9Nl?;wKz?`Oc$rgV}&x_A4=D4u5R2i zahmh_d2yP3zFC~+e(m6DT_0R7PILXO5~u0=m^jUO>Uv6-?^)tB&jW5$x);Q0?$@@9 z)8x^mMt40Ah|`=0)#5aL@Ub{eU0hG=t~0&GY35fhPSbx2#A%*~?oiIpJx^Dci^XZi zy;m78s&wCr)11#IKBKGO2yvSAog+@Of43;zVe@r)_{C}VM_8O@J=TlU^nIIWb#*Ba zr#Y`Ciqo72uZYuJXTB1rxt`}fr^{o2I87c?#cB5Ma;5u2Ilq&i*F7&AEl$(V^TcWD zw?&-h^~Ai0Zoid?)6{vUI8EPg6sLKTjQfx{&3;=YPLuCGFY59r5T{w+ zo5X3($ydc`_T^4-n&-)RTVT3x)MO82NZ%{kd1PV@cWeP7jGKYEMPTrbPTY3@s&QO5gB8L$0oy7jnF zoMwG*7pJLnRGcQ?@0H^o^}23;1H@_iZ@M_m^(`h&bDe3sNH@RU;xw;2juEHH<9TtK zI&T)I>HBtX=6;_EB%8o2YaPl`bK!(Ae|K`96x1-qgMBST0Vpz7eHs zQablry6d@L+{JsQYdG_LUYzE>={u$C{Vd%d!s#cAfZRGg;o_gSus*H@fozfBjXsmmwgH0ztYLO1U9;?7s} z)hpsO{bIbUo8P(OG)lkY~Q%Uz|re%v5Vvp-%Ir@7AjDNd8eIWb+lhs0^F zgK=@iiazc3fzDNm)4U$BT%6{dZ2O^ZzYP$lxzCv=PP1+aahmnWU+prwD(W{>oaXuT zqvABZ$`na0bCcy;$@8a)*8c1_JRhAHA*JtNcTtcW+^(M)5I zBHrr9GL4h=`|rB^IVaNyE9yLJUZxRLjGOaZrtwVc{~kBGFw;0eG45BdXBrPH@(8|_ zY3!>Q_l^~r#?y*%kBMa(ofOXdQKm6hQJ2peGL8Ec>pOgt%uf+7^RrB&o#NbZH)R@c zDaQR|d!}(m+y7p-tA3JoYxCdk?qsIXRguT5e`gveDqLe)mJwCBC-%!yog2*=S;jWS zIldt)%g9so!5lE=;9hIf(t1G(b^6hm(mg+iF(lyI? zNU}w?>uf8n`N|C)NlNaS;mGv!|ic@ zb-_(p#+Qn5yWN~+1QjkaDNA*ZUott%XrqWX=#DI7jUtcZE3%BG3b#YtN`+f^XO{7m zVt%vk$};*X+?RLj*5l24viAD*WlIK{XP;`Z`%W{-Y0LRrQMig+i8)5IGf?si4I_2PUAcjN^){aR<8zfz8S{DZprjTE=H_Y*qDjVRqWN_YHJ<^06$?fbgU`8_Z0Tt%IK z5LcjZ-KXjL>S}RsD(-U*o{?n~DXvG?Jd$O+u85a2OYU%&dxH*74bHR z`&xT||ef`hrW{B&q7`I;B{Jprg0mG2C z9AiBc__2dA)cOzj|AWQhtk;O!`EDy?yS#?A*?b+Vz4#-=;nSC;i#r;rr;T!ZVoWjP zrT)90!>t5&FSr{WZVkBmz&+`38^JvY?mdUwDlRqe)cmG``@!LMLcD3<4v`nXFyCF^ zri1f2oUz0ncLumg4%c3sRlnKbA`aIXTo~LZ4wnn=32?1PwalXn%-;RZHlthSJ6xPK z?(^Wzak$A4?*(v^9B!JprSfLT+HDHf?ELYM~5pB*V7!g7TkeS zEbP;n;<}jbRd8oI+){D5rh5%ssl#oB`Mm+|euvvGuDuy=F}PP8ZWqK`0&cUz8E@J3 zi-Kz_*A&dRwK!|sH^FstxX$3-0yoIvx`@k_$5ZS3Hn=Gc*B9a~1-H=Q28y%x`8(h? zI$Vi3Yu)O={poO1Al@=?M~`b+mucXZgS*(_W{R`ww*uTmhno-XU2xS7w@93o$4YST zIowv5-+SPGcDU^@?)%_!$G6OPm$+PcJhg7Cz@6)Go!_?CBL;4?!{vfo1MXpm>mtso z-$&qc2R+GKZTF^ZN|k zLk_nH+-7h~9B!q!TzNb-zpdcDa=7i{taEJ}xXcMH^UYmq*SQH?zQc6`_XW5?4p#u~ zOK^8OTz_z1ft&AeCE&J$TkUXT#1+Wnsk-a{_nX5l5NFlp8*oS6*s?C$#aZi{0N2mq zc7ppB+)WO*3*2|$<~p45j=dh=gIn%!?ZtJI$5Z+41ox}M6^OI)_yJt*O)c~73-Nvg z*WckLg8K*4X(q@E%V4- z*3npGy0liiVQRg5JKRQb15LL-xM2?0t==BjdYv*AZ<@mm1lJbgEpfQX;;g#3zdAPxcLyz4Q`CXtrTbNk3+%Db+}#PI-BDj25z0h zwSU*n;|OrAf-UptCa$L$??`Z`INWe?*8GkFca6i%6xZL3mj`Z|!)+JW-gHNUd&}W= zfjb7=cMjKjrM(`JO!Jk9{u<@T0&bQWig>jmd`xB_uj|D6f$L5G_r&RUP&;Fdbv9C21% z&I0$7!)+Be&8*+~;7*v_GLJE<>~r!0aHS5nRh+eM7lM1-;dY4|XpU=rKPS}}^$yoR zX4m;*i1)3-4HRe9|Yur)b zW;@&hak*x^(csoQ+!}G#c`ydtpANTCT!9&HEVvWzY?*K8)pni7f%7}u0&wHOO?9}w zYwSL_3EX0bTPkjWIlqbEzHqoPAK7_K0(Vel%RCl{v+8^cxJw*vsW_{C72s}nxRv1U z1oyPVtr0iI%;RowF^4Ny+wq_86Q}maJ>Y(Fxc2MpJnjW|)Lkv}%>@?%cZI`s6F1zP z-vi*LINVH#_Yk;O9Bw|i>EO0F+#+$E&2eXd%euQ|9%~@p6X4EsxUJxx1b36e?Syfw z!OeHL)(!Uk!BgNiI^1w^);_NR=enn59&^N5{WlL>PlsC|&g#Esz>RRYMG$X3xGINR zDK6Kn^RwVqINWw|)_Ob#?q`QHKDO%;0e8Zbmid;5v&MY^+!YQtS)5gu7r|9H+%$3h z%{*QL_lCo56=$u-0&rhAT<7)ned5dD4!YNohqw}R+{NIE9B!$&fu>smZj8fq-eBLq zM8Q4na0TMlnDMOl)wGuX-sEuYH`?`k3*vQjrK!xV&jC>(W!4b)DG`?ox;AE3UuUr(c7c z>~J$7-VSiDIoy13-+z5;&adaE_VukJxH5+;5m#Ww%LX^w;pTwL z0k_WKwu-Z^zn#Ffo8g#W+#dHpaD5zZBDl`rZg#ju;Hd!|eihFvQ#8a6Lb> z=XVIWqpMoxF%g^_+z^LbByPA_=R?6g?r^!A?QstS7k9W4ah=V0hlA_%uw#DWCYvr7 z+!YSDOPn>oBfw2}xRNdQxppMDwGKC2T&_9pQQ$f}(sF)N#I-kF9=IzVZYH>+!OeBJ z`7pm@z^!+<1>jBqcfg}9=eG!)EWtltslMv#a7)3-Q2)A74!07VJoK-7)Zx~M>no3@ z_W9%B-f_6jTW$9wxUU_qL|kg#sd#h1Wz1}u?{IO}ddvlPw!=+?cu#}7&fzA5dk$R4 z;iiC#fU9%3Y2aQ4_qD^#6ldkJ5ZnQ?TIM?+;=KayOov+l@m>cv%;A=b>nx9_>bwYC z$l*4^xF3Ui)#0{^%QfSz2luJN8K2wvZUndAV=eP-FV5~fNKP|!r{7s`x@LXhwCZMTHjW!cEeO&N6c=SZ(nh_^82av$N+bq!wnbL&2;U+ zjdi%0Fu#uA<~ZCOaGk)da=7{6I)mHga0|d41n!t{%X}A!v(Al!!4*54(P;O<;o$Cc zxYpphfP2~D+Jox`Zj-}x7T43Pb9ZoU<&eYY$^9W-0k|_AZXmd`!Hsvg5^)9QxP8FQ zbGSJWuP?Zb4mTg%Md0>*qGcWn!1V`rlEWu_7a4F&hN!)*sw2ClnYoN#@2iYqbK<34bHhwH!1ejac?xTy{|N1Roc2f;0K zxCP>@^KTls9S*lhoYkjQ;0~DM$OGa%0`5$Q+a=E0m$SfK=Wqp0_WWjpo9S?U!G*ys zbGZKC9tXG6;Rb@63odVN%X~|~Ed+O&!wnZ_)$bK>_c+`fh_@5m`wllB+>hW|Rkxhq z0&qWrJKNzFf%^sAWQSV{?pJV29d4yK>-zB>B^Dw@!`ydIf%;8## z>ul`4zWoXAX@|=d*Tr;yf&1Fw`og$rY4Qi;E45#atZ6yF{^0fjca6gh1h*f!M;)#N zTpMs7JKS(_R=!!_I>}8ao-dOjUKel!9BvA@dQ-A$Ya+&#qQgPTH}7u>zX6@j~tI3GCc^LF-jJ{N-vk$8S^4-i)d z?m^-L;HDB+4sIH8L2wTdR|#%9aUpOsh^qouMO+x%!^G8qdxW?MxJQYr1vitpD7aa~ z)q{JCxEQ$E#5I5m6Bh?(eXiTy`nd_*6C_>&+>^vLgPTKK65L$k(!aLPziQ%K;GQBb z8(a->Zg5W%mj`YhaUO8b5SI^bK5<@f&k|Pz?m6Oo;GQS07+i!nKe!i&D+Bi;aRG2I z5mydw0dYZaFB4Y@ZXt0YaIX+o1+JF3Ft}HVs{!{KaS?E@6ITmv5phv)ZxB}xZZUB& za7&1502d`L4(?6jn!s6~cel55G6C*w60aHDQsR=}-XSi1hkgFl5$6K8jJRxY^~AZs zEhjDy+zR46;NB%JAKXgfyx`s=t_a-w#QDIjBCZ%*j5t5I4~Q!R_aSisaI1+c2e*c} zAh?f+s|2@}xDdE?#8rW7ATA8 zarxl36Xyl@HE~7Yb`a+S_YHBy;1b07!F@|y8MyC=3xNBcxN>kii3@`Jfw)R=KN1%L z_Y-kd;F^gGgZr7d8gRc57XkMxakb!f5f=sb8*%mEekU#l?hoP`z$J-`gZq=XCUAcd zmjL%San0b2egF6O)so;^5tp8@&%ZR{T;TR0E*o4rac*$?5|;;VKjJ*#_9reMob@@f zd%GX^f@?$K6@hC@oDWmahzo-2PFy9p zlZgv~JB7F^aQVcA!JSH64Y(e}MZld#TrIes#6`jNBCa0X>BPmrok3g!I4^N=aAy+N z1g^KK}}dbAjtaTsF8O;@sfQAubQxxx{(Eokv_gxW2@B z!JSWB5x5J8^MSjNxMFZV;{4$H5myH8BH{wzE+(!VTz}$%;4UGq65OT4g}_}#Tot%t z;=d&0cHN4A8$jaKf*VL&6x@}>)q@*ETnyY*#5I8P6Bh?}HE~Vgt|2Y~ zZZL7p;7W)~f*V3y`uFzvS4x}<+)(1O!Icr`1~-hjJaE?%=K*&earxke6Xyjtg191Z z*AwRhcLQ<7-~z`tZUS*N z;BF)?0`4Z_YQaq;E(-2u;_AUoA}$8*7UCMf1&ND;yOp>maJLbc0Czia&EO^zmjrhQ zap^nl^RI$97q~l#%LZ3ToEzL-#N~mzn>Y`+dx*;iH-$JaxO<5!0(T#AK5+LFR}3yh zoFCi+#Fc@2khlQ2sl=6on?_s^+(X1wf}2iU2;2r;wr%{BrXK*72>ME)e;v5_bPEU;9esx0`7I+hO~loM`-Hd{xKD{|02e1N z4(>DJn!s%)E&*-}an0bi5|;$`IdSPf+2>y)aV~J%h|31oM4TJk7sTa(`;s^hxUY!I z2e+L#FSxIXD+0HJI3Kugh${w{AkGi&TjI*VeMejX-1o$lgWE}55Zn*MRf7AGxDdFX zh^qqEOk5b;&&1V$`-Qj&xL=8@1-A>_e)C#>4n|bmuG4mZK1etCJPN0)Jt5mDkhj65 zJ}0X?an0aPCNAG&$2*0%a&djlar23bf;*MC^b_rIdk|M7Zl*czX~f0FO*UOm;`}FN z|NC%)V z77&-+-F9aa=ND(?QAk`wT!}fqKE%0B&i?oFN{fgq19uK_QE`*aanB{rdx|~odBjzT z8*awyOI%W%Rp;}GE6TUWy@0r|I4jU{pE&nv+5h}};MDnd32`;z3e5RkN?emTtA3Xe=jmzpX)$pjaRbe9FDI@^ zoYgN^5a;V9=bwBaQ7Yd7#5J96pH~BkD?YmUHrtk z&dfIEnDx7wxQMv%)Zy_Y!eMRxt}BQ7M)>Vx}< zi;0_Ku3Lz>z{PeR4-l6WXXWuAae@AJ9#e^ninFdq(}>Hy#J=Bnh`1_oR=nxNCB&sZ z2RU_rHG??!W!c77vwl^?CB<3&_b_o~#diNaLR`H#E00Hsb6;-Pc_wiIaaKRiBCZMI zJw{yq71{s(+_~ArHHowOB}`oL06X5}#HA0k<2^xKxi~A|Cy7gln{2M{9O433+Uqfw zxO#Ba#JLCAeee`l#1)USU5vQ6IBWlYKwN0FUB3^BYXY~LIPVyHzpWuI zEY4cDkBDm)H`A=kTH-=u?K-a`&Na?<4a9}SS@ZjtxF&H{zpN+DGv0O^h$|OYV&=P% zxCU_rrrShZcDdcBpAZ)mXYI>RiA#vH@{JRhKfxaNGvdPHmYR8NCeDAO9d8S9_2Np* zcw33fyD9shpBI$6-}s!kxHv1{M&j}&+Vk5+Tu5AjIlm_2V&W#6?hE3IZqEMagYHv# ze97D-yYIguu3ntg_uGkc-(tJ3i7OXp<-3EpT5(pLzacIO<0gnJ4%&V2EpfHttn2=F z#HHVA&+mKUeB!KlJBbU6v+Dc(5|@5^wz1Rfm!F7h7B}2<&BXa9+x7dI zxTv@(X1rgBE4sse9qw1+g5s?D?IJD)?lh=?nY-%p(zt%ysAv-V{gart-I zZXe=;;ue_WrW5D6+s=1i;zHsUnep}`uIL_nefK9W46ZeC&EVP)=bK{pb6euV;x?Lj zWDr+=uf2a=#Kpx;G~;CwSA3s6zbxWvz_lZ;8C-kfite|^?Lb_WxPfLK2N0JKH^y`w ziSvi-akGhwfXg8+39b`yz6b36b|7&fan||VnYd=g`5##l-D2>vsro z(W&^$;_3y3Q*;~h<0Oq|sR#}Ma!*xpCS5?3zH8n+8^4d9L=F8>jGe#aA6Db8Bo z6Nrm}^AMN)sJ)L)BrYh9>g_=?e#c~IRE4JIoXrAFt}dC#l`hB^F5uo z>?dq@25~-d1!g=iaUpTmb?Z#xn!xoY&ikajKh7eqQk*qz0daA0W6V6xCeAm<&bN@b zkT~lc>O)){;uR6+o@?iO4sm7Ttn1~u#KpvwnE9SZoTu8(w=Z!4aaO+P6BmVe7Z8^e zXU*?I;`~q9``kxdvpA~{`Vr@=vGcfyxUe|ue7=~tCUE_U^E_?O?-JrF#aVT^l(;5w z6V3I#j5z;1d)#8;YQ-%z<6TZ%`7`$Y)fL1g#TA(G1`y|+pKYu$-9X}8&)UzUt|Trh z&Z^5G;_{!f_t90vg~d%V=jSIb?|Hjlt|l%ZuEdOY4RJAWgNgG*?0zmGE(mT2aWQbE z#JOLv?>mPQ7Ztb2%(slV@)zy(9Y$Q2`(=B7+(4XPoOKQbh^v8kBZ+GgXXP=9xcr6oxTA>+inHR4AucAaz+AVn z#JOIv6NSxH1s5mR%7m0JPu;aZ%TtJ)^Zvk;JaaO)B6X$x@?$d?D6^om1*6$VKlH#m! zYl-u&v|lHDmAII=HRial5f^^XuFLDhCB<3&vWU3+_w791Ag&zTV&ZDSEg`O1T#1=) zl(^zm_WpR2xCpqnh)a*z=kD9Y1;8yOu0fo2zPv-6=L0+6I^sg$mJyc_XN_A=T+xTN zTTWb9+yZkwRuJb~ZO40;xEgRPiA#!GX^#6IarJBL>&N@Vm3?HNFRO^F6*t@*H%6R$ ztsUKyfqT@wqhNnG<`IY#Ppb5isBinw@Qj7jX@PbBq#sJT>lb#N`jQ_uKEpHI&)z58}$NwfAL`xaja4W1?A?KZ(m9 zX~+AExZr51pX8d#_iy52x8@kB&v!~WL&i^iwU&RJ@BfS5DdU>`(u%nByJS7gzE2}A z`yM%;&3O9|*EB`W7c*WuagqD&e%_b3rcjPC&5XAnaphC(e%_zBy}Mi;5FOj5a(TFyH3Qp7Rz<8 z?e4xhkht1r9+yMUFAq+~)@o7g;6FjCU|`o)7GOeh6{i)w18rcy8iiYh-=p z@zgnVC~@^4%etBI4kIpogPd#9OR0E=6W0tbm$)XmDYoJrL0rQo`+Po4?Bvu z?9Fn&Vdk4hTwsfgYvy}2akb)Rn(i3ld|Tzd*c|s*;%Yz7`S<-?U5JY|N*?C8#}Svk z&CcU^;{4!FAg)GSPjg%kadB`b5|`a%$2*BQpSU^ZxLt`$K)i0m<$Ym~+nqQ+xRZ&i z0(S~=F>v|BrGIJ9?^NQv;Cc{O4(>GKBH(%w*95K?aqh3|JWeOB7~C1eg}`}6H*;V1X71}8BiD3i5tqNi-oFLJdB3su<=Mnlid$*sQAnIGVaMx3T$MO0 zUJ-HrZ{>WJ8;8_+e-3fJU*vi1VY}VA#O3F7G6tH@Kh7gAbVw&-SLW_`eTl0)u9MOK z(B1BQ;u_BF^zYy6xPZ9Gc``q<&KDAw-dEi8-Q)U*^MBIm-`7R^5$F1})4$)3x`?<+ zaZ}9sT@0?%yq2GT>WX(V+M8~S)I0Sh%V;>A8{AmpJmAI==LI*OI3Kuj;{4zy5ElS< zBXL1+HxU;CH<7q7xSNTKfSW{I6x=Pu#lQuLi-WtBxCFS{h)aUIojBKLcK=N#&JFGk z;ymCgi1UKGlQusXrW5A{H-k7IxGLiO;2tI}0PYdug5Vw{E(C5S zaba+?h>L)GjJPPc*~G=bg^7!Udz`ogxF?89f_suU*A~0~<`CxwHht#o+B;_?s?*3;3CAu!M#9S0^EzlCBeN! zoNKGye+!6ngL|1c54eTIdBMFxoDWG5*GmX8gW5zuM-ynw}`kfxHpK4fLlyl z6xi-7xtxG1Bj+!w?Jz>` z2dqwjrTsCoj za5=;Uz;z-n2<|}QLf|?R7Y26_aS?C_6Bh+{2yroRZsOwL4ka!D?l9t#;0`Cw^_AU! zxx~4_9YLH2+>yk2!5u}M4_qE`esD(<7XWt*aY1m$5*Gs3g}5-dL=|intg!KXGwzR}+^2cMWk#aD$0+ePj1u32|<4Lx}T$D<#egZYXg+ zaAm~#!3`rW0Pb4ig5a(rE(C5kaba*Hh>L)`p13Hu8;Fa63lJ9vH3GQ~{T;JOLH<>s$xI2jRfU6+R3+_(heBdgH^MkvKxB$4j zi3@_ehqw^9Da3`r-Ah~q+3|xq~IJgIhOMrWjxFoo##JRq+`)?X?Zg39~ z=K(jJI4`&v#QDHg5$6Z@FmVBJj}R9G_b728a5ISugPTQM1l(i9MZwJ`E(R`4TpZlv z#3jHzL0l5tlf=2cxBG7nac*#PiSvM~Ce91)DdK$KYKZfLdz!caxOv0{!97D<2;6+) z!r-1IE&}d3;-cW5CoTpqLR=i&3&bVBy+~XV+)Ko{cG~^7fH*g}mx=R$TS%N2+$+TS zz||7x2lpy*0dTJo7X!jE=pV++?&KDz`aFW65QLw zxqh(wZz*wZaPJW30ar(y7u+)9eBkPd^MhMXTmak(;)3AbB`ySRC2?VJ?-3UP_dan^ zaI1)mfr}9r2loMS32+}0mjt((IMm+elm(+$Q28;65QP3hqTmsx?;*#LD5a;^I?!T?Xxxsx- zoCjPZab9rSi1UGKBF+!)3*rLcz9cRP?knO#;Iu0uV} z0hdOc7u-I?`M{+U=LfehaRG4q5f=ovKXD;&t%(bRYeQTFTwCIz;4+AdfpZZT2bW1) z0$dhxNpS6mbNyoXUwh)*;5rcJ0e1j#UT__W^MT7I&JQk!xB$3L#09|}2=3T%} z9&m3E=LNTzI3Ktr#QDKRi3@;xlei$bw}=aYdz-j0xTVBJz`a9U6kHu~F>uR>i-W5t zE&*;iaY=A1h;!|-`|n-i+~8Ic=K=Q~ab9rm6XyfBia0;G7;yn`9}pJ=_aSj1aI1+6 zgIhyf1l&i&MZv8lE(UHLadB`B#3jIeOk5J&dg5Ha+5NYHI5)VB#CgDNBF+o$6XJZ} zJ|)f%E>2tk+-JlE!EGik1a1p)VQ^cCi-7x_xG1RxUlZpAw}UtzxNnH_gG&$>0QW6%L2%y@7XtS^aba*fiHm^yfw(BR zABl^B`-!+XxMt!K;C?193GNr-Tz}a8_bYL3aJz`}fcuR&FSy@{^MU(=I6t@~aRG3D z5*Gyb7jYqQe-jr5XUNZC_+QUcBH&sP7X_C_TnyYk#Kpm-6PEzDFL6n5`w{0#+Wogb zac*#}iSvMKL!1{}TjG4+GKlkoa}gH+mq}a@To!R5aP5c-gG>D!kpJ0#;5rZ&1$O{( zF>oD;i-XH1E&(owxFonv#JT>o`|m*F+~7JB=K*&Rab9o-6XyeW2yuRJZsG#q4ka!K z?l9s);0`A)3@(?r2)HANi-J3nxEQ#jh>L^EBQ62%XyTIKjv>zVm)(EI66Xfjg*Xqm zu8$g^J+(6V~51~-v7 z54f9&^Mad1oDbYB#QDJmi3@rSh7YA2K zTmsx(#3jMqO`I#;?!SA8bAy{goCn;!#CgHpN1PAb{lxjfg@_A)dw{qgxCe;~ftyNP z7~C}CBH$h(E(&fsaWQZ+h>L@(A}#^$Vd9eD9wE-Puibx-66XdtlQ<8!S;Tq4Jw}`l z+-&0f;KIZOz&%b}5Zn{Qg}^;YTo~LO;v(SY5*GzmO|{NN(Q1;D*PToBxg#D&1UL|ho$0^%azUM4OI zZXt0oaIX*-2Ukm60^F;_CBeN$oNIr(|6V7~4Q>%}9&m3E=LNTzI3Ktr#QDKRi3@;x zlei$bw}=aYdz-j0xTVBJz`a9U6kHu~F>uR>i-W5tE&*;iaY=A1h;y~J`|n-i+~8Ic z=K=Q~ab9rm6XyfBia0;G7;yn`9}pJ=_aSj1aI1+6gIhyf1l&i&MZv8lE(UHLadB`B z#3jIeOk5J&dg5Gd?Ec$8oEzLm;ymCs5$6T>32{DfpAzQ>7bh+N?la@ zFu1M6MZkSdToha*aWQb)h>L@3A}#^$3*wUCz9i1o*6zQrh;xJ6PMina*Ti|j?I6wv z?i=F#;1a|Iz(5xSxqjg8PLy zSBBkxzY^yLw~IIrxZjBLg8Q8~AGkk=^Mgwg7XbGsaY1l@5f=jYH*sNbhKs!a3S2AV zqTteqi-FsRxH!0U;u7HYB`yhWKjK_2yZ`nl&JC_LaUO7Oi1UJLOPmi}2629HF5&{< zGKmX<%OWlWt{rhL^E zBQ62%XyTIKjv>yKW%u8)#JRzBAS z=K*&Warxl<#CgG8OA zZX9t5aN~(<23Jm865Ish(hsoDwHt|ZfxC&gY;Y5abA!8?xIA!^i1UEEg}8ihLE^mN zZY8b=+-=19z}-$mTp73u;sW6AB(5A>C2>J;cM(?!?r!2j;O-%=3fvUp z!r<;Dt_IwF#6`f}Ph2gy5OGm(4-i)m?m^;W;HDDS0B#y_ac~b2*92}laS3oUh-(H{ zMO+fx!^EX`w9mgsh;xB^l(=kgGl_G9n?+n6xW|a|fSXNRKDaP(UT}{SR|M_};(Xwq zB(50T9OC@o<`P#1u9~<2xTlCK2UkN}5Zu$mRf3yGTnOAV#8rWtPh1$>v&7YadycpW zxaWzh1s5SM3ho8s>cPE8TnyYx#5I6hKwKQ$%fvN-TS#02+$+R2gR3Pj3GP+m(zEUJ z?=|9F;9e{8t|+~D3IE)U#d;ymD%5SI@wN}Lzmo5U4?dy6<9xVMQb2Dg+rKe%^@ zD+5y9*6Bh)xoVZGGD~Jn$dzZK>a4U%mgL{v-8gTCu7Xi15xLR;A;-cU_ zAg&(Vhs4FettPGk+#2HI;65U*3EW!Z65!Sm*9@+KxFoobiA&G1&%gD=xxj58E*soN z;@sdi5tj$<6XHDJJ|!+6T%0&BxX*|y0=JnsAGj^V6@%MKoFClh#Fc?-BrX7M8*$~} znurU6`+~Sia9uxi-Y@txF&Ev5|;q?6LHPpnu$w-`=XZWnQGaK90k2kv*` zJmCHyE+1TyI4`(Ai7Nv47jZste-l>>&d9Xi|L6RElpkCx;>y6K5f=cr4{_z-(uoU# z+n2aXaQhJ#0=GYLRp43^7Y5gcxEgS6iHm^CAg&gii?}GbOycUnWf2zx*N(UbaP5hU zgX=(C6SxD2OMvT0Tr;?A;*#KUh)X}vKL0uq=K^;iaoONH6XynZ5OI0n4kpe6?hxYg z!MTa^f;*JBB5;Qh=L2^*amCL^kPFxeXlZi`! zJB7GraQVa~!JSH6dT0Cm>p`3g+-byRgX>A08(c5q^1z)=oCn+)#N~tY66XbXCUHgJ zdK2dZcNTHQ;0lQIgFBnJGH`{&1;F(ot{hwuaY1nB5LXHAT;f9D&Lgf0TwmhC;Lazm z2HXY2MZjH1TrD^saZzynh^q&85pgka7ZcY2u0L^caF-C*1nyGe65uW)t{Gf0aY=BO z6PJFFeg0iRoD19l;Cb=L0vGxMFZ6 z#QDJuA+8KuDRBXCLy0Q~S4LbA+%V!Q!CgyS2;6nVRe>8$To~L4;%dNMPh14t4aC)g z3lJ9tHY;u7G-6W0u`oVX;o3B;uzY@dHO66XSU z6LHz#CKBfccQbK$;3g600e1^=`QU=YdBNREToJh2i1UHFow#CflZo?#yMwqga23P_ zz}-n)Ik-yVg5d5Vt`gkc#D&1!LtGWODa3`r-Ah~zxci8UfV-c#T5uuaqTn7Nt{&Wj z#Kpi(C9VP7G~(jm9wM#@+;rj+;ARll46cf}B)Er(OFzUu{~jUE1@2Mevcb(H&JAuB zae3e#BhCYEHgWmj!o+#OJx*K^xF?A7fqRm;VsLYa^Mjj9Tp74(;sW5FBCZ@<4RJwm zPZL)OZXR(VaL*7|1#UiZVQ|k9R|D=j;v(RlC$1J;gt#cU7l^9|_abpIa4!+p0B!+s zad0ma*92}MaS3p*5Z4T@mbfIiSBXn^+vneF#JRw|PFyy)MZ~$my+K?axW&YIz%3yz zA6%3;FSs{}D+2cxaXxTw6ITpwDRF*q?+{l8u8z0>xMjqZgR3Vl2yQuXmEcwo7XtS# zaaG_}5*G&d9&t6`-X|^sZWVF0;9|r@!F@nnJ-82vi-B8BTm!f@#KpmVL|hZNwZtXB zts|}(Tmx}Qa32$weyDx^ttZX}ZUb@I;5HKH2Dgd0JaC^7=K=RAarxll#CgGeMqClN z&BXb@Z6U50+*acJ;65j=3|u2|0dU)hD+kv^ToBwB#8ra(lDH7KuZXJxx1G2!xUY$; z0k?y=2)J*Es|A-JE(-2j;_AVDM_dft_rx`T+eus;+z-Sxf%}oT1h}7wYX;X$ToT;R z#HAl*pMSp)=K}XDaoON@5$6W?8*zEyekaZY?hoSf!6k|Fg8P%WB5;3!yU6kR5k7E# z6ITq*kk6V(eYKWcmk-WOoEO}o#1(-%j5r^-!-*>f zmrI-<+!4f;fjg480Jx)wD+iZHToByR#8rYjhPV*8V~MK**M+z+xZ{Yc0e3uc5pX9E zR}0QVTol}i#MOg4iMSZJuEaHf>qcB0TzBG{z@1E70^BLYHG|71E(z{b;?i^N^REYS zE^wz2mkq8bac*$Eh|2?aI&mIwXAqYU&P$vZ+?m7`f$L4258PSA6@x1v&JXTv;>y4k z5*Gm1hq!WZMZ^WcokLtDxO0gMfjf`5DsX*?3xhkKxEgR55ElV=A#t_fe8fe;^&_qx z+(pF2z+FsS1GxUg#lc-dTobrUiA#XHjJRfS#l$7ST~1v35%&3a1#vEL1BlB8H;_0t zxGRav12>2`54fv{%LnHt&I|5p;)=jsL!1xXVB(6wl@R9#H-xw{aHYfrzzrp?99$W3 zL2$!}s|0r~aUpQm5myCnIB{WcBZ#X3cRg_ta5oTF3obxh6x>MS>cNd7E(UHiaSh;3j}8mDi2`IY#?-qdz~~C}}+G@2;Q! zE)S-1F^u$9eNOLMKB8;sh|%K*_ZWQIDTBLpm;ZGgGi2xuL#`V(KK0o6o5!af?t1Nz zks|^(cO5crWY_aYm5&=SYW#?y<1d>qX3Xeu<%5TeA9<4e^H0z|r~5A-KWyB1f6!Rj^n_96gM0LxIC1dE@#Foef5wj+ z>Nf{8iqFrL|DAnlzudFOj~_O&G%##jZvQ^HH+JuFQm>PGT%-9-MXKaTRd#ykny?aj~ZV-Zo*uQCB>7ldL&39*JKf zksR)3vmU6MU3Wh>ibxhVh!{;)vnu=h*YUdEzw34P5J1c~1#hZ(W2o>hOAKN3jB?T1pXF;#A?6)A!xOt zP~P=tu3J|W4pCx;h)8j1(TT;U6yH=uAE*fp36aB)(9n?Q7#<%A9UUnqx3dObQ&oI( z)xb?ej;y~1nT7jTtEjLjtEx{az%OO=JMR+I;;-_j##w~x07{o6RafFqW4#ES0lUz< zZA9^q0Rsm1TN93~4G&l!F1Rt=a7#G+({SkL;n2xo#uM?TqzIjWpG5=uH57*i6qJOH z51kM?F)|`FO4kZJwXq!v!td@s(Rjd)pzu!e;jlR0!Xg|N7g{(Hjxbyxmihb(87>mt zKL36U7mI6r{{6*9A08m?x9}*G`;!d+(!xWLUX@=ID@+$IBv}-Z-CxMGhx=(fKx6d3 zG0kh%_L&eu;m+1J+DBRrgq7NIfmNJv%ru$zr|EsirxL4DLjIi|>tz!XqvK+HOQNY~ zSuEMUw8Q*vO|~b@?|4&FS7N1yy5jA4L>SoF)6^bs1D=~~8a=upacNJYJ2iSVI+WIA z6LW0t>?Frtrcic2e^M3?O8&;~Y7$tzDOH_@C*cC?RQ+8SR*F{Zj?jNQxiugpdg)<; z9gc#fv~Y6=9MmI1`E*hRAcA4A^!BOjL;hMhD-!;877BrG%4cYJ_-$Oa`<394JJqpi z8-$-`yz9WDzKVEAw=^!^Ch(@hmw2YF5brr$cD&D7@{Bw2UT3`5tn{Iqm4;|YMWf+_sNx$CM$mK@%vM% zfqLWjGsGBCP#)b`5XDtW*Jf!8Z8w(QCvm9sq&GsP)o&_};bz+5=%_a$?#$Tca}>YrD^ld;^^j` z1K-%Zb12;2M_AQH4sf2)81G*38JuCP)@|s3=T|}brpmYy*O5NAxDo~6ez@B?YwAh1 zwn&E*rkj*Eu?knf%pyxj47FRkM2f-+vHVaLJ`LoL^uk|}SK)VG7VnJ3YLOo`J;|fg zO%N3K@d$-zI{tqz>#n@YdRc2vqBjLC`7~KBmyga+sGzG-=pv^Um~GZfbDfBseH^4& zvwh#0d4|l4nlGu{zia%ZSy{rdH{uK%>+-x4ZWhf-L7 z2$m9hy$UfTv_Y;x^g19dU))$VP_AGUcR7EUyxQX}(BLX)ItK~X>DkZ#g8ETwLTmXPxx?w zc+LNE<~UZDgJ1nPDs*ev$0sG)CVcF`jo{(&4_W?a7FX(())eW=D z=}(2A9;mvdrAsWBJ5$WBJx{F%W?vPwqhZ7HtgDH3IMZ|H9YA)KSalrTV%88p-GxUx zGcs+xe(2;5U<&ETu9QQ&PD*Q>v``(iL~YjtZ;XHTYpnJ#$~qmN zEMp9>6Am`-Ibav>Ud=P%=^6Qf0hY~qZ$S7}j?RknzKj6{^^x3g-ajJY-45Qv2xvRc zK*pn77%=Bu1m31Rc>BOxlLxO8i{LKa_Yu}k-#+kMYs#D#!h)r1O_}p%fH%#NKF;d_ zZ?1#)bC$lJfEUe!w>?i@2n)3?d9Sc|PXceYBVNv14qjCryl;Z{1qW{j+|cBx`Af4C zyu}7sHmwz7NaL9qSV+Df4yVKA6zxjS?*G9B5uTy%LZE2m6x@U-JOz!wZU^-J13MfE zAYL6vwmY4pZ{#5f(ztkZUcBL9Q#p`F8vurfARh007H=_lls^ouM4_U|aGZBMcvCgc z^f@G-^A=h>+yc_Lc+r{NuK z@vdO;(tCLn52X*oGieBO9=(5NcxImE;?a9nhIgzb?^eW%|DK`uiClXX4}gUBETWo8 z?-~4?9T4sW|Bmq@$n4_|-pXWKtnRX;RMP2ax}?n8tC-~0HL9qbP!2UDnB036caD*X z^!6%F7NbPL8}r{BSvc>*k(fXhZ=3h#SqsPQjxOB1v-GHOZFal1>Z z?%&>T+w(h6Nw}(T-G=GixjQQMmko))-?$fw`?rfIIMJ#dmDpE^h%LK}pB<)P+x^>% z;8!|)7vk8yxAdqjd(K)2?tm>Hh^>RSkKFp)jv-rb-Z60B>DxzayAS&qn|B_+753J9 zc9v|r`3=QU{_jEi@p`IuMCAESoFP!q~KSD z+TB26Xk2yZs$|Azph`OOs*+@TGG*#wVt#dDf~f7Jatfrz&)L@7?*uI(mf-I}T5k{R zE3|^zd9=EIBdxKUb@m(8db@<{m4{k)zxHsaEwUa9-)cjEb_4YC`@zwqGfUA2TMv(J zRAXqeqy~7HnP@||gfTVvq5S2eJg1+` z@VGQWhTh#jm*E7%YZ?9)!!I-Z8pFF7rjqjv;*T<1!*GmY8sB*a;lIYPZ!87>mze(^ zhWn{XRU*M3&2TNlOBvq4@ZU203x;dypv&J77=v%KF9EMh7$~5$?ztIpJMnmhNUu~Ro^F=#R{FCN`~h!yp-W}44dzJ z%P3I(<~ytgoA2crd@|y!0iB$K7I+qgTz1k{0B2!D&DgEX|MT1h6kBNI}|FthjEsLOTq85@KBV`Jr*Ya7Z~2p zaM>_ZTUaLqzZ~$4?_j-_>~G^m8nVADL<`xEsJa*ne=>7%jRl9y`MAb{M`k&$vEY)S zx(h$7+6dWdxTyBT+sN-Pg^>1N={@25)w*?fv&Ii-jE$2EH2-34)7mqI{|jwjrtNFA zeUr9n2oQcy%eha>L3~mUY`M1$dm`~+C$%lZL7ALxIf_T(do%{m_#1Zw3o^b{uT?G0 zu`ay!muySK8drBFx??q63A~uMu%k8Eyjo;>FX%~i_M{x%wOw5uT``Bp%p_ith}Evd zyMJ>ND-*5u0#33$mFQZER}s5o^^~r8&@fK6FI&(_uUFVa>wP$Ty@rx3VzHI+SZlI7 zg5`d=?q;8dO7y&rmL9zSxG05;`@HLCQ&DtvtW35f zx?(XBfj2*V6k^QpX>Eq@UfhG**juS^e!U?H5>2X^JD`X-`Mm(w>fb zNP9XeBJJs{3FTcAZ*6UYHnpol7$Y!oo{Yd0dW^tidWw3`7mCNTo^BBv6APaR7-Fs z48hT8jaNWQNo+t$$txhG=}@e+8xqUVeP%1~hEzOO)6v!zZ*N(M_MGr{g5=wf=%piET zhTEH3QeXrK9?;U@L#6GIiTB}C!4m5m@g(j}#oIb-T9bHUIwcs2%QG#&dv3WBVMGKy zy1ZlrQQgb}ldEa@q&0}@NT`>*objt#nHz7y5G-?CwBi_N*|ev=fpTv=Iv)dSjG57SDd)3WJMgZRoj?8LqX&R$N{*yua2y?e z2FKA2XbyVelz()p98boFW)HICDcc7NSGH-_rmF$+#$(Lbd`=%q9bZG zdzqPRPSv(1+I%%7d-C}mEv&i8{++g;7bo!y;8O}2Xd#YkNjbgI@2II#1MU;6!Pyff zIh)Z*4WQ6m%IjYPIJRDAc4^cJcyo#%X_BL>Br7Lpx=0dxW@iy7AC~6v5Wvekq9J>R zYvRqz6FFoq?6@pvp)_=~%}lIJ;$fFPzD0@Vj`kMytO=@h!^t5@4QO)2N6n+IqhrM) zjN<}|j3{Wm%`58Z^ocB_>MqRgW6g5aAR8}x)1c@wa~3e`UtB-WjwyiUOBk&T;4r6& zmE}|ADgk~^nly1@9%3@n9T1=HWvrqKAm*J<-?%fkT$_$jSMC6M2C+1GsjO-FmVyC` zl9%J45z-6SuPWpg$F|m$QhDxRW-I*&diB6wVq&?~Gz$%>gMYmt~Wl21=s@q!{dfE{{YEZfObS9NuKokKc ze<`f7kr>2rc-zfkdOIR_Nn3S8RYT{^#Phug9AWbfY8uaH;=mhPm!^x>smXZzDGGY; zHqzEK=WWs)vW#lMnT+=fU|U7V@Y*#GmNd`~6CWC2*_`(=cy~}jnBlyQ(7ot%@GeI< zpEGn2qD&S+&WnPF<^2r9c~674E`ue+4REvLtwDj?+h-;S=QV;yWy%fb-434X-3h8A zJKpEPi*jMWocDGB?;$3y1Px=hLmuZff>-6>Jq|ajD&w^Yyu}7s_RsJeTTq_a10LL7&)|m-UY7caXoN0@IVj%XuXn)J*(e^pL?`g}M0UpIe zJfvG1l1J}a;=gC+f@g;#58|z3^3Dg3+({nUWL&%@7SG5f9_eHmOktN>=`;Cr@m7IX z2R_AX)Now9t>DofF7ePLq#@onSiB!t@s?!a6%R|7-ynhqH<{T_j+y4{ks)+Y<^A8hyHG5l@dSFQDAeT1Z{ z`{Mx5He!0ddNeftv+`;{1f9(x%|A5-Qm#JI-w;@fyCQR_<{IP9>S=GLTuI#l$GZW6 zVboDDxFMk{T!52~>gbmU7oiIBi#a{ICbb1B)jXq52UKq+q`Wk2l4;0!h%0GJMC1XU zheka<NY8|5q7)kKsY89jGASpTY24hT9n4$ndurev#ol z4EI-^ychrH8LnZtiQ(%Q{yM|IVEDfn9+bXQWP3P+;W~yB46kMQ0fv9V@M{eJH^W2C zV3JA%^)Zg&I))Pr-@xz#4AcC|Gm!tU4F8Vd!Di4(fxxd|cmc!h46kSS?->4jhJV9w zG0jtqLHwsOJe%P-!&fkT7sFc^{&$AGNd=_=@t;J4V`G4;8NQg|%Nf3l;b$3sk70Vp z-7|=99>Xby?_>Cv48PCtK&HceGQ-sjU%+sR;Tsu#fZ-o8{40j{Fx-#nc#medn&DQ4 zuVwhJ8GeT09Srvy=#{>#|0u)L7;a#=jp17ueuUvy84j7rASDC!KZfC2hA(9Ja)$3> z_%Vjfx4UJo5uf>1tik46eFmFvLm6zoMPl%6W|B${koPphZ!tW~Ojb32D#I5sd>zBz zWcUS!-)HzZGwIdw&0x5N;TstKCc`f<{4vA*?L{k;$1x0_$?!6UH!}PT!}}OM0Sf@9 zQQly};gA>wJX1l5NvE7f-DJprI`BpXC7uav4C$PoV_^Y2&%$)xnjc5Rmwf&O3>S)o z&%cOaoW1Y!FBWTkxWBmF!ldK<4Thh#@KB`pKP^l;*~78!GFNAi{ONIg#zX48{Lt;{ z{anK3a1Y&~)^`an)Vw9+j>*b$jjtpOedaY9Q+GZVd@@m7^qb;-QaRP9T+yep zoroE|Y=@$Y@$!@@>{ijIvJFLYhtf}4VbH0lrM$E0gEEGrUKqonqsth9$@J2ZC9P0u zGg=dN{i`U*GcbkZ8JIZo3`|!#B-8BF%4D_{g71#*Q`vTvxKZ?Wl(+G6Hh?~rZTDLh zXr6s4+iu14K9z0nRX4PfK9z0%dw+c@+vztU`&71l8rhCfg#XP*t4V*^bG#fcjLn@fB5DalTJwTfJrN(~P#ZtnIR*l?Q#dW?|&5%6y6`uJmTS{{qq5zM_ll+dLSj`i zML)^~Ii+`yjeCXG#f5V9LD7@_Q@$n{s8Er2Ic3wSc1cf{hfzsB7+=&3{NkiJN!?QY z{fvBuQm#SLI;7c7oQU6~m|_gA!IGivK6}0LIdZfe2*YIX!10~OrfBMW!}>Q_uSA51 zTG;%=va>Im_rUv}@w9CEo{F8Ezd^$7C4NKYyeGjk>)M7x_BdR&yb$(#&HjMRo56Ue zgV$pd^lyp-N$)gX_ky?B0L#7zzwNF6_rY6;y*|>Hp9Da(|z_aC(8_By7m+g)Z4@x~%l82;9Lp&_6`*B{*m}zfX}?vkx=D~;|}-01Ew&TcNnnbHOOM((6o^NlC8_2xHCT*bYNtCQl==SLr>&yN^5%yL`~bxsqXs9s~L(t+qRR3Em=)#hR8ZiQ$*}4|_?x2&xN+yf94dF7l2jNfR@eAuw+x zn%r1FNP5RPlOFlHJo|dXx|^U{tWM$9zj}8JwxI7W4h@|(@S3XPo2v$Hs-h9Z0e!qt zez{R#JdmMtOgAnSBwfZ(V^9O6^stR?AY-n>59LptH8e5uYPK0Y)~a3yw7LvROO2Nf z>OJyJhwmmJF^5OnS>9$8oiucYwr>arTxmSX20oYJOBlYM;RhK0zYM?0@E(RgV0Z`$ z)iX%XScc~?+|KZg41b;BpECSwhCgEX7&B<6L?J!p49{VBIm7%+?T4BF^9=81c%XVd zsUkuAr!zc@;bw-{Fx=ZSwF}dCqs;%Q49{VBIm6d8{2;^6F#KzVKVkR;GuhJhF_GZ~ z3}3?V^$b7A@Xr|jHNzh=Jj^U0==78^JeOgv|9ms^{}#i~GR*a#BTOIpWQJ=QZejR3 zhVNzgDTZHQ_-%#<7OSQz|DwH)VR$~nD;U0w;l~($nc;UBKFUmXb$yIscrnA*G5i?A zzh;=9v0aWe3eOfUhLU{u_p$W%xG?4`%wxQyGpkyo%wC41b5=ml*y%!zVC( zqR?QeWIEKaiYmm@fn_icDRSH*80A%C0?WTaBs#pl*xaC#$VO= zMj6_q9!rqVO#`{7pLi8X;tO*fKn986Gx`wZpJwxOG|| z81iWSlH^MF_1fLy8F!UOkTXqf#wwG&7k?17gsr*p+4Tz+#Tu96;HMUfz@C3duZC3j zTpVua^usn1cei%lFiWvkStQYS#&gBgNmC|Hnw+P?a29odKeywbq4=3TJ7@p6>6@p3kRJ|*MBtYmzUPZRAs zYZ`~}^_?}HJ~G$QkE5$4RcNh=l%_g*81FFXzO$xjP}&_kbZ1T5gSU*6oE=q@!Eto; z85~Dz&>Wlx+IJ#!z_IgrD2MY|lC9?FnkQx4bzA`EQfZE^+N>O1wVVSDPkFGb-02t+2TT}R=06}>uZJy`Q`lpPREVVJ8?JP}yP~XlJv?fQl zeEN!$dFT%0Q$xP2CJN6`9H zp3bY*s5rnTb5OKwb847Q&!>1Yvt$%h^9t^3E;$dg^_QkUY-9cS?$vEg9j)Wzt;u+| zRFBo=)S7I^G1HVTTQfI}@!_m?C@|QR&Yq_BI6ji1RBQ1)E_^C%{L)r@WK4|jPIaZ? zO|X~iUztl~ZWmfxql?zs$dLZ4ZOpbCZSQd2Hj8L@XEPq1H|wo4!_V-zzU6Z8{%FZF zKRK@nYpefF31NowzJ!RbcJQu8INSME?Bhk5EP|Z(0eC;kgZDTJ630JenA_lD$2$uJ z3RTJs!+Ga{cSZ(F2+mszp6guN`w-TSm(DRd%^{ETc7hjm@V?9B6&4GDrP~a{d0z!@ zb_Pp`AHxk>)1AiapTTqK1-}3Ss@^kWu^;y+u9M(m%A1zd{{@%5Rreas@qkEqzNraM z_!tz5&7*HX(t0#3N{=+eTL_+Mv*h@ZgGXCWH-m@&o*4!O3tK*Uki5+--Y9sKZi<)u z$+&ps;E_A=j9kLsVe+P0@=Us2ygKlzv^+FzX@5CyY1x6vSg1lnzV0vWoHvQOo4iZ^nB*lO;d5e)C4e3FGNEk3#Ez=RL6| zx^JYY!nNi-vElU(hHWdXyME@lef>(RekTTP#nm}`>ns@(e@gd0I#}%6FFI#`2&7v2 z0c!cu$+4-n?nzV1%jBUY(DD7u92=X`)k!La2c$xnHS<*1<+zS?rO(Sy3hn_Fedj>c zExvw-Z-{m!y79>rldk|}TX!I(>Ny%=5!>a5yxd7o;z%#|tMV@QWrQTg{k3(tyX?eBgNuFJ-us;VT)&(QRo1d5@+Miv8XFFEac)h6mXR27e60vlwn- zcn!mMG5iF>FEYG`;Szf+gY=AN_*{l_o$vb{#{VV5|H*KH8FW)QA^wvYu4Q-`!y6d> z7Q-(xyocfbX0WW||2)Gr3^y^nmf_6|KgIAX4DV&QzZsO9^e{Y|;UEZgV_00bghSxFt4Tk@b;av>#^L{WHj_Szlj38ziQx?lKf&8cqws8h*Wwc{ver~cKXx+1H4M)IHbWHBm%Yq~BXTNJhBIrajKes?mgDs(1S z+M)Da*wwKz*^>S)yKfYL@5)Qk{GQfUml#jIaZ#%809{p7D9=@^U1g=UMi=#Tc6M~7 za?x}*nO0$QJpcRjP}MNCzP&qD2L(7^)0Nt$3%lC7-9CMKs2Ez(6U5b2>vijMv^oDN zwvO?GpWu+-K9trW$xU=T2;D?S)V!m0WlZ))mFtTg)Fo~o(xOsknzH_RI!Po=t&O+6`6JB2Q* zR5Hz>P3tUl>uA{CwZK0E9a^(?M_Wkro7VKmkgjdH{H6YwEx>7jHm?QP-VQOmcFj|v z)%*S*8(`U-w*tcHoqTRMZwJ0CH&NIk=Ljw3-)P6FnOiXBf_-y-$~JEa$xvz{B#cFWy0@z-UIS>f8l8ed7ao4>5W3!8_X_kMlNy zSL@(C4mWIPcN(u>f#=ep{TT?TQqPQ~28o6hg>{#9rDgkn!ews{jzu9G-A)s}7@QC? zYuX|Op9vmqQ<2W5;Sr|uAnbBk2%aq;6sfaW50dSE5qK02$s?N#*__v6@l1H)eTm6y z1&{Ja@=Us2yeq*oI0EMS~ zm~Ab>oHxwkQNGC#ZzJU4zh_2(H{3(%9}j|rb|s?PX)<_UM;dKIavo;9*G?9~r+)$t z@yaSHCt9kpInVx`Ts~PJ7Mxo*c7#foryDy)oGwn-`?vlr|u z5dHU#7`$L#NZaHy13sT1g_PR^Rtb$)Oe*u1QoIEj(u&0;1s~yhi8twbJcK1c#Xz^p z5ndAETTm445guwemRZXf=S`?IdYY8M06ondp_R5K^-YNXzQa=;)YBa4)j>T`FRNq0 z%0$=F){e_+YUVeZvuY`;y{#B7M^zC$){vo?+P=X|7B(WYKjk$h9msvF8mlG>9^m%~6ep&6raNGr9}%w?|{MK~mxA`8=SPx0&z3bgn0go-GF; zig$*T{&PH`)Eo9zsC^fcwCYOyIrQq{ay&}$ks*EY6V*@om-M|(@?q$E`EW!$;KK#t zbqkaJmmfzME)Z{8{7ATv;Ub3nF}B37%L0SkLM#=P0qm;;0Ij;QxS?2ZR3)(2(9^iTOn z7#$B0m|Zou=*(90^_kTY)a-Io8d^H+TYnC=|I{fUBjp40h^6G%?5su+Kt9h`bX~JJTiZcx7 zwSaSL9=!Ju(L;Ig{tA8OUpja%Atko+87P!!M(Q%Ztu+U{wR!NK2k*K(c;}*ms7$%} z4>;KAdlfvjEaqo&-fr+*>*Jg^8jFYd@L~bH-?H@G4PMlrG>JIxhk5eoof(%r8r#_A z@<;IIIO65JS}Z1iF%RC|;LUgNXe^A!ai{Ux1)ghNemHpM9w2TNZT7(7G+1U_O3&_5 z;Mw`0H%uYYXOJ~90VLafE_mcl^J5ZC#>H#2co;rN +#include +#include +#include +#include +#include + + +/* BIOS/XDC Include Files. */ +#include + +/* mmWave SDK Include Files: */ +#include +#include +#include +#include +#include +#include "float.h" + +/* Demo Include Files */ +#include + + +/************************************************************************** + *************************** Local Definitions **************************** + **************************************************************************/ + +/************************************************************************** + *************************** Global Definitions *************************** + **************************************************************************/ + +typedef enum { + TRACKING_DEFAULT_PARAM_SET = 0, + TRACKING_TRAFFIC_MONITORING_PARAM_SET, + TRACKING_PEOPLE_COUNTING_PARAM_SET, + TRACKING_OUTDOOR_PARAM_SET, + TRACKING_CEILING_MOUNT_PARAM_SET +} TRACKING_ADVANCED_PARAM_SET; + +typedef enum { + TRACKING_PARAM_SET_TM = 0, + TRACKING_PARAM_SET_PC, + TRACKING_PARAM_SET_OUTDOOR, + TRACKING_PARAM_SET_CEILING_MOUNT +} TRACKING_ADVANCED_PARAM_SET_TABLE; +#if 0 +/* Scenery parameters includes up to two boundary boxes and up to two static boxes */ +/* Each box is in format {x1,x2, y1,y2, z1,z2}. In 2D cases, the z parameters are ignored */ +GTRACK_sceneryParams appSceneryParamTable[4] = { + /* TM: 1 boundary box: {-1,12, 15,75, 0,0}, and 1 static box {0,14, 19,50, 0,0} */ + 1,{{-1.f,12.f, 15.f,75.f, 0.f,0.f},{0.f,0.f,0.f,0.f,0.f,0.f}},1,{{0.f,11.f, 19.f,50.f, 0.f,0.f},{0.f,0.f,0.f,0.f,0.f}}, + /* PEOPLE COUNTING: 1 boundary box: {-4,4, 0.5,7.5, 0,0}, and 1 static box {-3,3, 2,6, 0,0} */ + 1,{{-4.f,4.f, 0.5f,7.5f, 0.f,0.f},{0.f,0.f,0.f,0.f,0.f,0.f}}, 1,{{-3.f,3.f,2.f,6.f,0.f,0.f},{0.f,0.f,0.f,0.f,0.f,0.f}}, + /* OUTDOOR: 1 boundary box: {-39,19, 2,50, 0,0}, and 1 static box {-30,16, 4,44, 0,0} */ + 1,{{-29.f,39.f, 2.f,59.f, -1.f,3.f},{0.f,0.f,0.f,0.f,0.f,0.f}}, 1,{{-20.f,20.f, 12.f,40.f, 0.f, 2.f},{0.f,0.f,0.f,0.f,0.f,0.f}}, + /* CEILING MOUNT: 1 boundary box: {-4,4, 0.5,7.5, -1,3}, and 1 static box {-3,3, 2,6, -0.5,2.5} */ + 1,{{-4.f,4.f, 0.5f,7.5f, -1.f,3.0f},{0.f,0.f,0.f,0.f,0.f,0.f}}, 1,{{-3.f,3.f,2.f,6.f,-0.5,2.5f},{0.f,0.f,0.f,0.f,0.f,0.f}} +}; + +/* Gating Volume 2 "liters", Limits are set to 2m in depth and width, no limit in height and doppler */ +GTRACK_gatingParams appGatingParamTable[4] = { + /* TM: Gating volume = 16, Limits are set to 12m in depth, 8m in width, ignore the height, no limit in doppler */ + {4.f, {12.f, 6.f, 4.f, 12.f}}, + /* PEOPLE COUNTING: Gating gain = 3, Limits are 2m in depth, 2m in width, ignore the height, 12m/s in doppler */ + {3.f, {2.f, 2.f, 2.f, 12.f}}, + /* OUTDOOR: Gating gain = 4, Limits are set to 6m in depth, 6m in width, ignore the height, 10m/s limit in doppler */ + {4.f, {6.f, 6.f, 4.f, 10.f}}, + /* CEILING MOUNT: Gating volume = 2, Limits are 2m in depth, 2m in width, 2m the height, no limit in doppler */ + {2.f, {2.f, 2.f, 2.f, 10.f}} +}; +GTRACK_stateParams appStateParamTable[4] = { + {3U, 3U, 5U, 100U, 5U}, /* TM: det2act, det2free, act2free, stat2free, exit2free */ + {10U, 5U, 50U, 100U, 5U}, /* PC: det2act, det2free, act2free, stat2free, exit2free */ + {4U, 10U, 60U, 600U, 20U}, /* OUTDOOR: det2act, det2free, act2free, stat2free, exit2free */ + {10U, 5U, 10U, 100U, 5U} /* CEILING MOUNT: det2act, det2free, act2free, stat2free, exit2free */ +}; +GTRACK_allocationParams appAllocationParamTable[4] = { + {100.f, 100.f, 1.f, 3U, 4.f, 2.f}, /* TM: 100 (100) SNRs, 1m/s minimal velocity, 3 points with 4m in distance, 2m/c in velocity separation */ + {60.f, 200.f, 0.1f, 5U, 1.5f, 2.f}, /* PC: 150 (250 obscured), 0.1 m/s minimal velocity, 5 points, with 1m in distance, 2m/c in velocity in separation */ + {40.f, 200.f, 0.5f, 3U, 2.f, 2.f}, /* OUTDOOR: 50 (200 obscured), 0.5 m/s minimal velocity, 5 points, with 1m in distance, 2m/c in velocity in separation */ + {60.f, 200.f, 0.1f, 5U, 1.5f, 2.f} /* CEILING MOUNT: 150 (200 obscured), 0.5 m/s minimal velocity, 5 points, with 1m in distance, 2m/c in velocity in separation */ +}; +/* This parameter is ignored in 2D/3D tracker versions */ +GTRACK_varParams appVariationParamTable[4] = { + {0.f, 0.f, 0.f}, + {0.f, 0.f, 0.f}, + {0.f, 0.f, 0.f}, + {0.f, 0.f, 0.f} +}; + +float maxAccelerationParams[3] = {1, 1, 1}; +#endif +/** + * @brief + * Global Variable for tracking information required by the mmw Demo + */ +extern Pcount3DDemo_MSS_MCB gMmwMssMCB; + +unsigned int gGtrackMemoryUsed = 0; + +/* @TODO: These functions need to be abstracted to the DPC */ +void *gtrack_alloc(unsigned int numElements, unsigned int sizeInBytes) +{ + gGtrackMemoryUsed += numElements*sizeInBytes; + return MemoryP_ctrlAlloc(numElements*sizeInBytes, 0); +} +void gtrack_free(void *pFree, unsigned int sizeInBytes) +{ + gGtrackMemoryUsed -= sizeInBytes; + MemoryP_ctrlFree(pFree,sizeInBytes); +} +void gtrack_log(GTRACK_VERBOSE_TYPE level, const char *format, ...) +{ +#if 0 + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); +#endif +} + +/** + * @b Description + * @n + * This is the CLI Handler for tracking configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLITrackingCfg (int32_t argc, char* argv[]) +{ + GTRACK_moduleConfig config; + + + TRACKING_ADVANCED_PARAM_SET trackingParamSet; + + //Memory_Stats startMemoryStats; + //Memory_Stats endMemoryStats; + + if (argc >= 1) { + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.trackerEnabled = (uint16_t) atoi (argv[1]); + } + + if(gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.trackerEnabled != 1) { + return 0; + } + + /* Sanity Check: Minimum argument check */ + if (argc != 8) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } +#if 0 + System_printf("Debug: Heap before creating a tracker\n"); + MmwDemo_printHeapStats(); +#endif + /* Initialize CLI configuration: */ + memset ((void *)&config, 0, sizeof(GTRACK_moduleConfig)); + + trackingParamSet = (TRACKING_ADVANCED_PARAM_SET) atoi (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.trackingParamSet = trackingParamSet; + + switch(trackingParamSet) + { + case TRACKING_DEFAULT_PARAM_SET: + // Do not configure advanced parameters, use library default parameters + config.advParams = 0; + break; + + case TRACKING_TRAFFIC_MONITORING_PARAM_SET: + /* Initialize CLI configuration: */ + config.initialRadialVelocity = -8.0f; // for TM, detected targets are approaching + config.maxAcceleration[0] = 2.0f; // for TM, maximum acceleration in lateral direction is set to 2m/s2 + config.maxAcceleration[1] = 20.0f; // for TM, maximum acceleration is longitudinal direction set to 20m/s2 + config.maxAcceleration[2] = 0.f; // ignored + break; + + case TRACKING_PEOPLE_COUNTING_PARAM_SET: + /* Initialize CLI configuration: */ + config.initialRadialVelocity = 0; //For PC, detected target velocity is unknown + config.maxAcceleration[0] = 0.1f; + config.maxAcceleration[1] = 0.1f; + config.maxAcceleration[2] = 0.1f; + break; + + case TRACKING_OUTDOOR_PARAM_SET: + /* Initialize CLI configuration: */ + config.initialRadialVelocity = 0; // for OUTDOOR, detected targets velocity is unknown + config.maxAcceleration[0] = 1.0f; + config.maxAcceleration[1] = 1.0f; + config.maxAcceleration[2] = 1.0f; + break; + + case TRACKING_CEILING_MOUNT_PARAM_SET: + /* Initialize CLI configuration: */ + config.initialRadialVelocity = 0; + config.maxAcceleration[0] = 0.1f; + config.maxAcceleration[1] = 0.1f; + config.maxAcceleration[2] = 0.1f; + break; + + + default: + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } +#ifdef GTRACK_3D + config.stateVectorType = GTRACK_STATE_VECTORS_3DA; // Track three dimensions with acceleration +#else + config.stateVectorType = GTRACK_STATE_VECTORS_2DA; // Track two dimensions with acceleration +#endif + config.verbose = GTRACK_VERBOSE_NONE; + config.maxNumPoints = (uint16_t) atoi(argv[3]); + config.maxNumTracks = (uint16_t) atoi(argv[4]); + config.maxRadialVelocity = (float) atoi(argv[5]) *0.1f; +#ifndef GTRACK_3D + config.radialVelocityResolution = (float) atoi(argv[6]) *0.001f; +#endif + config.deltaT = (float) atoi(argv[7]) *0.001f; + + /* Save Configuration to use later */ + memcpy((void *)&gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gtrackModuleConfig, (void *)&config, sizeof(GTRACK_moduleConfig)); + + return 0; +} + +int32_t MmwDemo_CLIStaticBoundaryBoxCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ +#ifdef GTRACK_3D + if (argc != 7) +#else + if (argc != 5) +#endif + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /* Initialize the ADC Output configuration: */ + //memset ((void *)&sceneryParams, 0, sizeof(GTRACK_sceneryParams)); + + /* Populate configuration: */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.numStaticBoxes = 1; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].x1 = (float) atof (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].x2 = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].y1 = (float) atof (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].y2 = (float) atof (argv[4]); + +#ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].z1 = (float) atof (argv[5]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.staticBox[0].z2 = (float) atof (argv[6]); +#endif + + return 0; + +} + +int32_t MmwDemo_CLIBoundaryBoxCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ +#ifdef GTRACK_3D + if (argc != 7 && argc != 13) +#else + if (argc != 5) +#endif + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /* Initialize the ADC Output configuration: */ + //memset ((void *)&sceneryParams, 0, sizeof(GTRACK_sceneryParams)); + + /* Populate configuration: */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.numBoundaryBoxes = 1; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].x1 = (float) atof (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].x2 = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].y1 = (float) atof (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].y2 = (float) atof (argv[4]); +#ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].z1 = (float) atof (argv[5]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[0].z2 = (float) atof (argv[6]); +#endif + if (argc == 13) { //second boundary box + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.numBoundaryBoxes = 2; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].x1 = (float) atof (argv[7]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].x2 = (float) atof (argv[8]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].y1 = (float) atof (argv[9]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].y2 = (float) atof (argv[10]); + #ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].z1 = (float) atof (argv[11]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.boundaryBox[1].z2 = (float) atof (argv[12]); + #endif + } + + return 0; + +} + +int32_t MmwDemo_CLISensorPositionCfg(int32_t argc, char* argv[]) +{ + if (argc != 4) + { + CLI_write("Error: Invalid usage of the CLI Command\n"); + return -1; + } + + /* Assume sensor position as the origin in the xy plane so x=0, y=0*/ + /*populate sensor position configuration*/ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.sensorPosition.x = 0; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.sensorPosition.y = 0; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.sensorPosition.z = (float) atof (argv[1]); + /*populate sensor orientation configuration*/ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.sensorOrientation.azimTilt = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.sensorOrientation.elevTilt = (float) atof (argv[3]); + /*demo parameters*/ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sensorAzimuthTilt = atoi(argv[2])*3.14f/180; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sensorElevationTilt = atoi(argv[3])*3.14f/180; + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sensorHeight = (float)atof(argv[1]); + + return 0; +} +/** + * @b Description + * @n + * This is the CLI Handler for GatingParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIGatingParamCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ +#ifdef GTRACK_3D + if (argc != 6) +#else + if (argc != 5) +#endif + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + /* Initialize the ADC Output configuration: */ + //memset ((void *)&gatingParams, 0, sizeof(GTRACK_gatingParams)); + + /* Populate configuration: */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.gain = (float) atof (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.limits.width = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.limits.depth = (float) atof (argv[3]); +#ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.limits.height = (float) atof (argv[4]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.limits.vel = (float) atof (argv[5]); +#else + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.gatingParams.limits.vel = (float) atof (argv[4]); +#endif + + return 0; + +} + + +/** + * @b Description + * @n + * This is the CLI Handler for StateParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIStateParamCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ + if (argc != 7) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /* Initialize the ADC Output configuration: */ + //memset ((void *)&stateParams, 0, sizeof(GTRACK_stateParams)); + + /* Populate configuration: */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.det2actThre = (uint16_t) atoi (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.det2freeThre= (uint16_t) atoi (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.active2freeThre= (uint16_t) atoi (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.static2freeThre= (uint16_t) atoi (argv[4]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.exit2freeThre= (uint16_t) atoi (argv[5]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.stateParams.sleep2freeThre = (uint16_t) atoi (argv[6]); + + return 0; + +} + +/** + * @b Description + * @n + * This is the CLI Handler for AllocationParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIAllocationParamCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ +#ifdef GTRACK_3D + if (argc != 7) +#else + if (argc != 6) +#endif + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /* Initialize the ADC Output configuration: */ + //memset ((void *)&allocationParams, 0, sizeof(GTRACK_allocationParams)); + + /* Populate configuration: */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.snrThre = (float) atof (argv[1]); +#ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.snrThreObscured = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.velocityThre = (float) atof (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.pointsThre = (uint16_t) atoi (argv[4]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.maxDistanceThre = (float) atof (argv[5]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.maxVelThre = (float) atof (argv[6]); +#else + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.velocityThre = (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.pointsThre = (uint16_t) atoi (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.maxDistanceThre = (float) atof (argv[4]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.allocationParams.maxVelThre = (float) atof (argv[5]); +#endif + + return 0; + +} + +int32_t MmwDemoCLIMaxAccelerationParamCfg(int32_t argc, char* argv[]) +{ +#ifdef GTRACK_3D + if (argc != 4) +#else + if (argc != 3) +#endif + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.accelerationParams[0] = (float) atof (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.accelerationParams[1] = (float) atof (argv[2]); +#ifdef GTRACK_3D + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.accelerationParams[2] = (float) atof (argv[3]); +#endif + + return 0; + +} + +/** + * @b Description + * @n + * This is the CLI Handler for PresenceParams configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIPresenceParamCfg (int32_t argc, char* argv[]) +{ + /* Sanity Check: Minimum argument check */ + if (argc != 7) + { + CLI_write ("Error: Invalid usage of the CLI command\n"); + return -1; + } + + /* Hardcode presence detection thresholds */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.pointsThre= 3;//(uint16_t) atoi (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.velocityThre= 0.5;//(uint16_t) atoi (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.on2offThre= 10;//(uint16_t) atoi (argv[3]); + /* Only one presence detection boundary box supported for now */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.numOccupancyBoxes= 1; + + /* Set presence detection enabled flag */ + if( ( gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.sceneryParams.numBoundaryBoxes > 0) + && ( gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.pointsThre > 0)) + { + gMmwMssMCB.presenceDetEnabled = true; + } + + /* Boundary Box configuration */ + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].x1= (float) atof (argv[1]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].x2= (float) atof (argv[2]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].y1= (float) atof (argv[3]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].y2= (float) atof (argv[4]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].z1= (float) atof (argv[5]); + gMmwMssMCB.trackerCfg.trackerDpuCfg.staticCfg.presenceParams.occupancyBox[0].z2= (float) atof (argv[6]); + + return 0; + +} + diff --git a/mss/tracker_utils.h b/mss/tracker_utils.h new file mode 100644 index 0000000..5ad09b5 --- /dev/null +++ b/mss/tracker_utils.h @@ -0,0 +1,212 @@ +/** + * @file task_mbox.c + * + * @brief + * MSS main implementation of the millimeter wave Demo + * + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/************************************************************************** + *************************** Include Files ******************************** + **************************************************************************/ + +/* Standard Include Files. */ +#include +#include +#include +#include +#include +#include + +/************************************************************************** + *************************** Local Definitions **************************** + **************************************************************************/ + +/************************************************************************** + *************************** Global Definitions *************************** + **************************************************************************/ + +void *gtrack_alloc(unsigned int numElements, unsigned int sizeInBytes); +void gtrack_free(void *pFree, unsigned int sizeInBytes); + +/** + * @b Description + * @n + * This is the CLI Handler for tracking configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ + +int32_t MmwDemo_CLITrackingCfg (int32_t argc, char* argv[]); +/** + * @b Description + * @n + * This is the CLI Handler for static boundary box configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIStaticBoundaryBoxCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for boundary box configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIBoundaryBoxCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for sensor position and orientation configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLISensorPositionCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for GatingParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIGatingParamCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for StateParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIStateParamCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for AllocationParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIAllocationParamCfg (int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for tracker Acceleration configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemoCLIMaxAccelerationParamCfg(int32_t argc, char* argv[]); + +/** + * @b Description + * @n + * This is the CLI Handler for PresenceParam configuration + * + * @param[in] argc + * Number of arguments + * @param[in] argv + * Arguments + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t MmwDemo_CLIPresenceParamCfg (int32_t argc, char* argv[]); diff --git a/objdetrangehwa.c b/objdetrangehwa.c new file mode 100644 index 0000000..f4037ad --- /dev/null +++ b/objdetrangehwa.c @@ -0,0 +1,1209 @@ +/* + * @file objdetrangehwa.c + * + * @brief + * Object Detection DPC implementation with range HWA DPU only + * + * \par + * NOTE: + * (C) Copyright 2019 Texas Instruments, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/************************************************************************** + *************************** Include Files ******************************** + **************************************************************************/ +#include +#include +#include + +#define DBG_DPC_OBJDETRANGEHWA + +/* mmWave SDK Include Files: */ +#include +#include +#include +#include +#include +#include +#include +#include + +/* DPUs */ +#include + + /** @addtogroup DPC_OBJDETRANGEHWA_IOCTL__INTERNAL_DEFINITIONS + @{ */ + +/*! This is supplied at command line when application builds this file. This file + * is owned by the application and contains all resource partitioning, an + * application may include more than one DPC and also use resources outside of DPCs. + * The resource definitions used by this object detection DPC are prefixed by DPC_OBJDETRANGEHWA */ +#include APP_RESOURCE_FILE + +/* Obj Det instance etc */ +#include +#include + +#ifdef DBG_DPC_OBJDETRANGEHWA +ObjDetObj *gObjDetObj; +#endif + +/*! Radar cube data buffer alignment in bytes. No DPU module specifying alignment + * need (through a \#define) implies that no alignment is needed i.e 1 byte alignment. + * But we do the natural data type alignment which is 2 bytes (as radar cube is complex16-bit type) + * because radar cube is exported out of DPC in processing result so assume CPU may access + * it for post-DPC processing. + */ +#define DPC_OBJDETRANGEHWA_RADAR_CUBE_DATABUF_BYTE_ALIGNMENT (sizeof(int16_t)) + + +/** +@} +*/ + +#define DPC_OBJDETRANGEHWA_HWA_MAX_WINDOW_RAM_SIZE_IN_SAMPLES SOC_HWA_WINDOW_RAM_SIZE_IN_SAMPLES + +/******************************************************************************/ +/* Local definitions */ +#define DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU +#define DPC_DPU_RANGEPROC_FFT_WINDOW_TYPE MATHUTILS_WIN_BLACKMAN + + +#define DPC_OBJDET_QFORMAT_RANGE_FFT 17 + +/************************************************************************** + ************************** Local Functions ******************************* + **************************************************************************/ + +static DPM_DPCHandle DPC_ObjectDetection_init +( + DPM_Handle dpmHandle, + DPM_InitCfg* ptrInitCfg, + int32_t* errCode +); + +static int32_t DPC_ObjectDetection_execute +( + DPM_DPCHandle handle, + DPM_Buffer* ptrResult +); + +static int32_t DPC_ObjectDetection_ioctl +( + DPM_DPCHandle handle, + uint32_t cmd, + void* arg, + uint32_t argLen +); + +static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle); +static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle); +static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle); +static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle); + +/************************************************************************** + ************************* Global Declarations **************************** + **************************************************************************/ + +/** @addtogroup DPC_OBJDETRANGEHWA__GLOBAL + @{ */ + +/** + * @brief Global used to register Object Detection DPC in DPM + */ +DPM_ProcChainCfg gDPC_ObjDetRangeHWACfg = +{ + DPC_ObjectDetection_init, /* Initialization Function: */ + DPC_ObjectDetection_start, /* Start Function: */ + DPC_ObjectDetection_execute, /* Execute Function: */ + DPC_ObjectDetection_ioctl, /* Configuration Function: */ + DPC_ObjectDetection_stop, /* Stop Function: */ + DPC_ObjectDetection_deinit, /* Deinitialization Function: */ + NULL, /* Inject Data Function: */ + NULL, /* Chirp Available Function: */ + DPC_ObjectDetection_frameStart /* Frame Start Function: */ +}; + +/* @} */ + +/** + * @b Description + * @n + * Utility function for reseting memory pool. + * + * @param[in] pool Handle to pool object. + * + * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION + * + * @retval + * none. + */ +static void DPC_ObjDetRangeHwa_MemPoolReset(MemPoolObj *pool) +{ + pool->currAddr = (uintptr_t)pool->cfg.addr; + pool->maxCurrAddr = pool->currAddr; +} + + +/** + * @b Description + * @n + * Utility function for getting maximum memory pool usage. + * + * @param[in] pool Handle to pool object. + * + * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION + * + * @retval + * Amount of pool used in bytes. + */ +static uint32_t DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(MemPoolObj *pool) +{ + return((uint32_t)(pool->maxCurrAddr - (uintptr_t)pool->cfg.addr)); +} + +/** + * @b Description + * @n + * Utility function for allocating from a static memory pool. + * + * @param[in] pool Handle to pool object. + * @param[in] size Size in bytes to be allocated. + * @param[in] align Alignment in bytes + * + * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION + * + * @retval + * pointer to beginning of allocated block. NULL indicates could not + * allocate. + */ +static void *DPC_ObjDetRangeHwa_MemPoolAlloc(MemPoolObj *pool, + uint32_t size, + uint8_t align) +{ + void *retAddr = NULL; + uintptr_t addr; + + addr = MEM_ALIGN(pool->currAddr, align); + if ((addr + size) <= ((uintptr_t)pool->cfg.addr + pool->cfg.size)) + { + retAddr = (void *)addr; + pool->currAddr = addr + size; + pool->maxCurrAddr = MAX(pool->currAddr, pool->maxCurrAddr); + } + + return(retAddr); +} + + +/** + * @b Description + * @n + * Sends Assert + * + * @retval + * Not Applicable. + */ +void _DPC_Objdet_Assert(DPM_Handle handle, int32_t expression, + const char *file, int32_t line) +{ + DPM_DPCAssert fault; + + if (!expression) + { + fault.lineNum = (uint32_t)line; + fault.arg0 = 0U; + fault.arg1 = 0U; + strncpy (fault.fileName, file, (DPM_MAX_FILE_NAME_LEN-1)); + + /* Report the fault to the DPM entities */ + DPM_ioctl (handle, + DPM_CMD_DPC_ASSERT, + (void*)&fault, + sizeof(DPM_DPCAssert)); + } +} + + +/** + * @b Description + * @n + * Computes the length of window to generate for range DPU. + * + * @param[in] numAdcSamples Number of ADC samples + * + * @retval Length of window to generate + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + */ +static uint32_t DPC_ObjDetRangeHwa_GetRangeWinGenLen(uint16_t numAdcSamples) +{ + uint32_t winGenLen; + +#ifdef DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU + winGenLen = (numAdcSamples + 1)/2; +#else + winGenLen = numAdcSamples; +#endif + return(winGenLen); +} + +/** + * @b Description + * @n + * Generate the range DPU window using mathutils API. + * + * @param[in] cfg Range DPU configuration, output window is generated in window + * pointer in the staticCfg of this. + * + * @retval None + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + */ +static void DPC_ObjDetRangeHwa_GenRangeWindow(DPU_RangeProcHWA_Config *cfg) +{ + mathUtils_genWindow((uint32_t *)cfg->staticCfg.window, + cfg->staticCfg.ADCBufData.dataProperty.numAdcSamples, + DPC_ObjDetRangeHwa_GetRangeWinGenLen(cfg->staticCfg.ADCBufData.dataProperty.numAdcSamples), + DPC_DPU_RANGEPROC_FFT_WINDOW_TYPE, + DPC_OBJDET_QFORMAT_RANGE_FFT); +} + + +/** + * @b Description + * @n + * Sub-frame reconfiguration, used when switching sub-frames. Invokes the + * DPU configuration using the configuration that was stored during the + * pre-start configuration so reconstruction time is saved because this will + * happen in real-time. + * @param[in] objDetObj Pointer to DPC object + * @param[in] subFrameIndx Sub-frame index. + * + * @retval + * Success - 0 + * @retval + * Error - <0 + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + */ +static int32_t DPC_ObjDetRangeHwa_reconfigSubFrame(ObjDetObj *objDetObj, uint8_t subFrameIndx) +{ + int32_t retVal = 0; + SubFrameObj *subFrmObj; + + subFrmObj = &objDetObj->subFrameObj[subFrameIndx]; + + if(objDetObj->commonCfg.numSubFrames > 1) + { + DPC_ObjDetRangeHwa_GenRangeWindow(&subFrmObj->rangeCfg); + retVal = DPU_RangeProcHWA_config(subFrmObj->dpuRangeObj, &subFrmObj->rangeCfg); + if (retVal != 0) + { + goto exit; + } + } +exit: + return(retVal); +} + +/** + * @b Description + * @n + * Configure range DPU. + * + * @param[in] dpuHandle Handle to DPU + * @param[in] staticCfg Pointer to static configuration of the sub-frame + * @param[in] dynCfg Pointer to dynamic configuration of the sub-frame + * @param[in] edmaHandle Handle to edma driver to be used for the DPU + * @param[in] radarCube Pointer to DPIF radar cube, which is output of range + * processing. + * @param[in] CoreLocalRamObj Pointer to core local RAM object to allocate local memory + * for the DPU, only for scratch purposes + * @param[out] cfgSave Configuration that is built in local + * (stack) variable is saved here. This is for facilitating + * quick reconfiguration later without having to go through + * the construction of the configuration. + * + * @retval + * Success - 0 + * @retval + * Error - <0 + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + */ +static int32_t DPC_ObjDetRangeHwa_rangeConfig +( + DPU_RangeProcHWA_Handle dpuHandle, + DPC_ObjectDetectionRangeHWA_StaticCfg *staticCfg, + DPC_ObjectDetectionRangeHWA_DynCfg *dynCfg, + EDMA_Handle edmaHandle, + DPIF_RadarCube *radarCube, + MemPoolObj *CoreLocalRamObj, + DPU_RangeProcHWA_Config *cfgSave +) +{ + int32_t retVal = 0; + DPU_RangeProcHWA_Config rangeCfg; + DPU_RangeProcHWA_HW_Resources *hwRes = &rangeCfg.hwRes; + DPU_RangeProcHWA_EDMAInputConfig *edmaIn = &hwRes->edmaInCfg; + DPU_RangeProcHWA_EDMAOutputConfig *edmaOut = &hwRes->edmaOutCfg; + DPU_RangeProcHWA_HwaConfig *hwaCfg = &hwRes->hwaCfg; + uint32_t numRxAntennas, winGenLen; + + memset(&rangeCfg, 0, sizeof(rangeCfg)); + + numRxAntennas = staticCfg->ADCBufData.dataProperty.numRxAntennas; + + /* Even though Range DPU supports both modes, + * object detection DPC only supports non-interleaved at present */ + DebugP_assert(staticCfg->ADCBufData.dataProperty.interleave == DPIF_RXCHAN_NON_INTERLEAVE_MODE); + + /* dynamic configuration */ + rangeCfg.dynCfg.calibDcRangeSigCfg = &dynCfg->calibDcRangeSigCfg; + + /* static configuration */ + rangeCfg.staticCfg.ADCBufData = staticCfg->ADCBufData; + rangeCfg.staticCfg.numChirpsPerFrame = staticCfg->numChirpsPerFrame; + rangeCfg.staticCfg.numRangeBins = staticCfg->numRangeBins; + rangeCfg.staticCfg.numTxAntennas = staticCfg->numTxAntennas; + rangeCfg.staticCfg.numVirtualAntennas = staticCfg->numVirtualAntennas; + rangeCfg.staticCfg.resetDcRangeSigMeanBuffer = 1; + rangeCfg.staticCfg.rangeFFTtuning.fftOutputDivShift = staticCfg->rangeFFTtuning.fftOutputDivShift; + rangeCfg.staticCfg.rangeFFTtuning.numLastButterflyStagesToScale = staticCfg->rangeFFTtuning.numLastButterflyStagesToScale; + + /* radarCube */ + rangeCfg.hwRes.radarCube = *radarCube; + + /* static configuration - window */ + /* Generating 1D window, allocate first */ + winGenLen = DPC_ObjDetRangeHwa_GetRangeWinGenLen(rangeCfg.staticCfg.ADCBufData.dataProperty.numAdcSamples); + rangeCfg.staticCfg.windowSize = winGenLen * sizeof(uint32_t); + rangeCfg.staticCfg.window = (int32_t *)DPC_ObjDetRangeHwa_MemPoolAlloc(CoreLocalRamObj, rangeCfg.staticCfg.windowSize, sizeof(uint32_t)); + if (rangeCfg.staticCfg.window == NULL) + { + retVal = DPC_OBJDETRANGEHWA_ENOMEM__CORE_LOCAL_RAM_RANGE_HWA_WINDOW; + goto exit; + } + DPC_ObjDetRangeHwa_GenRangeWindow(&rangeCfg); + + /* hwres - dcRangeSig, allocate from heap, this needs to persist within sub-frame/frame + * processing and across sub-frames */ + hwRes->dcRangeSigMeanSize = DPU_RANGEPROC_SIGNATURE_COMP_MAX_BIN_SIZE * + staticCfg->numTxAntennas * numRxAntennas * sizeof(cmplx32ImRe_t); + hwRes->dcRangeSigMean = (cmplx32ImRe_t *) MemoryP_ctrlAlloc (hwRes->dcRangeSigMeanSize, + (uint8_t) 0 /*sizeof(cmplx32ImRe_t)*/); + DebugP_assert(rangeCfg.hwRes.dcRangeSigMeanSize == hwRes->dcRangeSigMeanSize); + + /* hwres - edma */ + hwRes->edmaHandle = edmaHandle; + /* We have choosen ISOLATE mode, so we have to fill in dataIn */ + edmaIn->dataIn.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_CH; + edmaIn->dataIn.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SHADOW; + edmaIn->dataIn.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_EVENT_QUE; + edmaIn->dataInSignature.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_CH; + edmaIn->dataInSignature.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_SHADOW; + edmaIn->dataInSignature.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_EVENT_QUE; + + /* We are radar Cube FORMAT1 and non-interleaved ADC, so for 3 tx antenna case, we have to + * fill format2, otherwise format1 + */ + if ((staticCfg->numTxAntennas == 3) && (radarCube->datafmt == DPIF_RADARCUBE_FORMAT_1)) + { + /* Ping */ + /* Ping - dataOutPing */ + edmaOut->u.fmt2.dataOutPing.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_CH; + edmaOut->u.fmt2.dataOutPing.channelShadow[0] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_0; + edmaOut->u.fmt2.dataOutPing.channelShadow[1] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_1; + edmaOut->u.fmt2.dataOutPing.channelShadow[2] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_2; + edmaOut->u.fmt2.dataOutPing.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_EVENT_QUE; + /* Ping - dataOutPingData */ + edmaOut->u.fmt2.dataOutPingData[0].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_CH; + edmaOut->u.fmt2.dataOutPingData[0].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_SHADOW; + edmaOut->u.fmt2.dataOutPingData[0].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_EVENT_QUE; + edmaOut->u.fmt2.dataOutPingData[1].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_CH; + edmaOut->u.fmt2.dataOutPingData[1].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_SHADOW; + edmaOut->u.fmt2.dataOutPingData[1].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_EVENT_QUE; + edmaOut->u.fmt2.dataOutPingData[2].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_CH; + edmaOut->u.fmt2.dataOutPingData[2].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_SHADOW; + edmaOut->u.fmt2.dataOutPingData[2].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_EVENT_QUE; + + /* Pong */ + /* Pong - dataOutPong */ + edmaOut->u.fmt2.dataOutPong.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_CH; + edmaOut->u.fmt2.dataOutPong.channelShadow[0] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_0; + edmaOut->u.fmt2.dataOutPong.channelShadow[1] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_1; + edmaOut->u.fmt2.dataOutPong.channelShadow[2] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_2; + edmaOut->u.fmt2.dataOutPong.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_EVENT_QUE; + /* Pong - dataOutPongData */ + edmaOut->u.fmt2.dataOutPongData[0].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_CH; + edmaOut->u.fmt2.dataOutPongData[0].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_SHADOW; + edmaOut->u.fmt2.dataOutPongData[0].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_EVENT_QUE; + edmaOut->u.fmt2.dataOutPongData[1].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_CH; + edmaOut->u.fmt2.dataOutPongData[1].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_SHADOW; + edmaOut->u.fmt2.dataOutPongData[1].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_EVENT_QUE; + edmaOut->u.fmt2.dataOutPongData[2].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_CH; + edmaOut->u.fmt2.dataOutPongData[2].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_SHADOW; + edmaOut->u.fmt2.dataOutPongData[2].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_EVENT_QUE; + } + else + { + /* Ping */ + edmaOut->u.fmt1.dataOutPing.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_CH; + edmaOut->u.fmt1.dataOutPing.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_SHADOW; + edmaOut->u.fmt1.dataOutPing.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_EVENT_QUE; + + /* Pong */ + edmaOut->u.fmt1.dataOutPong.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_CH; + edmaOut->u.fmt1.dataOutPong.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_SHADOW; + edmaOut->u.fmt1.dataOutPong.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_EVENT_QUE; + } + + edmaOut->dataOutSignature.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_CH; + edmaOut->dataOutSignature.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_SHADOW; + edmaOut->dataOutSignature.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_EVENT_QUE; + + /* hwres - hwa */ + /* Use ISOLATED mode to support CBUFF in future */ + hwaCfg->dataInputMode = DPU_RangeProcHWA_InputMode_ISOLATED; + +#ifdef DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU + hwaCfg->hwaWinSym = HWA_FFT_WINDOW_SYMMETRIC; +#else + hwaCfg->hwaWinSym = HWA_FFT_WINDOW_NONSYMMETRIC; +#endif + hwaCfg->hwaWinRamOffset = (uint16_t) DPC_OBJDET_HWA_WINDOW_RAM_OFFSET; + if ((hwaCfg->hwaWinRamOffset + winGenLen) > DPC_OBJDETRANGEHWA_HWA_MAX_WINDOW_RAM_SIZE_IN_SAMPLES) + { + retVal = DPC_OBJDETRANGEHWA_ENOMEM_HWA_WINDOW_RAM; + goto exit; + } + + hwaCfg->numParamSet = DPU_RANGEPROCHWA_NUM_HWA_PARAM_SETS; + hwaCfg->paramSetStartIdx = DPC_OBJDET_DPU_RANGEPROC_PARAMSET_START_IDX; + + *cfgSave = rangeCfg; + + retVal = DPU_RangeProcHWA_config(dpuHandle, &rangeCfg); + if (retVal != 0) + { + goto exit; + } + + /* store configuration for use in intra-sub-frame processing and + * inter-sub-frame switching, although window will need to be regenerated and + * dc range sig should not be reset. */ + rangeCfg.staticCfg.resetDcRangeSigMeanBuffer = 0; + *cfgSave = rangeCfg; + +exit: + return retVal; +} + +/** + * @b Description + * @n + * Performs processing related to pre-start configuration, which is per sub-frame, + * by configuring each of the DPUs involved in the processing chain. + * Memory management notes: + * 1. Core Local Memory that needs to be preserved across sub-frames (such as range DPU's calib DC buffer) + * will be allocated using MemoryP_alloc. + * 2. Core Local Memory that needs to be preserved within a sub-frame across DPU calls + * (the DPIF * type memory) or for intermediate private scratch memory for + * DPU (i.e no preservation is required from process call to process call of the DPUs + * within the sub-frame) will be allocated from the Core Local RAM configuration supplied in + * @ref DPC_ObjectDetectionRangeHWA_InitParams given to @ref DPC_ObjectDetection_init API + * 3. L3 memory will only be allocated from the L3 RAM configuration supplied in + * @ref DPC_ObjectDetectionRangeHWA_InitParams given to @ref DPC_ObjectDetection_init API + * No L3 buffers are presently required that need to be preserved across sub-frames + * (type described in #1 above), neither are L3 scratch buffers required for + * intermediate processing within DPU process call. + * + * @param[in] subFrmObj Pointer to sub-frame object + * @param[in] objDetObj Pointer to objDetObj + * @param[in] staticCfg Pointer to static configuration of the sub-frame + * @param[in] dynCfg Pointer to dynamic configuration of the sub-frame + * @param[out] memUsage Pointer to memory usage structure to report mmemory + usage in this DPC + * + * @retval + * Success - 0 + * @retval + * Error - <0 + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + */ +static int32_t DPC_ObjDetRangeHwa_preStartConfig +( + SubFrameObj *subFrmObj, + ObjDetObj *objDetObj, + DPC_ObjectDetectionRangeHWA_StaticCfg *staticCfg, + DPC_ObjectDetectionRangeHWA_DynCfg *dynCfg, + DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage *memUsage +) +{ + int32_t retVal = 0; + DPIF_RadarCube radarCube; + MemPoolObj *L3RamObj; + MemPoolObj *CoreLocalRamObj; + + L3RamObj = &objDetObj->L3RamObj; + CoreLocalRamObj = &objDetObj->CoreLocalRamObj; + + DPC_ObjDetRangeHwa_MemPoolReset(L3RamObj); + DPC_ObjDetRangeHwa_MemPoolReset(CoreLocalRamObj); + + /* L3 allocations */ + /* L3 - radar cube -- This has be synced with the DSP chain */ + radarCube.dataSize = staticCfg->numRangeBins * staticCfg->numDopplerChirps * + staticCfg->numVirtualAntennas * sizeof(cmplx16ReIm_t); + radarCube.data = DPC_ObjDetRangeHwa_MemPoolAlloc(L3RamObj, radarCube.dataSize, + DPC_OBJDETRANGEHWA_RADAR_CUBE_DATABUF_BYTE_ALIGNMENT); + if (radarCube.data == NULL) + { + retVal = DPC_OBJDETRANGEHWA_ENOMEM__L3_RAM_RADAR_CUBE; + goto exit; + } + radarCube.datafmt = staticCfg->radarCubeFormat; + + retVal = DPC_ObjDetRangeHwa_rangeConfig(subFrmObj->dpuRangeObj, + staticCfg, + dynCfg, + objDetObj->edmaHandle, + &radarCube, CoreLocalRamObj, + &subFrmObj->rangeCfg); + if (retVal != 0) + { + goto exit; + } + + /* Report RAM usage */ + memUsage->CoreLocalRamUsage = DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(CoreLocalRamObj); + memUsage->L3RamUsage = DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(L3RamObj); + +exit: + return retVal; +} + + +/** + * @b Description + * @n + * DPC frame start function registered with DPM. This is invoked on reception + * of the frame start ISR from the RF front-end. + * + * @param[in] handle DPM's DPC handle + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Not applicable + */ +static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle) +{ + ObjDetObj *objDetObj = (ObjDetObj *) handle; + + objDetObj->stats.frameStartTimeStamp = Cycleprofiler_getTimeStamp(); + + DebugP_log2("ObjDet DPC: Frame Start, frameIndx = %d, subFrameIndx = %d\n", + objDetObj->stats.frameStartIntCounter, objDetObj->subFrameIndx); + + /* Check if previous frame (sub-frame) processing has completed */ + DPC_Objdet_Assert(objDetObj->dpmHandle, (objDetObj->interSubFrameProcToken == 0)); + objDetObj->interSubFrameProcToken++; + + /* Increment interrupt counter for debugging purpose */ + if (objDetObj->subFrameIndx == 0) + { + objDetObj->stats.frameStartIntCounter++; + } + + /* Notify the DPM Module that the DPC is ready for execution */ + DebugP_assert (DPM_notifyExecute (objDetObj->dpmHandle, handle, true) == 0); + return; +} + +/** + * @b Description + * @n + * DPC's (DPM registered) execute function which is invoked by the application + * in the DPM's execute context when the DPC issues DPM_notifyExecute API from + * its registered @ref DPC_ObjectDetection_frameStart API that is invoked every + * frame interrupt. + * + * @param[in] handle DPM's DPC handle + * @param[out] ptrResult Pointer to the result + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +int32_t DPC_ObjectDetection_execute +( + DPM_DPCHandle handle, + DPM_Buffer* ptrResult +) +{ + ObjDetObj *objDetObj; + SubFrameObj *subFrmObj; + DPU_RangeProcHWA_OutParams outRangeProc; + int32_t retVal; + DPM_Buffer rangeProcResult; + + objDetObj = (ObjDetObj *) handle; + DebugP_assert (objDetObj != NULL); + DebugP_assert (ptrResult != NULL); + + DebugP_log1("ObjDet DPC: Processing sub-frame %d\n", objDetObj->subFrameIndx); + + subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx]; + if (objDetObj->processCallBackFxn.processFrameBeginCallBackFxn != NULL) + { + (*objDetObj->processCallBackFxn.processFrameBeginCallBackFxn)(objDetObj->subFrameIndx); + } + + retVal = DPU_RangeProcHWA_process(subFrmObj->dpuRangeObj, &outRangeProc); + if (retVal != 0) + { + goto exit; + } + DebugP_assert(outRangeProc.endOfChirp == true); + + subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx]; + if (objDetObj->processCallBackFxn.processInterFrameBeginCallBackFxn != NULL) + { + (*objDetObj->processCallBackFxn.processInterFrameBeginCallBackFxn)(objDetObj->subFrameIndx); + } + + /******************************************************************************** + * Range Processing is finished, now it can send data to inter frame processing DPC. + ********************************************************************************/ + rangeProcResult.ptrBuffer[0] = objDetObj->subFrameObj[objDetObj->subFrameIndx].rangeCfg.hwRes.radarCube.data; + rangeProcResult.size[0] = objDetObj->subFrameObj[objDetObj->subFrameIndx].rangeCfg.hwRes.radarCube.dataSize; + + /* Relay the results: */ + retVal = DPM_relayResult(objDetObj->dpmHandle, handle, &rangeProcResult); + DebugP_assert (retVal == 0); + + /******************************************************************************** + * This DPC does not report results to the application so for the + * sake of clarity reset the result buffer + ********************************************************************************/ + memset ((void *)ptrResult, 0, sizeof(DPM_Buffer)); + objDetObj->interSubFrameProcToken--; + + /******************************************************************************** + * Prepare for next Frame + ********************************************************************************/ + + /* Update subFrame index */ + objDetObj->subFrameIndx++; + objDetObj->subFrameIndx = objDetObj->subFrameIndx % objDetObj->commonCfg.numSubFrames; + + if(objDetObj->commonCfg.numSubFrames > 1U) + { + /* Re-configure Range DPU for next subFrame */ + retVal = DPC_ObjDetRangeHwa_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx); + DebugP_assert (retVal == 0); + } + + /* Trigger Range DPU for next frame */ + retVal = DPU_RangeProcHWA_control(objDetObj->subFrameObj[objDetObj->subFrameIndx].dpuRangeObj, + DPU_RangeProcHWA_Cmd_triggerProc, NULL, 0); + DPC_Objdet_Assert(objDetObj->dpmHandle, (retVal == 0)); + + /* For rangeProcHwa, interChirpProcessingMargin is not available */ + objDetObj->stats.interChirpProcessingMargin = 0; + objDetObj->stats.interFrameStartTimeStamp = Cycleprofiler_getTimeStamp(); + + DebugP_log0("ObjDet DPC: Range Proc Done\n"); + +exit: + return retVal; +} + +/** + * @b Description + * @n + * DPC's (DPM registered) start function which is invoked by the + * application using DPM_start API. + * + * @param[in] handle DPM's DPC handle + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle) +{ + ObjDetObj *objDetObj; + SubFrameObj *subFrmObj; + int32_t retVal = 0; + + objDetObj = (ObjDetObj *) handle; + DebugP_assert (objDetObj != NULL); + + objDetObj->stats.frameStartIntCounter = 0; + + /* Start marks consumption of all pre-start configs, reset the flag to check + * if pre-starts were issued only after common config was issued for the next + * time full configuration happens between stop and start */ + objDetObj->isCommonCfgReceived = false; + + /* App must issue export of last frame after stop which will switch to sub-frame 0, + * so start should always see sub-frame indx of 0, check */ + DebugP_assert(objDetObj->subFrameIndx == 0); + + if(objDetObj->commonCfg.numSubFrames > 1U) + { + /* Pre-start cfgs for sub-frames may have come in any order, so need + * to ensure we reconfig for the current (0) sub-frame before starting */ + DPC_ObjDetRangeHwa_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx); + } + + /* Trigger Range DPU, related to reconfig above */ + subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx]; + retVal = DPU_RangeProcHWA_control(subFrmObj->dpuRangeObj, + DPU_RangeProcHWA_Cmd_triggerProc, NULL, 0); + if(retVal < 0) + { + goto exit; + } + + DebugP_log0("ObjDet DPC: Start done\n"); +exit: + return(retVal); +} + + +/** + * @b Description + * @n + * DPC's (DPM registered) stop function which is invoked by the + * application using DPM_stop API. + * + * @param[in] handle DPM's DPC handle + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle) +{ + ObjDetObj *objDetObj; + + objDetObj = (ObjDetObj *) handle; + DebugP_assert (objDetObj != NULL); + + /* We can be here only after complete frame processing is done, which means + * processing token must be 0 and subFrameIndx also 0 */ + DebugP_assert(objDetObj->subFrameIndx == 0); + + DebugP_log0("ObjDet DPC: Stop done\n"); + return(0); +} + +/** + * @b Description + * @n + * DPC IOCTL commands configuration API which will be invoked by the + * application using DPM_ioctl API + * + * @param[in] handle DPM's DPC handle + * @param[in] cmd Capture DPC specific commands + * @param[in] arg Command specific arguments + * @param[in] argLen Length of the arguments which is also command specific + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t DPC_ObjectDetection_ioctl +( + DPM_DPCHandle handle, + uint32_t cmd, + void* arg, + uint32_t argLen +) +{ + ObjDetObj *objDetObj; + SubFrameObj *subFrmObj; + int32_t retVal = 0; + + /* Get the DSS MCB: */ + objDetObj = (ObjDetObj *) handle; + DebugP_assert(objDetObj != NULL); + DebugP_assert(arg != NULL); + + /* Process the commands. Process non sub-frame specific ones first + * so the sub-frame specific ones can share some code. */ + if((cmd < DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG) || + (cmd > DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG)) + { + retVal = DPM_EINVCMD; + } + else if (cmd == DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_COMMON_CFG) + { + uint8_t index; + DPC_ObjectDetectionRangeHWA_PreStartCommonCfg *cfg; + + DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_PreStartCommonCfg)); + + cfg = (DPC_ObjectDetectionRangeHWA_PreStartCommonCfg*)arg; + + /* Release DPU DC range Signal mean memory */ + for(index = 0; index < objDetObj->commonCfg.numSubFrames; index ++) + { + subFrmObj = &objDetObj->subFrameObj[index]; + + if (subFrmObj->rangeCfg.hwRes.dcRangeSigMean) + { + MemoryP_ctrlFree(subFrmObj->rangeCfg.hwRes.dcRangeSigMean, + subFrmObj->rangeCfg.hwRes.dcRangeSigMeanSize); + } + } + + objDetObj->commonCfg = *cfg; + objDetObj->isCommonCfgReceived = true; + + DebugP_log0("ObjDet DPC: Pre-start Common Config IOCTL processed\n"); + } +#ifdef TRACKERPROC_EN + else if (cmd == DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG) + { + //System_printf("Entering Tracker Config"); + DPC_ObjectDetection_TrackerConfig *cfg; + + DebugP_assert(argLen == sizeof(DPC_ObjectDetection_TrackerConfig)); + + cfg = (DPC_ObjectDetection_TrackerConfig*)arg; + + retVal = DPU_TrackerProc_config(objDetObj->dpuTrackerObj, &(cfg->trackerDpuCfg)); + if (retVal != 0) + { + goto exit; + } + } +#endif + else + { + uint8_t subFrameNum; + subFrameNum = *(uint8_t *)arg; + + switch (cmd) + { + /* Range DPU related */ + case DPC_OBJDETRANGEHWA_IOCTL__DYNAMIC_CALIB_DC_RANGE_SIG_CFG: + { + DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg *cfg; + + DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg)); + + cfg = (DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg*)arg; + + subFrmObj = &objDetObj->subFrameObj[subFrameNum]; + + retVal = DPU_RangeProcHWA_control(subFrmObj->dpuRangeObj, + DPU_RangeProcHWA_Cmd_dcRangeCfg, + &cfg->cfg, + sizeof(DPU_RangeProc_CalibDcRangeSigCfg)); + if (retVal != 0) + { + goto exit; + } + + /* save into object */ + subFrmObj->dynCfg.calibDcRangeSigCfg = cfg->cfg; + + break; + } + + /* Related to pre-start configuration */ + case DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG: + { + DPC_ObjectDetectionRangeHWA_PreStartCfg *cfg; + DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage *memUsage; + MemoryP_Stats statsStart; + MemoryP_Stats statsEnd; + + /* Pre-start common config must be received before pre-start configs are received. */ + if (objDetObj->isCommonCfgReceived == false) + { + retVal = DPC_OBJDETRANGEHWA_PRE_START_CONFIG_BEFORE_PRE_START_COMMON_CONFIG; + goto exit; + } + + DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_PreStartCfg)); + + /* Get system heap size before preStart configuration */ + MemoryP_getStats(&statsStart); + + cfg = (DPC_ObjectDetectionRangeHWA_PreStartCfg*)arg; + subFrmObj = &objDetObj->subFrameObj[subFrameNum]; + + memUsage = &cfg->memUsage; + memUsage->L3RamTotal = objDetObj->L3RamObj.cfg.size; + memUsage->CoreLocalRamTotal = objDetObj->CoreLocalRamObj.cfg.size; + retVal = DPC_ObjDetRangeHwa_preStartConfig(subFrmObj, + objDetObj, + &cfg->staticCfg, + &cfg->dynCfg, + memUsage); + if (retVal != 0) + { + goto exit; + } + + /* Populate radarCube memory information */ + cfg->radarCubeMem.addr = subFrmObj->rangeCfg.hwRes.radarCube.data; + cfg->radarCubeMem.size = subFrmObj->rangeCfg.hwRes.radarCube.dataSize; + + /* Get system heap size after preStart configuration */ + MemoryP_getStats(&statsEnd); + + /* Populate system heap usage */ + memUsage->SystemHeapTotal = statsEnd.totalSize; + memUsage->SystemHeapUsed = statsEnd.totalSize -statsEnd.totalFreeSize; + memUsage->SystemHeapDPCUsed = statsStart.totalFreeSize - statsEnd.totalFreeSize; + + DebugP_log1("ObjDet DPC: Pre-start Config IOCTL processed (subFrameIndx = %d)\n", cfg->subFrameNum); + break; + } + + default: + { + /* Error: This is an unsupported command */ + retVal = DPM_EINVCMD; + break; + } + } + } + +exit: + return retVal; +} + +/** + * @b Description + * @n + * DPC's (DPM registered) initialization function which is invoked by the + * application using DPM_init API. Among other things, this API allocates DPC instance + * and DPU instances (by calling DPU's init APIs) from the MemoryP osal + * heap. If this API returns an error of any type, the heap is not guaranteed + * to be in the same state as before calling the API (i.e any allocations + * from the heap while executing the API are not guaranteed to be deallocated + * in case of error), so any error from this API should be considered fatal and + * if the error is of _ENOMEM type, the application will + * have to be built again with a bigger heap size to address the problem. + * + * @param[in] dpmHandle DPM's DPC handle + * @param[in] ptrInitCfg Handle to the framework semaphore + * @param[out] errCode Error code populated on error + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static DPM_DPCHandle DPC_ObjectDetection_init +( + DPM_Handle dpmHandle, + DPM_InitCfg* ptrInitCfg, + int32_t* errCode +) +{ + int32_t i; + ObjDetObj *objDetObj = NULL; + DPC_ObjectDetectionRangeHWA_InitParams *dpcInitParams; + HWA_MemInfo hwaMemInfo; + uint8_t index; + + *errCode = 0; + + if ((ptrInitCfg == NULL) || (ptrInitCfg->arg == NULL)) + { + *errCode = DPC_OBJDETRANGEHWA_EINVAL; + goto exit; + } + + if (ptrInitCfg->argSize != sizeof(DPC_ObjectDetectionRangeHWA_InitParams)) + { + *errCode = DPC_OBJDETRANGEHWA_EINVAL__INIT_CFG_ARGSIZE; + goto exit; + } + + dpcInitParams = (DPC_ObjectDetectionRangeHWA_InitParams *) ptrInitCfg->arg; + + objDetObj = MemoryP_ctrlAlloc(sizeof(ObjDetObj), 0); + +#ifdef DBG_DPC_OBJDETRANGEHWA + gObjDetObj = objDetObj; +#endif + + DebugP_log1("ObjDet DPC: objDetObj address = %d\n", (uint32_t) objDetObj); + + if(objDetObj == NULL) + { + *errCode = DPC_OBJDETRANGEHWA_ENOMEM; + goto exit; + } + + /* Initialize memory */ + memset((void *)objDetObj, 0, sizeof(ObjDetObj)); + + /* Copy over the DPM configuration: */ + memcpy ((void*)&objDetObj->dpmInitCfg, (void*)ptrInitCfg, sizeof(DPM_InitCfg)); + + objDetObj->dpmHandle = dpmHandle; + objDetObj->socHandle = ptrInitCfg->socHandle; + objDetObj->L3RamObj.cfg = dpcInitParams->L3ramCfg; + objDetObj->CoreLocalRamObj.cfg = dpcInitParams->CoreLocalRamCfg; + + /* Validate EDMA handle */ + DebugP_assert(dpcInitParams->edmaHandle!= NULL); + objDetObj->edmaHandle = dpcInitParams->edmaHandle; + + /* Validate HWA handle */ + DebugP_assert(dpcInitParams->hwaHandle!= NULL); + objDetObj->hwaHandle = dpcInitParams->hwaHandle; + objDetObj->processCallBackFxn = dpcInitParams->processCallBackFxn; + + /* Set HWA bank memory address */ + *errCode = HWA_getHWAMemInfo(dpcInitParams->hwaHandle, &hwaMemInfo); + if (*errCode != 0) + { + goto exit; + } + + objDetObj->hwaMemBankSize = hwaMemInfo.bankSize; + + for (i = 0; i < hwaMemInfo.numBanks; i++) + { + objDetObj->hwaMemBankAddr[i] = hwaMemInfo.baseAddress + + i * hwaMemInfo.bankSize; + } + + for(index = 0; index < RL_MAX_SUBFRAMES; index++) + { + DPU_RangeProcHWA_InitParams rangeInitParams; + + rangeInitParams.hwaHandle = objDetObj->hwaHandle; + + objDetObj->subFrameObj[index].dpuRangeObj = DPU_RangeProcHWA_init(&rangeInitParams, errCode); + } +#ifdef TRACKERPROC_EN + if (*errCode != 0) + { + goto exit; + } + + /* Initialize the tracker DPU - this is not subframe based */ + objDetObj->dpuTrackerObj = DPU_TrackerProc_init(errCode); + + if (*errCode != 0) + { + goto exit; + } +#endif +exit: + if(*errCode != 0) + { + if(objDetObj != NULL) + { + MemoryP_ctrlFree(objDetObj, sizeof(ObjDetObj)); + objDetObj = NULL; + } + } + + return ((DPM_DPCHandle)objDetObj); +} + +/** + * @b Description + * @n + * DPC's (DPM registered) de-initialization function which is invoked by the + * application using DPM_deinit API. + * + * @param[in] handle DPM's DPC handle + * + * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION + * + * @retval + * Success - 0 + * @retval + * Error - <0 + */ +static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle) +{ + int32_t retVal = 0; + ObjDetObj *objDetObj = NULL; + uint8_t index; + + if (handle == NULL) + { + retVal = DPC_OBJDETRANGEHWA_EINVAL; + goto exit; + } + + objDetObj = handle; + + for(index = 0; index < RL_MAX_SUBFRAMES; index++) + { + if(objDetObj->subFrameObj[index].dpuRangeObj != NULL) + { + retVal = DPU_RangeProcHWA_deinit(objDetObj->subFrameObj[index].dpuRangeObj); + if (retVal != 0) + { + goto exit; + } + } + } + + /* Free DPC memory */ + MemoryP_ctrlFree(handle, sizeof(ObjDetObj)); + +exit: + return (retVal); +}