/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
 *
 * 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 The Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * 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 <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <inttypes.h>

#include "mm_qcamera_main_menu.h"
#include "mm_qcamera_app.h"
#include "mm_qcamera_dbg.h"
#include "mm_qcamera_socket.h"

/*===========================================================================
 * Macro
 *===========================================================================*/
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
#define VIDEO_BUFFER_SIZE       (PREVIEW_WIDTH * PREVIEW_HEIGHT * 3/2)
#define THUMBNAIL_BUFFER_SIZE   (THUMBNAIL_WIDTH * THUMBNAIL_HEIGHT * 3/2)
#define SNAPSHOT_BUFFER_SIZE    (PICTURE_WIDTH * PICTURE_HEIGHT * 3/2)
//TODO:check this Macros with current app.

/*===========================================================================
 * Defines
 *===========================================================================*/
//#define VIDEO_FRAMES_NUM      4
#define THUMBNAIL_FRAMES_NUM  1
#define SNAPSHOT_FRAMES_NUM   1
#define MAX_NUM_FORMAT        32
#define ZOOM_STEP             2
#define ZOOM_MIN_VALUE        0
#define EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR 12
#define EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR -12
#define EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR 0
#define EXPOSURE_COMPENSATION_DENOMINATOR 6

//TODO: find correct values of Contrast defines.
#define CAMERA_MIN_CONTRAST    0
#define CAMERA_DEF_CONTRAST    5
#define CAMERA_MAX_CONTRAST    10
#define CAMERA_CONTRAST_STEP   1

//TODO: find correct values of Brightness defines.
#define CAMERA_MIN_BRIGHTNESS  0
#define CAMERA_DEF_BRIGHTNESS  3
#define CAMERA_MAX_BRIGHTNESS  6
#define CAMERA_BRIGHTNESS_STEP 1

//TODO: find correct values of Saturation defines.
#define CAMERA_MIN_SATURATION  0
#define CAMERA_DEF_SATURATION  5
#define CAMERA_MAX_SATURATION  10
#define CAMERA_SATURATION_STEP 1

#define CAMERA_MIN_SHARPNESS 0
#define CAMERA_MAX_SHARPNESS 10
#define CAMERA_DEF_SHARPNESS 5
#define CAMERA_SHARPNESS_STEP 1

const CAMERA_MAIN_MENU_TBL_T camera_main_menu_tbl[] = {
  {START_PREVIEW,               "Start preview"},
  {STOP_PREVIEW,               "Stop preview/video"},
  {SET_WHITE_BALANCE,          "Set white balance mode"},
  {SET_TINTLESS_ENABLE,        "Set Tintless Enable"},
  {SET_TINTLESS_DISABLE,       "Set Tintless Disable"},
  {SET_EXP_METERING,           "Set exposure metering mode"},
  {GET_CTRL_VALUE,             "Get control value menu"},
  {TOGGLE_AFR,                 "Toggle auto frame rate. Default fixed frame rate"},
  {SET_ISO,                    "ISO changes."},
  {BRIGHTNESS_GOTO_SUBMENU,    "Brightness changes."},
  {CONTRAST_GOTO_SUBMENU,      "Contrast changes."},
  {EV_GOTO_SUBMENU,            "EV changes."},
  {SATURATION_GOTO_SUBMENU,    "Saturation changes."},
  {SET_ZOOM,                   "Set Digital Zoom."},
  {SET_SHARPNESS,              "Set Sharpness."},
  {TAKE_JPEG_SNAPSHOT,         "Take a snapshot"},
  {START_RECORDING,            "Start RECORDING"},
  {STOP_RECORDING,             "Stop RECORDING"},
  {BEST_SHOT,                  "Set best-shot mode"},
  {LIVE_SHOT,                  "Take a live snapshot"},
  {FLASH_MODES,                "Set Flash modes"},
  {TOGGLE_ZSL,                 "Toggle ZSL On/Off"},
  {TAKE_RAW_SNAPSHOT,          "Take RAW snapshot"},
  {SWITCH_SNAP_RESOLUTION,     "Select Jpeg resolution"},
  {TOGGLE_WNR,                 "Toggle Wavelet Denoise"},
  {EXIT,                       "Exit"}
};

CAMERA_SENSOR_MENU_TLB_T sensor_tbl[] = {
        {"Primary Camera",      0},
        {"Secondary Camera",    0},
        {"Camera Sensor 3",     0},
        {"Camera Sensor 4",     0}
};

const CAMERA_BRIGHTNESS_TBL_T brightness_change_tbl[] = {
  {INC_BRIGHTNESS, "Increase Brightness by one step."},
  {DEC_BRIGHTNESS, "Decrease Brightness by one step."},
};

const CAMERA_CONTRST_TBL_T contrast_change_tbl[] = {
  {INC_CONTRAST, "Increase Contrast by one step."},
  {DEC_CONTRAST, "Decrease Contrast by one step."},
};

const CAMERA_EV_TBL_T camera_EV_tbl[] = {
  {INCREASE_EV, "Increase EV by one step."},
  {DECREASE_EV, "Decrease EV by one step."},
};

const CAMERA_SATURATION_TBL_T camera_saturation_tbl[] = {
  {INC_SATURATION, "Increase Satuation by one step."},
  {DEC_SATURATION, "Decrease Satuation by one step."},
};

const CAMERA_SHARPNESS_TBL_T camera_sharpness_tbl[] = {
  {INC_SHARPNESS, "Increase Sharpness."},
  {DEC_SHARPNESS, "Decrease Sharpness."},
};

const WHITE_BALANCE_TBL_T white_balance_tbl[] = {
  {   WB_AUTO,               "White Balance - Auto"},
  {   WB_INCANDESCENT,       "White Balance - Incandescent"},
  {   WB_FLUORESCENT,        "White Balance - Fluorescent"},
  {   WB_WARM_FLUORESCENT,   "White Balance - Warm Fluorescent"},
  {   WB_DAYLIGHT,           "White Balance - Daylight"},
  {   WB_CLOUDY_DAYLIGHT,    "White Balance - Cloudy Daylight"},
  {   WB_TWILIGHT,           "White Balance - Twilight"},
  {   WB_SHADE,              "White Balance - Shade"},
};

const GET_CTRL_TBL_T get_ctrl_tbl[] = {
  {     WHITE_BALANCE_STATE,            "Get white balance state (auto/off)"},
  {     WHITE_BALANCE_TEMPERATURE,      "Get white balance temperature"},
  {     BRIGHTNESS_CTRL,                "Get brightness value"},
  {     EV,                             "Get exposure value"},
  {     CONTRAST_CTRL,                  "Get contrast value"},
  {     SATURATION_CTRL,                "Get saturation value"},
  {     SHARPNESS_CTRL,                 "Get sharpness value"},
};

const EXP_METERING_TBL_T exp_metering_tbl[] = {
  {   AUTO_EXP_FRAME_AVG,          "Exposure Metering - Frame Average"},
  {   AUTO_EXP_CENTER_WEIGHTED,    "Exposure Metering - Center Weighted"},
  {   AUTO_EXP_SPOT_METERING,      "Exposure Metering - Spot Metering"},
  {   AUTO_EXP_SMART_METERING,     "Exposure Metering - Smart Metering"},
  {   AUTO_EXP_USER_METERING,      "Exposure Metering - User Metering"},
  {   AUTO_EXP_SPOT_METERING_ADV,  "Exposure Metering - Spot Metering Adv"},
  {   AUTO_EXP_CENTER_WEIGHTED_ADV,"Exposure Metering - Center Weighted Adv"},
};

const ISO_TBL_T iso_tbl[] = {
  {   ISO_AUTO,   "ISO: Auto"},
  {   ISO_DEBLUR, "ISO: Deblur"},
  {   ISO_100,    "ISO: 100"},
  {   ISO_200,    "ISO: 200"},
  {   ISO_400,    "ISO: 400"},
  {   ISO_800,    "ISO: 800"},
  {   ISO_1600,   "ISO: 1600"},
};

const ZOOM_TBL_T zoom_tbl[] = {
  {   ZOOM_IN,  "Zoom In one step"},
  {   ZOOM_OUT, "Zoom Out one step"},
};

