//Singularity engine control program
#ifdef SINGULARITY_TIME
/datum/computer/file/terminal_program/engine_control
name = "EngineMaster"
size = 10
req_access = list(access_engineering_engine)
var/tmp/authenticated = null //Are we currently logged in?
var/datum/computer/file/user_data/account = null
var/log_string = null
var/obj/item/peripheral/network/powernet_card/netcard = null
var/obj/item/peripheral/network/radio/radiocard = null
var/tmp/task = null //What are we doing at the moment?
var/tmp/startup_line = 1
var/tmp/starting_up = 0 //Are we currently starting up?
var/list/emitter_ids = list() //Net ids of located emitters.
var/list/fieldgen_ids = list() //Net ids of located field generators.
var/tmp/last_event_report = 0 //When did we last report an event?
var/setup_acc_filepath = "/logs/sysusr"//Where do we look for login data?
var/setup_logdump_name = "englog"
var/setup_mail_freq = 1149 //Which freq do we report to?
var/setup_mailgroup = "engineer" //The PDA mailgroup used when alerting engineer pdas.
initialize()
src.authenticated = null
src.task = null
src.master.temp = null
src.startup_line = 1
if(!src.find_access_file()) //Find the account information, as it's essentially a ~digital ID card~
src.print_text("Error: Cannot locate user file. Quitting...")
src.master.unload_program(src) //Oh no, couldn't find the file.
return
if(!src.check_access(src.account.access))
src.print_text("User [src.account.registered] does not have needed access credentials.
Quitting...")
src.master.unload_program(src)
return
src.netcard = locate() in src.master.peripherals
if(!src.netcard || !istype(src.netcard))
src.print_text("Error: No network card detected.
Quitting...")
src.log_string += "
Startup Failure: No network card."
src.master.unload_program(src)
return
src.radiocard = locate() in src.master.peripherals
if(!radiocard || !istype(src.radiocard))
src.radiocard = null
src.print_text("Warning: No radio module detected.")
src.log_string += "
Startup Error: No radio."
src.authenticated = src.account.registered
src.log_string += "
LOGIN: [src.authenticated]"
src.ping_devices()
var/intro_text = {"
EngineMaster
Automated Engine Control System
Commands:
(Startup) to activate engine systems.
(Abort) to abort startup procedure.
(Rescan) to rescan for engine devices.
(Clear) to clear the screen.
(Quit) to exit."}
src.print_text(intro_text)
return
input_text(text)
if(..())
return
var/list/command_list = parse_string(text)
var/command = command_list[1]
command_list -= command_list[1]
src.print_text(strip_html(text))
switch(lowertext(command))
if("startup")
//We're already starting, jeez give it some time
if(src.starting_up)
src.print_text("Startup already in progress.")
src.master.add_fingerprint(usr)
return
if(!emitter_ids || emitter_ids.len <= 0)
src.print_text("Error: Insufficient emitters detected.")
src.master.add_fingerprint(usr)
return
if(!fieldgen_ids || fieldgen_ids.len < 4)
src.print_text("Error: Insufficient field generators detected.")
src.master.add_fingerprint(usr)
return
src.startup_line = 1
src.starting_up = 1
src.task = "startup-emit"
src.log_string += "
Startup initiated."
src.report_event("Engine starting up...")
src.print_text("Startup procedure initiated.")
if("abort")
if(!src.starting_up)
src.print_text("No startup procedure in progress.")
src.master.add_fingerprint(usr)
return
src.startup_line = 1
src.task = null
src.starting_up = 0
src.log_string += "
Startup aborted."
src.print_text("Startup procedure aborted.")
if("rescan")
if((src.task && src.task != "scan") || src.starting_up)
src.print_text("Unable to scan, system is busy.")
return
src.ping_devices()
if("logdump")
if(!src.log_string) //Something is wrong.
src.print_text("Error: No log data to dump.")
return
if(src.holder.read_only)
src.print_text("Error: Destination drive is read-only.")
return
var/datum/computer/file/text/logdump = get_file_name(setup_logdump_name, src.holding_folder)
if(logdump && !istype(logdump) || get_folder_name(setup_logdump_name, src.holding_folder))
src.print_text("Error: Name in use.")
return
if(logdump && istype(logdump))
logdump.data = src.log_string
else
logdump = new /datum/computer/file/text
logdump.name = setup_logdump_name
logdump.data = src.log_string
if(!src.holding_folder.add_file(logdump))
//qdel(logdump)
logdump.dispose()
src.print_text("Error: Cannot save to disk.")
return
src.print_text("Log dumped to holding directory.")
if("clear")
src.master.temp = null
src.master.temp_add = "Workspace cleared.
"
if("quit")
src.log_string += "
LOGOUT: [src.authenticated]"
src.print_text("Now quitting...")
src.master.unload_program(src)
return
else
src.print_text("Unknown command.")
src.master.add_fingerprint(usr)
src.master.updateUsrDialog()
return
process()
if(..() || !src.task)
return
switch(src.task)
if("startup-emit")
if(startup_line > src.emitter_ids.len)
src.task = "startup-field"
src.startup_line = 1
return
post_status(src.emitter_ids[src.startup_line], "command", "activate")
src.startup_line++
if("startup-field")
if(startup_line > src.fieldgen_ids.len)
src.task = null
src.startup_line = 1
src.starting_up = 0
src.print_text("Startup procedure complete.")
return
post_status(src.fieldgen_ids[src.startup_line], "command", "activate")
src.startup_line++
receive_command(obj/source, command, datum/signal/signal)
if((..()) || !signal)
return
//Time to populate our lists of components.
if(signal.data["command"] == "ping_reply" && (src.task == "scan"))
if(!signal.data["netid"])
return
switch(signal.data["device"])
if("PNET_ENG_EMITR") //Oh hey a new emitter.
if(!(signal.data["netid"] in src.emitter_ids))
src.emitter_ids += signal.data["netid"]
if("PNET_ENG_FIELD")
if(!(signal.data["netid"] in src.fieldgen_ids))
src.fieldgen_ids += signal.data["netid"]
else
return
return
proc
ping_devices()
if(!src.netcard)
return
src.task = "scan"
src.emitter_ids = new
src.fieldgen_ids = new
var/datum/signal/newsignal = get_free_signal()
//newsignal.encryption = "\ref[src.netcard]"
src.log_string += "
Scanning for devices..."
src.print_text("Scanning for devices...")
src.peripheral_command("ping", newsignal, "\ref[src.netcard]")
return
post_status(var/target_id, var/key, var/value, var/key2, var/value2, var/key3, var/value3)
if(!src.netcard)
return
var/datum/signal/signal = get_free_signal()
//signal.encryption = "\ref[src.netcard]"
signal.data[key] = value
if(key2)
signal.data[key2] = value2
if(key3)
signal.data[key3] = value3
signal.data["address_1"] = target_id
src.peripheral_command("transmit", signal, "\ref[src.netcard]")
report_event(var/event_string)
if(!event_string || !src.radiocard)
return
//Unlikely that this would be a problem but OH WELL
if(last_event_report && world.time < (last_event_report + 10))
return
//Set card frequency if it isn't already.
if(src.radiocard.frequency != src.setup_mail_freq && !src.radiocard.setup_freq_locked)
var/datum/signal/freqsignal = get_free_signal()
//freqsignal.encryption = "\ref[src.radiocard]"
peripheral_command("[src.setup_mail_freq]", freqsignal,"\ref[src.radiocard]")
src.log_string += "
Adjusting frequency... \[[src.setup_mail_freq]]."
var/datum/signal/signal = get_free_signal()
//signal.encryption = "\ref[src.radiocard]"
//Create a PDA mass-message string.
signal.data["address_1"] = "00000000"
signal.data["command"] = "text_message"
signal.data["sender_name"] = "ENGINE-MAILBOT"
signal.data["group"] = src.setup_mailgroup //Only engineer PDAs should be informed.
signal.data["message"] = "Notice: [event_string]"
src.log_string += "
Event notification sent."
last_event_report = world.time
peripheral_command("transmit", signal, "\ref[src.radiocard]")
return
find_access_file() //Look for the whimsical account_data file
var/datum/computer/folder/accdir = src.holder.root
if(src.master.host_program) //Check where the OS is, preferably.
accdir = src.master.host_program.holder.root
var/datum/computer/file/user_data/target = parse_file_directory(setup_acc_filepath, accdir)
if(target && istype(target))
src.account = target
return 1
return 0
#endif