Hi Reinder,
Here is my script :
local throttle = class.create_throttle("throttle_1")
local train = world.get_object("train_1")
local horaire_depart
throttle.acquire(train, true) -- lier le train à la 'manette'
log.debug("Prise de contrôle du train ", train.name)
local canton_A = world.get_object("block_9")
local canton_B = world.get_object("block_12")
local canton_preA = world.get_object("block_10")
local canton_preB = world.get_object("block_11")
local canton_pre_preA = world.get_object("block_3")
local canton_pre_preB = world.get_object("block_4")
log.debug("Navette de ", canton_A.name, "à", canton_B.name," et retour")
-- Fonction : Arrêter le train immédiatement
local function safe_stop()
throttle.emergency_stop()
end
-- Fonction : Changer de direction (train arrété)
local function set_direction(dir)
throttle.set_direction(dir)
end
-- Fonction : Définir la vitesse
local function set_speed(kmph)
throttle.set_target_speed(kmph, enum.speed_unit.KMPH)
end
canton_preB.on_train_entered(function(entered,blk,dir)
-- log.debug("Passage du train :",entered.name," canton ",blk.name," dir ",dir," à ", world.clock.time)
if dir == enum.block_train_direction.TOWARDS_B then
set_speed(10) -- ralentissement avant arret sur le canton suivant
log.debug ("Vitesse réduite 10 km/h")
end
end)
canton_pre_preB.on_train_entered(function(entered,blk,dir)
-- log.debug("Passage du train :",entered.name," canton ",blk.name, " dir ",dir," à ", world.clock.time)
if dir == enum.block_train_direction.TOWARDS_A then
set_speed(15) -- pre ralentissement avant ralentissement du canton suivant
log.debug ("Vitesse réduite 15 km/h")
end
end)
canton_preA.on_train_entered(function(entered,blk,dir)
-- log.debug("Passage du train :",entered.name," canton ",blk.name," dir ",dir," à ", world.clock.time)
if dir == enum.block_train_direction.TOWARDS_A then
set_speed(10) -- ralentissement avant arret sur le canton suivant
log.debug ("Vitesse réduite 10 km/h")
end
end)
canton_pre_preA.on_train_entered(function(entered,blk,dir)
-- log.debug("Passage du train :",entered.name," canton ",blk.name," dir ",dir," à ", world.clock.time)
if dir== enum.block_train_direction.TOWARDS_A then
set_speed(15) -- pre ralentissement avant ralentissement du canton suivant
log.debug ("Vitesse réduite 15 km/h")
end
end)
-- Objectif atteint → Retour
canton_B.on_train_entered(function(entered,blk,dir)
log.debug("Arrivée train :",entered.name," sur le canton :",blk.name) -- ," direction",dir)
set_speed(0) -- safe_stop()
horaire_depart = world.clock.time + 5 -- 5 tick d'attente
log.debug("Départ vers A prévu à ",horaire_depart)
end)
world.clock.on_tick(function(time)
if time == horaire_depart then
if canton_B.state == enum.block_state.OCCUPIED then -- on repart vers A
set_direction(enum.direction.REVERSE)
set_speed(25)
log.debug("Départ du train :",train.name, "vers A, il est ",time)
else if canton_A.state == enum.block_state.OCCUPIED then -- on repart vers B
set_direction(enum.direction.FORWARD)
set_speed(25)
log.debug("Départ du train :",train.name, " vers B, il est ",time)
else
log.debug("Pas de train à faire partir ni en A ni en B. Il est ",time)
end
end
end
end)
-- Départ atteint → Aller
canton_A.on_train_entered(function(entered,blk,dir)
log.debug("Arrivée train :",entered.name," sur le canton :",blk.name) --," direction",dir)
set_speed(0) -- safe_stop()
horaire_depart = world.clock.time + 5 -- 5 tick d'attente
log.debug("Départ vers B prévu à : ",horaire_depart)
end)
-- Positionnement des aiguilles
local turnout = world.get_object("turnout_1") -- choisir l'aiguille 1
resultat = turnout.set_position(enum.turnout_position.STRAIGHT)
-- log.debug('aiguille 1 positionnée tout droit' ,resultat)
turnout = world.get_object("turnout_5") -- choisir l'aiguille 5
resultat = turnout.set_position(enum.turnout_position.STRAIGHT)
-- log.debug('aiguille 5 positionnée tout droit' ,resultat)
turnout = world.get_object("turnout_6") -- choisir l'aiguille 6
resultat = turnout.set_position(enum.turnout_position.LEFT)
-- log.debug('aiguille 6 positionnée déviée' ,resultat)
turnout = world.get_object("turnout_7") -- choisir l'aiguille 7
resultat = turnout.set_position(enum.turnout_position.STRAIGHT)
-- log.debug('aiguille 7 positionnée tout droit' ,resultat)
turnout = world.get_object("turnout_8") -- choisir l'aiguille 8
resultat = turnout.set_position(enum.turnout_position.LEFT)
-- log.debug('aiguille _ positionnée déviée' ,resultat)
-- Départ du voyage
-- on part en marche avant sauf si on est déjà en canton_B
if canton_B.state == enum.block_state.OCCUPIED then
set_direction(enum.direction.REVERSE)
else
set_direction(enum.direction.FORWARD)
end
set_speed(25)
Here a capture of my layout :
And here a capture of the simulator screen :
For debug purpose and showing the state of the script, I put at least one “log.debug” line per “on_event” subroutine. I suppose that they are time consumming like printf in C langage.
After removing all those lines, there is no more duration warnings.
Regards
Serge