const BESTSHOT_MODE_TBT_T bestshot_mode_tbl[] = {
  {BESTSHOT_AUTO,           "Bestshot Mode: Auto"},
  {BESTSHOT_ACTION,         "Bestshot Mode: Action"},
  {BESTSHOT_PORTRAIT,       "Bestshot Mode: Portrait"},
  {BESTSHOT_LANDSCAPE,      "Bestshot Mode: Landscape"},
  {BESTSHOT_NIGHT,          "Bestshot Mode: Night"},
  {BESTSHOT_NIGHT_PORTRAIT, "Bestshot Mode: Night Portrait"},
  {BESTSHOT_THEATRE,        "Bestshot Mode: Theatre"},
  {BESTSHOT_BEACH,          "Bestshot Mode: Beach"},
  {BESTSHOT_SNOW,           "Bestshot Mode: Snow"},
  {BESTSHOT_SUNSET,         "Bestshot Mode: Sunset"},
  {BESTSHOT_ANTISHAKE,      "Bestshot Mode: Antishake"},
  {BESTSHOT_FIREWORKS,      "Bestshot Mode: Fireworks"},
  {BESTSHOT_SPORTS,         "Bestshot Mode: Sports"},
  {BESTSHOT_PARTY,          "Bestshot Mode: Party"},
  {BESTSHOT_CANDLELIGHT,    "Bestshot Mode: Candlelight"},
  {BESTSHOT_ASD,            "Bestshot Mode: ASD"},
  {BESTSHOT_BACKLIGHT,      "Bestshot Mode: Backlight"},
  {BESTSHOT_FLOWERS,        "Bestshot Mode: Flowers"},
  {BESTSHOT_AR,             "Bestshot Mode: Augmented Reality"},
  {BESTSHOT_HDR,            "Bestshot Mode: HDR"},
};

const FLASH_MODE_TBL_T flashmodes_tbl[] = {
  {   FLASH_MODE_OFF,   "Flash Mode Off"},
  {   FLASH_MODE_AUTO,  "Flash Mode Auto"},
  {   FLASH_MODE_ON,    "Flash Mode On"},
  {   FLASH_MODE_TORCH, "Flash Mode Torch"},
};

DIMENSION_TBL_T dimension_tbl[] = {
{VGA_WIDTH,      VGA_HEIGHT,      "VGA",   "Size: VGA <640x480>"   , 0},
{MP1_WIDTH,      MP1_HEIGHT,      "1MP",   "Size: 1MP <1280x960>"  , 0},
{MP5_WIDTH,      MP5_HEIGHT,      "5MP",   "Size: 5MP <2592x1944>",  0},
{MP8_WIDTH,      MP8_HEIGHT,      "8MP",   "Size: 8MP <3264x2448>",  0},
{MP12_WIDTH,     MP12_HEIGHT,     "12MP",  "Size: 12MP <4000x3000>", 0},
};

/*===========================================================================
 * Forward declarations
 *===========================================================================*/
//static void system_dimension_set(mm_camera_test_obj_t *test_obj);
/*===========================================================================
 * Static global variables
 *===========================================================================*/
USER_INPUT_DISPLAY_T input_display;
int preview_video_resolution_flag = 0;

//TODO: default values.
#if 1
int brightness = CAMERA_DEF_BRIGHTNESS;
int contrast = CAMERA_DEF_CONTRAST;
int saturation = CAMERA_DEF_SATURATION;
int sharpness = CAMERA_DEF_SHARPNESS;
#else
int brightness = 0;
int contrast = 0;
int saturation = 0;
int sharpness = 0;
#endif
//TODO: find new method to calculate ev.
//int32_t ev_numerator = EXPOSURE_COMPENSATION_DEFAULT_NUMERATOR;

//TODO:
//fps_mode_t fps_mode = FPS_MODE_FIXED;
int zoom_level;
int zoom_max_value;
int cam_id;
int is_rec = 0;


static int submain();

/*===========================================================================
 * FUNCTION    - keypress_to_event -
 *
 * DESCRIPTION:
 *==========================================================================*/
int keypress_to_event(char keypress)
{
  char out_buf = INVALID_KEY_PRESS;
  if ((keypress >= 'A' && keypress <= 'Z') ||
    (keypress >= 'a' && keypress <= 'z')) {
    out_buf = tolower(keypress);
    out_buf = out_buf - 'a';
  } else if (keypress >= '0' && keypress <= '9') {
    out_buf = keypress - '0';
  }
  return out_buf;
}

