From 40ff13b65bb6e350fb96ac511aedd6217ef8ce10 Mon Sep 17 00:00:00 2001 From: Richard Harrison Date: Fri, 14 Sep 2018 22:50:47 +0200 Subject: [PATCH] Reposition slowdown settimer fixes. Definitely problems in aar.nas, seaport.nas; as these were hanging off a fdm-initialized. The others have timers that are started from a listener and as such are more suited to use maketimer rather than settimer The modules that use the loopid technique are probably fine, but these are also more suited (and easier to understand) using a maketimer --- Aircraft/Generic/aar.nas | 8 ++++---- Aircraft/ufo/cam.nas | 6 +++--- Nasal/contrail.nas | 6 +++--- Nasal/seaport.nas | 15 ++++++++++----- Nasal/wildfire.nas | 36 +++++++++++++++--------------------- Nasal/windsock.nas | 6 +++--- 6 files changed, 38 insertions(+), 39 deletions(-) diff --git a/Aircraft/Generic/aar.nas b/Aircraft/Generic/aar.nas index a2e09c748..b528cc75f 100644 --- a/Aircraft/Generic/aar.nas +++ b/Aircraft/Generic/aar.nas @@ -9,9 +9,7 @@ # + fuel-consumed-lbs - Output from the FDM, zeroed by this script # + out-of-fuel - boolean, set by this code. - var UPDATE_PERIOD = 0.3; - var enabled = nil; var serviceable = nil; var fuel_freeze = nil; @@ -176,9 +174,11 @@ var update_loop = func { foreach (var e; engines) e.getNode("out-of-fuel", 1).setBoolValue(out_of_fuel); - settimer(update_loop, UPDATE_PERIOD); + aarTimer.restart(UPDATE_PERIOD); } +var aarTimer = maketimer(UPDATE_PERIOD, update_loop); +aarTimer.simulatedTime = 1; setlistener("/sim/signals/fdm-initialized", func { @@ -213,7 +213,7 @@ setlistener("/sim/signals/fdm-initialized", func { setlistener("sim/freeze/fuel", func(n) fuel_freeze = n.getBoolValue(), 1); setlistener("sim/ai/enabled", func(n) ai_enabled = n.getBoolValue(), 1); setlistener("systems/refuel/serviceable", func(n) serviceable = n.getBoolValue(), 1); - update_loop(); + aarTimer.restart(UPDATE_PERIOD); }); diff --git a/Aircraft/ufo/cam.nas b/Aircraft/ufo/cam.nas index 19e35c7bb..18a7314f7 100644 --- a/Aircraft/ufo/cam.nas +++ b/Aircraft/ufo/cam.nas @@ -182,8 +182,6 @@ if (0) { var loop = func { if (view_number == cam_view and targetN != nil) update(); - - settimer(loop, 0); } @@ -301,6 +299,8 @@ setlistener("/sim/cam/lock", func(n) { }); } +camTimer = maketimer(0, loop); +camTimer.simulatedTime = 1; setlistener("/sim/signals/fdm-initialized", func { var views = props.globals.getNode("/sim").getChildren("view"); @@ -311,7 +311,7 @@ setlistener("/sim/signals/fdm-initialized", func { setprop("/sim/current-view/view-number", cam_view); setprop("/engines/engine/speed-max-mps", 500); update_aircraft(); - loop(); + camTimer.start(); }); diff --git a/Nasal/contrail.nas b/Nasal/contrail.nas index 2673deb1e..fbdae873e 100644 --- a/Nasal/contrail.nas +++ b/Nasal/contrail.nas @@ -20,11 +20,11 @@ updateContrail = func{ } else { contrail_Node.setValue(0); } - - settimer(updateContrail,30) } ### Contrail +contrailTimer = maketimer(30, updateContrail); +contrailTimer.simulatedTime = 1; _setlistener("/sim/signals/nasal-dir-initialized", func { printlog ("debug", "init contrail"); @@ -35,5 +35,5 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { var static_contrail_node = props.globals.getNode("sim/ai/aircraft/contrail", 1); var time_node = props.globals.getNode("sim/time/elapsed-sec", 1); - updateContrail(); + contrailTimer.restart(30); }); diff --git a/Nasal/seaport.nas b/Nasal/seaport.nas index 81786fd55..9b5aa14e3 100644 --- a/Nasal/seaport.nas +++ b/Nasal/seaport.nas @@ -1,13 +1,18 @@ -_setlistener("/sim/signals/nasal-dir-initialized", func { - _setlistener("/sim/presets/latitude-deg", func { - printlog("info", "*** NEW LOCATION ***"); - settimer(func { +seaportLoop = func { var typ = getprop("/sim/type"); var lat = getprop("/position/latitude-deg"); var lon = getprop("/position/longitude-deg"); var g = geodinfo(lat, lon); if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") ) fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" })); - }, 8); + }; +seaportTimer = maketimer(8, seaportLoop); +seaportTimer.simulatedTime = 1; + +_setlistener("/sim/signals/nasal-dir-initialized", func { + _setlistener("/sim/presets/latitude-deg", func { + printlog("info", "*** NEW LOCATION ***"); + seaportTimer.restart(8); + }, 1); }); diff --git a/Nasal/wildfire.nas b/Nasal/wildfire.nas index 8ab105db1..43ff94697 100644 --- a/Nasal/wildfire.nas +++ b/Nasal/wildfire.nas @@ -22,6 +22,7 @@ var SAVEDIR = getprop("/sim/fg-home") ~ "/Wildfire/"; # Maximum number of ignite events a single user can send per second. var MAX_IGNITE_RATE = 0.25; +var wildfireScoreReportTimer = nil; ############################################################################### ## External API @@ -164,7 +165,6 @@ var score_report_loop = func { old_score.protected = score.protected; old_score.waste = score.waste; } - settimer(score_report_loop, CAFire.GENERATION_DURATION); } ############################################################################### @@ -439,7 +439,6 @@ CAFireModels.MODEL = { # Model paths CAFireModels.grid = {}; # Sparse cell model grid storage. CAFireModels.pending = []; # List of pending model changes. CAFireModels.models_enabled = 1; -CAFireModels.loopid = 0; ###################################################################### # Public operations ############################################################ @@ -470,14 +469,13 @@ CAFireModels.reset = func (enabled) { ############################################################ # Start the CA model grid. CAFireModels.start = func { - me.loopid += 1; - me._loop_(me.loopid); + me.timer.restart(0.033); # 30hz should be fast enough. } ############################################################ # Stop the CA model grid. # Note that it will catch up lost time when started again. CAFireModels.stop = func { - me.loopid += 1; + me.timer.stop(); } ############################################################ # Add a new cell model. @@ -516,12 +514,6 @@ CAFireModels.update = func { } } } -############################################################ -CAFireModels._loop_ = func(id) { - id == me.loopid or return; - me.update(); - settimer(func { me._loop_(id); }, 0); -} ############################################################################### ############################################################################### @@ -543,7 +535,6 @@ CAFire.cells_burning = 0; CAFire.pass = 0; # Update pass within the current full update. CAFire.pass_work = 0; # Cells to update in each pass. CAFire.remaining_work = []; # Work remaining in this full update. -CAFire.loopid = 0; CAFire.event_log = []; # List of all events that has occured so far. CAFire.load_count = 0; CAFire.BURN_RATE = { # Burn rate DB. grid widths per second @@ -580,6 +571,8 @@ CAFire.NEIGHBOURS = # Neighbour index offsets. First row and column ############################################################ CAFire.init = func { # Initialization. + CAFireModels.timer = maketimer(0.03, me, me.loop); + CAFireModels.timer.simulatedTime = 1; me.reset(1, SimTime.current_time()); } ############################################################ @@ -612,15 +605,12 @@ CAFire.reset = func (enabled, sim_time) { CAFire.start = func { CAFireModels.start(); broadcast.start(); - me.loopid += 1; - me._loop_(me.loopid); } ############################################################ # Stop the CA. Note that it will catch up lost time when started again. CAFire.stop = func { CAFireModels.stop(); broadcast.stop(); - me.loopid += 1; } ############################################################ # Start a fire in the cell at pos. @@ -931,12 +921,12 @@ CAFire.update = func { } } ############################################################ -CAFire._loop_ = func(id) { - id == me.loopid or return; +CAFire.loop = func { me.update(); - settimer(func { me._loop_(id); }, - me.GENERATION_DURATION * (me.generation + 1/me.PASSES) - - SimTime.current_time()); + CAFireModels.timer.restart(me.GENERATION_DURATION + * (me.generation + 1/me.PASSES) + - SimTime.current_time() + ); } ############################################################################### @@ -973,7 +963,11 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { CAFire.init(); # Start the score reporting. - settimer(score_report_loop, CAFire.GENERATION_DURATION); + if (wildfireScoreReportTimer == nil){ + wildfireScoreReportTimer = maketimer(CAFire.GENERATION_DURATION, score_report_loop); + wildfireScoreReportTimer.simulatedTime = 1; + wildfireScoreReportTimer.start(); + } setlistener("/sim/signals/exit", func { if (getprop(report_score_pp) and (CAFire.cells_created > 0)) diff --git a/Nasal/windsock.nas b/Nasal/windsock.nas index 2f4448563..8d019ffd6 100644 --- a/Nasal/windsock.nas +++ b/Nasal/windsock.nas @@ -22,7 +22,7 @@ var windsock = func { interpolate("/environment/windsock/wind-speed-12.5kt", total, 0.1); dt += 0.08 + 0.02*(math.sin(dt)+math.cos(dt/(mag2+0.01))*0.33); - settimer(windsock, 0.25); } - -windsock(); +windsockTimer = maketimer(0.25, windsock); +windsockTimer.simulatedTime = 1; +windsockTimer.start();