Create icon indicating copy to clipboard operation
Create copied to clipboard

Add ComputerCraft integrations to more devices

Open ElementW opened this issue 1 year ago • 3 comments

Adds a handful of ComputerCraft integrations to mostly train-related devices. If merged I will expand the repo's wiki to document these APIs.

Train Station

  • Emit CC events train_imminent, train_arrival and train_departure when these occur on the station
  • Add CC canTrainReach(destination) function to test if the train stopped at the station can reach a (schedule-compatible) destination
  • Add CC distanceTo(destination) function to get the shortest distance to a (schedule-compatible) destination at the moment, using the train stopped in the station

Train Signal

  • Makes computer-controlled signals unable to be changed by external factors
  • Emit CC event train_signal_state_change with the new state as parameter whenever the signal changes
  • Add CC getState() function to get the current signal state
  • Add CC isForcedRed()/setForcedRed(forced) functions to force the signal to be red, replacing redstone control
  • Add CC getSignalType()/cycleSignalType() function to change the signal signal type in the same manner as using the wrench
  • Add CC listBlockingTrainNames() function to list names of trains blocking the track group ahead of the signal

Train Observer

  • Emit CC events train_passing & train_passed with the name of the train originating these events
  • Add CC isTrainPassing() function to check passing train presence
  • Add CC getPassingTrainName() function to get the passing train name, or nil failing that

Creative Motor

  • Add CC {get,set}GeneratedSpeed() function get/set motor speed

Sticker

  • Add CC isExtended() function to check extension state
  • Add CC extend()/retract()/toggle() to change the Sticker extension state, returning state change success

Speedometer

  • Emit CC event speed_change
    • 1 argument: speed (RPM)

Stressometer

  • Emit CC event overstressed
  • Emit CC event stress_change
    • 2 arguments: stress (SU), capacity (SU)

Nixie Tubes

The big feature

  • Makes computer-controlled Nixie Tubes unable to be changed by external factors (but can still be used as a Display Link source)
  • Add CC setText(text[, colour]) function
  • Add CC setTextColour(colour) function
  • Add CC setSignal(first, second) function taking 2 tables describing the appearance of the first and second tube as custom train signals
    • Has controls for Red, Green, Blue, glow dot size (1-4 pixels on each axis), and blink interval (in a PWM fashion)

Direct nixie control, no need for a display link

Now featuring colour!

https://github.com/user-attachments/assets/5d3b9128-19a7-477e-b082-14057491e06a

Custom signals!

https://github.com/user-attachments/assets/2cc743d8-b8bc-45fb-9b9d-3ef021ab5f09

Code

Rotates the left tube through the Oklch hue wheel, and the right tube through the valid glow sizes

function oklch2oklab(l, c, h)
    if h ~= h then -- Checks for NaN
        return l, 0, 0
    end
    return  l, c * math.cos(h * math.pi / 180), c * math.sin(h * math.pi / 180)
end
function oklab2rgb(l, a, b)
    -- Convert OKLab to linear RGB
    local l_ = l + 0.3963377774 * a + 0.2158037573 * b
    local m_ = l - 0.1055613458 * a - 0.0638541728 * b
    local s_ = l - 0.0894841775 * a - 1.2914855480 * b

    local l_3 = l_ ^ 3
    local m_3 = m_ ^ 3
    local s_3 = s_ ^ 3

    local r = 4.0767416621 * l_3 - 3.3077115913 * m_3 + 0.2309699292 * s_3
    local g = -1.2684380046 * l_3 + 2.6097574011 * m_3 - 0.3413193965 * s_3
    local b = -0.0041960863 * l_3 - 0.7034186147 * m_3 + 1.7076147010 * s_3

    -- Convert linear RGB to sRGB
    local function linearToSrgb(c)
        if c <= 0.0031308 then
            return 12.92 * c
        else
            return 1.055 * (c ^ (1 / 2.4)) - 0.055
        end
    end

    r = linearToSrgb(r)
    g = linearToSrgb(g)
    b = linearToSrgb(b)

    -- Clamp values to [0, 1] range
    r = math.min(math.max(r, 0), 1)
    g = math.min(math.max(g, 0), 1)
    b = math.min(math.max(b, 0), 1)

    return r * 255, g * 255, b * 255
end

t=peripheral.wrap("top")
i=0
gw = {
    {1, 1},
    {1, 2},
    {1, 3},
    {1, 4},
    {2, 4},
    {3, 4},
    {4, 4},
    {4, 3},
    {4, 2},
    {4, 1},
    {3, 1},
    {2, 1},
}
while true do
    i = (i + 4) % 360
    local r, g, b = oklab2rgb(oklch2oklab(0.5, 0.23, i))
    local j = math.floor(i/16) % #gw
    t.setSignal({r=r, g=g, b=b, glowWidth=1, glowHeight=1}, {glowWidth=gw[j+1][1], glowHeight=gw[j+1][2]})
    sleep(0.05)
end

Clears & reset themselves when dis/connected from computers

https://github.com/user-attachments/assets/3f84b17e-76bb-4010-a5c9-20d527f14d9a

ElementW avatar Aug 24 '24 13:08 ElementW