int next_menu(menu_id_change_t current_menu_id, char keypress, camera_action_t * action_id_ptr, int * action_param)
{
  char output_to_event;
  menu_id_change_t next_menu_id = MENU_ID_INVALID;
  * action_id_ptr = ACTION_NO_ACTION;

  output_to_event = keypress_to_event(keypress);
  CDBG("current_menu_id=%d\n",current_menu_id);
  printf("output_to_event=%d\n",output_to_event);
  switch(current_menu_id) {
    case MENU_ID_MAIN:
      switch(output_to_event) {
        case START_PREVIEW:
          * action_id_ptr = ACTION_START_PREVIEW;
          CDBG("START_PREVIEW\n");
          break;
        case STOP_PREVIEW:
          * action_id_ptr = ACTION_STOP_PREVIEW;
          CDBG("STOP_PREVIEW\n");
          break;

        case SET_WHITE_BALANCE:
          next_menu_id = MENU_ID_WHITEBALANCECHANGE;
          CDBG("next_menu_id = MENU_ID_WHITEBALANCECHANGE = %d\n", next_menu_id);
          break;

        case SET_TINTLESS_ENABLE:
          * action_id_ptr = ACTION_SET_TINTLESS_ENABLE;
          next_menu_id = MENU_ID_MAIN;
          CDBG("next_menu_id = MENU_ID_TINTLESSENABLE = %d\n", next_menu_id);
          break;

        case SET_TINTLESS_DISABLE:
          * action_id_ptr = ACTION_SET_TINTLESS_DISABLE;
          next_menu_id = MENU_ID_MAIN;
          CDBG("next_menu_id = MENU_ID_TINTLESSDISABLE = %d\n", next_menu_id);
          break;

        case SET_EXP_METERING:
          next_menu_id = MENU_ID_EXPMETERINGCHANGE;
          CDBG("next_menu_id = MENU_ID_EXPMETERINGCHANGE = %d\n", next_menu_id);
          break;

        case GET_CTRL_VALUE:
          next_menu_id = MENU_ID_GET_CTRL_VALUE;
          CDBG("next_menu_id = MENU_ID_GET_CTRL_VALUE = %d\n", next_menu_id);
          break;

        case BRIGHTNESS_GOTO_SUBMENU:
          next_menu_id = MENU_ID_BRIGHTNESSCHANGE;
          CDBG("next_menu_id = MENU_ID_BRIGHTNESSCHANGE = %d\n", next_menu_id);
          break;

        case CONTRAST_GOTO_SUBMENU:
          next_menu_id = MENU_ID_CONTRASTCHANGE;
          break;

        case EV_GOTO_SUBMENU:
          next_menu_id = MENU_ID_EVCHANGE;
          break;

        case SATURATION_GOTO_SUBMENU:
          next_menu_id = MENU_ID_SATURATIONCHANGE;
          break;

        case TOGGLE_AFR:
          * action_id_ptr = ACTION_TOGGLE_AFR;
          CDBG("next_menu_id = MENU_ID_TOGGLEAFR = %d\n", next_menu_id);
          break;

        case SET_ISO:
          next_menu_id = MENU_ID_ISOCHANGE;
          CDBG("next_menu_id = MENU_ID_ISOCHANGE = %d\n", next_menu_id);
          break;

        case SET_ZOOM:
          next_menu_id = MENU_ID_ZOOMCHANGE;
          CDBG("next_menu_id = MENU_ID_ZOOMCHANGE = %d\n", next_menu_id);
          break;

        case BEST_SHOT:
          next_menu_id = MENU_ID_BESTSHOT;
          CDBG("next_menu_id = MENU_ID_BESTSHOT = %d\n", next_menu_id);
          break;

        case LIVE_SHOT:
          * action_id_ptr = ACTION_TAKE_LIVE_SNAPSHOT;
          CDBG("\nTaking Live snapshot\n");
          break;

        case FLASH_MODES:
          next_menu_id = MENU_ID_FLASHMODE;
          CDBG("next_menu_id = MENU_ID_FLASHMODE = %d\n", next_menu_id);
          break;

        case SET_SHARPNESS:
          next_menu_id = MENU_ID_SHARPNESSCHANGE;
          CDBG("next_menu_id = MENU_ID_SHARPNESSCHANGE = %d\n", next_menu_id);
          break;

        case SWITCH_SNAP_RESOLUTION:
          next_menu_id = MENU_ID_SWITCH_RES;
          CDBG("next_menu_id = MENU_ID_SWITCH_RES = %d\n", next_menu_id);
          break;

        case TAKE_JPEG_SNAPSHOT:
          * action_id_ptr = ACTION_TAKE_JPEG_SNAPSHOT;
          printf("\n Taking JPEG snapshot\n");
          break;

        case START_RECORDING:
          * action_id_ptr = ACTION_START_RECORDING;
          CDBG("Start recording\n");
          break;
        case STOP_RECORDING:
          * action_id_ptr = ACTION_STOP_RECORDING;
          CDBG("Stop recording\n");
          break;
        case TOGGLE_ZSL:
          * action_id_ptr = ACTION_TOGGLE_ZSL;
          CDBG("Toggle ZSL\n");
          break;
        case TAKE_RAW_SNAPSHOT:
            * action_id_ptr = ACTION_TAKE_RAW_SNAPSHOT;
            next_menu_id = MENU_ID_MAIN;
            CDBG("Capture RAW\n");
            break;
        case TOGGLE_WNR:
            * action_id_ptr = ACTION_TOGGLE_WNR;
            next_menu_id = MENU_ID_MAIN;
            CDBG("Toggle WNR");
            break;
        case EXIT:
          * action_id_ptr = ACTION_EXIT;
          CDBG("Exit \n");
          break;
        default:
          next_menu_id = MENU_ID_MAIN;
          CDBG("next_menu_id = MENU_ID_MAIN = %d\n", next_menu_id);
          break;
      }
      break;

    case MENU_ID_SWITCH_RES:
        printf("MENU_ID_SWITCH_RES\n");
        *action_id_ptr = ACTION_SWITCH_RESOLUTION;
        *action_param = output_to_event;
        int available_sizes = sizeof(dimension_tbl)/sizeof(dimension_tbl[0]);
        if ( ( *action_param >= 0 ) &&
             ( *action_param < available_sizes ) &&
             ( dimension_tbl[*action_param].supported )) {
            next_menu_id = MENU_ID_MAIN;
        }
        else {
          next_menu_id = current_menu_id;
        }
        break;

    case MENU_ID_SENSORS:
        next_menu_id = MENU_ID_MAIN;
        *action_id_ptr = ACTION_SWITCH_CAMERA;
        *action_param = output_to_event;
        break;

    case MENU_ID_WHITEBALANCECHANGE:
      printf("MENU_ID_WHITEBALANCECHANGE\n");
      if (output_to_event >= WB_MAX) {
        next_menu_id = current_menu_id;
        * action_id_ptr = ACTION_NO_ACTION;
      } else {
        next_menu_id = MENU_ID_MAIN;
        * action_id_ptr = ACTION_SET_WHITE_BALANCE;
        * action_param = output_to_event;
      }
      break;

    case MENU_ID_EXPMETERINGCHANGE:
      printf("MENU_ID_EXPMETERINGCHANGE\n");
      if (output_to_event >= AUTO_EXP_MAX) {
        next_menu_id = current_menu_id;
        * action_id_ptr = ACTION_NO_ACTION;
      } else {
        next_menu_id = MENU_ID_MAIN;
        * action_id_ptr = ACTION_SET_EXP_METERING;
        * action_param = output_to_event;
      }
      break;

    case MENU_ID_GET_CTRL_VALUE:
      printf("MENU_ID_GET_CTRL_VALUE\n");
      * action_id_ptr = ACTION_GET_CTRL_VALUE;
      if (output_to_event > 0 &&
        output_to_event <= sizeof(get_ctrl_tbl)/sizeof(get_ctrl_tbl[0])) {
          next_menu_id = MENU_ID_MAIN;
          * action_param = output_to_event;
      }
      else {
        next_menu_id = current_menu_id;
      }
      break;

    case MENU_ID_BRIGHTNESSCHANGE:
      switch (output_to_event) {
        case INC_BRIGHTNESS:
          * action_id_ptr = ACTION_BRIGHTNESS_INCREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        case DEC_BRIGHTNESS:
          * action_id_ptr = ACTION_BRIGHTNESS_DECREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        default:
          next_menu_id = MENU_ID_BRIGHTNESSCHANGE;
          break;
      }
      break;

    case MENU_ID_CONTRASTCHANGE:
      switch (output_to_event) {
        case INC_CONTRAST:
          * action_id_ptr = ACTION_CONTRAST_INCREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        case DEC_CONTRAST:
          * action_id_ptr = ACTION_CONTRAST_DECREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        default:
          next_menu_id = MENU_ID_CONTRASTCHANGE;
          break;
      }
      break;

    case MENU_ID_EVCHANGE:
      switch (output_to_event) {
        case INCREASE_EV:
          * action_id_ptr = ACTION_EV_INCREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        case DECREASE_EV:
          * action_id_ptr = ACTION_EV_DECREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        default:
          next_menu_id = MENU_ID_EVCHANGE;
          break;
      }
      break;

    case MENU_ID_SATURATIONCHANGE:
      switch (output_to_event) {
        case INC_SATURATION:
          * action_id_ptr = ACTION_SATURATION_INCREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        case DEC_SATURATION:
          * action_id_ptr = ACTION_SATURATION_DECREASE;
          next_menu_id = MENU_ID_MAIN;
          break;

        default:
          next_menu_id = MENU_ID_EVCHANGE;
          break;
      }
      break;

    case MENU_ID_ISOCHANGE:
      printf("MENU_ID_ISOCHANGE\n");
      if (output_to_event >= ISO_MAX) {
        next_menu_id = current_menu_id;
        * action_id_ptr = ACTION_NO_ACTION;
      } else {
        next_menu_id = MENU_ID_MAIN;
        * action_id_ptr = ACTION_SET_ISO;
        * action_param = output_to_event;
      }
      break;

    case MENU_ID_ZOOMCHANGE:
      * action_id_ptr = ACTION_SET_ZOOM;
      if (output_to_event > 0 &&
        output_to_event <= sizeof(zoom_tbl)/sizeof(zoom_tbl[0])) {
          next_menu_id = MENU_ID_MAIN;
          * action_param = output_to_event;
      } else {
        next_menu_id = current_menu_id;
      }
      break;

    case MENU_ID_SHARPNESSCHANGE:
      switch (output_to_event) {
        case INC_SHARPNESS:
          * action_id_ptr = ACTION_SHARPNESS_INCREASE;
          next_menu_id = MENU_ID_MAIN;
          break;
        case DEC_SHARPNESS:
          * action_id_ptr = ACTION_SHARPNESS_DECREASE;
          next_menu_id = MENU_ID_MAIN;
          break;
        default:
          next_menu_id = MENU_ID_SHARPNESSCHANGE;
          break;
      }
      break;

    case MENU_ID_BESTSHOT:
      if (output_to_event >= BESTSHOT_MAX) {
        next_menu_id = current_menu_id;
        * action_id_ptr = ACTION_NO_ACTION;
      } else {
        next_menu_id = MENU_ID_MAIN;
        * action_id_ptr = ACTION_SET_BESTSHOT_MODE;
        * action_param = output_to_event;
      }
      break;

    case MENU_ID_FLASHMODE:
      if (output_to_event >= FLASH_MODE_MAX) {
        next_menu_id = current_menu_id;
        * action_id_ptr = ACTION_NO_ACTION;
      } else {
        next_menu_id = MENU_ID_MAIN;
        * action_id_ptr = ACTION_SET_FLASH_MODE;
        * action_param = output_to_event;
      }
      break;

    default:
      CDBG("menu id is wrong: %d\n", current_menu_id);
      break;
  }

  return next_menu_id;
}

/*===========================================================================
 * FUNCTION    - print_menu_preview_video -
 *
 * DESCRIPTION:
 * ===========================================================================*/
static void print_menu_preview_video(void) {
  unsigned int i;
  if (!is_rec) {
    printf("\n");
    printf("===========================================\n");
    printf("      Camera is in preview/video mode now        \n");
    printf("===========================================\n\n");
  } else {
    printf("\n");
    printf("===========================================\n");
    printf("      Camera is in RECORDING mode now       \n");
    printf("        Press 'Q' To Stop Recording          \n");
    printf("        Press 'S' To Take Live Snapshot       \n");
    printf("===========================================\n\n");
  }
  char menuNum = 'A';
  for (i = 0; i < sizeof(camera_main_menu_tbl)/sizeof(camera_main_menu_tbl[0]); i++) {
    if (i == BASE_OFFSET) {
      menuNum = '1';
    }

    printf("%c.  %s\n", menuNum, camera_main_menu_tbl[i].menu_name);
    menuNum++;
  }

  printf("\nPlease enter your choice: ");

  return;
}

static void camera_preview_video_wb_change_tbl(void) {
  unsigned int i;
  printf("\n");
  printf("==========================================================\n");
  printf("      Camera is in white balance change mode       \n");
  printf("==========================================================\n\n");

  char submenuNum = 'A';
  for (i = 0 ; i < sizeof(white_balance_tbl) /
                   sizeof(white_balance_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, white_balance_tbl[i].wb_name);
        submenuNum++;
  }
  printf("\nPlease enter your choice for White Balance modes: ");
  return;
}

static void camera_preview_video_get_ctrl_value_tbl(void) {
  unsigned int i;
  printf("\n");
  printf("==========================================================\n");
  printf("      Camera is in get control value mode       \n");
  printf("==========================================================\n\n");

  char submenuNum = 'A';
  for (i = 0 ; i < sizeof(get_ctrl_tbl) /
                   sizeof(get_ctrl_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, get_ctrl_tbl[i].get_ctrl_name);
        submenuNum++;
  }
  printf("\nPlease enter your choice for control value you want to get: ");
  return;
}

