/** ----------------------------------------------------------------------
 *
 * Copyright (C) 2018 ST Microelectronics S.A.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *
 ----------------------------------------------------------------------*/

#ifndef HAL_FD_H_
#define HAL_FD_H_

#include "halcore.h"

#define STFLASHTOOL_VERSION 0x0503
/*
 *Structure containing fw version info
 */
typedef struct FWInfo {
  uint32_t patchVersion;
  uint32_t chipFwVersion;
  uint8_t chipHwVersion;
  uint32_t chipLoaderVersion;
  uint16_t chipCustVersion;
  uint16_t chipUwbVersion;
  bool hibernate_exited;

  uint16_t fileUwbVersion;
  uint8_t fileHwVersion;  // if 0, no FW patch available.
  uint32_t fileFwVersion;
  uint16_t fileCustVersion;  // if 0, no custom params available.
  uint8_t chipProdType;
} FWInfo;


/*
 *Structure containing capabilities
 */
typedef struct FWCap {
  uint8_t ObserveMode;

} FWCap;

typedef enum {
  //  HAL_FD_STATE_GET_ATR,
  HAL_FD_STATE_AUTHENTICATE,
  HAL_FD_STATE_ERASE_FLASH,
  HAL_FD_STATE_SEND_RAW_APDU,
  HAL_FD_STATE_EXIT_APDU,
} hal_fd_state_e;

typedef enum {
  HAL_FD_ST54L_STATE_PUY_KEYUSER,
  HAL_FD_ST54L_STATE_ERASE_UPGRADE_START,
  HAL_FD_ST54L_STATE_ERASE_NFC_AREA,
  HAL_FD_ST54L_STATE_ERASE_UPGRADE_STOP,
  HAL_FD_ST54L_STATE_SEND_RAW_APDU,
  HAL_FD_ST54L_STATE_SET_CONFIG,
  HAL_FD_ST54L_STATE_SWITCH_TO_USER,
} hal_fd_st54l_state_e;

#define FT_CLF_MODE_ERROR 0
#define FT_CLF_MODE_LOADER 1
#define FT_CLF_MODE_ROUTER 2

#define FW_TIMER_DURATION 3000

#define FW_PATCH_AVAILABLE 1
#define FW_CUSTOM_PARAM_AVAILABLE 2
#define FW_UWB_PARAM_AVAILABLE 4

#define FW_UPDATE_NEEDED 1
#define CONF_UPDATE_NEEDED 2
#define UWB_CONF_UPDATE_NEEDED 4

// HwVersion :
#define HW_NFCD 0x04
#define HW_ST54J 0x05
#define HW_ST54L 0x06

/* Function declarations */
int hal_fd_init();
void hal_fd_close();
uint8_t ft_cmd_HwReset(uint8_t* pdata, uint8_t* clf_mode);
void ExitHibernateHandler(HALHANDLE mHalHandle, uint16_t data_len,
                          uint8_t* p_data);
void FwUpdateHandler(HALHANDLE mHalHandle, uint16_t data_len, uint8_t* p_data);
void ApplyCustomParamHandler(HALHANDLE mHalHandle, uint16_t data_len,
                             uint8_t* p_data);
void ApplyUwbParamHandler(HALHANDLE mHalHandle, uint16_t data_len,
                             uint8_t* p_data);
void resetHandlerState();
bool ft_CheckUWBConf() ;
FWInfo* hal_fd_getFwInfo();
FWCap* hal_fd_getFwCap();
#endif /* HAL_FD_H_ */
