2022-07-28 15:44:31 +03:00

68 lines
1.7 KiB
Plaintext

--@include ./powertrain_component.txt
--@include ./enums/gearbox.txt
--@include /koptilnya/libs/constants.txt
require('/koptilnya/libs/constants.txt')
require('./powertrain_component.txt')
local gearboxTypes = require('./enums/gearbox.txt')
Clutch = class('Clutch', PowertrainComponent)
function Clutch:initialize(config)
PowertrainComponent.initialize(self, 'Clutch')
self.wireInputs = {
Clutch = 'number'
}
self.wireOutputs = {
Clutch_Torque = 'number'
}
self.inertia = config.Inertia or 0.1
self.slipTorque = config.SlipTorque or 1000
end
function Clutch:updateWireOutputs()
wire.ports.Clutch_Torque = self.torque
end
function Clutch:getPress()
return 1 - wire.ports.Clutch
end
function Clutch:queryInertia()
if self.output == nil then
return self.inertia
end
return self.inertia + self.output:queryInertia() * self:getPress()
end
function Clutch:queryAngularVelocity(angularVelocity)
self.angularVelocity = angularVelocity
if self.output == nil then
return angularVelocity
end
local outputW = self.output:queryAngularVelocity(angularVelocity) * self:getPress()
local inputW = angularVelocity * (1 - self:getPress())
return outputW + inputW
end
function Clutch:forwardStep(torque, inertia)
if self.output == nil then
return torque
end
local press = self:getPress()
self.torque = math.clamp(torque, -self.slipTorque, self.slipTorque)
self.torque = self.torque * (1 - (1 - math.pow(press, 0.3)))
local returnTorque = self.output:forwardStep(self.torque, inertia * press + self.inertia) * press
return math.clamp(returnTorque, -self.slipTorque, self.slipTorque)
end