Start adding a WiFi driver

This commit is contained in:
Jean-André Santoni 2016-09-21 16:06:14 +02:00 committed by twinaphex
parent 719533cf50
commit c45058d3ae
16 changed files with 494 additions and 2 deletions

View File

@ -173,6 +173,7 @@ OBJ += frontend/frontend.o \
gfx/video_coord_array.o \
gfx/video_driver.o \
camera/camera_driver.o \
wifi/wifi_driver.o \
location/location_driver.o \
driver.o \
configuration.o \
@ -217,6 +218,7 @@ OBJ += frontend/frontend.o \
audio/drivers_resampler/cc_resampler.o \
location/drivers/nulllocation.o \
camera/drivers/nullcamera.o \
wifi/drivers/nullwifi.o \
gfx/drivers/nullgfx.o \
audio/drivers/nullaudio.o \
input/drivers/nullinput.o \
@ -324,6 +326,10 @@ OBJ += frontend/drivers/platform_emscripten.o \
camera/drivers/rwebcam.o
endif
ifeq ($(HAVE_LAKKA), 1)
OBJ += wifi/drivers/connmanctl.o
endif
# Audio
#
ifeq ($(HAVE_COREAUDIO), 1)

View File

@ -114,6 +114,9 @@ enum
CAMERA_AVFOUNDATION,
CAMERA_NULL,
WIFI_CONNMANCTL,
WIFI_NULL,
LOCATION_ANDROID,
LOCATION_CORELOCATION,
LOCATION_NULL,
@ -309,6 +312,12 @@ enum
#define CAMERA_DEFAULT_DRIVER CAMERA_NULL
#endif
#if defined(HAVE_LAKKA)
#define WIFI_DEFAULT_DRIVER WIFI_CONNMANCTL
#else
#define WIFI_DEFAULT_DRIVER WIFI_NULL
#endif
#if defined(ANDROID)
#define LOCATION_DEFAULT_DRIVER LOCATION_ANDROID
#elif defined(HAVE_CORELOCATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH))

View File

