/*
 * @file ini_cfg.c
 *
 *  Created on: Nov 9, 2017
 *      Author: hstubeda
 *
 *   @brief
 *      MMWave Demo automatic self-configuration
 *
 *  \par
 *  NOTE:
 *      (C) Copyright 2017 Ross Video, Ltd.
 *
 *  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 <string.h>
/* mmWave SDK Include Files: */
#include <xdc/runtime/System.h>

#include <ti/drivers/uart/UART.h>
#include <ti/utils/cli/include/cli_internal.h>
#include <ti/utils/cli/cli.h>

/* local includes */
//#include "cli.h"
#include "ini_cfg.h"

/**************************************************************************
 *************************** Extern Definitions ***************************
 **************************************************************************/
/* CLI Extended Command Functions */
extern int32_t MmwDemo_CLICfarCfg(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIPeakGroupingCfg(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIMultiObjBeamForming(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLICalibDcRangeSig(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLISensorStart(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLISensorStop(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIGuiMonSel(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLISetDataLogger(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIClutterRemoval(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIExtendedMaxVelocity(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLICompRangeBiasAndRxChanPhaseCfg(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIMeasureRangeBiasAndRxChanPhaseCfg(int32_t argc, char* argv[]);
extern int32_t MmwDemo_CLIADCBufCfg (int32_t argc, char* argv[]);

/**************************************************************************
 ****************** Local Function Definitions ***************************
 **************************************************************************/

/**
 *  @b Description
 *  @n
 *      This function uses CLI command string to configure the sensor;
 *      This function can be run from within code, and does not require user input from CLI.
 *
 *  @param[in] cmd[]
 *      CLI command, broken into its constituent arguments
 *      e.g multiObjBeamForming 1 0.5 is {"multiObjBeamForming", "1", "0.5"}
 *
 *  @retval
 *      Not Applicable.
 */
void MmwDemo_CfgWithCmdString (uint32_t num_arg, char* cmd[])
{
    if(strcmp("sensorStop", cmd[0]) == 0)
        MmwDemo_CLISensorStop(num_arg, cmd);

    //else if(strcmp("adcbufCfg", cmd[0]) == 0)
    //	MmwDemo_CLIADCBufCfg(num_arg, cmd);

    else if(strcmp("guiMonitor", cmd[0]) == 0)
        MmwDemo_CLIGuiMonSel(num_arg, cmd);

    else if(strcmp("cfarCfg", cmd[0]) == 0)
        MmwDemo_CLICfarCfg(num_arg, cmd);

    else if(strcmp("peakGrouping", cmd[0]) == 0)
        MmwDemo_CLIPeakGroupingCfg(num_arg, cmd);

    else if(strcmp("multiObjBeamForming", cmd[0]) == 0)
        MmwDemo_CLIMultiObjBeamForming(num_arg, cmd);
        
    else if(strcmp("clutterRemoval", cmd[0]) == 0)
        MmwDemo_CLIClutterRemoval(num_arg, cmd);

    else if(strcmp("calibDcRangeSig", cmd[0]) == 0)
        MmwDemo_CLICalibDcRangeSig(num_arg, cmd);
    
    else if(strcmp("extendedMaxVelocity", cmd[0]) == 0)
        MmwDemo_CLIExtendedMaxVelocity(num_arg, cmd);
    
    else if(strcmp("compRangeBiasAndRxChanPhase", cmd[0]) == 0)
    	MmwDemo_CLICompRangeBiasAndRxChanPhaseCfg(num_arg, cmd);
    	
    else if(strcmp("measureRangeBiasAndRxChanPhase", cmd[0]) == 0)
    	MmwDemo_CLIMeasureRangeBiasAndRxChanPhaseCfg(num_arg, cmd);
    	
    else if(strcmp("sensorStart", cmd[0]) == 0)
        MmwDemo_CLISensorStart(num_arg, cmd);

    else
        CLI_MMWaveExtensionHandler(num_arg, cmd);

    return;
}

/**
 *  @b Description
 *  @n
 *      This function instantiates initial configuration structure using CLI command strings,
 *      and uses these strings to configure the sensor
 *
 *  @param[in] cmd
 *      Commands
 *
 *  @retval
 *      Not Applicable.
 */
void MmwDemo_IniRSSDSSCfg(void)
{
    String_Cfg_Cmds iniCfgCmds;
    uint32_t c = 0;

    iniCfgCmds.sensorStop[0] = "sensorStop";

    iniCfgCmds.flushCfg[0] = "flushCfg";

    iniCfgCmds.dfeDataOutputMode[0] = "dfeDataOutputMode";
    iniCfgCmds.dfeDataOutputMode[1] = "1";

    iniCfgCmds.channelCfg[0] = "channelCfg";
    iniCfgCmds.channelCfg[1] = "15";
    iniCfgCmds.channelCfg[2] = "3";
    iniCfgCmds.channelCfg[3] = "0";

    iniCfgCmds.adcCfg[0] = "adcCfg";
    iniCfgCmds.adcCfg[1] = "2";
    iniCfgCmds.adcCfg[2] = "1";

    iniCfgCmds.adcbufCfg[0] = "adcbufCfg";
    iniCfgCmds.adcbufCfg[1] = "-1";
    iniCfgCmds.adcbufCfg[2] = "0";
    iniCfgCmds.adcbufCfg[3] = "0";
    iniCfgCmds.adcbufCfg[4] = "1";
    iniCfgCmds.adcbufCfg[5] = "0";

    iniCfgCmds.profileCfg [0] = "profileCfg";
    iniCfgCmds.profileCfg[ 1] = "0";
    iniCfgCmds.profileCfg[ 2] = "77";
    iniCfgCmds.profileCfg[ 3] = "438";
    iniCfgCmds.profileCfg[ 4] = "7";
    iniCfgCmds.profileCfg[ 5] = "48.98";
    iniCfgCmds.profileCfg[ 6] = "0";
    iniCfgCmds.profileCfg[ 7] = "0";
    iniCfgCmds.profileCfg[ 8] = "15";
    iniCfgCmds.profileCfg[ 9] = "1";
    iniCfgCmds.profileCfg[10] = "256";
    iniCfgCmds.profileCfg[11] = "6250";
    iniCfgCmds.profileCfg[12] = "0";
    iniCfgCmds.profileCfg[13] = "0";
    iniCfgCmds.profileCfg[14] = "30";

    iniCfgCmds.chirpCfg1[0] = "chirpCfg";
    iniCfgCmds.chirpCfg1[1] = "0";
    iniCfgCmds.chirpCfg1[2] = "0";
    iniCfgCmds.chirpCfg1[3] = "0";
    iniCfgCmds.chirpCfg1[4] = "0";
    iniCfgCmds.chirpCfg1[5] = "0";
    iniCfgCmds.chirpCfg1[6] = "0";
    iniCfgCmds.chirpCfg1[7] = "0";
    iniCfgCmds.chirpCfg1[8] = "1";

    iniCfgCmds.chirpCfg2[0] = "chirpCfg";
    iniCfgCmds.chirpCfg2[1] = "1";
    iniCfgCmds.chirpCfg2[2] = "1";
    iniCfgCmds.chirpCfg2[3] = "0";
    iniCfgCmds.chirpCfg2[4] = "0";
    iniCfgCmds.chirpCfg2[5] = "0";
    iniCfgCmds.chirpCfg2[6] = "0";
    iniCfgCmds.chirpCfg2[7] = "0";
    iniCfgCmds.chirpCfg2[8] = "2";

    iniCfgCmds.frameCfg[0] = "frameCfg";
    iniCfgCmds.frameCfg[1] = "0";
    iniCfgCmds.frameCfg[2] = "1";
    iniCfgCmds.frameCfg[3] = "16";
    iniCfgCmds.frameCfg[4] = "0";
    iniCfgCmds.frameCfg[5] = "600";
    iniCfgCmds.frameCfg[6] = "1";
    iniCfgCmds.frameCfg[7] = "0"; //frame delay upon sensor startup; change this value between different sensors to avoid sensor cross-interference

    iniCfgCmds.guiMonitor[0] = "guiMonitor";
    iniCfgCmds.guiMonitor[1] = "-1";
    iniCfgCmds.guiMonitor[2] = "1";
    iniCfgCmds.guiMonitor[3] = "0";
    iniCfgCmds.guiMonitor[4] = "0";
    iniCfgCmds.guiMonitor[5] = "0";
    iniCfgCmds.guiMonitor[6] = "0";
    iniCfgCmds.guiMonitor[7] = "0";

    iniCfgCmds.cfarCfgRange[0] = "cfarCfg";
    iniCfgCmds.cfarCfgRange[1] = "-1";
    iniCfgCmds.cfarCfgRange[2] = "0";
    iniCfgCmds.cfarCfgRange[3] = "0";
    iniCfgCmds.cfarCfgRange[4] = "8";
    iniCfgCmds.cfarCfgRange[5] = "4";
    iniCfgCmds.cfarCfgRange[6] = "4";
    iniCfgCmds.cfarCfgRange[7] = "0";
    iniCfgCmds.cfarCfgRange[8] = "5120";

    iniCfgCmds.cfarCfgDoppler[0] = "cfarCfg";
    iniCfgCmds.cfarCfgDoppler[1] = "-1";
    iniCfgCmds.cfarCfgDoppler[2] = "1";
    iniCfgCmds.cfarCfgDoppler[3] = "0";
    iniCfgCmds.cfarCfgDoppler[4] = "4";
    iniCfgCmds.cfarCfgDoppler[5] = "2";
    iniCfgCmds.cfarCfgDoppler[6] = "3";
    iniCfgCmds.cfarCfgDoppler[7] = "0";
    iniCfgCmds.cfarCfgDoppler[8] = "5120";

    iniCfgCmds.peakGrouping[0] = "peakGrouping";
    iniCfgCmds.peakGrouping[1] = "-1";
    iniCfgCmds.peakGrouping[2] = "1";
    iniCfgCmds.peakGrouping[3] = "1";
    iniCfgCmds.peakGrouping[4] = "1";
    iniCfgCmds.peakGrouping[5] = "1";
    iniCfgCmds.peakGrouping[6] = "255";

    iniCfgCmds.multiObjBeamForming[0] = "multiObjBeamForming";
    iniCfgCmds.multiObjBeamForming[1] = "-1";
    iniCfgCmds.multiObjBeamForming[2] = "1";
    iniCfgCmds.multiObjBeamForming[3] = "0.5";
    
    iniCfgCmds.clutterRemoval[0] = "clutterRemoval";
    iniCfgCmds.clutterRemoval[1] = "-1";
    iniCfgCmds.clutterRemoval[2] = "0";
    
    iniCfgCmds.calibDcRangeSig[0] = "calibDcRangeSig";
    iniCfgCmds.calibDcRangeSig[1] = "-1";
    iniCfgCmds.calibDcRangeSig[2] = "0";
    iniCfgCmds.calibDcRangeSig[3] = "-5";
    iniCfgCmds.calibDcRangeSig[4] = "8";
    iniCfgCmds.calibDcRangeSig[5] = "256";
    
    iniCfgCmds.extendedMaxVelocity[0] = "extendedMaxVelocity";
    iniCfgCmds.extendedMaxVelocity[1] = "-1";
    iniCfgCmds.extendedMaxVelocity[2] = "0";
    
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 0] = "compRangeBiasAndRxChanPhase";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 1] = "0.0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 2] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 3] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 4] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 5] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 6] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 7] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 8] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[ 9] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[10] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[11] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[12] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[13] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[14] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[15] = "0";
    iniCfgCmds.compRangeBiasAndRxChanPhase[16] = "1";
    iniCfgCmds.compRangeBiasAndRxChanPhase[17] = "0";
    
    iniCfgCmds.measureRangeBiasAndRxChanPhase[0] = "measureRangeBiasAndRxChanPhase";
    iniCfgCmds.measureRangeBiasAndRxChanPhase[1] = "0";
    iniCfgCmds.measureRangeBiasAndRxChanPhase[2] = "1.5";
    iniCfgCmds.measureRangeBiasAndRxChanPhase[3] = "0.2";

    iniCfgCmds.sensorStart[0] = "sensorStart";

    //arrays cannot be set like this in C; need to copy them, or set each pointer individually, as was done above
    //iniCfgCmds.sensorStop          = {"sensorStop"};
    //iniCfgCmds.flushCfg            = {"flushCfg"};
    //iniCfgCmds.dfeDataOutputMode   = {"dfeDataOutputMode", "1"};
    //iniCfgCmds.channelCfg          = {"channelCfg", "15", "3", "0"};
    //iniCfgCmds.adcCfg              = {"adcCfg", "2", "1"};
    //iniCfgCmds.adcbufCfg           = {"adcbufCfg", "0", "0", "1", "1"};
    //iniCfgCmds.profileCfg          = {"profileCfg", "0", "77", "194", "7", "40", "0", "0", "100", "1", "64", "2000", "0", "0", "30"};
    //iniCfgCmds.chirpCfg1           = {"chirpCfg1", "0", "0", "0", "0", "0", "0", "0", "1"};
    //iniCfgCmds.chirpCfg2           = {"chirpCfg2", "1", "1", "0", "0", "0", "0", "0", "2"};
    //iniCfgCmds.frameCfg            = {"frameCfg", "0", "1", "16", "0", "100", "1", "0"};
    //iniCfgCmds.guiMonitor          = {"guiMonitor", "1", "0", "0", "0", "0", "0"};
    //iniCfgCmds.cfarCfgRange        = {"cfarCfg", "0", "0", "8", "4", "4", "0", "3413"};
    //iniCfgCmds.cfarCfgDoppler      = {"cfarCfg", "1", "0", "4", "2", "3", "0", "5120"};
    //iniCfgCmds.peakGrouping        = {"peakGrouping", "1", "1", "1", "1", "63"};
    //iniCfgCmds.multiObjBeamForming = {"multiObjBeamForming", "1", "0.5"};
    //iniCfgCmds.calibDcRangeSig     = {"calibDcRangeSig", "1", "-5", "20", "256"};
    //iniCfgCmds.sensorStart         = {"sensorStart"};

    MmwDemo_CfgWithCmdString ( 1, iniCfgCmds.sensorStop         			);
    System_printf ("3sensorStop done\n");
    for (c = 1 ; c <= 50000000 ; c++); //this delay ensures the sensor stops
    System_printf ("3delay done\n");
    MmwDemo_CfgWithCmdString ( 1, iniCfgCmds.flushCfg           			);
    System_printf ("3flushCfg done\n");
    MmwDemo_CfgWithCmdString ( 2, iniCfgCmds.dfeDataOutputMode  			);
    System_printf ("3dfeDataOutputMode done\n");
    MmwDemo_CfgWithCmdString ( 4, iniCfgCmds.channelCfg         			);
    System_printf ("3channelCfg done\n");
    MmwDemo_CfgWithCmdString ( 3, iniCfgCmds.adcCfg             			);
    System_printf ("3adcCfg done\n");
    MmwDemo_CfgWithCmdString ( 6, iniCfgCmds.adcbufCfg          			);
    System_printf ("3adcbufCfg done\n");
    MmwDemo_CfgWithCmdString (15, iniCfgCmds.profileCfg         			);
    System_printf ("3profileCfg done\n");
    MmwDemo_CfgWithCmdString ( 9, iniCfgCmds.chirpCfg1          			);
    System_printf ("3chirpCfg1 done\n");
    MmwDemo_CfgWithCmdString ( 9, iniCfgCmds.chirpCfg2          			);
    System_printf ("3chirpCfg2 done\n");
    MmwDemo_CfgWithCmdString ( 8, iniCfgCmds.frameCfg           			);
    System_printf ("3frameCfg done\n");
    System_printf ("3guiMonitor start\n");
    MmwDemo_CfgWithCmdString ( 8, iniCfgCmds.guiMonitor         			);
    System_printf ("3guiMonitor done\n");
    MmwDemo_CfgWithCmdString ( 9, iniCfgCmds.cfarCfgRange       			);
    System_printf ("3cfarCfgRange done\n");
    MmwDemo_CfgWithCmdString ( 9, iniCfgCmds.cfarCfgDoppler     			);
    System_printf ("3cfarCfgDoppler done\n");
    MmwDemo_CfgWithCmdString ( 7, iniCfgCmds.peakGrouping       			);
    System_printf ("3peakGrouping done\n");
    MmwDemo_CfgWithCmdString ( 4, iniCfgCmds.multiObjBeamForming			);
    System_printf ("3multiObjBeamForming done\n");
    MmwDemo_CfgWithCmdString ( 3, iniCfgCmds.clutterRemoval					);
    System_printf ("3clutterRemoval done\n");
    MmwDemo_CfgWithCmdString ( 6, iniCfgCmds.calibDcRangeSig				);
    System_printf ("3calibDcRangeSig done\n");
    MmwDemo_CfgWithCmdString ( 3, iniCfgCmds.extendedMaxVelocity			);
    System_printf ("3extendedMaxVelocity done\n");
    MmwDemo_CfgWithCmdString (18, iniCfgCmds.compRangeBiasAndRxChanPhase	);
    System_printf ("3compRangeBiasAndRxChanPhase done\n");
    MmwDemo_CfgWithCmdString ( 4, iniCfgCmds.measureRangeBiasAndRxChanPhase	);
    System_printf ("3measureRangeBiasAndRxChanPhase done\n");
    MmwDemo_CfgWithCmdString ( 1, iniCfgCmds.sensorStart        			);
    System_printf ("3sensorStart done\n");

    return;
}

