diff --git a/src/telem/lib/input.lua b/src/telem/lib/input.lua index b36b9be..ea4db73 100644 --- a/src/telem/lib/input.lua +++ b/src/telem/lib/input.lua @@ -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 diff --git a/src/telem/lib/input/create/BaseCreateInputAdapter.lua b/src/telem/lib/input/create/BaseCreateInputAdapter.lua new file mode 100644 index 0000000..08e80c2 --- /dev/null +++ b/src/telem/lib/input/create/BaseCreateInputAdapter.lua @@ -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> + 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 diff --git a/src/telem/lib/input/create/RotationSpeedControllerInputAdapter.lua b/src/telem/lib/input/create/RotationSpeedControllerInputAdapter.lua new file mode 100644 index 0000000..17a94b0 --- /dev/null +++ b/src/telem/lib/input/create/RotationSpeedControllerInputAdapter.lua @@ -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 \ No newline at end of file diff --git a/src/telem/lib/input/create/SpeedometerInputAdapter.lua b/src/telem/lib/input/create/SpeedometerInputAdapter.lua new file mode 100644 index 0000000..6b49fcd --- /dev/null +++ b/src/telem/lib/input/create/SpeedometerInputAdapter.lua @@ -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 \ No newline at end of file diff --git a/src/telem/lib/input/create/StressometerInputAdapter.lua b/src/telem/lib/input/create/StressometerInputAdapter.lua new file mode 100644 index 0000000..4fbe8ec --- /dev/null +++ b/src/telem/lib/input/create/StressometerInputAdapter.lua @@ -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 \ No newline at end of file