static void camera_preview_video_exp_metering_change_tbl(void) {
  unsigned int i;
  printf("\n");
  printf("==========================================================\n");
  printf("      Camera is in exposure metering change mode       \n");
  printf("==========================================================\n\n");

  char submenuNum = 'A';
  for (i = 0 ; i < sizeof(exp_metering_tbl) /
                   sizeof(exp_metering_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, exp_metering_tbl[i].exp_metering_name);
        submenuNum++;
  }
  printf("\nPlease enter your choice for exposure metering modes: ");
  return;
}

static void camera_contrast_change_tbl(void) {
    unsigned int i;

    printf("\n");
    printf("==========================================================\n");
    printf("      Camera is in change contrast resolution mode       \n");
    printf("==========================================================\n\n");

    char contrastmenuNum = 'A';
    for (i = 0; i < sizeof(contrast_change_tbl) /
                    sizeof(contrast_change_tbl[0]); i++) {
        printf("%c.  %s\n", contrastmenuNum,
                            contrast_change_tbl[i].contrast_name);
        contrastmenuNum++;
    }

    printf("\nPlease enter your choice for contrast Change: ");
    return;
}

static void camera_EV_change_tbl(void) {
  unsigned int i;

  printf("\n");
  printf("===========================================\n");
  printf("      Camera is in EV change mode now       \n");
  printf("===========================================\n\n");

  char submenuNum = 'A';
  for (i = 0; i < sizeof(camera_EV_tbl)/sizeof(camera_EV_tbl[0]); i++) {
    printf("%c.  %s\n", submenuNum, camera_EV_tbl[i].EV_name);
    submenuNum++;
  }

  printf("\nPlease enter your choice for EV changes: ");
  return;
}

static void camera_resolution_change_tbl(void) {
    unsigned int i;

    printf("\n");
    printf("==========================================================\n");
    printf("      Camera is in snapshot resolution mode               \n");
    printf("==========================================================\n\n");

    for (i = 0; i < sizeof(dimension_tbl) /
      sizeof(dimension_tbl[0]); i++) {
        if ( dimension_tbl[i].supported ) {
            printf("%d.  %s\n", i,
                    dimension_tbl[i].str_name);
        }
    }

    printf("\nPlease enter your choice for Resolution: ");
    return;
}

static void camera_preview_video_zoom_change_tbl(void) {
    unsigned int i;
    zoom_max_value = MAX_ZOOMS_CNT;
    printf("\nCurrent Zoom Value = %d ,Max Zoom Value = %d\n",zoom_level,zoom_max_value);
    char submenuNum = 'A';
    for (i = 0 ; i < sizeof(zoom_tbl) /
                   sizeof(zoom_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, zoom_tbl[i].zoom_direction_name);
        submenuNum++;
    }
    printf("\nPlease enter your choice for zoom change direction: ");
    return;
}

static void camera_brightness_change_tbl(void) {
    unsigned int i;

    printf("\n");
    printf("==========================================================\n");
    printf("      Camera is in change brightness mode       \n");
    printf("==========================================================\n\n");

    char brightnessmenuNum = 'A';
    for (i = 0; i < sizeof(brightness_change_tbl) /
                    sizeof(brightness_change_tbl[0]); i++) {
        printf("%c.  %s\n", brightnessmenuNum,
                            brightness_change_tbl[i].brightness_name);
        brightnessmenuNum++;
    }

    printf("\nPlease enter your choice for Brightness Change: ");
    return;
}

static void camera_saturation_change_tbl(void) {
    unsigned int i;

    printf("\n");
    printf("==========================================================\n");
    printf("      Camera is in change saturation mode       \n");
    printf("==========================================================\n\n");

    char saturationmenuNum = 'A';
    for (i = 0; i < sizeof(camera_saturation_tbl) /
                    sizeof(camera_saturation_tbl[0]); i++) {
        printf("%c.  %s\n", saturationmenuNum,
                            camera_saturation_tbl[i].saturation_name);
        saturationmenuNum++;
    }

    printf("\nPlease enter your choice for Saturation Change: ");
    return;
}

static void camera_preview_video_iso_change_tbl(void) {
  unsigned int i;
  printf("\n");
  printf("==========================================================\n");
  printf("      Camera is in ISO change mode       \n");
  printf("==========================================================\n\n");

  char submenuNum = 'A';
  for (i = 0 ; i < sizeof(iso_tbl) /
                   sizeof(iso_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, iso_tbl[i].iso_modes_name);
        submenuNum++;
  }
  printf("\nPlease enter your choice for iso modes: ");
  return;
}

static void camera_preview_video_sharpness_change_tbl(void) {
  unsigned int i;
  printf("\n");
  printf("==========================================================\n");
  printf("      Camera is in sharpness change mode       \n");
  printf("==========================================================\n\n");

  char submenuNum = 'A';
  for (i = 0 ; i < sizeof(camera_sharpness_tbl) /
                   sizeof(camera_sharpness_tbl[0]); i++) {
        printf("%c.  %s\n", submenuNum, camera_sharpness_tbl[i].sharpness_name);
        submenuNum++;
  }
  printf("\nPlease enter your choice for sharpness modes: ");
  return;
}

static void camera_set_bestshot_tbl(void)
{
  unsigned int i;

  printf("\n");
  printf("===========================================\n");
  printf("      Camera is in set besthot mode now       \n");
  printf("===========================================\n\n");


  char bsmenuNum = 'A';
  for (i = 0; i < sizeof(bestshot_mode_tbl)/sizeof(bestshot_mode_tbl[0]); i++) {
    printf("%c.  %s\n", bsmenuNum,
      bestshot_mode_tbl[i].name);
    bsmenuNum++;
  }

  printf("\nPlease enter your choice of Bestshot Mode: ");
  return;
}

static void camera_set_flashmode_tbl(void)
{
  unsigned int i;

  printf("\n");
  printf("===========================================\n");
  printf("      Camera is in set flash mode now       \n");
  printf("===========================================\n\n");


  char bsmenuNum = 'A';
  for (i = 0; i < sizeof(flashmodes_tbl)/sizeof(flashmodes_tbl[0]); i++) {
    printf("%c.  %s\n", bsmenuNum,
      flashmodes_tbl[i].name);
    bsmenuNum++;
  }

  printf("\nPlease enter your choice of Bestshot Mode: ");
  return;
}

static void camera_sensors_tbl(void)
{
  unsigned int i;
  size_t available_sensors = sizeof(sensor_tbl)/sizeof(sensor_tbl[0]);

  printf("\n");
  printf("===========================================\n");
  printf("      Camera Sensor to be used:            \n");
  printf("===========================================\n\n");


  char bsmenuNum = 'A';
  for (i = 0; ( i < available_sensors ) && ( sensor_tbl[i].present ) ; i++) {
    printf("%c.  %s\n", bsmenuNum,
            sensor_tbl[i].menu_name);
    bsmenuNum++;
  }

  printf("\nPlease enter your choice for sensor: ");
  return;
}

/*===========================================================================
 * FUNCTION     - increase_contrast -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int increase_contrast (mm_camera_lib_handle *lib_handle) {
        contrast += CAMERA_CONTRAST_STEP;
        if (contrast > CAMERA_MAX_CONTRAST) {
                contrast = CAMERA_MAX_CONTRAST;
                printf("Reached max CONTRAST. \n");
        }
        printf("Increase Contrast to %d\n", contrast);
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_CONTRAST,
                                          &contrast,
                                          NULL);
}

/*===========================================================================
 * FUNCTION     - decrease_contrast -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int decrease_contrast (mm_camera_lib_handle *lib_handle) {
        contrast -= CAMERA_CONTRAST_STEP;
        if (contrast < CAMERA_MIN_CONTRAST) {
                contrast = CAMERA_MIN_CONTRAST;
                printf("Reached min CONTRAST. \n");
        }
        printf("Decrease Contrast to %d\n", contrast);
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_CONTRAST,
                                          &contrast,
                                          NULL);
}

/*===========================================================================
 * FUNCTION     - decrease_brightness -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int decrease_brightness (mm_camera_lib_handle *lib_handle) {
        brightness -= CAMERA_BRIGHTNESS_STEP;
        if (brightness < CAMERA_MIN_BRIGHTNESS) {
                brightness = CAMERA_MIN_BRIGHTNESS;
                printf("Reached min BRIGHTNESS. \n");
        }
        printf("Decrease Brightness to %d\n", brightness);
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_BRIGHTNESS,
                                          &brightness,
                                          NULL);
}

/*===========================================================================
 * FUNCTION     - increase_brightness -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int increase_brightness (mm_camera_lib_handle *lib_handle) {
        brightness += CAMERA_BRIGHTNESS_STEP;
        if (brightness > CAMERA_MAX_BRIGHTNESS) {
                brightness = CAMERA_MAX_BRIGHTNESS;
                printf("Reached max BRIGHTNESS. \n");
        }
        printf("Increase Brightness to %d\n", brightness);
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_BRIGHTNESS,
                                          &brightness,
                                          NULL);
}

/*===========================================================================
 * FUNCTION     - increase_EV -
 *
 * DESCRIPTION:
 * ===========================================================================*/

