VE Lua Documentation

Press F to search!

loadControllerExternal

Definition


-- @/lua/vehicle/controller.lua:289

local function loadControllerExternal(fileName, controllerName, controllerData)
  local directory = "controller/"

  local filePath = directory .. fileName
  --adjust for relocated controllers by using the new path if one exists
  if relocatedControllers[filePath] then
    log("D", "controller.loadControllerExternal", string.format("Using relocated controller controller '%s' at '/%s.lua', original file path: '/%s.lua'", fileName, relocatedControllers[filePath], filePath))
    filePath = relocatedControllers[filePath]
  end
  controllerName = controllerName or fileName
  local c
  local loadFunc = function()
    if loadedControllers[controllerName] then
      error(string.format("Controller with same name is already existing, can't load duplicate controller. Name: %q", controllerName))
    end
    c = rerequire(filePath)
    if c then
      local data = controllerData or {}
      controllerJbeamData[controllerName] = data
      c.name = controllerName
      c.typeName = fileName
      c.init(data)
      c.manualOrder = data.manualOrder
      loadedControllers[controllerName] = c

      if c.type == "main" then
        error(string.format("Can't load mainController at runtime! FileName: %q, ControllerName: %q", fileName, c.name))
        return nil
      end
    end
  end
  local result, errorStr = pcall(loadFunc)
  if not result then
    log("E", "controller.loadControllerExternal", string.format("Can't load controller '%s' at '/%s.lua', further info below:", fileName, filePath))
    log("E", "controller.loadControllerExternal", errorStr)
    log("E", "controller.loadControllerExternal", debug.traceback())
  end

  if c.initSecondStage then
    c.initSecondStage(controllerJbeamData[controller.name])
  end
  if c.initSounds then
    c.initSounds(controllerJbeamData[controller.name])
  end
  if c.initLastStage then
    c.initLastStage(controllerJbeamData[controller.name])
  end

  table.clear(sortedControllers)
  for _, v in pairs(loadedControllers) do
    table.insert(sortedControllers, v)
  end

  local ranks = {}
  for k, v in ipairs(powertrain.getOrderedDevices()) do
    ranks[v.name] = k * 100
  end
  table.sort(
    sortedControllers,
    function(a, b)
      local ra, rb = ranks[a.relevantDevice or ""] or a.manualOrder or a.defaultOrder or 100000, ranks[b.relevantDevice or ""] or b.manualOrder or b.defaultOrder or 100000
      a.order = ra
      b.order = rb
      if ra == rb then
        return a.name < b.name
      else
        return ra < rb
      end
    end
  )

  M.cacheAllControllerFunctions()

  return c
end

Callers

@/lua/vehicle/extensions/tech/powertrainSensor.lua
    data = controllerData,
    controller = controller.loadControllerExternal('tech/powertrainSensor', 'powertrainSensor' .. decodedData.sensorId, controllerData) }
end
@/lua/vehicle/extensions/tech/advancedIMU.lua
    data = controllerData,
    controller = controller.loadControllerExternal('tech/advancedIMU', 'advancedIMU' .. decodedData.sensorId, controllerData) }
end
@/lua/ge/extensions/editor/cosimulationSignalEditor.lua
      }
      be:queueObjectLua(vid, string.format("controller.loadControllerExternal('tech/cosimulationCoupling', 'cosimulationCoupling', %s)", serialize(lpack.encode({cData}))))
@/lua/vehicle/extensions/tech/tyreBarrier.lua
  -- Instantiate the tyreBarrier controller.
  tyreBarrierController = controller.loadControllerExternal(
    'tech/tyreBarrier',
    isSendImmediately = decodedData.isSendImmediately }
  IMUcontroller = controller.loadControllerExternal('tech/advancedIMU', 'advancedIMU' .. decodedData.sensorId, controllerData)
  advancedIMU = { data = controllerData, controller = IMUcontroller }
@/lua/vehicle/extensions/tech/roadsSensor.lua
    data = controllerData,
    controller = controller.loadControllerExternal('tech/roadsSensor', 'roadsSensor' .. decodedData.sensorId, controllerData) }
end
@/lua/vehicle/controller/tech/MQTToutput.lua
1. Spawn a car you want to send the data for, open the BeamNG console (by pressing `` ` ``) and switch to `BeamNG - Current Vehicle` in the bottom-left combobox.
2. Write: `controller.loadControllerExternal('tech/MQTToutput', 'MQTToutput', {uri = '127.0.0.1', topic='car_data'})`
   into the console to start exporting data. If you are using the example broker, you should see that data are being sent.
@/lua/vehicle/extensions/tech/vehicleSystemsCoupling.lua
  if controller.getController('vehicleSystemsCoupling') == nil then
    controller.loadControllerExternal('tech/vehicleSystemsCoupling', 'vehicleSystemsCoupling', {loadedByExtension = true})
  end
@/lua/vehicle/extensions/tech/GPS.lua
    data = controllerData,
    controller = controller.loadControllerExternal('tech/GPS', 'GPS' .. decodedData.sensorId, controllerData) }
end
@/lua/vehicle/extensions/tech/techCore.lua
  }}
  controller.loadControllerExternal('tech/cosimulationCoupling', 'cosimulationCoupling', lpack.encode(cData))
    local initData = nil
    recorders = controller.loadControllerExternal('tech/recorders', 'recorders', initData)
  end
@/lua/vehicle/extensions/tech/idealRADARSensor.lua
    data = controllerData,
    controller = controller.loadControllerExternal('tech/idealRADARSensor', 'idealRADARSensor' .. decodedData.sensorId, controllerData) }
end