OC_Scripts/scripts/ir_speed_checkpoint/train_speed_checkpoint.lua

81 lines
2.3 KiB
Lua

--[[
Author: Andrew Lalis
File: train_speed_checkpoint.lua
Version: 1.0
Last Modified: 16-06-2018
Script used for helping to control the speed of a train. Use many
computers running this script to calibrate trains to run at a certain speed.
--]]
--Require statements and component definitions.
local component = require("component")
local event = require("event")
local computer = require("computer")
local term = require("term")
local detector = component.ir_augment_detector
local controller = component.ir_augment_control
-- Optimal Speed.
local DESIRED_SPEED = 20
--[[
Shortcut for pulling only train events.
func - function(net_address, augment_type, stock_uuid): function to handle the
train event, with augment type being either DETECTOR or LOCO_CONTROL.
--]]
local function pullTrainEvent(func)
local event_name, net_address, augment_type, stock_uuid = event.pull("ir_train_overhead")
func(net_address, augment_type, stock_uuid)
end
--[[
Determines if a string starts with a given substring.
return - boolean: true if str starts with start, false otherwise.
--]]
local function strStarts(str, start)
return string.sub(str, 1, string.len(start)) == start
end
--[[
Determines if a stock car over the detector is a locomotive by reading info.id
from the detector's info() method. If it begins with rolling_stock/loc, then
it is a locomotive.
--]]
local function isStockLocomotive(id)
return strStarts(id, "rolling_stock/loc")
end
local function balanceSpeed(info, target_speed)
local diff = target_speed - info.speed
local percent_diff = info.speed / target_speed
if diff > 0 then -- We are too slow.
controller.setBrake(0)
controller.setThrottle(info.throttle + percent_diff)
else -- We are too fast.
controller.setThrottle(0)
controller.setBrake(percent_diff)
end
end
local function handleTrainEvent(net_address, augment_type, stock_uuid)
local info = detector.info()
local data = detector.consist()
if not (data and info and isStockLocomotive(info.id)) then
return
end
if (augment_type == "DETECTOR") then
term.clear()
term.setCursor(1, 1)
term.write(" Speed: "..data.speed_km.." Km/h")
term.write(" Dir: "..data.direction)
term.write(" Weight: "..data.weight_kg.." Kg")
end
if (augment_type == "LOCO_CONTROL") then
balanceSpeed(info, DESIRED_SPEED)
end
end
while true do
pullTrainEvent(handleTrainEvent)
end