int increase_EV (void) {
#if 0
   int rc = 0;
   int32_t value = 0;
   rc = cam_config_is_parm_supported(cam_id, MM_CAMERA_PARM_EXPOSURE_COMPENSATION);
    if(!rc) {
       printf("MM_CAMERA_PARM_EXPOSURE_COMPENSATION mode is not supported for this sensor");
       return -1;
    }
    ev_numerator += 1;
    if(ev_numerator >= EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR &&
            ev_numerator <= EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR){
        int16_t  numerator16 = (int16_t)(ev_numerator & 0x0000ffff);
        uint16_t denominator16 = EXPOSURE_COMPENSATION_DENOMINATOR;
        value = numerator16 << 16 | denominator16;
    } else {
       printf("Reached max EV.\n");
    }
    return mm_app_set_config_parm(cam_id, MM_CAMERA_PARM_EXPOSURE_COMPENSATION, value);
#endif
  return 0;
}

/*===========================================================================
 * FUNCTION     - decrease_EV -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int decrease_EV (void) {
#if 0
   int rc = 0;
   int32_t  value = 0;
   rc = cam_config_is_parm_supported(cam_id, MM_CAMERA_PARM_EXPOSURE_COMPENSATION);
    if(!rc) {
       printf("MM_CAMERA_PARM_EXPOSURE_COMPENSATION mode is not supported for this sensor");
       return -1;
    }
    ev_numerator -= 1;
    if(ev_numerator >= EXPOSURE_COMPENSATION_MINIMUM_NUMERATOR &&
            ev_numerator <= EXPOSURE_COMPENSATION_MAXIMUM_NUMERATOR){
        int16_t  numerator16 = (int16_t)(ev_numerator & 0x0000ffff);
        uint16_t denominator16 = EXPOSURE_COMPENSATION_DENOMINATOR;
        value = numerator16 << 16 | denominator16;
    } else {
       printf("Reached min EV.\n");
    }
    return mm_app_set_config_parm(cam_id, MM_CAMERA_PARM_EXPOSURE_COMPENSATION, value);
#endif
  return 0;
}

/*===========================================================================
 * FUNCTION     - increase_saturation -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int increase_saturation (mm_camera_lib_handle *lib_handle) {
#if 0
  saturation += CAMERA_SATURATION_STEP;
  if (saturation > CAMERA_MAX_SATURATION) {
    saturation = CAMERA_MAX_SATURATION;
    printf("Reached max saturation. \n");
  }
  printf("Increase Saturation to %d\n", saturation);
  return mm_app_set_config_parm(cam_id, MM_CAMERA_PARM_SATURATION, saturation);
#endif
  saturation += CAMERA_SATURATION_STEP;
  if (saturation > CAMERA_MAX_SATURATION) {
    saturation = CAMERA_MAX_SATURATION;
    printf("Reached max saturation. \n");
  }
  printf("Increase saturation to %d\n", contrast);
  return mm_camera_lib_send_command(lib_handle,
                                       MM_CAMERA_LIB_SATURATION,
                                       &saturation,
                                       NULL);
}

/*===========================================================================
 * FUNCTION     - decrease_saturation -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int decrease_saturation (mm_camera_lib_handle *lib_handle) {
#if 0
  saturation -= CAMERA_SATURATION_STEP;
  if (saturation < CAMERA_MIN_SATURATION) {
    saturation = CAMERA_MIN_SATURATION;
    printf("Reached min saturation. \n");
  }
  printf("Dcrease Saturation to %d\n", saturation);
  return mm_app_set_config_parm(cam_id, MM_CAMERA_PARM_SATURATION, saturation);
#endif
  saturation -= CAMERA_SATURATION_STEP;
  if (saturation < CAMERA_MIN_SATURATION) {
    saturation = CAMERA_MIN_SATURATION;
    printf("Reached min saturation. \n");
  }
  printf("decrease saturation to %d\n", contrast);
  return mm_camera_lib_send_command(lib_handle,
                                       MM_CAMERA_LIB_SATURATION,
                                       &saturation,
                                       NULL);
}


int take_jpeg_snapshot(mm_camera_test_obj_t *test_obj, int is_burst_mode)
{
  CDBG_HIGH("\nEnter take_jpeg_snapshot!!\n");
  int rc = MM_CAMERA_OK;
  if(MM_CAMERA_OK != (rc = mm_app_take_picture(test_obj, is_burst_mode))) {
    CDBG_ERROR("%s: mm_app_take_picture() err=%d\n", __func__, rc);
  }
  return rc;
}

/*===========================================================================
 * FUNCTION    - main -
 *
 * DESCRIPTION:
 *==========================================================================*/
int main()
{
    char tc_buf[3];
    int mode = 0;
    int rc = 0;

    printf("Please Select Execution Mode:\n");
    printf("0: Menu Based 1: Regression\n");
    fgets(tc_buf, 3, stdin);
    mode = tc_buf[0] - '0';
    if(mode == 0) {
      printf("\nStarting Menu based!!\n");
    } else if(mode == 1) {
      printf("Starting Regression testing!!\n");
      if(!mm_app_start_regression_test(1)) {
         printf("\nRegressiion test passed!!\n");
         return 0;
      } else {
        printf("\nRegression test failed!!\n");
        exit(-1);
      }
    } else {
       printf("\nPlease Enter 0 or 1\n");
       printf("\nExisting the App!!\n");
       exit(-1);
    }


    rc = submain();

    printf("Exiting application\n");

    return rc;
}

