text: 
  /**
   *  \file cli_main.c
   *
   *  This File contains the "main" function for the CLI application,
   *  to exercise various functionalities of the Mindtree Mesh stack.
   */
  
  /*
   *  Copyright (C) 2017. Mindtree Ltd.
   *  All rights reserved.
   */
  
  #ifndef DEMO
  
  /* ------------------------------- Header File Inclusion */
  #include "cli_main.h"
  #include "nvs.h"
  
  /* ------------------------------- Global Variables */
  #ifndef CLI_NO_MAIN
  DECL_STATIC UCHAR r_buf[1024];
  #else
  void cli_input (char * cmd, int size);
  #endif /* CLI_NO_MAIN */
  
  /* Level - Root */
  DECL_CONST CLI_COMMAND cli_root_cmd_list[] =
  {
      /* Help */
      { "help", "Help", cli_help },
  
      /* Core */
      { "core", "Core Options", cli_core },
  
      /* Model */
      { "model", "Model Options", cli_model },
  
      /* Reset */
      { "reset", "Reset Node", cli_reset },
  
      /* Persistent Storage */
      { "ps", "Persistent Storage", cli_ps },
  
      /* Mesh ADV/GATT bearer Operations */
      { "brr", "Mesh bearer Operations", cli_brr },
  
      /* Set Log Level */
      { "loglevel", "Set Log Level <ERR/INF/TRC/ALL>", cli_set_log_level }
  };
  
  /* Command List Stack */
  typedef struct _CLI_COMMAND_STACK_FRAME
  {
      CLI_COMMAND * cmd_list;
      UINT16        cmd_list_len;
  
  } CLI_COMMAND_STACK_FRAME;
  
  #define  CLI_CMD_LIST_MAX_DEPTH     10
  DECL_STATIC UINT16        cli_cmd_list_sp;
  DECL_STATIC CLI_COMMAND_STACK_FRAME cli_cmd_list_stack[CLI_CMD_LIST_MAX_DEPTH];
  
  /* ------------------------------- Functions */
  /* Common Utility Routines */
  void cli_cmd_stack_push(/* IN */ CLI_COMMAND *cmd_list, /* IN */ UINT16 cmd_list_len)
  {
      cli_cmd_list_sp++;
      cli_cmd_list_stack[cli_cmd_list_sp].cmd_list = cmd_list;
      cli_cmd_list_stack[cli_cmd_list_sp].cmd_list_len = cmd_list_len;
  }
  
  void cli_cmd_stack_pop(void)
  {
      /* Check if the Stack point in not 0. Decrement by one */
      if (0 != cli_cmd_list_sp)
      {
          cli_cmd_list_sp--;
      }
      else
      {
          CONSOLE_OUT("Already at Root Level\n");
      }
  }
  
  API_RESULT cli_reset(UINT32 argc, UCHAR *argv[])
  {
      MS_IGNORE_UNUSED_PARAM(argc);
      MS_IGNORE_UNUSED_PARAM(argv);
  
      CONSOLE_OUT ("Clearing Storage\n");
      nvs_reset(NVS_BANK_PERSISTENT);
  
      return API_SUCCESS;
  }
  extern uint8 llState;
  extern uint8 llSecondaryState;
  extern UCHAR blebrr_state;  
  extern uint32 blebrr_advscan_timeout_count;
  extern uint32 osal_memory_statics(void);
  
  /* Help */
  API_RESULT cli_help(UINT32 argc, UCHAR *argv[])
  {
      UINT32 index;
      UINT32 sum = 0;
  
      MS_IGNORE_UNUSED_PARAM(argc);
      MS_IGNORE_UNUSED_PARAM(argv);
  
      CONSOLE_OUT("In Help\n");
  
      /* Print all the available commands */
      for (index = 0; index < cli_cmd_list_stack[cli_cmd_list_sp].cmd_list_len; index++)
      {
          CONSOLE_OUT("    %s: %s\n",
          cli_cmd_list_stack[cli_cmd_list_sp].cmd_list[index].cmd,
          cli_cmd_list_stack[cli_cmd_list_sp].cmd_list[index].desc);
      }
      
      sum = osal_memory_statics();
      printf("osal_memory sum = %d\r\n", sum);
      printf("\r\n===== internal status ============\r\n");
      printf("llState = %d, llSecondaryState = %d\r\n", llState, llSecondaryState);	
  	printf("blebrr_state = %d\r\n", blebrr_state);
      printf("blebrr_advscan_timeout_count = %d\r\n", blebrr_advscan_timeout_count);
  
      return API_SUCCESS;
  }
  
  /* Back */
  API_RESULT cli_back(UINT32 argc, UCHAR *argv[])
  {
  
      CONSOLE_OUT("Going Back \n");
  
      cli_cmd_stack_pop();
  
      /* Print Help of the new level */
      cli_help(argc, argv);
  
      return API_SUCCESS;
  }
  
  /* Root */
  API_RESULT cli_root(UINT32 argc, UCHAR *argv[])
  {
      CONSOLE_OUT("Level - Root\n");
  
      /* Set Stack Pointer to Root */
      cli_cmd_list_sp = 0;
      cli_cmd_list_stack[cli_cmd_list_sp].cmd_list = (CLI_COMMAND *)cli_root_cmd_list;
      cli_cmd_list_stack[cli_cmd_list_sp].cmd_list_len = sizeof(cli_root_cmd_list) / sizeof(CLI_COMMAND);
  
      /* Print Help of the Root level */
      cli_help(argc, argv);
  
      return API_SUCCESS;
  }
  
  /* Log Level */
  API_RESULT cli_set_log_level(UINT32 argc, UCHAR *argv[])
  {
      UINT32  index;
      UCHAR * log_levels[4] = { "ERR", "TRC", "INF", "ALL" };
  
      CONSOLE_OUT("In Set Log Level\n");
  
      if (1 == argc)
      {
          for (index = 0; index < 4; index++)
          {
              if (0 == CLI_STR_COMPARE(argv[0], log_levels[index]))
              {
                  break;
              }
          }
  
          if (index > 3)
          {
              CONSOLE_OUT("Invalid Argument:%s\n", argv[0]);
              return API_FAILURE;
          }
  
          if (index < 3)
          {
              index += 1;
          }
  
          EM_set_debug_level((UCHAR)index);
          CONSOLE_OUT("Set Log Level:0x%02X\n", (UCHAR)index);
      }
      else
      {
          CONSOLE_OUT("Invalid Number of Arguments:0x%04X\n", argc);
      }
  
      return API_SUCCESS;
  }
  
  /* Module related Utility Routines */
  void cli_gatt_bearer_iface_event_pl_cb
       (
           UCHAR  ev_name,
           UCHAR  ev_param
       )
  {
     switch(ev_name)
      {
          /* GATT Bearer BLE Link Layer Disconnected */
          case BLEBRR_GATT_IFACE_DOWN:
              CONSOLE_OUT("\r\n >> GATT Bearer BLE Link Layer Disconnection Event Received!\r\n");
              CONSOLE_OUT("Invoke relevant CLI Commands! \r\n");
              break;
  
          /* GATT Bearer BLE Link Layer Connected */
          case BLEBRR_GATT_IFACE_UP:
              CONSOLE_OUT("\r\n >> GATT Bearer BLE Link Layer Connection Event Received!\r\n");
              /**
               * TODO:
               * Check if this only when DUT is Unprovisioned Device!
               * also check if this needs to be done.
               */
              MS_brr_bcast_end(BRR_BCON_TYPE_UNPROV_DEVICE, BRR_BCON_ACTIVE);
              break;
  
          /* GATT Bearer Service Enabled for Communication */
          case BLEBRR_GATT_IFACE_ENABLE:
              CONSOLE_OUT("\r\n >> GATT Bearer Active Event Received!\r\n");
              {
                  if (BLEBRR_GATT_PROV_MODE == ev_param)
                  {
                      /* Call to bind with the selected device */
                      /**
                       * TODO:
                       * This needs to be made role Specific.
                       * For Provisioner role, this below function needs to be
                       * updated. Typically for Provisioner Role, "Bind" needs
                       * to happen from the CLI command pointing to the desired
                       * PROV_DEVICE_S of Remote Unprovisioned Device.
                       */
                      appl_prov_bind_device(PROV_BRR_GATT);
                  }
              }
              break;
  
          /* GATT Bearer Service Disabled for Communication */
          case BLEBRR_GATT_IFACE_DISABLE:
              CONSOLE_OUT("\r\n >> GATT Bearer Inactive Event Received!\r\n");
              CONSOLE_OUT("Invoke relevant CLI Commands! \r\n");
              break;
  
          /* Unknown Event! */
          default:
              CONSOLE_OUT("\r\n >> GATT Bearer BLE Link Layer Unknown Event 0x%02X Received!\r\n", ev_name);
              break;
      }
  }
  
  #ifndef CLI_NO_MAIN
  int main (int argc, char **argv)
  {
      MS_IGNORE_UNUSED_PARAM(argc);
      MS_IGNORE_UNUSED_PARAM(argv);
  
      /* Initialize CLI */
      CLI_init();
  
      /* Set Root Command List and Length */
      cli_root(0, NULL);
  
      MS_LOOP_FOREVER()
      {
          /* */
          fgets(r_buf, sizeof(r_buf), stdin);
  
          CLI_process_line
          (
              r_buf,
              CLI_strlen(r_buf),
              cli_cmd_list_stack[cli_cmd_list_sp].cmd_list,
              cli_cmd_list_stack[cli_cmd_list_sp].cmd_list_len
          );
      }
  
      return 0;
  }
  #else /* CLI_NO_MAIN */
  void cli_input (char * cmd, int size)
  {
      CLI_process_line
      (
         (UCHAR *) cmd,
          size,
          cli_cmd_list_stack[cli_cmd_list_sp].cmd_list,
          cli_cmd_list_stack[cli_cmd_list_sp].cmd_list_len
      );
  }
  #endif /* CLI_NO_MAIN */
  #endif /* DEMO */
  