/***************************************************************************
 *
 * Copyright 2015-2019 BES.
 * All rights reserved. All unpublished rights reserved.
 *
 * No part of this work may be used or reproduced in any form or by any
 * means, or stored in a database or retrieval system, without prior written
 * permission of BES.
 *
 * Use of this work is governed by a license granted by BES.
 * This work contains confidential and proprietary information of
 * BES. which is protected by copyright, trade secret,
 * trademark and other intellectual property rights.
 *
 ****************************************************************************/
#include "app_status_ind.h"
#include "app_pwl.h"
#include "cmsis_os.h"
#include "hal_trace.h"
#include "stdbool.h"
#include "string.h"

static APP_STATUS_INDICATION_T app_status = APP_STATUS_INDICATION_NUM;
static APP_STATUS_INDICATION_T app_status_ind_filter =
    APP_STATUS_INDICATION_NUM;

const char *app_status_indication_str[] = {
    "[POWERON]",
    "[INITIAL]",
    "[PAGESCAN]",
    "[POWEROFF]",
    "[CHARGENEED]",
    "[CHARGING]",
    "[FULLCHARGE]",
    /* repeatable status: */
    "[BOTHSCAN]",
    "[CONNECTING]",
    "[CONNECTED]",
    "[DISCONNECTED]",
    "[CALLNUMBER]",
    "[INCOMINGCALL]",
    "[PAIRSUCCEED]",
    "[PAIRFAIL]",
    "[HANGUPCALL]",
    "[REFUSECALL]",
    "[ANSWERCALL]",
    "[CLEARSUCCEED]",
    "[CLEARFAIL]",
    "[WARNING]",
    "[ALEXA_START]",
    "[ALEXA_STOP]",
    "[GSOUND_MIC_OPEN]",
    "[GSOUND_MIC_CLOSE]",
    "[GSOUND_NC]",
    "[INVALID]",
    "[MUTE]",
    "[TESTMODE]",
    "[TESTMODE1]",
    "[RING_WARNING]",
#ifdef __INTERACTION__
    "[FINDME]",
#endif
    "[MY_BUDS_FIND]",
    "[TILE_FIND]",
};

const char *status2str(uint16_t status) {
  const char *str = NULL;

  if (status >= 0 && status < APP_STATUS_INDICATION_NUM) {
    str = app_status_indication_str[status];
  } else {
    str = "[UNKNOWN]";
  }

  return str;
}

int app_status_indication_filter_set(APP_STATUS_INDICATION_T status) {
  app_status_ind_filter = status;
  return 0;
}

APP_STATUS_INDICATION_T app_status_indication_get(void) { return app_status; }