@ -216,6 +216,12 @@ typedef struct settings
unsigned height;
} camera;
struct
{
char driver[32];
bool allow;
} wifi;
struct
{
char driver[32];

View File

@ -34,6 +34,7 @@
#include "camera/camera_driver.h"
#include "record/record_driver.h"
#include "location/location_driver.h"
#include "wifi/wifi_driver.h"
#include "configuration.h"
#include "core.h"
#include "driver.h"
@ -49,6 +50,7 @@
#define HASH_AUDIO_DRIVER 0x26594002U
#define HASH_AUDIO_RESAMPLER_DRIVER 0xedcba9ecU
#define HASH_RECORD_DRIVER 0x144cd2cfU
#define HASH_WIFI_DRIVER 0x64d7d17fU
/**
* find_driver_nonempty:
@ -118,6 +120,11 @@ static const void *find_driver_nonempty(const char *label, int i,
if (drv)
strlcpy(s, audio_resampler_driver_find_ident(i), len);
break;
case HASH_WIFI_DRIVER:
drv = wifi_driver_find_handle(i);
if (drv)
strlcpy(s, wifi_driver_find_ident(i), len);
break;
}
return drv;
@ -294,6 +301,8 @@ static void init_drivers(int flags)
camera_driver_ctl(RARCH_CAMERA_CTL_UNSET_OWN_DRIVER, NULL);
if (flags & DRIVER_LOCATION)
location_driver_ctl(RARCH_LOCATION_CTL_UNSET_OWN_DRIVER, NULL);
if (flags & DRIVER_WIFI)
wifi_driver_ctl(RARCH_WIFI_CTL_UNSET_OWN_DRIVER, NULL);
#ifdef HAVE_MENU
/* By default, we want the menu to persist through driver reinits. */
@ -390,6 +399,9 @@ static void uninit_drivers(int flags)
if (flags & DRIVER_AUDIO)
audio_driver_deinit();
if ((flags & DRIVER_WIFI) && !wifi_driver_ctl(RARCH_WIFI_CTL_OWNS_DRIVER, NULL))
wifi_driver_ctl(RARCH_WIFI_CTL_DEINIT, NULL);
if (flags & DRIVERS_VIDEO_INPUT)
video_driver_deinit();
@ -416,6 +428,7 @@ bool driver_ctl(enum driver_ctl_state state, void *data)
#endif
location_driver_ctl(RARCH_LOCATION_CTL_DESTROY, NULL);
camera_driver_ctl(RARCH_CAMERA_CTL_DESTROY, NULL);
wifi_driver_ctl(RARCH_WIFI_CTL_DESTROY, NULL);
core_uninit_libretro_callbacks();
break;
case RARCH_DRIVER_CTL_UNINIT:
@ -449,6 +462,7 @@ bool driver_ctl(enum driver_ctl_state state, void *data)
video_driver_find_driver();
input_driver_find_driver();
camera_driver_ctl(RARCH_CAMERA_CTL_FIND_DRIVER, NULL);
wifi_driver_ctl(RARCH_WIFI_CTL_FIND_DRIVER, NULL);
find_location_driver();
#ifdef HAVE_MENU
menu_driver_ctl(RARCH_MENU_CTL_FIND_DRIVER, NULL);

View File

@ -33,7 +33,8 @@ RETRO_BEGIN_DECLS
| DRIVER_CAMERA \
| DRIVER_LOCATION \
| DRIVER_MENU \
| DRIVERS_VIDEO_INPUT )
| DRIVERS_VIDEO_INPUT \
| DRIVER_WIFI )
enum
{
@ -43,7 +44,8 @@ enum
DRIVER_CAMERA = 1 << 3,
DRIVER_LOCATION = 1 << 4,
DRIVER_MENU = 1 << 5,
DRIVERS_VIDEO_INPUT = 1 << 6
DRIVERS_VIDEO_INPUT = 1 << 6,
DRIVER_WIFI = 1 << 7
};
enum driver_ctl_state

View File

@ -560,6 +560,12 @@ CAMERA
#include "../camera/drivers/nullcamera.c"
/*============================================================
WIFI
============================================================ */
#include "../wifi/drivers/nullwifi.c"
/*============================================================
LOCATION
============================================================ */

View File

@ -2886,6 +2886,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg)
return "menu_driver";
case MENU_ENUM_LABEL_CAMERA_DRIVER:
return "camera_driver";
case MENU_ENUM_LABEL_WIFI_DRIVER:
return "wifi_driver";
case MENU_ENUM_LABEL_LOCATION_DRIVER:
return "location_driver";
case MENU_ENUM_LABEL_OVERLAY_SCALE:
@ -4163,6 +4165,8 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg)
return "Menu Driver";
case MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER:
return "Camera Driver";
case MENU_ENUM_LABEL_VALUE_WIFI_DRIVER:
return "WiFi Driver";
case MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER:
return "Location Driver";
case MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE:

View File

@ -32,6 +32,10 @@
#include "camera/camera_driver.h"
#endif
#ifdef HAVE_WIFI
#include "wifi/wifi_driver.h"
#endif
#ifdef HAVE_LOCATION
#include "location/location_driver.h"
#endif
@ -180,6 +184,17 @@ struct string_list *string_list_new_special(enum string_list_type type,
string_list_append(s, opt, attr);
}
break;
#endif
case STRING_LIST_WIFI_DRIVERS:
#ifdef HAVE_WIFI
for (i = 0; wifi_driver_find_handle(i); i++)
{
const char *opt = wifi_driver_find_ident(i);
*len += strlen(opt) + 1;
string_list_append(s, opt, attr);
}
break;
#endif
case STRING_LIST_LOCATION_DRIVERS:
#ifdef HAVE_LOCATION

View File

