81 lines
2.3 KiB
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 |