int app_status_indication_set(APP_STATUS_INDICATION_T status) {
  struct APP_PWL_CFG_T cfg0;
  struct APP_PWL_CFG_T cfg1;

  if (app_status == status)
    return 0;

  if (app_status_ind_filter == status)
    return 0;

  TRACE(2, "%s %d", __func__, status);

  app_status = status;
  memset(&cfg0, 0, sizeof(struct APP_PWL_CFG_T));
  memset(&cfg1, 0, sizeof(struct APP_PWL_CFG_T));
  app_pwl_stop(APP_PWL_ID_0);
  app_pwl_stop(APP_PWL_ID_1);
  switch (status) {
  case APP_STATUS_INDICATION_POWERON:
    cfg0.part[0].level = 1;
    cfg0.part[0].time = (3000);
    cfg0.part[1].level = 0;
    cfg0.part[1].time = (200);
    cfg0.parttotal = 2;
    cfg0.startlevel = 1;
    cfg0.periodic = false;

    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);

    break;
  case APP_STATUS_INDICATION_INITIAL:
    break;
  case APP_STATUS_INDICATION_PAGESCAN:
    cfg0.part[0].level = 1;
    cfg0.part[0].time = (300);
    cfg0.part[1].level = 0;
    cfg0.part[1].time = (8000);
    cfg0.parttotal = 2;
    cfg0.startlevel = 1;
    cfg0.periodic = true;
    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    break;
  case APP_STATUS_INDICATION_BOTHSCAN:
    cfg0.part[0].level = 0;
    cfg0.part[0].time = (300);
    cfg0.part[1].level = 1;
    cfg0.part[1].time = (300);
    cfg0.parttotal = 2;
    cfg0.startlevel = 0;
    cfg0.periodic = true;

    cfg1.part[0].level = 1;
    cfg1.part[0].time = (300);
    cfg1.part[1].level = 0;
    cfg1.part[1].time = (300);
    cfg1.parttotal = 2;
    cfg1.startlevel = 1;
    cfg1.periodic = true;

    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_CONNECTING:
    // LED's alternating Red/Blue
    cfg0.part[0].level = 1;
    cfg0.part[0].time = (300);
    cfg0.part[1].level = 0;
    cfg0.part[1].time = (300);
    cfg0.parttotal = 2;
    cfg0.startlevel = 0;
    cfg0.periodic = true;

    cfg1.part[0].level = 1;
    cfg1.part[0].time = (300);
    cfg1.part[1].level = 0;
    cfg1.part[1].time = (300);
    cfg1.parttotal = 2;
    cfg1.startlevel = 1;
    cfg1.periodic = true;

    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_CONNECTED:
    cfg0.part[0].level = 1;
    cfg0.part[0].time = (500);
    cfg0.part[1].level = 0;
    cfg0.part[1].time = (3000);
    cfg0.parttotal = 2;
    cfg0.startlevel = 1;
    cfg0.periodic = true;

    cfg1.part[0].level = 0;
    cfg1.part[0].time = (500);
    cfg1.part[1].level = 0;
    cfg1.part[1].time = (3000);
    cfg1.parttotal = 2;
    cfg1.startlevel = 0;
    cfg1.periodic = true;
    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_CHARGING:
    cfg1.part[0].level = 1;
    cfg1.part[0].time = (5000);
    cfg1.parttotal = 1;
    cfg1.startlevel = 1;
    cfg1.periodic = true;
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_FULLCHARGE:
    cfg0.part[0].level = 0;
    cfg0.part[0].time = (5000);
    cfg0.parttotal = 1;
    cfg0.startlevel = 1;
    cfg0.periodic = false;
    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg0);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_POWEROFF:
    cfg1.part[0].level = 0;
    cfg1.part[0].time = (100);
    cfg1.parttotal = 1;
    cfg1.startlevel = 1;
    cfg1.periodic = false;
    cfg0.part[0].level = 0;
    cfg0.part[0].time = (100);
    cfg0.parttotal = 1;
    cfg0.startlevel = 1;
    cfg0.periodic = false;

    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    break;
  case APP_STATUS_INDICATION_CHARGENEED:
    cfg1.part[0].level = 1;
    cfg1.part[0].time = (500);
    cfg1.part[1].level = 0;
    cfg1.part[1].time = (2000);
    cfg1.parttotal = 2;
    cfg1.startlevel = 1;
    cfg1.periodic = true;
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_TESTMODE:
    cfg0.part[0].level = 0;
    cfg0.part[0].time = (300);
    cfg0.part[1].level = 1;
    cfg0.part[1].time = (300);
    cfg0.parttotal = 2;
    cfg0.startlevel = 0;
    cfg0.periodic = true;

    cfg1.part[0].level = 0;
    cfg1.part[0].time = (300);
    cfg1.part[1].level = 1;
    cfg1.part[1].time = (300);
    cfg1.parttotal = 2;
    cfg1.startlevel = 1;
    cfg1.periodic = true;

    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  case APP_STATUS_INDICATION_TESTMODE1:
    cfg0.part[0].level = 0;
    cfg0.part[0].time = (1000);
    cfg0.part[1].level = 1;
    cfg0.part[1].time = (1000);
    cfg0.parttotal = 2;
    cfg0.startlevel = 0;
    cfg0.periodic = true;

    cfg1.part[0].level = 0;
    cfg1.part[0].time = (1000);
    cfg1.part[1].level = 1;
    cfg1.part[1].time = (1000);
    cfg1.parttotal = 2;
    cfg1.startlevel = 1;
    cfg1.periodic = true;

    app_pwl_setup(APP_PWL_ID_0, &cfg0);
    app_pwl_start(APP_PWL_ID_0);
    app_pwl_setup(APP_PWL_ID_1, &cfg1);
    app_pwl_start(APP_PWL_ID_1);
    break;
  default:
    break;
  }
  return 0;
}
