You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pcount3D_cli.c 51KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. /*
  2. * @file mmw_cli.c
  3. *
  4. * @brief
  5. * Mmw (Milli-meter wave) DEMO CLI Implementation
  6. *
  7. * \par
  8. * NOTE:
  9. * (C) Copyright 2018 Texas Instruments, Inc.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. *
  18. * Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the
  21. * distribution.
  22. *
  23. * Neither the name of Texas Instruments Incorporated nor the names of
  24. * its contributors may be used to endorse or promote products derived
  25. * from this software without specific prior written permission.
  26. *
  27. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  30. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  32. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  33. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  34. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  35. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  36. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  37. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. */
  39. /**************************************************************************
  40. *************************** Include Files ********************************
  41. **************************************************************************/
  42. /* Standard Include Files. */
  43. #include <stdint.h>
  44. #include <stdlib.h>
  45. #include <stddef.h>
  46. #include <string.h>
  47. #include <stdio.h>
  48. /* BIOS/XDC Include Files. */
  49. #include <xdc/runtime/System.h>
  50. /* mmWave SDK Include Files: */
  51. #include <ti/common/sys_common.h>
  52. #include <ti/common/mmwave_sdk_version.h>
  53. #include <ti/drivers/uart/UART.h>
  54. #include <ti/control/mmwavelink/mmwavelink.h>
  55. #include <ti/utils/cli/cli.h>
  56. #include <ti/utils/mathutils/mathutils.h>
  57. /* Demo Include Files */
  58. #include <mmwdemo_rfparser.h>
  59. #include <mmwdemo_adcconfig.h>
  60. #include <people_counting/68xx_3D_people_counting/src/common/pcount3D_config.h>
  61. #include <people_counting/68xx_3D_people_counting/src/mss/pcount3D_mss.h>
  62. #include <people_counting/68xx_3D_people_counting/src/mss/tracker_utils.h>
  63. #define DEBUG(_x) //_x
  64. /**************************************************************************
  65. *************************** Local function prototype****************************
  66. **************************************************************************/
  67. /* CLI Extended Command Functions */
  68. static int32_t Pcount3DDemo_CLIDynRACfarCfg (int32_t argc, char* argv[]);
  69. static int32_t Pcount3DDemo_CLIStaticRACfarCfg (int32_t argc, char* argv[]);
  70. static int32_t Pcount3DDemo_CLIDynRngAngleCfg (int32_t argc, char* argv[]);
  71. static int32_t Pcount3DDemo_CLIStaticRngAngleCfg (int32_t argc, char* argv[]);
  72. static int32_t Pcount3DDemo_CLIDynAngleEstCfg (int32_t argc, char* argv[]);
  73. static int32_t Pcount3DDemo_CLIDopplerCFARCfg (int32_t argc, char* argv[]);
  74. static int32_t Pcount3DDemo_CLIBoardAntGeometry0 (int32_t argc, char* argv[]);
  75. static int32_t Pcount3DDemo_CLIBoardAntGeometry1 (int32_t argc, char* argv[]);
  76. static int32_t Pcount3DDemo_CLIBoardAntPhaseRot (int32_t argc, char* argv[]);
  77. static int32_t Pcount3DDemo_CLIAntAngleFoV (int32_t argc, char* argv[]);
  78. static int32_t Pcount3DDemo_CLISensorStart (int32_t argc, char* argv[]);
  79. static int32_t Pcount3DDemo_CLISensorStop (int32_t argc, char* argv[]);
  80. static int32_t Pcount3DDemo_CLIADCBufCfg (int32_t argc, char* argv[]);
  81. static int32_t Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg (int32_t argc, char* argv[]);
  82. /**************************************************************************
  83. *************************** Extern Definitions *******************************
  84. **************************************************************************/
  85. extern Pcount3DDemo_MSS_MCB gMmwMssMCB;
  86. /**************************************************************************
  87. *************************** Local Definitions ****************************
  88. **************************************************************************/
  89. /**************************************************************************
  90. *************************** CLI Function Definitions **************************
  91. **************************************************************************/
  92. /**
  93. * @b Description
  94. * @n
  95. * This is the CLI Handler for the sensor start command
  96. *
  97. * @param[in] argc
  98. * Number of arguments
  99. * @param[in] argv
  100. * Arguments
  101. *
  102. * @retval
  103. * Success - 0
  104. * @retval
  105. * Error - <0
  106. */
  107. static int32_t Pcount3DDemo_CLISensorStart (int32_t argc, char* argv[])
  108. {
  109. bool doReconfig = true;
  110. int32_t retVal = 0;
  111. /* Only following command syntax will be supported
  112. sensorStart
  113. sensorStart 0
  114. */
  115. if (argc == 2)
  116. {
  117. doReconfig = (bool) atoi (argv[1]);
  118. if (doReconfig == true)
  119. {
  120. CLI_write ("Error: Reconfig is not supported, only argument of 0 is\n"
  121. "(do not reconfig, just re-start the sensor) valid\n");
  122. return -1;
  123. }
  124. }
  125. else
  126. {
  127. /* In case there is no argument for sensorStart, always do reconfig */
  128. doReconfig = true;
  129. }
  130. /***********************************************************************************
  131. * Do sensor state management to influence the sensor actions
  132. ***********************************************************************************/
  133. /* Error checking initial state */
  134. if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT)
  135. {
  136. MMWave_CtrlCfg ctrlCfg;
  137. /* need to get number of sub-frames so that next function to check
  138. * pending state can work */
  139. CLI_getMMWaveExtensionConfig (&ctrlCfg);
  140. gMmwMssMCB.objDetCommonCfg.numSubFrames =
  141. MmwDemo_RFParser_getNumSubFrames(&ctrlCfg);
  142. if (Pcount3DDemo_isAllCfgInPendingState() == 0)
  143. {
  144. CLI_write ("Error: Full configuration must be provided before sensor can be started "
  145. "the first time\n");
  146. /* Although not strictly needed, bring back to the initial value since we
  147. * are rejecting this first time configuration, prevents misleading debug. */
  148. gMmwMssMCB.objDetCommonCfg.numSubFrames = 0;
  149. return -1;
  150. }
  151. }
  152. if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STARTED)
  153. {
  154. CLI_write ("Ignored: Sensor is already started\n");
  155. return 0;
  156. }
  157. if (doReconfig == false)
  158. {
  159. /* User intends to issue sensor start without config, check if no
  160. config was issued after stop and generate error if this is the case. */
  161. if (Pcount3DDemo_isAllCfgInNonPendingState() == 0)
  162. {
  163. /* Message user differently if all config was issued or partial config was
  164. issued. */
  165. if (Pcount3DDemo_isAllCfgInPendingState())
  166. {
  167. CLI_write ("Error: You have provided complete new configuration, "
  168. "issue \"sensorStart\" (without argument) if you want it to "
  169. "take effect\n");
  170. }
  171. else
  172. {
  173. CLI_write ("Error: You have provided partial configuration between stop and this "
  174. "command and partial configuration cannot be undone."
  175. "Issue the full configuration and do \"sensorStart\" \n");
  176. }
  177. return -1;
  178. }
  179. }
  180. else
  181. {
  182. /* User intends to issue sensor start with full config, check if all config
  183. was issued after stop and generate error if is the case. */
  184. if (Pcount3DDemo_isAllCfgInPendingState() == 0)
  185. {
  186. /* Message user differently if no config was issued or partial config was
  187. issued. */
  188. if (Pcount3DDemo_isAllCfgInNonPendingState())
  189. {
  190. CLI_write ("Error: You have provided no configuration, "
  191. "issue \"sensorStart 0\" OR provide "
  192. "full configuration and issue \"sensorStart\"\n");
  193. }
  194. else
  195. {
  196. CLI_write ("Error: You have provided partial configuration between stop and this "
  197. "command and partial configuration cannot be undone."
  198. "Issue the full configuration and do \"sensorStart\" \n");
  199. }
  200. return -1;
  201. }
  202. }
  203. /***********************************************************************************
  204. * Retreive and check mmwave Open related config before calling openSensor
  205. ***********************************************************************************/
  206. /* Fill demo's MCB mmWave openCfg structure from the CLI configs*/
  207. if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT)
  208. {
  209. /* Get the open configuration: */
  210. CLI_getMMWaveExtensionOpenConfig (&gMmwMssMCB.cfg.openCfg);
  211. }
  212. else
  213. {
  214. /* openCfg related configurations like chCfg, lowPowerMode, adcCfg
  215. * are only used on the first sensor start. If they are different
  216. * on a subsequent sensor start, then generate a fatal error
  217. * so the user does not think that the new (changed) configuration
  218. * takes effect, the board needs to be reboot for the new
  219. * configuration to be applied.
  220. */
  221. MMWave_OpenCfg openCfg;
  222. CLI_getMMWaveExtensionOpenConfig (&openCfg);
  223. /* Compare openCfg->chCfg*/
  224. if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.chCfg, (void *)&openCfg.chCfg,
  225. sizeof(rlChanCfg_t)) != 0)
  226. {
  227. Pcount3DDemo_debugAssert(0);
  228. }
  229. /* Compare openCfg->lowPowerMode*/
  230. if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.lowPowerMode, (void *)&openCfg.lowPowerMode,
  231. sizeof(rlLowPowerModeCfg_t)) != 0)
  232. {
  233. Pcount3DDemo_debugAssert(0);
  234. }
  235. /* Compare openCfg->adcOutCfg*/
  236. if(memcmp((void *)&gMmwMssMCB.cfg.openCfg.adcOutCfg, (void *)&openCfg.adcOutCfg,
  237. sizeof(rlAdcOutCfg_t)) != 0)
  238. {
  239. Pcount3DDemo_debugAssert(0);
  240. }
  241. }
  242. retVal = Pcount3DDemo_openSensor(gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT);
  243. if(retVal != 0)
  244. {
  245. return -1;
  246. }
  247. /***********************************************************************************
  248. * Retrieve mmwave Control related config before calling startSensor
  249. ***********************************************************************************/
  250. /* Get the mmWave ctrlCfg from the CLI mmWave Extension */
  251. if(doReconfig)
  252. {
  253. CLI_getMMWaveExtensionConfig (&gMmwMssMCB.cfg.ctrlCfg);
  254. retVal = Pcount3DDemo_configSensor();
  255. if(retVal != 0)
  256. {
  257. return -1;
  258. }
  259. }
  260. retVal = Pcount3DDemo_startSensor();
  261. if(retVal != 0)
  262. {
  263. return -1;
  264. }
  265. /***********************************************************************************
  266. * Set the state
  267. ***********************************************************************************/
  268. gMmwMssMCB.sensorState = Pcount3DDemo_SensorState_STARTED;
  269. return 0;
  270. }
  271. /**
  272. * @b Description
  273. * @n
  274. * This is the CLI Handler for the sensor stop command
  275. *
  276. * @param[in] argc
  277. * Number of arguments
  278. * @param[in] argv
  279. * Arguments
  280. *
  281. * @retval
  282. * Success - 0
  283. * @retval
  284. * Error - <0
  285. */
  286. static int32_t Pcount3DDemo_CLISensorStop (int32_t argc, char* argv[])
  287. {
  288. if ((gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STOPPED) ||
  289. (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_INIT))
  290. {
  291. CLI_write ("Ignored: Sensor is already stopped\n");
  292. return 0;
  293. }
  294. Pcount3DDemo_stopSensor();
  295. Pcount3DDemo_resetStaticCfgPendingState();
  296. gMmwMssMCB.sensorState = Pcount3DDemo_SensorState_STOPPED;
  297. return 0;
  298. }
  299. /**
  300. * @b Description
  301. * @n
  302. * Utility function to get sub-frame number
  303. *
  304. * @param[in] argc Number of arguments
  305. * @param[in] argv Arguments
  306. * @param[in] expectedArgc Expected number of arguments
  307. * @param[out] subFrameNum Sub-frame Number (0 based)
  308. *
  309. * @retval
  310. * Success - 0
  311. * @retval
  312. * Error - <0
  313. */
  314. static int32_t Pcount3DDemo_CLIGetSubframe (int32_t argc, char* argv[], int32_t expectedArgc,
  315. int8_t* subFrameNum)
  316. {
  317. int8_t subframe;
  318. /* Sanity Check: Minimum argument check */
  319. if (argc != expectedArgc)
  320. {
  321. CLI_write ("Error: Invalid usage of the CLI command\n");
  322. return -1;
  323. }
  324. /*Subframe info is always in position 1*/
  325. subframe = (int8_t) atoi(argv[1]);
  326. if(subframe >= (int8_t)RL_MAX_SUBFRAMES)
  327. {
  328. CLI_write ("Error: Subframe number is invalid\n");
  329. return -1;
  330. }
  331. *subFrameNum = (int8_t)subframe;
  332. return 0;
  333. }
  334. /**
  335. * @b Description
  336. * @n
  337. * This is the CLI Handler for dynamic scene RA CFAR configuration
  338. *
  339. * @param[in] argc
  340. * Number of arguments
  341. * @param[in] argv
  342. * Arguments
  343. *
  344. * @retval
  345. * Success - 0
  346. * @retval
  347. * Error - <0
  348. */
  349. static int32_t Pcount3DDemo_CLIDynRACfarCfg (int32_t argc, char* argv[])
  350. {
  351. int8_t subFrameNum;
  352. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 15, &subFrameNum) < 0)
  353. {
  354. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynRACfarCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));)
  355. return -1;
  356. }
  357. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  358. {
  359. uint8_t indx;
  360. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  361. {
  362. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]);
  363. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]);
  364. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]);
  365. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]);
  366. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]);
  367. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]);
  368. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]);
  369. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]);
  370. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.K0 = (float) atof (argv[10]);
  371. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]);
  372. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]);
  373. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicSideLobeThr = (float) atof (argv[12]);
  374. }
  375. }
  376. else
  377. {
  378. uint8_t indx = subFrameNum;
  379. /* Apply configuration to specific subframe (or to position zero for the legacy case
  380. where there is no advanced frame config) */
  381. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]);
  382. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]);
  383. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]);
  384. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]);
  385. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]);
  386. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]);
  387. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]);
  388. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]);
  389. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.K0 = (float) atof (argv[10]);
  390. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]);
  391. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]);
  392. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.dynamicSideLobeThr = (float) atof (argv[12]);
  393. }
  394. return 0;
  395. }
  396. /**
  397. * @b Description
  398. * @n
  399. * This is the CLI Handler for static scene RA CFAR configuration
  400. *
  401. * @param[in] argc
  402. * Number of arguments
  403. * @param[in] argv
  404. * Arguments
  405. *
  406. * @retval
  407. * Success - 0
  408. * @retval
  409. * Error - <0
  410. */
  411. static int32_t Pcount3DDemo_CLIStaticRACfarCfg (int32_t argc, char* argv[])
  412. {
  413. int8_t subFrameNum;
  414. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 15, &subFrameNum) < 0)
  415. {
  416. DEBUG(System_printf ("Error: Pcount3DDemo_CLIStaticRACfarCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));)
  417. return -1;
  418. }
  419. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  420. {
  421. uint8_t indx;
  422. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  423. {
  424. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]);
  425. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]);
  426. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]);
  427. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]);
  428. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]);
  429. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]);
  430. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]);
  431. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]);
  432. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.K0 = (float) atof (argv[10]);
  433. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]);
  434. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]);
  435. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticSideLobeThr = (float) atof (argv[12]);
  436. }
  437. }
  438. else
  439. {
  440. uint8_t indx = subFrameNum;
  441. /* Apply configuration to specific subframe (or to position zero for the legacy case
  442. where there is no advanced frame config) */
  443. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSize = (uint8_t) atoi (argv[2]);
  444. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSize = (uint8_t) atoi (argv[3]);
  445. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.leftSkipSizeAzimuth = (uint8_t) atoi (argv[4]);
  446. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.rightSkipSizeAzimuth= (uint8_t) atoi (argv[5]);
  447. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeRange = (uint8_t) atoi (argv[6]);
  448. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.searchWinSizeDoppler= (uint8_t) atoi (argv[7]);
  449. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeRange = (uint8_t) atoi (argv[8]);
  450. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.guardSizeDoppler = (uint8_t) atoi (argv[9]);
  451. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.K0 = (float) atof (argv[10]);
  452. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.dopplerSearchRelThr = (float) atof (argv[11]);
  453. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticCfarConfig.enableSecondPassSearch = (uint8_t) atoi (argv[13]);
  454. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.staticSideLobeThr = (float) atof (argv[12]);
  455. }
  456. return 0;
  457. }
  458. /**
  459. * @b Description
  460. * @n
  461. * This is the CLI Handler for dynamic scene range-angle config
  462. *
  463. * @param[in] argc
  464. * Number of arguments
  465. * @param[in] argv
  466. * Arguments
  467. *
  468. * @retval
  469. * Success - 0
  470. * @retval
  471. * Error - <0
  472. */
  473. static int32_t Pcount3DDemo_CLIDynRngAngleCfg (int32_t argc, char* argv[])
  474. {
  475. int8_t subFrameNum;
  476. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 6, &subFrameNum) < 0)
  477. {
  478. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynRngAngleCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));)
  479. return -1;
  480. }
  481. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  482. {
  483. uint8_t indx;
  484. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  485. {
  486. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.searchStep = (float) atof (argv[2]);
  487. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.mvdr_alpha = (float) atof (argv[3]);
  488. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod = (uint8_t) atoi (argv[4]);
  489. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod = (uint8_t) atoi (argv[5]);
  490. }
  491. }
  492. else
  493. {
  494. uint8_t indx = subFrameNum;
  495. /* Apply configuration to specific subframe (or to position zero for the legacy case
  496. where there is no advanced frame config) */
  497. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.searchStep = (float) atof (argv[2]);
  498. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.mvdr_alpha = (float) atof (argv[3]);
  499. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod = (uint8_t) atoi (argv[4]);
  500. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod = (uint8_t) atoi (argv[5]);
  501. }
  502. return 0;
  503. }
  504. /**
  505. * @b Description
  506. * @n
  507. * This is the CLI Handler for dynamic scene 2D angle estimation config
  508. *
  509. * @param[in] argc
  510. * Number of arguments
  511. * @param[in] argv
  512. * Arguments
  513. *
  514. * @retval
  515. * Success - 0
  516. * @retval
  517. * Error - <0
  518. */
  519. static int32_t Pcount3DDemo_CLIDynAngleEstCfg (int32_t argc, char* argv[])
  520. {
  521. int8_t subFrameNum;
  522. subFrameNum = (int8_t) atoi(argv[1]);
  523. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  524. {
  525. uint8_t indx;
  526. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg all detectionMethod = %d\n", gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod);)
  527. if (gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod <= 1)
  528. {
  529. if (argc != 10)
  530. {
  531. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));)
  532. return -1;
  533. }
  534. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  535. {
  536. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevSearchStep = (float) atof (argv[2]);
  537. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.mvdr_alpha = (float) atof (argv[3]);
  538. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.maxNpeak2Search = (uint8_t) atoi (argv[4]);
  539. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples = (uint8_t) atoi (argv[5]);
  540. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevOnly = (uint8_t) atoi (argv[6]);
  541. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.sideLobThr = (float) atof (argv[7]);
  542. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpRelThr = (float) atof (argv[8]);
  543. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSNRThr = (float) atof (argv[9]);
  544. }
  545. }
  546. else
  547. {
  548. if (argc != 8)
  549. {
  550. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDynAngleEstCfg argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));)
  551. return -1;
  552. }
  553. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  554. {
  555. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominFactor = (uint8_t) atoi (argv[2]);
  556. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominNn8bors = (uint8_t) atoi (argv[3]);
  557. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples = (uint8_t) atoi (argv[4]);
  558. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpRelThr = (float) atof (argv[5]);
  559. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSNRThr = (float) atof (argv[6]);
  560. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.localMaxCheckFlag = (uint8_t) atoi(argv[7]);
  561. }
  562. }
  563. }
  564. else
  565. {
  566. uint8_t indx = subFrameNum;
  567. /* Apply configuration to specific subframe (or to position zero for the legacy case
  568. where there is no advanced frame config) */
  569. if (gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.detectionMethod <= 1)
  570. {
  571. if (argc != 10)
  572. {
  573. return -1;
  574. }
  575. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevSearchStep = (float) atof (argv[2]);
  576. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.mvdr_alpha = (float) atof (argv[3]);
  577. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.maxNpeak2Search = (uint8_t) atoi (argv[4]);
  578. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples = (uint8_t) atoi (argv[5]);
  579. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.elevOnly = (uint8_t) atoi (argv[6]);
  580. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.sideLobThr = (float) atof (argv[7]);
  581. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpRelThr = (float) atof (argv[8]);
  582. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSNRThr = (float) atof (argv[9]);
  583. }
  584. else
  585. {
  586. if (argc != 8)
  587. {
  588. return -1;
  589. }
  590. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominFactor = (uint8_t) atoi (argv[2]);
  591. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.zoominNn8bors = (uint8_t) atoi (argv[3]);
  592. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples = (uint8_t) atoi (argv[4]);
  593. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpRelThr = (float) atof (argv[5]);
  594. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.peakExpSNRThr = (float) atof (argv[6]);
  595. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.angle2DEst.azimElevZoominCfg.localMaxCheckFlag = (uint8_t) atoi(argv[7]);
  596. }
  597. }
  598. return 0;
  599. }
  600. /**
  601. * @b Description
  602. * @n
  603. * This is the CLI Handler for Doppler Estimation configuration if the Doppler estimation method is CFAR
  604. *
  605. * @param[in] argc
  606. * Number of arguments
  607. * @param[in] argv
  608. * Arguments
  609. *
  610. * @retval
  611. * Success - 0
  612. * @retval
  613. * Error - <0
  614. */
  615. static int32_t Pcount3DDemo_CLIDopplerCFARCfg (int32_t argc, char* argv[])
  616. {
  617. int8_t subFrameNum;
  618. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 7, &subFrameNum) < 0)
  619. {
  620. DEBUG(System_printf ("Error: Pcount3DDemo_CLIDopplerCFARCfg argc = %d, argv2\n", argc, (uint8_t) atoi (argv[2]));)
  621. return -1;
  622. }
  623. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  624. {
  625. uint8_t indx;
  626. if (gMmwMssMCB.subFrameCfg[0].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod == 1)
  627. {
  628. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  629. {
  630. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardLeft = (uint8_t) atoi (argv[2]);
  631. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardRight = (uint8_t) atoi (argv[3]);
  632. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.guardWinSize = (uint8_t) atoi (argv[4]);
  633. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.refWinSize = (uint8_t) atoi (argv[5]);
  634. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.thre = (float) atof (argv[6]);
  635. }
  636. }
  637. }
  638. else
  639. {
  640. uint8_t indx = subFrameNum;
  641. /* Apply configuration to specific subframe (or to position zero for the legacy case
  642. where there is no advanced frame config) */
  643. if (gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.rangeAngleCfg.dopplerEstMethod == 1)
  644. {
  645. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardLeft = (uint8_t) atoi (argv[2]);
  646. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.cfarDiscardRight = (uint8_t) atoi (argv[3]);
  647. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.guardWinSize = (uint8_t) atoi (argv[4]);
  648. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.refWinSize = (uint8_t) atoi (argv[5]);
  649. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.dopCfarCfg.thre = (float) atof (argv[6]);
  650. }
  651. }
  652. return 0;
  653. }
  654. /**
  655. * @b Description
  656. * @n
  657. * This is the CLI Handler for static scene range-angle config
  658. *
  659. * @param[in] argc
  660. * Number of arguments
  661. * @param[in] argv
  662. * Arguments
  663. *
  664. * @retval
  665. * Success - 0
  666. * @retval
  667. * Error - <0
  668. */
  669. static int32_t Pcount3DDemo_CLIStaticRngAngleCfg (int32_t argc, char* argv[])
  670. {
  671. int8_t subFrameNum;
  672. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 5, &subFrameNum) < 0)
  673. {
  674. DEBUG(System_printf ("Error: Pcount3DDemo_CLIStaticRngAngleCfg argc = %d, argv2 = %d\n", argc, (uint8_t) atoi (argv[2]));)
  675. return -1;
  676. }
  677. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  678. {
  679. uint8_t indx;
  680. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  681. {
  682. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticProcEnabled = (uint8_t) atoi (argv[2]);
  683. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticAzimStepDeciFactor = (uint8_t) atoi (argv[3]);
  684. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticElevStepDeciFactor = (uint8_t) atoi (argv[4]);
  685. }
  686. }
  687. else
  688. {
  689. uint8_t indx = subFrameNum;
  690. /* Apply configuration to specific subframe (or to position zero for the legacy case
  691. where there is no advanced frame config) */
  692. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticProcEnabled = (uint8_t) atoi (argv[2]);
  693. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticAzimStepDeciFactor = (uint8_t) atoi (argv[3]);
  694. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.staticEstCfg.staticElevStepDeciFactor = (uint8_t) atoi (argv[4]);
  695. }
  696. return 0;
  697. }
  698. /**
  699. * @b Description
  700. * @n
  701. * This is the CLI Handler for ADC buffer command
  702. *
  703. * @param[in] argc
  704. * Number of arguments
  705. * @param[in] argv
  706. * Arguments
  707. *
  708. * @retval
  709. * Success - 0
  710. * @retval
  711. * Error - <0
  712. */
  713. static int32_t Pcount3DDemo_CLIADCBufCfg (int32_t argc, char* argv[])
  714. {
  715. MmwDemo_ADCBufCfg adcBufCfg;
  716. int8_t subFrameNum;
  717. if (gMmwMssMCB.sensorState == Pcount3DDemo_SensorState_STARTED)
  718. {
  719. CLI_write ("Ignored: This command is not allowed after sensor has started\n");
  720. return 0;
  721. }
  722. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 6, &subFrameNum) < 0)
  723. {
  724. return -1;
  725. }
  726. /* Initialize the ADC Output configuration: */
  727. memset ((void *)&adcBufCfg, 0, sizeof(adcBufCfg));
  728. /* Populate configuration: */
  729. adcBufCfg.adcFmt = (uint8_t) atoi (argv[2]);
  730. adcBufCfg.iqSwapSel = (uint8_t) atoi (argv[3]);
  731. adcBufCfg.chInterleave = (uint8_t) atoi (argv[4]);
  732. adcBufCfg.chirpThreshold = (uint8_t) atoi (argv[5]);
  733. /* This demo is using HWA for 1D processing which does not allow multi-chirp
  734. * processing */
  735. if (adcBufCfg.chirpThreshold != 1)
  736. {
  737. CLI_write("Error: chirpThreshold must be 1, multi-chirp is not allowed\n");
  738. return -1;
  739. }
  740. /* Save Configuration to use later */
  741. Pcount3DDemo_CfgUpdate((void *)&adcBufCfg,
  742. PCOUNT3DDEMO_ADCBUFCFG_OFFSET,
  743. sizeof(MmwDemo_ADCBufCfg), subFrameNum);
  744. return 0;
  745. }
  746. /**
  747. * @b Description
  748. * @n
  749. * This is the CLI Handler for compensation of range bias and channel phase offsets
  750. *
  751. * @param[in] argc
  752. * Number of arguments
  753. * @param[in] argv
  754. * Arguments
  755. *
  756. * @retval
  757. * Success - 0
  758. * @retval
  759. * Error - <0
  760. */
  761. static int32_t Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg (int32_t argc, char* argv[])
  762. {
  763. int32_t argInd;
  764. int32_t i;
  765. uint8_t indx;
  766. /* Sanity Check: Minimum argument check */
  767. if (argc != (1+1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL*2))
  768. {
  769. CLI_write ("Error: Invalid usage of the CLI command\n");
  770. DEBUG(System_printf ("Error: Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg argc = %d, argv2=%f\n", argc, (float)atof (argv[2]));)
  771. return -1;
  772. }
  773. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  774. {
  775. argInd = 2;
  776. for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++)
  777. {
  778. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseCompVect[i].real = (float)atof (argv[argInd++]);
  779. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseCompVect[i].imag = (float)atof (argv[argInd++]);
  780. }
  781. }
  782. return 0;
  783. }
  784. /**
  785. * @b Description
  786. * @n
  787. * This is the CLI Handler for board antenna geometry matrix row 0
  788. *
  789. * @param[in] argc
  790. * Number of arguments
  791. * @param[in] argv
  792. * Arguments
  793. *
  794. * @retval
  795. * Success - 0
  796. * @retval
  797. * Error - <0
  798. */
  799. static int32_t Pcount3DDemo_CLIBoardAntGeometry0 (int32_t argc, char* argv[])
  800. {
  801. int32_t argInd;
  802. int32_t i;
  803. uint8_t indx;
  804. /* Sanity Check: Minimum argument check */
  805. if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL))
  806. {
  807. CLI_write ("Error: Invalid usage of the CLI command\n");
  808. DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntGeometry0 argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));)
  809. return -1;
  810. }
  811. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  812. {
  813. argInd = 1;
  814. for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++)
  815. {
  816. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.m_ind[i] = (int8_t)atoi (argv[argInd++]);
  817. }
  818. }
  819. return 0;
  820. }
  821. /**
  822. * @b Description
  823. * @n
  824. * This is the CLI Handler for board antenna geometry matrix row 1
  825. *
  826. * @param[in] argc
  827. * Number of arguments
  828. * @param[in] argv
  829. * Arguments
  830. *
  831. * @retval
  832. * Success - 0
  833. * @retval
  834. * Error - <0
  835. */
  836. static int32_t Pcount3DDemo_CLIBoardAntGeometry1 (int32_t argc, char* argv[])
  837. {
  838. int32_t argInd;
  839. int32_t i;
  840. uint8_t indx;
  841. /* Sanity Check: Minimum argument check */
  842. if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL))
  843. {
  844. CLI_write ("Error: Invalid usage of the CLI command\n");
  845. DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntGeometry1 argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));)
  846. return -1;
  847. }
  848. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  849. {
  850. argInd = 1;
  851. for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++)
  852. {
  853. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.n_ind[i] = (int8_t)atoi (argv[argInd++]);
  854. }
  855. }
  856. return 0;
  857. }
  858. /**
  859. * @b Description
  860. * @n
  861. * This is the CLI Handler for board antenna phase rotation
  862. *
  863. * @param[in] argc
  864. * Number of arguments
  865. * @param[in] argv
  866. * Arguments
  867. *
  868. * @retval
  869. * Success - 0
  870. * @retval
  871. * Error - <0
  872. */
  873. static int32_t Pcount3DDemo_CLIBoardAntPhaseRot (int32_t argc, char* argv[])
  874. {
  875. int32_t argInd;
  876. int32_t i;
  877. uint8_t indx;
  878. /* Sanity Check: Minimum argument check */
  879. if (argc != (1+SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL))
  880. {
  881. CLI_write ("Error: Invalid usage of the CLI command\n");
  882. DEBUG(System_printf ("Error: Pcount3DDemo_CLIBoardAntPhaseRot argc = %d, argv2 = %d\n", argc, (int8_t)atoi (argv[2]));)
  883. return -1;
  884. }
  885. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  886. {
  887. argInd = 1;
  888. for (i=0; i < SYS_COMMON_NUM_TX_ANTENNAS*SYS_COMMON_NUM_RX_CHANNEL; i++)
  889. {
  890. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.phaseRot[i] = (int8_t)atoi (argv[argInd++]);
  891. }
  892. }
  893. return 0;
  894. }
  895. /**
  896. * @b Description
  897. * @n
  898. * This is the CLI Handler for angle FOV config
  899. *
  900. * @param[in] argc
  901. * Number of arguments
  902. * @param[in] argv
  903. * Arguments
  904. *
  905. * @retval
  906. * Success - 0
  907. * @retval
  908. * Error - <0
  909. */
  910. static int32_t Pcount3DDemo_CLIAntAngleFoV (int32_t argc, char* argv[])
  911. {
  912. int8_t subFrameNum;
  913. if(Pcount3DDemo_CLIGetSubframe(argc, argv, 4, &subFrameNum) < 0)
  914. {
  915. DEBUG(System_printf ("Error: Pcount3DDemo_CLIAntAngleFoV argc = %d, argv2 = %f\n", argc, (float) atof (argv[2]));)
  916. return -1;
  917. }
  918. if(subFrameNum == PCOUNT3DDEMO_SUBFRAME_NUM_FRAME_LEVEL_CONFIG)
  919. {
  920. uint8_t indx;
  921. for(indx = 0; indx < RL_MAX_SUBFRAMES; indx++)
  922. {
  923. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[0] = (float) atof (argv[2]);
  924. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[1] = (float) atof (argv[3]);
  925. }
  926. }
  927. else
  928. {
  929. uint8_t indx = subFrameNum;
  930. /* Apply configuration to specific subframe (or to position zero for the legacy case
  931. where there is no advanced frame config) */
  932. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[0] = (float) atof (argv[2]);
  933. gMmwMssMCB.subFrameCfg[indx].objDetDynCfg.dspDynCfg.caponChainCfg.doaConfig.fovCfg[1] = (float) atof (argv[3]);
  934. }
  935. return 0;
  936. }
  937. /**
  938. * @b Description
  939. * @n
  940. * This is the CLI Execution Task
  941. *
  942. * @retval
  943. * Not Applicable.
  944. */
  945. void Pcount3DDemo_CLIInit (uint8_t taskPriority)
  946. {
  947. CLI_Cfg cliCfg;
  948. char demoBanner[110];
  949. uint32_t cnt;
  950. /* Create Demo Banner to be printed out by CLI */
  951. sprintf(&demoBanner[0],
  952. "***********************************\n" \
  953. "IWR68xx Indoor people counting demo" \
  954. "***********************************\n"
  955. );
  956. /* Initialize the CLI configuration: */
  957. memset ((void *)&cliCfg, 0, sizeof(CLI_Cfg));
  958. /* Populate the CLI configuration: */
  959. cliCfg.cliPrompt = "mmwDemo:/>";
  960. cliCfg.cliBanner = demoBanner;
  961. cliCfg.cliUartHandle = gMmwMssMCB.commandUartHandle;
  962. cliCfg.taskPriority = taskPriority;
  963. cliCfg.socHandle = gMmwMssMCB.socHandle;
  964. cliCfg.mmWaveHandle = gMmwMssMCB.ctrlHandle;
  965. cliCfg.enableMMWaveExtension = 1U;
  966. cliCfg.usePolledMode = true;
  967. cliCfg.overridePlatform = false;
  968. cliCfg.overridePlatformString = NULL;
  969. cnt=0;
  970. cliCfg.tableEntry[cnt].cmd = "sensorStart";
  971. cliCfg.tableEntry[cnt].helpString = "[doReconfig(optional, default:enabled)]";
  972. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLISensorStart;
  973. cnt++;
  974. cliCfg.tableEntry[cnt].cmd = "sensorStop";
  975. cliCfg.tableEntry[cnt].helpString = "No arguments";
  976. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLISensorStop;
  977. cnt++;
  978. cliCfg.tableEntry[cnt].cmd = "dynamicRACfarCfg";
  979. cliCfg.tableEntry[cnt].helpString = "<leftSkipSize> <rightSkipSize> <leftSkipSizeAzimuth> <rightSkipSizeAngle> <searchWinSizeRange> <searchWinSizeAngle> <guardSizeRange> <guardSizeAngle> <threRange> <threAngle> <threSidelob> <enSecondPass>";
  980. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynRACfarCfg;
  981. cnt++;
  982. cliCfg.tableEntry[cnt].cmd = "staticRACfarCfg";
  983. cliCfg.tableEntry[cnt].helpString = "<leftSkipSize> <rightSkipSize> <leftSkipSizeAzimuth> <rightSkipSizeAngle> <searchWinSizeRange> <searchWinSizeAngle> <guardSizeRange> <guardSizeAngle> <threRange> <threAngle> <threSidelob> <enSecondPass>";
  984. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIStaticRACfarCfg;
  985. cnt++;
  986. cliCfg.tableEntry[cnt].cmd = "dynamicRangeAngleCfg";
  987. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <searchStep> <mvdr_alpha> <detectionMethod> <dopplerEstMethod>";
  988. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynRngAngleCfg;
  989. cnt++;
  990. cliCfg.tableEntry[cnt].cmd = "dynamic2DAngleCfg";
  991. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <elevSearchStep> <mvdr_alpha> <maxNpeak2Search> <peakExpSamples> <elevOnly> <sideLobThr> <peakExpRelThr> <peakExpSNRThr>";
  992. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDynAngleEstCfg;
  993. cnt++;
  994. cliCfg.tableEntry[cnt].cmd = "dopplerCfarCfg";
  995. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <discardLeft> <discardRight> <guardWinSize> <refWinSize> <threshold> ";
  996. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIDopplerCFARCfg;
  997. cnt++;
  998. cliCfg.tableEntry[cnt].cmd = "staticRangeAngleCfg";
  999. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <staticProcEnabled> <staticAzimStepDeciFactor> <staticElevStepDeciFactor>";
  1000. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIStaticRngAngleCfg;
  1001. cnt++;
  1002. cliCfg.tableEntry[cnt].cmd = "fovCfg";
  1003. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <azimFoV> <elevFoV> ";
  1004. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIAntAngleFoV;
  1005. cnt++;
  1006. cliCfg.tableEntry[cnt].cmd = "antGeometry0";
  1007. cliCfg.tableEntry[cnt].helpString = "<elem0> <elem1> <elem2> <elem3> <elem4> <elem5> <elem6> <elem7> <elem8> <elem9> <elem10> <elem11> <elem12> ";
  1008. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntGeometry0;
  1009. cnt++;
  1010. cliCfg.tableEntry[cnt].cmd = "antGeometry1";
  1011. cliCfg.tableEntry[cnt].helpString = "<elem0> <elem1> <elem2> <elem3> <elem4> <elem5> <elem6> <elem7> <elem8> <elem9> <elem10> <elem11> <elem12> ";
  1012. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntGeometry1;
  1013. cnt++;
  1014. cliCfg.tableEntry[cnt].cmd = "antPhaseRot";
  1015. cliCfg.tableEntry[cnt].helpString = "<elem0> <elem1> <elem2> <elem3> <elem4> <elem5> <elem6> <elem7> <elem8> <elem9> <elem10> <elem11> <elem12> ";
  1016. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIBoardAntPhaseRot;
  1017. cnt++;
  1018. cliCfg.tableEntry[cnt].cmd = "adcbufCfg";
  1019. cliCfg.tableEntry[cnt].helpString = "<subFrameIdx> <adcOutputFmt> <SampleSwap> <ChanInterleave> <ChirpThreshold>";
  1020. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLIADCBufCfg;
  1021. cnt++;
  1022. cliCfg.tableEntry[cnt].cmd = "compRangeBiasAndRxChanPhase";
  1023. cliCfg.tableEntry[cnt].helpString = "<rangeBias> <Re00> <Im00> <Re01> <Im01> <Re02> <Im02> <Re03> <Im03> <Re10> <Im10> <Re11> <Im11> <Re12> <Im12> <Re13> <Im13> <Re20> <Im20> <Re21> <Im21> <Re22> <Im22> <Re23> <Im23> ";
  1024. cliCfg.tableEntry[cnt].cmdHandlerFxn = Pcount3DDemo_CLICompRangeBiasAndRxChanPhaseCfg;
  1025. cnt++;
  1026. cliCfg.tableEntry[cnt].cmd = "trackingCfg";
  1027. cliCfg.tableEntry[cnt].helpString = "<enable> <paramSet> <numPoints> <numTracks> <maxDoppler> <framePeriod>";
  1028. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLITrackingCfg;
  1029. cnt++;
  1030. cliCfg.tableEntry[cnt].cmd = "staticBoundaryBox";
  1031. cliCfg.tableEntry[cnt].helpString = "<X min> <X Max> <Y min> <Y max> <Z min> <Z max>";
  1032. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIStaticBoundaryBoxCfg;
  1033. cnt++;
  1034. cliCfg.tableEntry[cnt].cmd = "boundaryBox";
  1035. cliCfg.tableEntry[cnt].helpString = "<X min> <X Max> <Y min> <Y max> <Z min> <Z max>";
  1036. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIBoundaryBoxCfg;
  1037. cnt++;
  1038. cliCfg.tableEntry[cnt].cmd = "sensorPosition";
  1039. cliCfg.tableEntry[cnt].helpString = "<Z - Height> <Azimuth Tilt> <Elevation Tilt>";
  1040. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLISensorPositionCfg;
  1041. cnt++;
  1042. cliCfg.tableEntry[cnt].cmd = "gatingParam";// PC: 4 gating volume, Limits are set to 3m in length, 2m in width, 0 no limit in doppler
  1043. cliCfg.tableEntry[cnt].helpString = "<gating volume> <length> <width> <doppler>";
  1044. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIGatingParamCfg;
  1045. cnt++;
  1046. 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
  1047. cliCfg.tableEntry[cnt].helpString = "<det2act> <det2free> <act2free> <stat2free> <exit2free> <sleep2free>";//det2act, det2free, act2free, stat2free, exit2free, sleep2free
  1048. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIStateParamCfg;
  1049. cnt++;
  1050. cliCfg.tableEntry[cnt].cmd = "allocationParam";// PC: 250 SNR, 0.1 minimal velocity, 5 points, 1m in distance, 2m/s in velocity
  1051. cliCfg.tableEntry[cnt].helpString = "<SNRs> <minimal velocity> <points> <in distance> <in velocity>";
  1052. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIAllocationParamCfg;
  1053. cnt++;
  1054. cliCfg.tableEntry[cnt].cmd = "maxAcceleration";
  1055. cliCfg.tableEntry[cnt].helpString = "<max X acc.> <max Y acc.> <max Z acc.>";
  1056. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemoCLIMaxAccelerationParamCfg;
  1057. cnt++;
  1058. cliCfg.tableEntry[cnt].cmd = "presenceBoundaryBox";
  1059. cliCfg.tableEntry[cnt].helpString = "<X min> <X Max> <Y min> <Y max> <Z min> <Z max>";
  1060. cliCfg.tableEntry[cnt].cmdHandlerFxn = MmwDemo_CLIPresenceParamCfg;
  1061. cnt++;
  1062. /* Open the CLI: */
  1063. if (CLI_open (&cliCfg) < 0)
  1064. {
  1065. System_printf ("Error: Unable to open the CLI\n");
  1066. return;
  1067. }
  1068. System_printf ("Debug: CLI is operational\n");
  1069. return;
  1070. }