// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// NOTE: THIS FILE IS AUTOMATICALLY GENERATED - DO NOT MODIFY

#ifndef HERMES_QMI_UIM_H_
#define HERMES_QMI_UIM_H_

#include <cstdint>

#include <libqrtr.h>

enum class QmiUimCommand : uint16_t {
  kReset = 0x00,
  kSendApdu = 0x3B,
  kOpenLogicalChannel = 0x42,
};
constexpr int kBufferDataSize = 260;

struct uim_qmi_result {
  uint16_t result;
  uint16_t error;
};

struct uim_card_result_t {
  uint8_t sw1;
  uint8_t sw2;
};

struct uim_open_logical_channel_req {
  uint8_t slot;
  bool aid_valid;
  uint8_t aid_len;
  uint8_t aid[kBufferDataSize];
};

struct uim_open_logical_channel_resp {
  uim_qmi_result result;
  bool channel_id_valid;
  uint8_t channel_id;
  bool card_result_valid;
  uim_card_result_t card_result;
  bool select_response_valid;
  uint8_t select_response_len;
  uint8_t select_response[kBufferDataSize];
};

struct uim_reset_req {
};

struct uim_reset_resp {
  uim_qmi_result result;
};

struct uim_send_apdu_req {
  uint8_t slot;
  uint16_t apdu_len;
  uint8_t apdu[kBufferDataSize];
  bool channel_id_valid;
  uint8_t channel_id;
};

struct uim_send_apdu_resp {
  uim_qmi_result result;
  bool apdu_response_valid;
  uint16_t apdu_response_len;
  uint8_t apdu_response[kBufferDataSize];
};

extern struct qmi_elem_info uim_open_logical_channel_req_ei[];
extern struct qmi_elem_info uim_open_logical_channel_resp_ei[];
extern struct qmi_elem_info uim_reset_req_ei[];
extern struct qmi_elem_info uim_reset_resp_ei[];
extern struct qmi_elem_info uim_send_apdu_req_ei[];
extern struct qmi_elem_info uim_send_apdu_resp_ei[];

#endif  // HERMES_QMI_UIM_H_