/*===========================================================================
 * FUNCTION     - set_whitebalance -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int set_whitebalance (mm_camera_lib_handle *lib_handle, int wb_action_param) {
        cam_wb_mode_type type = 0;
        switch (wb_action_param) {
                case WB_AUTO:
                        printf("\n WB_AUTO\n");
                        type = CAM_WB_MODE_AUTO;
                        break;
                case WB_INCANDESCENT:
                        printf("\n WB_INCANDESCENT\n");
                        type = CAM_WB_MODE_INCANDESCENT;
                        break;
                case WB_FLUORESCENT:
                        printf("\n WB_FLUORESCENT\n");
                        type = CAM_WB_MODE_FLUORESCENT;
                        break;
                case WB_WARM_FLUORESCENT:
                        printf("\n WB_WARM_FLUORESCENT\n");
                        type = CAM_WB_MODE_WARM_FLUORESCENT;
                        break;
                case WB_DAYLIGHT:
                        printf("\n WB_DAYLIGHT\n");
                        type = CAM_WB_MODE_DAYLIGHT;
                        break;
                case WB_CLOUDY_DAYLIGHT:
                        printf("\n WB_CLOUDY_DAYLIGHT\n");
                        type = CAM_WB_MODE_CLOUDY_DAYLIGHT;
                        break;
               case WB_TWILIGHT:
                        printf("\n WB_TWILIGHT\n");
                        type = CAM_WB_MODE_TWILIGHT;
                        break;
               case WB_SHADE:
                        printf("\n WB_SHADE\n");
                        type = CAM_WB_MODE_SHADE;
                        break;
                default:
                        break;
        }
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_WB,
                                          &type,
                                          NULL);
}


/*===========================================================================
 * FUNCTION     - set_exp_metering -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int set_exp_metering (mm_camera_lib_handle *lib_handle, int exp_metering_action_param) {
        cam_auto_exposure_mode_type type = 0;
        switch (exp_metering_action_param) {
		case AUTO_EXP_FRAME_AVG:
                        printf("\nAUTO_EXP_FRAME_AVG\n");
                        type = CAM_AEC_MODE_FRAME_AVERAGE;
                        break;
                case AUTO_EXP_CENTER_WEIGHTED:
                        printf("\n AUTO_EXP_CENTER_WEIGHTED\n");
                        type = CAM_AEC_MODE_CENTER_WEIGHTED;
                        break;
                case AUTO_EXP_SPOT_METERING:
                        printf("\n AUTO_EXP_SPOT_METERING\n");
                        type = CAM_AEC_MODE_SPOT_METERING;
                        break;
                case AUTO_EXP_SMART_METERING:
                        printf("\n AUTO_EXP_SMART_METERING\n");
                        type = CAM_AEC_MODE_SMART_METERING;
                        break;
                case AUTO_EXP_USER_METERING:
                        printf("\n AUTO_EXP_USER_METERING\n");
                        type = CAM_AEC_MODE_USER_METERING;
                        break;
                case AUTO_EXP_SPOT_METERING_ADV:
                        printf("\n AUTO_EXP_SPOT_METERING_ADV\n");
                        type = CAM_AEC_MODE_SPOT_METERING_ADV;
                        break;
                case AUTO_EXP_CENTER_WEIGHTED_ADV:
                        printf("\n AUTO_EXP_CENTER_WEIGHTED_ADV\n");
                        type = CAM_AEC_MODE_CENTER_WEIGHTED_ADV;
                        break;
                default:
                        break;
        }
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_EXPOSURE_METERING,
                                          &type,
                                          NULL);
}

int get_ctrl_value (int ctrl_value_mode_param){
#if 0
    int rc = 0;
    struct v4l2_control ctrl;

    if (ctrl_value_mode_param == WHITE_BALANCE_STATE) {
        printf("You chose WHITE_BALANCE_STATE\n");
        ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE;
    }
    else if (ctrl_value_mode_param == WHITE_BALANCE_TEMPERATURE) {
        printf("You chose WHITE_BALANCE_TEMPERATURE\n");
        ctrl.id = V4L2_CID_WHITE_BALANCE_TEMPERATURE;
    }
    else if (ctrl_value_mode_param == BRIGHTNESS_CTRL) {
        printf("You chose brightness value\n");
        ctrl.id = V4L2_CID_BRIGHTNESS;
    }
    else if (ctrl_value_mode_param == EV) {
        printf("You chose exposure value\n");
        ctrl.id = V4L2_CID_EXPOSURE;
    }
    else if (ctrl_value_mode_param == CONTRAST_CTRL) {
        printf("You chose contrast value\n");
        ctrl.id = V4L2_CID_CONTRAST;
    }
    else if (ctrl_value_mode_param == SATURATION_CTRL) {
        printf("You chose saturation value\n");
        ctrl.id = V4L2_CID_SATURATION;
    } else if (ctrl_value_mode_param == SHARPNESS_CTRL) {
        printf("You chose sharpness value\n");
        ctrl.id = V4L2_CID_SHARPNESS;
    }

  //  rc = ioctl(camfd, VIDIOC_G_CTRL, &ctrl);
    return rc;
#endif
  return ctrl_value_mode_param;
}

/*===========================================================================
 * FUNCTION     - toggle_afr -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int toggle_afr () {
#if 0
    if (fps_mode == FPS_MODE_AUTO) {
        printf("\nSetting FPS_MODE_FIXED\n");
        fps_mode = FPS_MODE_FIXED;
    } else {
        printf("\nSetting FPS_MODE_AUTO\n");
        fps_mode = FPS_MODE_AUTO;
    }
    return mm_app_set_config_parm(cam_id, MM_CAMERA_PARM_FPS_MODE, fps_mode);
#endif
  return 0;
}

int set_zoom (mm_camera_lib_handle *lib_handle, int zoom_action_param) {

    if (zoom_action_param == ZOOM_IN) {
        zoom_level += ZOOM_STEP;
        if (zoom_level > zoom_max_value)
            zoom_level = zoom_max_value;
    } else if (zoom_action_param == ZOOM_OUT) {
        zoom_level -= ZOOM_STEP;
        if (zoom_level < ZOOM_MIN_VALUE)
            zoom_level = ZOOM_MIN_VALUE;
    } else {
        CDBG("%s: Invalid zoom_action_param value\n", __func__);
        return -EINVAL;
    }
    return mm_camera_lib_send_command(lib_handle,
                                      MM_CAMERA_LIB_ZOOM,
                                      &zoom_level,
                                      NULL);
}

/*===========================================================================
 * FUNCTION     - set_iso -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int set_iso (mm_camera_lib_handle *lib_handle, int iso_action_param) {
    cam_iso_mode_type type = 0;
    switch (iso_action_param) {
        case ISO_AUTO:
            printf("\n ISO_AUTO\n");
            type = CAM_ISO_MODE_AUTO;
            break;
        case ISO_DEBLUR:
            printf("\n ISO_DEBLUR\n");
            type = CAM_ISO_MODE_DEBLUR;
            break;
        case ISO_100:
            printf("\n ISO_100\n");
            type = CAM_ISO_MODE_100;
            break;
        case ISO_200:
            printf("\n ISO_200\n");
            type = CAM_ISO_MODE_200;
            break;
        case ISO_400:
            printf("\n ISO_400\n");
            type = CAM_ISO_MODE_400;
            break;
        case ISO_800:
            printf("\n ISO_800\n");
            type = CAM_ISO_MODE_800;
            break;
        case ISO_1600:
            printf("\n ISO_1600\n");
            type = CAM_ISO_MODE_1600;
            break;
        default:
            break;
    }
    return mm_camera_lib_send_command(lib_handle,
                                      MM_CAMERA_LIB_ISO,
                                      &type,
                                      NULL);
}

/*===========================================================================
 * FUNCTION     - increase_sharpness -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int increase_sharpness (mm_camera_lib_handle *lib_handle) {
    sharpness += CAMERA_SHARPNESS_STEP;
    if (sharpness > CAMERA_MAX_SHARPNESS) {
        sharpness = CAMERA_MAX_SHARPNESS;
        printf("Reached max SHARPNESS. \n");
    }
    printf("Increase Sharpness to %d\n", sharpness);
    return mm_camera_lib_send_command(lib_handle,
                                      MM_CAMERA_LIB_SHARPNESS,
                                      &sharpness,
                                      NULL);
}

/*===========================================================================
 * FUNCTION     - decrease_sharpness -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int decrease_sharpness (mm_camera_lib_handle *lib_handle) {
    sharpness -= CAMERA_SHARPNESS_STEP;
    if (sharpness < CAMERA_MIN_SHARPNESS) {
        sharpness = CAMERA_MIN_SHARPNESS;
        printf("Reached min SHARPNESS. \n");
    }
    printf("Decrease Sharpness to %d\n", sharpness);
    return mm_camera_lib_send_command(lib_handle,
                                      MM_CAMERA_LIB_SHARPNESS,
                                      &sharpness,
                                      NULL);
}

int set_flash_mode (mm_camera_lib_handle *lib_handle, int action_param) {
    cam_flash_mode_t type = 0;
    switch (action_param) {
        case FLASH_MODE_OFF:
            printf("\n FLASH_MODE_OFF\n");
            type = CAM_FLASH_MODE_OFF;
            break;
        case FLASH_MODE_AUTO:
            printf("\n FLASH_MODE_AUTO\n");
            type = CAM_FLASH_MODE_AUTO;
            break;
        case FLASH_MODE_ON:
            printf("\n FLASH_MODE_ON\n");
            type = CAM_FLASH_MODE_ON;
            break;
        case FLASH_MODE_TORCH:
            printf("\n FLASH_MODE_TORCH\n");
            type = CAM_ISO_MODE_100;
            break;
        default:
            break;
    }
    return mm_camera_lib_send_command(lib_handle,
                                      MM_CAMERA_LIB_FLASH,
                                      &type,
                                      NULL);
}

int set_bestshot_mode(mm_camera_lib_handle *lib_handle, int action_param) {
    cam_scene_mode_type type = 0;
    switch (action_param) {
       case BESTSHOT_AUTO:
            printf("\n BEST SHOT AUTO\n");
            type = CAM_SCENE_MODE_OFF;
            break;
        case BESTSHOT_ACTION:
            printf("\n BEST SHOT ACTION\n");
            type = CAM_SCENE_MODE_ACTION;
            break;
        case BESTSHOT_PORTRAIT:
            printf("\n BEST SHOT PORTRAIT\n");
            type = CAM_SCENE_MODE_PORTRAIT;
            break;
        case BESTSHOT_LANDSCAPE:
            printf("\n BEST SHOT LANDSCAPE\n");
            type = CAM_SCENE_MODE_LANDSCAPE;
            break;
        case BESTSHOT_NIGHT:
            printf("\n BEST SHOT NIGHT\n");
            type = CAM_SCENE_MODE_NIGHT;
            break;
        case BESTSHOT_NIGHT_PORTRAIT:
            printf("\n BEST SHOT NIGHT PORTRAIT\n");
            type = CAM_SCENE_MODE_NIGHT_PORTRAIT;
            break;
        case BESTSHOT_THEATRE:
            printf("\n BEST SHOT THREATRE\n");
            type = CAM_SCENE_MODE_THEATRE;
            break;
        case BESTSHOT_BEACH:
            printf("\n BEST SHOT BEACH\n");
            type = CAM_SCENE_MODE_BEACH;
            break;
        case BESTSHOT_SNOW:
            printf("\n BEST SHOT SNOW\n");
            type = CAM_SCENE_MODE_SNOW;
            break;
        case BESTSHOT_SUNSET:
            printf("\n BEST SHOT SUNSET\n");
            type = CAM_SCENE_MODE_SUNSET;
            break;
        case BESTSHOT_ANTISHAKE:
            printf("\n BEST SHOT ANTISHAKE\n");
            type = CAM_SCENE_MODE_ANTISHAKE;
            break;
        case BESTSHOT_FIREWORKS:
            printf("\n BEST SHOT FIREWORKS\n");
            type = CAM_SCENE_MODE_FIREWORKS;
            break;
        case BESTSHOT_SPORTS:
            printf("\n BEST SHOT SPORTS\n");
            type = CAM_SCENE_MODE_SPORTS;
            break;
        case BESTSHOT_PARTY:
            printf("\n BEST SHOT PARTY\n");
            type = CAM_SCENE_MODE_PARTY;
            break;
        case BESTSHOT_CANDLELIGHT:
            printf("\n BEST SHOT CANDLELIGHT\n");
            type = CAM_SCENE_MODE_CANDLELIGHT;
            break;
        case BESTSHOT_ASD:
            printf("\n BEST SHOT ASD\n");
            type = CAM_SCENE_MODE_AUTO;
            break;
        case BESTSHOT_BACKLIGHT:
            printf("\n BEST SHOT BACKLIGHT\n");
            type = CAM_SCENE_MODE_BACKLIGHT;
            break;
        case BESTSHOT_FLOWERS:
            printf("\n BEST SHOT FLOWERS\n");
            type = CAM_SCENE_MODE_FLOWERS;
            break;
        case BESTSHOT_AR:
            printf("\n BEST SHOT AR\n");
            type = CAM_SCENE_MODE_AR;
            break;
        case BESTSHOT_HDR:
            printf("\n BEST SHOT HDR\n");
            type = CAM_SCENE_MODE_OFF;
            break;
        default:
            break;
        }
        return mm_camera_lib_send_command(lib_handle,
                                          MM_CAMERA_LIB_BESTSHOT,
                                          &type,
                                          NULL);
}
/*===========================================================================
 * FUNCTION     - print_current_menu -
 *
 * DESCRIPTION:
 * ===========================================================================*/
