From 10f95933ddf4c852795c5c11ee9cf459af9e3423 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 20 Aug 2014 21:54:04 -0400 Subject: [PATCH 1/2] Fixes power draw not being processed if no power was available Should address some of the issues raised in Pull Request #6080 --- code/modules/power/apc.dm | 50 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 03d124fb12a..8f4a437759e 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1191,36 +1191,40 @@ var/cell_maxcharge = cell.maxcharge // try to draw power from the grid - if (!src.avail()) - main_status = 0 - else + var/power_drawn = 0 + if (src.avail()) var/target_draw = perapc if (charging == 2) target_draw = min(target_draw, lastused_total) //if we're fully charged, only take what we need to meet demand var/power_drawn = add_load(target_draw) //get some power from the powernet + + //figure out how much power is left over after meeting demand + power_excess = power_drawn - lastused_total + + if (power_excess < 0) //couldn't get enough power from the grid, we will need to take from the power cell. - //figure out how much power is left over after meeting demand - power_excess = power_drawn - lastused_total - - if (power_excess < 0) //couldn't get enough power from the grid, we will need to take from the power cell. - main_status = 1 - charging = 0 - - var/required_power = -power_excess - if( (cell.charge/CELLRATE) >= required_power) // can we draw enough from cell to cover what's left over? - cell.use(required_power*CELLRATE) + charging = 0 + + var/required_power = -power_excess + if( (cell.charge/CELLRATE) >= required_power) // can we draw enough from cell to cover what's left over? + cell.use(required_power*CELLRATE) - else if (autoflag != 0) // not enough power available to run the last tick! - chargecount = 0 - // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - autoflag = 0 - - else - main_status = 2 + else if (autoflag != 0) // not enough power available to run the last tick! + chargecount = 0 + // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. + equipment = autoset(equipment, 0) + lighting = autoset(lighting, 0) + environ = autoset(environ, 0) + autoflag = 0 + + //Set external power status + if (!power_drawn) + main_status = 0 + else if (power_excess < 0) + main_status = 1 + else + main_status = 2 // Set channels depending on how much charge we have left From f2b234fe818f8fcdd887b002ff391e14176e2534 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 21 Aug 2014 01:18:26 -0400 Subject: [PATCH 2/2] Fixes APCs drawing more power than they can to use to charge --- code/modules/power/apc.dm | 40 ++++++++++++++++++++++--------------- code/modules/power/power.dm | 5 +++++ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 8f4a437759e..3fa162557bd 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1142,6 +1142,16 @@ else return 0 +/obj/machinery/power/apc/proc/last_surplus() + if(terminal && terminal.powernet) + return terminal.powernet.last_surplus() + else + return 0 + +//Returns 1 if the APC should attempt to charge +/obj/machinery/power/apc/proc/attempt_charging() + return (chargemode && charging == 1 && operating) + /obj/machinery/power/apc/add_load(var/amount) if(terminal && terminal.powernet) return terminal.powernet.draw_power(amount) @@ -1189,15 +1199,17 @@ if(cell && !shorted) //var/cell_charge = cell.charge var/cell_maxcharge = cell.maxcharge + + // Calculate how much power the APC will try to get from the grid. + var/target_draw = lastused_total + if (src.attempt_charging()) + target_draw += min((cell_maxcharge - cell.charge), (cell_maxcharge*CHARGELEVEL))/CELLRATE + target_draw = min(target_draw, perapc) //limit power draw by perapc // try to draw power from the grid var/power_drawn = 0 if (src.avail()) - var/target_draw = perapc - if (charging == 2) - target_draw = min(target_draw, lastused_total) //if we're fully charged, only take what we need to meet demand - - var/power_drawn = add_load(target_draw) //get some power from the powernet + power_drawn = add_load(target_draw) //get some power from the powernet //figure out how much power is left over after meeting demand power_excess = power_drawn - lastused_total @@ -1207,7 +1219,7 @@ charging = 0 var/required_power = -power_excess - if( (cell.charge/CELLRATE) >= required_power) // can we draw enough from cell to cover what's left over? + if(cell.charge >= required_power*CELLRATE) // can we draw enough from cell to cover what's left over? cell.use(required_power*CELLRATE) else if (autoflag != 0) // not enough power available to run the last tick! @@ -1267,13 +1279,9 @@ autoflag = 0 // now trickle-charge the cell - - if(chargemode && charging == 1 && operating) - if(power_excess > 0) // check to make sure we have enough to charge - // Max charge is available excess power, capped to cell capacity, or % per second constant (Whichever is smallest) - var/ch = min(power_excess*CELLRATE, (cell_maxcharge - cell.charge), (cell_maxcharge*CHARGELEVEL)) - cell.give(ch) // actually recharge the cell - + if(src.attempt_charging()) + if (power_excess > 0) // check to make sure we have enough to charge + cell.give(power_excess*CELLRATE) // actually recharge the cell else charging = 0 // stop charging chargecount = 0 @@ -1285,14 +1293,14 @@ //if we have excess power for long enough, think about re-enable charging. if(chargemode) if(!charging) - if(power_excess*CELLRATE >= cell_maxcharge*CHARGELEVEL) + //last_surplus() overestimates the amount of power available for charging, but it's equivalent to what APCs were doing before. + if(src.last_surplus()*CELLRATE >= cell_maxcharge*CHARGELEVEL) chargecount++ else chargecount = 0 charging = 0 - if(chargecount == 10) - + if(chargecount >= 10) chargecount = 0 charging = 1 diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c2421ea3dea..a1c0a57529e 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -406,6 +406,11 @@ /datum/powernet/proc/surplus() return max(avail - newload, 0) +//Returns the amount of excess power (before refunding to SMESs) from last tick. +//This is for machines that might adjust their power consumption using this data. +/datum/powernet/proc/last_surplus() + return max(avail - load, 0) + //Attempts to draw power from a powernet. Returns the actual amount of power drawn /datum/powernet/proc/draw_power(var/requested_amount) var/surplus = max(avail - newload, 0)