Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 97 additions & 90 deletions src/telem/lib/input.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,119 +3,126 @@ local function requireAP(target) return requireInput('advancedPeripherals.' .. t
local function requireBR(target) return requireInput('biggerReactors.' .. target) end
local function requireMek(target) return requireInput('mekanism.' .. target) end
local function requirePowah(target) return requireInput('powah.' .. target) end
local function requireCreate(target) return requireInput('create.' .. target) end

local export = {
helloWorld = requireInput('HelloWorldInputAdapter'),
custom = requireInput('CustomInputAdapter'),
helloWorld = requireInput('HelloWorldInputAdapter'),
custom = requireInput('CustomInputAdapter'),

-- storage
itemStorage = requireInput('ItemStorageInputAdapter'),
fluidStorage = requireInput('FluidStorageInputAdapter'),
itemStorage = requireInput('ItemStorageInputAdapter'),
fluidStorage = requireInput('FluidStorageInputAdapter'),

-- communication
secureModem = requireInput('SecureModemInputAdapter'),
secureModem = requireInput('SecureModemInputAdapter'),

advancedPeripherals = {
energyDetector = requireAP('EnergyDetectorInputAdapter'),
environmentDetector = requireAP('EnvironmentDetectorInputAdapter'),
geoScanner = requireAP('GeoScannerInputAdapter'),
inventoryManager = requireAP('InventoryManagerInputAdapter'),
meBridge = requireAP('MEBridgeInputAdapter'),
playerDetector = requireAP('PlayerDetectorInputAdapter'),
redstoneIntegrator = requireAP('RedstoneIntegratorInputAdapter'),
rsBridge = requireAP('RSBridgeInputAdapter'),
energyDetector = requireAP('EnergyDetectorInputAdapter'),
environmentDetector = requireAP('EnvironmentDetectorInputAdapter'),
geoScanner = requireAP('GeoScannerInputAdapter'),
inventoryManager = requireAP('InventoryManagerInputAdapter'),
meBridge = requireAP('MEBridgeInputAdapter'),
playerDetector = requireAP('PlayerDetectorInputAdapter'),
redstoneIntegrator = requireAP('RedstoneIntegratorInputAdapter'),
rsBridge = requireAP('RSBridgeInputAdapter'),
},

biggerReactors = {
reactor = requireBR('ReactorInputAdapter'),
turbine = requireBR('TurbineInputAdapter'),
reactor = requireBR('ReactorInputAdapter'),
turbine = requireBR('TurbineInputAdapter'),
},

mekanism = {
-- machines
apns = requireMek('AntiprotonicNucleosynthesizerInputAdapter'),
bin = requireMek('BinInputAdapter'),
bioGenerator = requireMek('BioGeneratorInputAdapter'),
boiler = requireMek('ThermoelectricBoilerInputAdapter'),
chemicalCrystallizer = requireMek('ChemicalCrystallizerInputAdapter'),
dissolutionChamber = requireMek('ChemicalDissolutionChamberInputAdapter'),
chemicalInfuser = requireMek('ChemicalInfuserInputAdapter'),
injectionChamber = requireMek('ChemicalInjectionChamberInputAdapter'),
chemicalOxidizer = requireMek('ChemicalOxidizerInputAdapter'),
chemicalTank = requireMek('ChemicalTankInputAdapter'),
chemicalWasher = requireMek('ChemicalWasherInputAdapter'),
combiner = requireMek('CombinerInputAdapter'),
crusher = requireMek('CrusherInputAdapter'),
digitalMiner = requireMek('DigitalMinerInputAdapter'),
dynamicTank = requireMek('DynamicTankInputAdapter'),
electricPump = requireMek('ElectricPumpInputAdapter'),
electrolyticSeparator = requireMek('ElectrolyticSeparatorInputAdapter'),
energizedSmelter = requireMek('EnergizedSmelterInputAdapter'),
energyCube = requireMek('EnergyCubeInputAdapter'),
enrichmentChamber = requireMek('EnrichmentChamberInputAdapter'),
fissionReactor = requireMek('FissionReactorInputAdapter'),
fluidTank = requireMek('FluidTankInputAdapter'),
fluidicPlenisher = requireMek('FluidicPlenisherInputAdapter'),
assemblicator = requireMek('FormulaicAssemblicatorInputAdapter'),
fuelwoodHeater = requireMek('FuelwoodHeaterInputAdapter'),
fusionReactor = requireMek('FusionReactorInputAdapter'),
gasGenerator = requireMek('GasGeneratorInputAdapter'),
heatGenerator = requireMek('HeatGeneratorInputAdapter'),
inductionMatrix = requireMek('InductionMatrixInputAdapter'),
industrialTurbine = requireMek('IndustrialTurbineInputAdapter'),
isotopicCentrifuge = requireMek('IsotopicCentrifugeInputAdapter'),
laser = requireMek('LaserInputAdapter'),
laserAmplifier = requireMek('LaserAmplifierInputAdapter'),
laserTractorBeam = requireMek('LaserTractorBeamInputAdapter'),
logisticalSorter = requireMek('LogisticalSorterInputAdapter'),
mechanicalPipe = requireMek('MechanicalPipeInputAdapter'),
metallurgicInfuser = requireMek('MetallurgicInfuserInputAdapter'),
nutritionalLiquifier = requireMek('NutritionalLiquifierInputAdapter'),
oredictionificator = requireMek('OredictionificatorInputAdapter'),
osmiumCompressor = requireMek('OsmiumCompressorInputAdapter'),
paintingMachine = requireMek('PaintingMachineInputAdapter'),
pigmentExtractor = requireMek('PigmentExtractorInputAdapter'),
pigmentMixer = requireMek('PigmentMixerInputAdapter'),
precisionSawmill = requireMek('PrecisionSawmillInputAdapter'),
reactionChamber = requireMek('PressurizedReactionChamberInputAdapter'),
pressurizedTube = requireMek('PressurizedTubeInputAdapter'),
purificationChamber = requireMek('PurificationChamberInputAdapter'),
quantumEntangloporter = requireMek('QuantumEntangloporterInputAdapter'),
wasteBarrel = requireMek('RadioactiveWasteBarrelInputAdapter'),
resistiveHeater = requireMek('ResistiveHeaterInputAdapter'),
condensentrator = requireMek('RotaryCondensentratorInputAdapter'),
sps = requireMek('SupercriticalPhaseShifterInputAdapter'),
seismicVibrator = requireMek('SeismicVibratorInputAdapter'),
solarGenerator = requireMek('SolarGeneratorInputAdapter'),
neutronActivator = requireMek('SolarNeutronActivatorInputAdapter'),
teleporter = requireMek('TeleporterInputAdapter'),
evaporationPlant = requireMek('ThermalEvaporationPlantInputAdapter'),
universalCable = requireMek('UniversalCableInputAdapter'),
windGenerator = requireMek('WindGeneratorInputAdapter'),
apns = requireMek('AntiprotonicNucleosynthesizerInputAdapter'),
bin = requireMek('BinInputAdapter'),
bioGenerator = requireMek('BioGeneratorInputAdapter'),
boiler = requireMek('ThermoelectricBoilerInputAdapter'),
chemicalCrystallizer = requireMek('ChemicalCrystallizerInputAdapter'),
dissolutionChamber = requireMek('ChemicalDissolutionChamberInputAdapter'),
chemicalInfuser = requireMek('ChemicalInfuserInputAdapter'),
injectionChamber = requireMek('ChemicalInjectionChamberInputAdapter'),
chemicalOxidizer = requireMek('ChemicalOxidizerInputAdapter'),
chemicalTank = requireMek('ChemicalTankInputAdapter'),
chemicalWasher = requireMek('ChemicalWasherInputAdapter'),
combiner = requireMek('CombinerInputAdapter'),
crusher = requireMek('CrusherInputAdapter'),
digitalMiner = requireMek('DigitalMinerInputAdapter'),
dynamicTank = requireMek('DynamicTankInputAdapter'),
electricPump = requireMek('ElectricPumpInputAdapter'),
electrolyticSeparator = requireMek('ElectrolyticSeparatorInputAdapter'),
energizedSmelter = requireMek('EnergizedSmelterInputAdapter'),
energyCube = requireMek('EnergyCubeInputAdapter'),
enrichmentChamber = requireMek('EnrichmentChamberInputAdapter'),
fissionReactor = requireMek('FissionReactorInputAdapter'),
fluidTank = requireMek('FluidTankInputAdapter'),
fluidicPlenisher = requireMek('FluidicPlenisherInputAdapter'),
assemblicator = requireMek('FormulaicAssemblicatorInputAdapter'),
fuelwoodHeater = requireMek('FuelwoodHeaterInputAdapter'),
fusionReactor = requireMek('FusionReactorInputAdapter'),
gasGenerator = requireMek('GasGeneratorInputAdapter'),
heatGenerator = requireMek('HeatGeneratorInputAdapter'),
inductionMatrix = requireMek('InductionMatrixInputAdapter'),
industrialTurbine = requireMek('IndustrialTurbineInputAdapter'),
isotopicCentrifuge = requireMek('IsotopicCentrifugeInputAdapter'),
laser = requireMek('LaserInputAdapter'),
laserAmplifier = requireMek('LaserAmplifierInputAdapter'),
laserTractorBeam = requireMek('LaserTractorBeamInputAdapter'),
logisticalSorter = requireMek('LogisticalSorterInputAdapter'),
mechanicalPipe = requireMek('MechanicalPipeInputAdapter'),
metallurgicInfuser = requireMek('MetallurgicInfuserInputAdapter'),
nutritionalLiquifier = requireMek('NutritionalLiquifierInputAdapter'),
oredictionificator = requireMek('OredictionificatorInputAdapter'),
osmiumCompressor = requireMek('OsmiumCompressorInputAdapter'),
paintingMachine = requireMek('PaintingMachineInputAdapter'),
pigmentExtractor = requireMek('PigmentExtractorInputAdapter'),
pigmentMixer = requireMek('PigmentMixerInputAdapter'),
precisionSawmill = requireMek('PrecisionSawmillInputAdapter'),
reactionChamber = requireMek('PressurizedReactionChamberInputAdapter'),
pressurizedTube = requireMek('PressurizedTubeInputAdapter'),
purificationChamber = requireMek('PurificationChamberInputAdapter'),
quantumEntangloporter = requireMek('QuantumEntangloporterInputAdapter'),
wasteBarrel = requireMek('RadioactiveWasteBarrelInputAdapter'),
resistiveHeater = requireMek('ResistiveHeaterInputAdapter'),
condensentrator = requireMek('RotaryCondensentratorInputAdapter'),
sps = requireMek('SupercriticalPhaseShifterInputAdapter'),
seismicVibrator = requireMek('SeismicVibratorInputAdapter'),
solarGenerator = requireMek('SolarGeneratorInputAdapter'),
neutronActivator = requireMek('SolarNeutronActivatorInputAdapter'),
teleporter = requireMek('TeleporterInputAdapter'),
evaporationPlant = requireMek('ThermalEvaporationPlantInputAdapter'),
universalCable = requireMek('UniversalCableInputAdapter'),
windGenerator = requireMek('WindGeneratorInputAdapter'),

-- factories
combiningFactory = requireMek('CombiningFactoryInputAdapter'),
compressingFactory = requireMek('CompressingFactoryInputAdapter'),
crushingFactory = requireMek('CrushingFactoryInputAdapter'),
enrichingFactory = requireMek('EnrichingFactoryInputAdapter'),
infusingFactory = requireMek('InfusingFactoryInputAdapter'),
injectingFactory = requireMek('InjectingFactoryInputAdapter'),
purifyingFactory = requireMek('PurifyingFactoryInputAdapter'),
sawingFactory = requireMek('SawingFactoryInputAdapter'),
smeltingFactory = requireMek('SmeltingFactoryInputAdapter'),
combiningFactory = requireMek('CombiningFactoryInputAdapter'),
compressingFactory = requireMek('CompressingFactoryInputAdapter'),
crushingFactory = requireMek('CrushingFactoryInputAdapter'),
enrichingFactory = requireMek('EnrichingFactoryInputAdapter'),
infusingFactory = requireMek('InfusingFactoryInputAdapter'),
injectingFactory = requireMek('InjectingFactoryInputAdapter'),
purifyingFactory = requireMek('PurifyingFactoryInputAdapter'),
sawingFactory = requireMek('SawingFactoryInputAdapter'),
smeltingFactory = requireMek('SmeltingFactoryInputAdapter'),

-- QIO
qioDriveArray = requireMek('QIODriveArrayInputAdapter'),
qioDriveArray = requireMek('QIODriveArrayInputAdapter'),
},

powah = {
energyCell = requirePowah('EnergyCellInputAdapter'),
furnator = requirePowah('FurnatorInputAdapter'),
magmator = requirePowah('MagmatorInputAdapter'),
reactor = requirePowah('ReactorInputAdapter'),
solarPanel = requirePowah('SolarPanelInputAdapter'),
thermoGenerator = requirePowah('ThermoGeneratorInputAdapter'),
energyCell = requirePowah('EnergyCellInputAdapter'),
furnator = requirePowah('FurnatorInputAdapter'),
magmator = requirePowah('MagmatorInputAdapter'),
reactor = requirePowah('ReactorInputAdapter'),
solarPanel = requirePowah('SolarPanelInputAdapter'),
thermoGenerator = requirePowah('ThermoGeneratorInputAdapter'),
},

create = {
stressometerInput = requireCreate('StressometerInputAdapter'),
speedometerInput = requireCreate('SpeedometerInputAdapter'),
rotationSpeedController = requireCreate('RotationSpeedControllerInputAdapter')
}
}

-- aliases that will be deprecated in the future
Expand Down
111 changes: 111 additions & 0 deletions src/telem/lib/input/create/BaseCreateInputAdapter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
local o = require 'telem.lib.ObjectModel'
local fl = require 'telem.vendor'.fluent
local fn = fl.fn

local InputAdapter = require 'telem.lib.InputAdapter'
local Metric = require 'telem.lib.Metric'
local MetricCollection = require 'telem.lib.MetricCollection'

local BaseCreateInputAdapter = o.class(InputAdapter)
BaseCreateInputAdapter.type = 'BaseCreateInputAdapter'

function BaseCreateInputAdapter:constructor(peripheralName, categories)
self:super('constructor')

self.prefix = 'create:'

self.categories = categories or { 'basic' }

---@type table<string, table<string, cyberbit.Fluent>>
self.queries = {}

---@type cyberbit.Fluent[]
self.storageQueries = {}

-- boot components
self:setBoot(function()
self.components = {}

self:addComponentByPeripheralID(peripheralName)
end)()

self:beforeRegister()

self:register()
end

function BaseCreateInputAdapter:beforeRegister()
-- nothing by default, should be overridden by subclasses
end

function BaseCreateInputAdapter:register()
local allCategories = fl(self.queries):keys():result()

if self.categories == '*' then
self.categories = allCategories
elseif type(self.categories) == 'table' then
self.categories = fl(self.categories):intersect(allCategories):result()
else
error('categories must be a list of categories or "*"')
end

return self
end

local function queueHelper (results, index, query)
return function ()
results[index] = Metric(query:metricable():result())
end
end

function BaseCreateInputAdapter:read ()
self:boot()

local source, component = next(self.components)

local tempMetrics = {}
local queue = {}

-- execute single-metric queries from a queue
for _, category in ipairs(self.categories) do
for k, v in pairs(self.queries[category]) do
table.insert(queue, queueHelper(
tempMetrics,
#queue + 1,
v:from(component):with('name', self.prefix .. k):with('source', source)
))
end
end

parallel.waitForAll(table.unpack(queue))

-- execute storage queries, which may return multiple metrics
-- these have no category and are always included
for k, v in pairs(self.storageQueries) do
local tempResult = v:from(component):result()

for _, metric in ipairs(tempResult) do
metric.name = 'storage:' .. metric.name
metric.source = source

table.insert(tempMetrics, metric)
end
end

return MetricCollection(table.unpack(tempMetrics))
end

------ Static Methods ------

function BaseCreateInputAdapter.mintAdapter(type)
local adapter = o.class(BaseCreateInputAdapter)
adapter.type = type

function adapter:constructor(peripheralName, categories)
self:super('constructor', peripheralName, categories)
end

return adapter
end

return BaseCreateInputAdapter
18 changes: 18 additions & 0 deletions src/telem/lib/input/create/RotationSpeedControllerInputAdapter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
local fn = require 'telem.vendor'.fluent.fn

local base = require 'telem.lib.input.create.BaseCreateInputAdapter'
local Metric = require 'telem.lib.Metric'

local RotationSpeedControllerInputAdapter = base.mintAdapter('RotationSpeedControllerInputAdapter')

function RotationSpeedControllerInputAdapter:beforeRegister ()
self.prefix = "createspeedcontroller:"

self.queries = {
basic = {
target_speed = fn():call("getTargetSpeed"):with("unit", "RPM"),
}
}
end

return RotationSpeedControllerInputAdapter
18 changes: 18 additions & 0 deletions src/telem/lib/input/create/SpeedometerInputAdapter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
local fn = require 'telem.vendor'.fluent.fn

local base = require 'telem.lib.input.create.BaseCreateInputAdapter'
local Metric = require 'telem.lib.Metric'

local SpeedometerInputAdapter = base.mintAdapter('SpeedometerInputAdapter')

function SpeedometerInputAdapter:beforeRegister ()
self.prefix = "createspeedo:"

self.queries = {
basic = {
speed = fn():call("getSpeed"):with("unit", "RPM"),
}
}
end

return SpeedometerInputAdapter
19 changes: 19 additions & 0 deletions src/telem/lib/input/create/StressometerInputAdapter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
local fn = require 'telem.vendor'.fluent.fn

local base = require 'telem.lib.input.create.BaseCreateInputAdapter'
local Metric = require 'telem.lib.Metric'

local StressometerInputAdapter = base.mintAdapter('StressometerInputAdapter')

function StressometerInputAdapter:beforeRegister ()
self.prefix = "createstresso:"

self.queries = {
basic = {
usage = fn():call("getStress"):with("unit", "SU"),
capacity = fn():call("getStressCapacity"):with("unit", "SU")
}
}
end

return StressometerInputAdapter
Loading