int print_current_menu (menu_id_change_t current_menu_id) {
  if (current_menu_id == MENU_ID_MAIN) {
    print_menu_preview_video ();
  } else if (current_menu_id == MENU_ID_WHITEBALANCECHANGE) {
    camera_preview_video_wb_change_tbl();
  } else if (current_menu_id == MENU_ID_EXPMETERINGCHANGE) {
    camera_preview_video_exp_metering_change_tbl();
  } else if (current_menu_id == MENU_ID_GET_CTRL_VALUE) {
    camera_preview_video_get_ctrl_value_tbl();
  } else if (current_menu_id == MENU_ID_ISOCHANGE) {
    camera_preview_video_iso_change_tbl();
  } else if (current_menu_id == MENU_ID_BRIGHTNESSCHANGE) {
    camera_brightness_change_tbl ();
  } else if (current_menu_id == MENU_ID_CONTRASTCHANGE) {
    camera_contrast_change_tbl ();
  } else if (current_menu_id == MENU_ID_EVCHANGE) {
    camera_EV_change_tbl ();
  } else if (current_menu_id == MENU_ID_SATURATIONCHANGE) {
    camera_saturation_change_tbl ();
  } else if (current_menu_id == MENU_ID_ZOOMCHANGE) {
    camera_preview_video_zoom_change_tbl();
  } else if (current_menu_id == MENU_ID_SHARPNESSCHANGE) {
    camera_preview_video_sharpness_change_tbl();
  } else if (current_menu_id == MENU_ID_BESTSHOT) {
    camera_set_bestshot_tbl();
  } else if (current_menu_id == MENU_ID_FLASHMODE) {
    camera_set_flashmode_tbl();
  } else if (current_menu_id == MENU_ID_SENSORS ) {
    camera_sensors_tbl();
  } else if (current_menu_id == MENU_ID_SWITCH_RES ) {
    camera_resolution_change_tbl();
  }

  return 0;
}

int filter_resolutions(mm_camera_lib_handle *lib_handle,
                       DIMENSION_TBL_T *tbl,
                       size_t tbl_size)
{
    size_t i, j;
    cam_capability_t camera_cap;
    int rc = 0;

    if ( ( NULL == lib_handle ) || ( NULL == tbl ) ) {
        return -1;
    }

    rc = mm_camera_lib_get_caps(lib_handle, &camera_cap);
    if ( MM_CAMERA_OK != rc ) {
        CDBG_ERROR("%s:mm_camera_lib_get_caps() err=%d\n", __func__, rc);
        return -1;
    }

    for( i = 0 ; i < tbl_size ; i++ ) {
        for( j = 0; j < camera_cap.picture_sizes_tbl_cnt; j++ ) {
            if ( ( tbl[i].width == camera_cap.picture_sizes_tbl[j].width ) &&
                 ( tbl[i].height == camera_cap.picture_sizes_tbl[j].height ) ) {
                tbl[i].supported = 1;
                rc = i;
                break;
            }
        }
    }

    return rc;
}

/*===========================================================================
 * FUNCTION   : enableAFR
 *
 * DESCRIPTION: This function will go through the list
 *              of supported FPS ranges and select the
 *              one which has maximum range
 *
 * PARAMETERS :
 *   @lib_handle   : camera test library handle
 *
 * RETURN     : uint32_t type of stream handle
 *              MM_CAMERA_OK  -- Success
 *              !=MM_CAMERA_OK -- Error status
 *==========================================================================*/
int enableAFR(mm_camera_lib_handle *lib_handle)
{
    size_t i, j;
    float max_range = 0.0f;
    cam_capability_t cap;
    int rc = MM_CAMERA_OK;

    if ( NULL == lib_handle ) {
        return MM_CAMERA_E_INVALID_INPUT;
    }

    rc = mm_camera_lib_get_caps(lib_handle, &cap);
    if ( MM_CAMERA_OK != rc ) {
        CDBG_ERROR("%s:mm_camera_lib_get_caps() err=%d\n", __func__, rc);
        return rc;
    }

    for( i = 0, j = 0 ; i < cap.fps_ranges_tbl_cnt ; i++ ) {
        if ( max_range < (cap.fps_ranges_tbl[i].max_fps - cap.fps_ranges_tbl[i].min_fps) ) {
            j = i;
        }
    }

    rc = mm_camera_lib_send_command(lib_handle,
                                    MM_CAMERA_LIB_FPS_RANGE,
                                    &cap.fps_ranges_tbl[j],
                                    NULL);

    CDBG_ERROR("%s : FPS range [%5.2f:%5.2f] rc = %d",
              __func__,
              cap.fps_ranges_tbl[j].min_fps,
              cap.fps_ranges_tbl[j].max_fps,
              rc);

    return rc;
}

/*===========================================================================
 * FUNCTION     - submain -
 *
 * DESCRIPTION:
 * ===========================================================================*/
