//States for airlock_control #define AIRLOCK_STATE_INOPEN -2 #define AIRLOCK_STATE_PRESSURIZE -1 #define AIRLOCK_STATE_CLOSED 0 #define AIRLOCK_STATE_DEPRESSURIZE 1 #define AIRLOCK_STATE_OUTOPEN 2 datum/computer/file/embedded_program/airlock_controller var/id_tag var/exterior_door_tag var/interior_door_tag var/airpump_tag var/sensor_tag var/sanitize_external state = AIRLOCK_STATE_CLOSED var/target_state = AIRLOCK_STATE_CLOSED var/sensor_pressure = null receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] if(!receive_tag) return if(receive_tag==sensor_tag) if(signal.data["pressure"]) sensor_pressure = text2num(signal.data["pressure"]) else if(receive_tag==exterior_door_tag) memory["exterior_status"] = signal.data["door_status"] else if(receive_tag==interior_door_tag) memory["interior_status"] = signal.data["door_status"] else if(receive_tag==airpump_tag) if(signal.data["power"]=="on") memory["pump_status"] = signal.data["direction"] else memory["pump_status"] = "off" else if(receive_tag==id_tag) switch(signal.data["command"]) if("cycle") if(state < AIRLOCK_STATE_CLOSED) target_state = AIRLOCK_STATE_OUTOPEN else target_state = AIRLOCK_STATE_INOPEN receive_user_command(command) switch(command) if("cycle_closed") target_state = AIRLOCK_STATE_CLOSED if("cycle_exterior") target_state = AIRLOCK_STATE_OUTOPEN if("cycle_interior") target_state = AIRLOCK_STATE_INOPEN if("abort") target_state = AIRLOCK_STATE_CLOSED process() switch(state) if(AIRLOCK_STATE_INOPEN) // state -2 if(target_state > state) if(memory["interior_status"] == "closed") state = AIRLOCK_STATE_CLOSED else var/datum/signal/signal = new signal.data["tag"] = interior_door_tag signal.data["command"] = "secure_close" post_signal(signal) else if(memory["pump_status"] != "off") var/datum/signal/signal = new signal.data["tag"] = airpump_tag signal.data["command"] = "power_off" post_signal(signal) if(AIRLOCK_STATE_PRESSURIZE) if(target_state < state) if(sensor_pressure >= ONE_ATMOSPHERE*0.95) if(memory["interior_status"] == "open") state = AIRLOCK_STATE_INOPEN else var/datum/signal/signal = new signal.data["tag"] = interior_door_tag signal.data["command"] = "secure_open" post_signal(signal) else var/datum/signal/signal = new signal.data["tag"] = airpump_tag if(memory["pump_status"] == "siphon") signal.data["command"] = "stabalize" else if(memory["pump_status"] != "release") signal.data["command"] = "power_on" post_signal(signal) else if(target_state > state) state = AIRLOCK_STATE_CLOSED if(AIRLOCK_STATE_CLOSED) if(target_state > state) if(memory["interior_status"] == "closed") state = AIRLOCK_STATE_DEPRESSURIZE else var/datum/signal/signal = new signal.data["tag"] = interior_door_tag signal.data["command"] = "secure_close" post_signal(signal) else if(target_state < state) if(memory["exterior_status"] == "closed") state = AIRLOCK_STATE_PRESSURIZE else var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag signal.data["command"] = "secure_close" post_signal(signal) else if(memory["pump_status"] != "off") var/datum/signal/signal = new signal.data["tag"] = airpump_tag signal.data["command"] = "power_off" post_signal(signal) if(AIRLOCK_STATE_DEPRESSURIZE) var/target_pressure = ONE_ATMOSPHERE*0.05 if(sanitize_external) target_pressure = ONE_ATMOSPHERE*0.01 if(sensor_pressure <= target_pressure) if(target_state > state) if(memory["exterior_status"] == "open") state = AIRLOCK_STATE_OUTOPEN else var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag signal.data["command"] = "secure_open" post_signal(signal) else if(target_state < state) state = AIRLOCK_STATE_CLOSED else if((target_state < state) && !sanitize_external) state = AIRLOCK_STATE_CLOSED else var/datum/signal/signal = new signal.transmission_method = 1 //radio signal signal.data["tag"] = airpump_tag if(memory["pump_status"] == "release") signal.data["command"] = "purge" else if(memory["pump_status"] != "siphon") signal.data["command"] = "power_on" post_signal(signal) if(AIRLOCK_STATE_OUTOPEN) //state 2 if(target_state < state) if(memory["exterior_status"] == "closed") if(sanitize_external) state = AIRLOCK_STATE_DEPRESSURIZE else state = AIRLOCK_STATE_CLOSED else var/datum/signal/signal = new signal.data["tag"] = exterior_door_tag signal.data["command"] = "secure_close" post_signal(signal) else if(memory["pump_status"] != "off") var/datum/signal/signal = new signal.data["tag"] = airpump_tag signal.data["command"] = "power_off" post_signal(signal) memory["sensor_pressure"] = sensor_pressure memory["processing"] = state != target_state sensor_pressure = null return 1 obj/machinery/embedded_controller/radio/airlock_controller icon = 'airlock_machines.dmi' icon_state = "airlock_control_standby" name = "Airlock Console" density = 0 frequency = 1449 // Setup parameters only var/id_tag var/exterior_door_tag var/interior_door_tag var/airpump_tag var/sensor_tag var/sanitize_external initialize() ..() var/datum/computer/file/embedded_program/airlock_controller/new_prog = new new_prog.id_tag = id_tag new_prog.exterior_door_tag = exterior_door_tag new_prog.interior_door_tag = interior_door_tag new_prog.airpump_tag = airpump_tag new_prog.sensor_tag = sensor_tag new_prog.sanitize_external = sanitize_external new_prog.master = src program = new_prog update_icon() if(on && program) if(program.memory["processing"]) icon_state = "airlock_control_process" else icon_state = "airlock_control_standby" else icon_state = "airlock_control_off" return_text() var/state_options = null var/state = 0 var/sensor_pressure = "----" var/exterior_status = "----" var/interior_status = "----" var/pump_status = "----" if(program) state = program.state sensor_pressure = program.memory["sensor_pressure"] exterior_status = program.memory["exterior_status"] interior_status = program.memory["interior_status"] pump_status = program.memory["pump_status"] switch(state) if(AIRLOCK_STATE_INOPEN) state_options = {"Close Interior Airlock
Cycle to Exterior Airlock
"} if(AIRLOCK_STATE_PRESSURIZE) state_options = "Abort Cycling
" if(AIRLOCK_STATE_CLOSED) state_options = {"Open Interior Airlock
Open Exterior Airlock
"} if(AIRLOCK_STATE_DEPRESSURIZE) state_options = "Abort Cycling
" if(AIRLOCK_STATE_OUTOPEN) state_options = {"Cycle to Interior Airlock
Close Exterior Airlock
"} var/output = {"Airlock Control Console
[state_options]
Chamber Pressure: [sensor_pressure] kPa
Exterior Door: [exterior_status]
Interior Door: [interior_status]
Control Pump: [pump_status]
"} return output