From 7c994669ab6aaecc93ffe6cb7b8692165bdd1a74 Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Sun, 15 Nov 2015 18:02:48 +1300 Subject: [PATCH] Added wireless connection controller Base framework for wireless connection controller to replace radio controller for device communication --- baystation12.dme | 4 ++ code/controllers/Processes/wireless.dm | 6 +++ code/controllers/verbs.dm | 5 ++- code/modules/wireless/interfaces.dm | 56 ++++++++++++++++++++++++++ code/modules/wireless/manager.dm | 47 +++++++++++++++++++++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 code/controllers/Processes/wireless.dm create mode 100644 code/modules/wireless/interfaces.dm create mode 100644 code/modules/wireless/manager.dm diff --git a/baystation12.dme b/baystation12.dme index 4d326ffcedb..b9a1e34febf 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -139,6 +139,8 @@ #include "code\controllers\Processes\ticker.dm" #include "code\controllers\Processes\turf.dm" #include "code\controllers\Processes\vote.dm" +#include "code\controllers\Processes\wireless.dm" +#include "code\controllers\ProcessScheduler\core\_define.dm" #include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" @@ -1830,6 +1832,8 @@ #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\modules\wireless\interfaces.dm" +#include "code\modules\wireless\manager.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" #include "code\ZAS\_docs.dm" diff --git a/code/controllers/Processes/wireless.dm b/code/controllers/Processes/wireless.dm new file mode 100644 index 00000000000..8cc3d039d8b --- /dev/null +++ b/code/controllers/Processes/wireless.dm @@ -0,0 +1,6 @@ +/datum/controller/process/wireless/setup() + name = "wireless" + schedule_interval = 50 + +/datum/controller/process/wireless/doWork() + wifi_manager.process() \ No newline at end of file diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index c394318c286..ad82eae3bf5 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -25,7 +25,7 @@ usr.client.debug_variables(antag) message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.") -/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry")) +/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano","Chemistry","Wireless")) set category = "Debug" set name = "Debug Controller" set desc = "Debug the various periodic loop controllers for the game (be careful!)" @@ -92,5 +92,8 @@ if("Chemistry") debug_variables(chemistryProcess) feedback_add_details("admin_verb", "DChem") + if("Wireless") + debug_variables(wifi_manager) + feedback_add_details("admin_verb", "DWifi") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/modules/wireless/interfaces.dm b/code/modules/wireless/interfaces.dm new file mode 100644 index 00000000000..63f9c8630f2 --- /dev/null +++ b/code/modules/wireless/interfaces.dm @@ -0,0 +1,56 @@ +/datum/wifi + var/list/connected_devices + +/datum/wifi/New() + connected_devices = new() + +/datum/wifi/Destroy(var/wifi/device) + ..() + for(var/datum/wifi/D in connected_devices) + D.disconnect_device(src) + +/datum/wifi/proc/connect_device(var/datum/wifi/device) + connected_devices |= device + +/datum/wifi/proc/disconnect_device(var/datum/wifi/device) + connected_devices -= device + + + +/datum/wifi/receiver + var/id + +/datum/wifi/receiver/New(var/new_id) + ..() + id = new_id + wifi_manager.add_device(src) + +/datum/wifi/receiver/Destroy() + ..() + wifi_manager.remove_device(src) + + + +/datum/wifi/sender + var/target + +/datum/wifi/sender/New(var/new_target) + ..() + target = new_target + +/datum/wifi/sender/proc/set_target(var/new_target) + target = new_target + +/datum/wifi/sender/proc/send_connection_request() + var/datum/connection_request/C = new(src, target) + wifi_manager.add_request(C) + + + +/datum/connection_request + var/datum/wifi/sender/source //wifi_sender object creating the request + var/target //id tag of the target device to try to connect to + +/datum/connection_request/New(var/datum/wifi/sender/sender, var/receiver) + source = sender + target = receiver diff --git a/code/modules/wireless/manager.dm b/code/modules/wireless/manager.dm new file mode 100644 index 00000000000..4922732785f --- /dev/null +++ b/code/modules/wireless/manager.dm @@ -0,0 +1,47 @@ +/datum/wifi_manager + var/list/pending_connections + var/list/receiver_list + var/list/failed_connections + +/datum/wifi_manager/New() + pending_connections = new() + receiver_list = new() + failed_connections = new() + +/datum/wifi_manager/proc/add_device(var/datum/wifi/receiver/R) + receiver_list |= R + +/datum/wifi_manager/proc/remove_device(var/datum/wifi/receiver/R) + receiver_list -= R + +/datum/wifi_manager/proc/add_request(var/datum/connection_request/C) + pending_connections += C + +/datum/wifi_manager/proc/process() + //check any failed connections from the previous pass + if(failed_connections.len > 0) + for(var/datum/connection_request/C in failed_connections) + var/target_found = 0 + for(var/datum/wifi/receiver/R in receiver_list) + if(R.id == C.target) + var/datum/wifi/sender/S = C.source + S.connect_device(R) + R.connect_device(S) + target_found = 1 + failed_connections -= C + if(!target_found) + log_debug("[C.source] could not connect to \"[C.target]\"") + + //check and try assigning any pending connections + if(pending_connections.len > 0) + for(var/datum/connection_request/C in pending_connections) + var/target_found = 0 + for(var/datum/wifi/receiver/R in receiver_list) + if(R.id == C.target) + var/datum/wifi/sender/S = C.source + S.connect_device(R) + R.connect_device(S) + target_found = 1 + pending_connections -= C + if(!target_found) + failed_connections += C