/*
 * Copyright (c) 2013-2020 Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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
 *
 * 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.
 */

#include "Driver_WiFi.h"

#define ARM_WIFI_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(1, 0)        // Driver version

// Driver Version
static const ARM_DRIVER_VERSION driver_version = {
  ARM_WIFI_API_VERSION,
  ARM_WIFI_DRV_VERSION 
};

// Driver Capabilities
static const ARM_WIFI_CAPABILITIES driver_capabilities = { 
  0U,                                   // Station supported
  0U,                                   // Access Point supported
  0U,                                   // Concurrent Station and Access Point not supported
  0U,                                   // WiFi Protected Setup (WPS) for Station supported
  0U,                                   // WiFi Protected Setup (WPS) for Access Point not supported
  0U,                                   // Access Point: event generated on Station connect
  0U,                                   // Access Point: event not generated on Station disconnect
  0U,                                   // Event not generated on Ethernet frame reception in bypass mode
  0U,                                   // Bypass or pass-through mode (Ethernet interface) not supported
  0U,                                   // IP (UDP/TCP) (Socket interface) supported
  0U,                                   // IPv6 (Socket interface) not supported
  0U,                                   // Ping (ICMP) supported
  0U                                    // Reserved (must be zero)
};
static ARM_DRIVER_VERSION ARM_WiFi_GetVersion (void) {
  return driver_version;
}

static ARM_WIFI_CAPABILITIES ARM_WiFi_GetCapabilities (void) { 
  return driver_capabilities;
}

static int32_t ARM_WiFi_Initialize (ARM_WIFI_SignalEvent_t cb_event) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_Uninitialize (void) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_PowerControl (ARM_POWER_STATE state) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_GetModuleInfo (char *module_info, uint32_t max_len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SetOption (uint32_t interface, uint32_t option, const void *data, uint32_t len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_GetOption (uint32_t interface, uint32_t option, void *data, uint32_t *len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}
static int32_t ARM_WiFi_Scan (ARM_WIFI_SCAN_INFO_t scan_info[], uint32_t max_num) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_Activate (uint32_t interface, const ARM_WIFI_CONFIG_t *config) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_Deactivate (uint32_t interface) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static uint32_t ARM_WiFi_IsConnected (void) {
  return 0U;
}

static int32_t ARM_WiFi_GetNetInfo (ARM_WIFI_NET_INFO_t *net_info) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_BypassControl (uint32_t interface, uint32_t mode) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_EthSendFrame (uint32_t interface, const uint8_t *frame, uint32_t len){
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_EthReadFrame (uint32_t interface, uint8_t *frame, uint32_t len){
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static uint32_t ARM_WiFi_EthGetRxFrameSize (uint32_t interface){
  return 0U;
}

static int32_t ARM_WiFi_SocketCreate (int32_t af, int32_t type, int32_t protocol) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketBind (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketListen (int32_t socket, int32_t backlog) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketAccept (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketConnect (int32_t socket, const uint8_t *ip, uint32_t ip_len, uint16_t port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketRecv (int32_t socket, void *buf, uint32_t len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketRecvFrom (int32_t socket, void *buf, uint32_t len, uint8_t *ip, uint32_t *ip_len, uint16_t *port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketSend (int32_t socket, const void *buf, uint32_t len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketSendTo (int32_t socket, const void *buf, uint32_t len, const uint8_t *ip, uint32_t ip_len, uint16_t port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketGetSockName (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketGetPeerName (int32_t socket, uint8_t *ip, uint32_t *ip_len, uint16_t *port) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketGetOpt (int32_t socket, int32_t opt_id, void *opt_val, uint32_t *opt_len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketSetOpt (int32_t socket, int32_t opt_id, const void *opt_val, uint32_t opt_len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketClose (int32_t socket) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_SocketGetHostByName (const char *name, int32_t af, uint8_t *ip, uint32_t *ip_len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

static int32_t ARM_WiFi_Ping (const uint8_t *ip, uint32_t ip_len) {
  return ARM_DRIVER_ERROR_UNSUPPORTED;
}

/* WiFi Driver Control Block */
extern \
ARM_DRIVER_WIFI Driver_WiFi0;
ARM_DRIVER_WIFI Driver_WiFi0 = { 
  ARM_WiFi_GetVersion,
  ARM_WiFi_GetCapabilities,
  ARM_WiFi_Initialize,
  ARM_WiFi_Uninitialize,
  ARM_WiFi_PowerControl,
  ARM_WiFi_GetModuleInfo,
  ARM_WiFi_SetOption,
  ARM_WiFi_GetOption,
  ARM_WiFi_Scan,
  ARM_WiFi_Activate,
  ARM_WiFi_Deactivate,
  ARM_WiFi_IsConnected,
  ARM_WiFi_GetNetInfo,
  ARM_WiFi_BypassControl,
  ARM_WiFi_EthSendFrame,
  ARM_WiFi_EthReadFrame,
  ARM_WiFi_EthGetRxFrameSize,
  ARM_WiFi_SocketCreate,
  ARM_WiFi_SocketBind,
  ARM_WiFi_SocketListen,
  ARM_WiFi_SocketAccept,
  ARM_WiFi_SocketConnect,
  ARM_WiFi_SocketRecv,
  ARM_WiFi_SocketRecvFrom,
  ARM_WiFi_SocketSend,
  ARM_WiFi_SocketSendTo,
  ARM_WiFi_SocketGetSockName,
  ARM_WiFi_SocketGetPeerName,
  ARM_WiFi_SocketGetOpt,
  ARM_WiFi_SocketSetOpt,
  ARM_WiFi_SocketClose,
  ARM_WiFi_SocketGetHostByName,
  ARM_WiFi_Ping
};