@ -40,6 +40,7 @@ enum string_list_type
STRING_LIST_NONE = 0,
STRING_LIST_MENU_DRIVERS,
STRING_LIST_CAMERA_DRIVERS,
STRING_LIST_WIFI_DRIVERS,
STRING_LIST_LOCATION_DRIVERS,
STRING_LIST_AUDIO_DRIVERS,
STRING_LIST_AUDIO_RESAMPLER_DRIVERS,

View File

@ -4342,6 +4342,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_RECORD_DRIVER,
PARSE_ONLY_STRING_OPTIONS, false);
ret = menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_WIFI_DRIVER,
PARSE_ONLY_STRING_OPTIONS, false);
info->need_refresh = true;
info->need_push = true;

View File

@ -62,6 +62,7 @@
#include "../runloop.h"
#include "../verbosity.h"
#include "../camera/camera_driver.h"
#include "../wifi/wifi_driver.h"
#include "../location/location_driver.h"
#include "../record/record_driver.h"
#include "../audio/audio_driver.h"
@ -2658,6 +2659,24 @@ static bool setting_append_list(
(*list)[list_info->index - 1].action_right = setting_string_action_right_driver;
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_CAMERA_DRIVER);
CONFIG_STRING_OPTIONS(
list, list_info,
settings->wifi.driver,
sizeof(settings->wifi.driver),
msg_hash_to_str(MENU_ENUM_LABEL_WIFI_DRIVER),
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER),
config_get_default_camera(),
config_get_camera_driver_options(),
&group_info,
&subgroup_info,
parent_group,
general_read_handler,
general_write_handler);
settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
(*list)[list_info->index - 1].action_left = setting_string_action_left_driver;
(*list)[list_info->index - 1].action_right = setting_string_action_right_driver;
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_WIFI_DRIVER);
CONFIG_STRING_OPTIONS(
list, list_info,
settings->location.driver,

View File

@ -1175,6 +1175,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_MENU_DRIVER,
MENU_ENUM_LABEL_LOCATION_DRIVER,
MENU_ENUM_LABEL_CAMERA_DRIVER,
MENU_ENUM_LABEL_WIFI_DRIVER,
MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER,
MENU_ENUM_LABEL_RECORD_DRIVER,
MENU_ENUM_LABEL_VIDEO_DRIVER,
@ -1187,6 +1188,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER,
MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER,
MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER,
MENU_ENUM_LABEL_VALUE_WIFI_DRIVER,
MENU_ENUM_LABEL_VALUE_RECORD_DRIVER,
MENU_ENUM_LABEL_VALUE_MENU_DRIVER,

47
wifi/drivers/connmanctl.c Normal file
View File

@ -0,0 +1,47 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2015 - Michael Lelli
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "../wifi_driver.h"
static void *connmanctl_init(const char *device, uint64_t caps,
unsigned width, unsigned height)
{
(void)device;
return (void*)-1;
}
static void connmanctl_free(void *data)
{
(void)data;
}
static bool connmanctl_start(void *data)
{
(void)data;
return true;
}
static void connmanctl_stop(void *data)
{
(void)data;
}
wifi_driver_t wifi_connmanctl = {
connmanctl_init,
connmanctl_free,
connmanctl_start,
connmanctl_stop,
"connmanctl",
};

47
wifi/drivers/nullwifi.c Normal file
View File

@ -0,0 +1,47 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2015 - Michael Lelli
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "../wifi_driver.h"
static void *nullwifi_init(const char *device, uint64_t caps,
unsigned width, unsigned height)
{
(void)device;
return (void*)-1;
}
static void nullwifi_free(void *data)
{
(void)data;
}
static bool nullwifi_start(void *data)
{
(void)data;
return true;
}
static void nullwifi_stop(void *data)
{
(void)data;
}
wifi_driver_t wifi_null = {
nullwifi_init,
nullwifi_free,
nullwifi_start,
nullwifi_stop,
"null",
};

213
wifi/wifi_driver.c Normal file
View File

@ -0,0 +1,213 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2016 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#include "wifi_driver.h"
#include "../configuration.h"
#include "../driver.h"
#include "../retroarch.h"
#include "../runloop.h"
#include "../list_special.h"
#include "../verbosity.h"
static const wifi_driver_t *wifi_drivers[] = {
#ifdef HAVE_LAKKA
&wifi_connmanctl,
#endif
&wifi_null,
NULL,
};
/**
* wifi_driver_find_handle:
* @idx : index of driver to get handle to.
*
* Returns: handle to wifi driver at index. Can be NULL
* if nothing found.
**/
const void *wifi_driver_find_handle(int idx)
{
const void *drv = wifi_drivers[idx];
if (!drv)
return NULL;
return drv;
}
/**
* wifi_driver_find_ident:
* @idx : index of driver to get handle to.
*
* Returns: Human-readable identifier of wifi driver at index. Can be NULL
* if nothing found.
**/
const char *wifi_driver_find_ident(int idx)
{
const wifi_driver_t *drv = wifi_drivers[idx];
if (!drv)
return NULL;
return drv->ident;
}
/**
* config_get_wifi_driver_options:
*
* Get an enumerated list of all wifi driver names,
* separated by '|'.
*
* Returns: string listing of all wifi driver names,
* separated by '|'.
**/
const char* config_get_wifi_driver_options(void)
{
return char_list_new_special(STRING_LIST_WIFI_DRIVERS, NULL);
}
void driver_wifi_stop(void)
{
wifi_driver_ctl(RARCH_WIFI_CTL_START, NULL);
}
bool driver_wifi_start(void)
{
return wifi_driver_ctl(RARCH_WIFI_CTL_START, NULL);
}
bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data)
{
settings_t *settings = config_get_ptr();
static const wifi_driver_t *wifi_driver = NULL;
static void *wifi_data = NULL;
static bool wifi_driver_active = false;
static bool wifi_driver_data_own = false;
switch (state)
{
case RARCH_WIFI_CTL_DESTROY:
wifi_driver_active = false;
wifi_driver_data_own = false;
wifi_driver = NULL;
wifi_data = NULL;
break;
case RARCH_WIFI_CTL_SET_OWN_DRIVER:
wifi_driver_data_own = true;
break;
case RARCH_WIFI_CTL_UNSET_OWN_DRIVER:
wifi_driver_data_own = false;
break;
case RARCH_WIFI_CTL_OWNS_DRIVER:
return wifi_driver_data_own;
case RARCH_WIFI_CTL_SET_ACTIVE:
wifi_driver_active = true;
break;
case RARCH_WIFI_CTL_FIND_DRIVER:
{
int i;
driver_ctx_info_t drv;
drv.label = "wifi_driver";
drv.s = settings->wifi.driver;
driver_ctl(RARCH_DRIVER_CTL_FIND_INDEX, &drv);
i = drv.len;
if (i >= 0)
wifi_driver = (const wifi_driver_t*)wifi_driver_find_handle(i);
else
{
unsigned d;
RARCH_ERR("Couldn't find any wifi driver named \"%s\"\n",
settings->wifi.driver);
RARCH_LOG_OUTPUT("Available wifi drivers are:\n");
for (d = 0; wifi_driver_find_handle(d); d++)
RARCH_LOG_OUTPUT("\t%s\n", wifi_driver_find_ident(d));
RARCH_WARN("Going to default to first wifi driver...\n");
wifi_driver = (const wifi_driver_t*)wifi_driver_find_handle(0);
if (!wifi_driver)
retroarch_fail(1, "find_wifi_driver()");
}
}
break;
case RARCH_WIFI_CTL_UNSET_ACTIVE:
wifi_driver_active = false;
break;
case RARCH_WIFI_CTL_IS_ACTIVE:
return wifi_driver_active;
case RARCH_WIFI_CTL_DEINIT:
if (wifi_data && wifi_driver)
{
if (wifi_driver->free)
wifi_driver->free(wifi_data);
}
wifi_data = NULL;
break;
case RARCH_WIFI_CTL_STOP:
if ( wifi_driver
&& wifi_driver->stop
&& wifi_data)
wifi_driver->stop(wifi_data);
break;
case RARCH_WIFI_CTL_START:
if (wifi_driver && wifi_data && wifi_driver->start)
{
if (settings->wifi.allow)
return wifi_driver->start(wifi_data);
runloop_msg_queue_push(
"Camera is explicitly disabled.\n", 1, 180, false);
}
return false;
case RARCH_WIFI_CTL_SET_CB:
{
/*struct retro_wifi_callback *cb =
(struct retro_wifi_callback*)data;
wifi_cb = *cb;*/
}
break;
case RARCH_WIFI_CTL_INIT:
/* Resource leaks will follow if wifi is initialized twice. */
if (wifi_data)
return false;
wifi_driver_ctl(RARCH_WIFI_CTL_FIND_DRIVER, NULL);
wifi_data = wifi_driver->init();
if (!wifi_data)
{
RARCH_ERR("Failed to initialize wifi driver. Will continue without wifi.\n");
wifi_driver_ctl(RARCH_WIFI_CTL_UNSET_ACTIVE, NULL);
}
/*if (wifi_cb.initialized)
wifi_cb.initialized();*/
break;
default:
break;
}
return false;
}