static int submain()
{
    int rc = 0;
    char tc_buf[3];
    menu_id_change_t current_menu_id = MENU_ID_MAIN, next_menu_id;
    camera_action_t action_id;
    int action_param;
    int isZSL = 0;
    uint8_t wnr_enabled = 0;
    mm_camera_lib_handle lib_handle;
    int num_cameras;
    int available_sensors = sizeof(sensor_tbl) / sizeof(sensor_tbl[0]);
    int available_snap_sizes = sizeof(dimension_tbl)/sizeof(dimension_tbl[0]);
    int i,c;
    mm_camera_lib_snapshot_params snap_dim;
    snap_dim.width = DEFAULT_SNAPSHOT_WIDTH;
    snap_dim.height = DEFAULT_SNAPSHOT_HEIGHT;
    cam_scene_mode_type default_scene= CAM_SCENE_MODE_OFF;
    int set_tintless= 0;

    mm_camera_test_obj_t test_obj;
    memset(&test_obj, 0, sizeof(mm_camera_test_obj_t));

    rc = mm_camera_lib_open(&lib_handle, 0);
    if (rc != MM_CAMERA_OK) {
        CDBG_ERROR("%s:mm_camera_lib_open() err=%d\n", __func__, rc);
        return -1;
    }

    num_cameras = mm_camera_lib_number_of_cameras(&lib_handle);
    if ( 0 >= num_cameras ) {
        CDBG_ERROR("%s: No camera sensors reported!", __func__);
        rc = -1;
        goto ERROR;
    } else if ( 1 <= num_cameras ) {
        c = MIN(num_cameras, available_sensors);
        for ( i = 0 ; i < c ; i++ ) {
            sensor_tbl[i].present = 1;
        }
        current_menu_id = MENU_ID_SENSORS;
    } else {
        i = filter_resolutions(&lib_handle,
                                dimension_tbl,
                                available_snap_sizes);
        if ( ( i < 0 ) || ( i >= available_snap_sizes ) ) {
            CDBG_ERROR("%s:filter_resolutions()\n", __func__);
            goto ERROR;
        }
        snap_dim.width = dimension_tbl[i].width;
        snap_dim.height = dimension_tbl[i].height;

        rc = enableAFR(&lib_handle);
        if (rc != MM_CAMERA_OK) {
            CDBG_ERROR("%s:enableAFR() err=%d\n", __func__, rc);
            goto ERROR;
        }

        rc =  mm_camera_lib_send_command(&lib_handle,
                                         MM_CAMERA_LIB_BESTSHOT,
                                         &default_scene,
                                         NULL);
        if (rc != MM_CAMERA_OK) {
            CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
            goto ERROR;
        }
    }
    /*start the eztune server*/
    CDBG_HIGH("Starting eztune Server \n");
    eztune_server_start(&lib_handle);

    do {
        print_current_menu (current_menu_id);
        fgets(tc_buf, 3, stdin);

        next_menu_id = next_menu(current_menu_id, tc_buf[0], & action_id, & action_param);

        if (next_menu_id != MENU_ID_INVALID) {
          current_menu_id = next_menu_id;
        }
        if (action_id == ACTION_NO_ACTION) {
          continue;
        }

        switch(action_id) {
            case ACTION_START_PREVIEW:
                CDBG_ERROR("ACTION_START_PREVIEW \n");
                rc = mm_camera_lib_start_stream(&lib_handle);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_start_stream() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_STOP_PREVIEW:
                CDBG("ACTION_STOP_PREVIEW \n");
                rc = mm_camera_lib_stop_stream(&lib_handle);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_stop_stream() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_SET_WHITE_BALANCE:
                CDBG("Selection for the White Balance changes\n");
                set_whitebalance(&lib_handle, action_param);
                break;

            case ACTION_SET_TINTLESS_ENABLE:
                CDBG("Selection for the Tintless enable changes\n");
                set_tintless = 1;
                rc =  mm_camera_lib_send_command(&lib_handle,
                                                 MM_CAMERA_LIB_SET_TINTLESS,
                                                 &set_tintless,
                                                 NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_SET_TINTLESS_DISABLE:
                CDBG("Selection for the Tintless disable changes\n");
                set_tintless = 0;
                rc =  mm_camera_lib_send_command(&lib_handle,
                                                 MM_CAMERA_LIB_SET_TINTLESS,
                                                 &set_tintless,
                                                 NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_SET_EXP_METERING:
                CDBG("Selection for the Exposure Metering changes\n");
                set_exp_metering(&lib_handle, action_param);
                break;

            case ACTION_GET_CTRL_VALUE:
                CDBG("Selection for getting control value\n");
                get_ctrl_value(action_param);
                break;

            case ACTION_BRIGHTNESS_INCREASE:
                printf("Increase brightness\n");
                increase_brightness(&lib_handle);
                break;

            case ACTION_BRIGHTNESS_DECREASE:
                printf("Decrease brightness\n");
                decrease_brightness(&lib_handle);
                break;

            case ACTION_CONTRAST_INCREASE:
                CDBG("Selection for the contrast increase\n");
                increase_contrast (&lib_handle);
                break;

            case ACTION_CONTRAST_DECREASE:
                CDBG("Selection for the contrast decrease\n");
                decrease_contrast (&lib_handle);
                break;

            case ACTION_EV_INCREASE:
                CDBG("Selection for the EV increase\n");
                increase_EV ();
                break;

            case ACTION_EV_DECREASE:
                CDBG("Selection for the EV decrease\n");
                decrease_EV ();
                break;

            case ACTION_SATURATION_INCREASE:
                CDBG("Selection for the EV increase\n");
                increase_saturation (&lib_handle);
                break;

            case ACTION_SATURATION_DECREASE:
                CDBG("Selection for the EV decrease\n");
                decrease_saturation (&lib_handle);
                break;

            case ACTION_TOGGLE_AFR:
                CDBG("Select for auto frame rate toggling\n");
                toggle_afr();
                break;

            case ACTION_SET_ISO:
                CDBG("Select for ISO changes\n");
                set_iso(&lib_handle, action_param);
                break;

            case ACTION_SET_ZOOM:
                CDBG("Selection for the zoom direction changes\n");
                set_zoom(&lib_handle, action_param);
                break;

            case ACTION_SHARPNESS_INCREASE:
                CDBG("Selection for sharpness increase\n");
                increase_sharpness(&lib_handle);
                break;

            case ACTION_SHARPNESS_DECREASE:
                CDBG("Selection for sharpness decrease\n");
                decrease_sharpness(&lib_handle);
                break;

            case ACTION_SET_BESTSHOT_MODE:
                CDBG("Selection for bestshot\n");
                set_bestshot_mode(&lib_handle, action_param);
                break;

            case ACTION_SET_FLASH_MODE:
                printf("\n Selection for flashmode\n");
                set_flash_mode(&lib_handle, action_param);
                break;

            case ACTION_SWITCH_CAMERA:
                rc = mm_camera_lib_close(&lib_handle);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_close() err=%d\n", __func__, rc);
                    goto ERROR;
                }

                rc = mm_camera_lib_open(&lib_handle, action_param);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_open() err=%d\n", __func__, rc);
                    goto ERROR;
                }

                i = filter_resolutions(&lib_handle,
                                        dimension_tbl,
                                        sizeof(dimension_tbl)/sizeof(dimension_tbl[0]));
                if ( ( i < 0 ) || ( i >=  available_snap_sizes ) ) {
                    CDBG_ERROR("%s:filter_resolutions()\n", __func__);
                    goto ERROR;
                }
                snap_dim.width = dimension_tbl[i].width;
                snap_dim.height = dimension_tbl[i].height;

                rc = enableAFR(&lib_handle);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:enableAFR() err=%d\n", __func__, rc);
                    goto ERROR;
                }

                rc =  mm_camera_lib_send_command(&lib_handle,
                                                 MM_CAMERA_LIB_BESTSHOT,
                                                 &default_scene,
                                                 NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_TOGGLE_ZSL:
                printf("ZSL Toggle !!!\n");
                isZSL = !isZSL;
                if ( isZSL ) {
                    printf("ZSL on !!!\n");
                } else {
                    printf("ZSL off !!!\n");
                }
                rc = mm_camera_lib_send_command(&lib_handle,
                                                MM_CAMERA_LIB_ZSL_ENABLE,
                                                &isZSL,
                                                NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_TAKE_RAW_SNAPSHOT:
                CDBG_HIGH("\n Take RAW snapshot\n");

                rc = mm_camera_lib_send_command(&lib_handle,
                                                MM_CAMERA_LIB_DO_AF,
                                                NULL,
                                                NULL);

                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }

                rc = mm_camera_lib_send_command(&lib_handle,
                                                MM_CAMERA_LIB_RAW_CAPTURE,
                                                NULL,
                                                NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;

            case ACTION_TAKE_JPEG_SNAPSHOT:
                CDBG_HIGH("\n Take JPEG snapshot\n");

                rc = mm_camera_lib_send_command(&lib_handle,
                                                MM_CAMERA_LIB_DO_AF,
                                                NULL,
                                                NULL);

                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }

                rc = mm_camera_lib_send_command(&lib_handle,
                                                MM_CAMERA_LIB_JPEG_CAPTURE,
                                                &snap_dim,
                                                NULL);
                if (rc != MM_CAMERA_OK) {
                    CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
                    goto ERROR;
                }
                break;
            case ACTION_SWITCH_RESOLUTION:
                printf("\n Switch snapshot resolution to %dx%d\n",
                       dimension_tbl[action_param].width,
                       dimension_tbl[action_param].height);
                snap_dim.width = dimension_tbl[action_param].width;
                snap_dim.height = dimension_tbl[action_param].height;
                break;

      case ACTION_START_RECORDING:
        CDBG("Start recording action\n");
#if 0
        if (mm_app_start_video(cam_id) < 0)
          goto ERROR;
        is_rec = 1;
#endif
        break;
      case ACTION_STOP_RECORDING:
        CDBG("Stop recording action\n");
#if 0
        if(is_rec) {
          if (mm_app_stop_video(cam_id) < 0)
            goto ERROR;
          is_rec = 0;
        }
#endif
        break;
      case ACTION_TAKE_LIVE_SNAPSHOT:
        printf("Selection for live shot\n");
#if 0
        if(is_rec)
           mm_app_take_live_snapshot(cam_id);
        else
           printf("\n !!! Use live snapshot option while recording only !!!\n");
#endif
        break;

        case ACTION_TOGGLE_WNR:
          wnr_enabled = !wnr_enabled;
          printf("WNR Enabled = %d\n", wnr_enabled);
          rc = mm_camera_lib_send_command(&lib_handle,
                                          MM_CAMERA_LIB_WNR_ENABLE,
                                          &wnr_enabled,
                                          NULL);
          if (rc != MM_CAMERA_OK) {
              CDBG_ERROR("%s:mm_camera_lib_send_command() err=%d\n", __func__, rc);
              goto ERROR;
          }
          break;

        case ACTION_EXIT:
            printf("Exiting....\n");
            break;
        case ACTION_NO_ACTION:
            printf("Go back to main menu");
            break;

        default:
            printf("\n\n!!!!!WRONG INPUT: %d!!!!\n", action_id);
            break;
    }

    usleep(1000 * 1000);
    CDBG("action_id = %d\n", action_id);

  } while (action_id != ACTION_EXIT);
  action_id = ACTION_NO_ACTION;

    mm_camera_lib_close(&lib_handle);
    return 0;

ERROR:

    mm_camera_lib_close(&lib_handle);

    return rc;
}