98
wifi/wifi_driver.h Normal file
View File

@ -0,0 +1,98 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2016 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __WIFI_DRIVER__H
#define __WIFI_DRIVER__H
#include <stdint.h>
#include <boolean.h>
#include <retro_common_api.h>
#include <libretro.h>
RETRO_BEGIN_DECLS
enum rarch_wifi_ctl_state
{
RARCH_WIFI_CTL_NONE = 0,
RARCH_WIFI_CTL_DESTROY,
RARCH_WIFI_CTL_DEINIT,
RARCH_WIFI_CTL_SET_OWN_DRIVER,
RARCH_WIFI_CTL_UNSET_OWN_DRIVER,
RARCH_WIFI_CTL_OWNS_DRIVER,
RARCH_WIFI_CTL_SET_ACTIVE,
RARCH_WIFI_CTL_UNSET_ACTIVE,
RARCH_WIFI_CTL_IS_ACTIVE,
RARCH_WIFI_CTL_FIND_DRIVER,
RARCH_WIFI_CTL_SET_CB,
RARCH_WIFI_CTL_STOP,
RARCH_WIFI_CTL_START,
RARCH_WIFI_CTL_INIT
};
typedef struct wifi_driver
{
void *(*init)();
void (*free)(void *data);
bool (*start)(void *data);
void (*stop)(void *data);
const char *ident;
} wifi_driver_t;
extern wifi_driver_t wifi_connmanctl;
extern wifi_driver_t wifi_null;
/**
* config_get_wifi_driver_options:
*
* Get an enumerated list of all wifi driver names,
* separated by '|'.
*
* Returns: string listing of all wifi driver names,
* separated by '|'.
**/
const char* config_get_wifi_driver_options(void);
/**
* wifi_driver_find_handle:
* @index : index of driver to get handle to.
*
* Returns: handle to wifi driver at index. Can be NULL
* if nothing found.
**/
const void *wifi_driver_find_handle(int index);
/**
* wifi_driver_find_ident:
* @index : index of driver to get handle to.
*
* Returns: Human-readable identifier of wifi driver at index. Can be NULL
* if nothing found.
**/
const char *wifi_driver_find_ident(int index);
void driver_wifi_stop(void);
bool driver_wifi_start(void);
bool wifi_driver_ctl(enum rarch_wifi_ctl_state state, void *data);
RETRO_END_DECLS
#endif