diff --git a/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilities.java b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilities.java new file mode 100644 index 0000000..f979d58 --- /dev/null +++ b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilities.java @@ -0,0 +1,15 @@ +package com.litoralregas.backend.acquisition; + +import java.time.Instant; + +public record ControllerCapabilities( + Integer irrigationControllerCount, + Integer fertilizerChannelCount, + Boolean irrigationEnabled, + Boolean climateEnabled, + Boolean lightingEnabled, + Integer climateGreenhouseCount, + Integer rawFeatureFlags, + Instant timestamp +) { +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesController.java b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesController.java new file mode 100644 index 0000000..aa40a25 --- /dev/null +++ b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesController.java @@ -0,0 +1,19 @@ +package com.litoralregas.backend.acquisition; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ControllerCapabilitiesController { + + private final ControllerCapabilitiesReader controllerCapabilitiesReader; + + public ControllerCapabilitiesController(ControllerCapabilitiesReader controllerCapabilitiesReader) { + this.controllerCapabilitiesReader = controllerCapabilitiesReader; + } + + @GetMapping("/api/acquisition/capabilities") + public ControllerCapabilities getCapabilities() { + return controllerCapabilitiesReader.readCapabilities(); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesReader.java b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesReader.java new file mode 100644 index 0000000..f38ce85 --- /dev/null +++ b/src/main/java/com/litoralregas/backend/acquisition/ControllerCapabilitiesReader.java @@ -0,0 +1,56 @@ +package com.litoralregas.backend.acquisition; + +import com.litoralregas.backend.modbus.LrModbusClient; +import com.litoralregas.backend.modbus.ModbusReadResult; +import com.litoralregas.backend.modbus.ModbusUnit; +import org.springframework.stereotype.Service; + +import java.time.Instant; +import java.util.List; + +@Service +public class ControllerCapabilitiesReader { + + private static final int CAPABILITIES_START_ADDRESS = 6; + private static final int CAPABILITIES_REGISTER_COUNT = 4; + + private final LrModbusClient modbusClient; + + public ControllerCapabilitiesReader(LrModbusClient modbusClient) { + this.modbusClient = modbusClient; + } + + public ControllerCapabilities readCapabilities() { + ModbusReadResult result = modbusClient.readInputRegisters( + ModbusUnit.PC, + CAPABILITIES_START_ADDRESS, + CAPABILITIES_REGISTER_COUNT + ); + + List values = result.values(); + + if (values.size() != CAPABILITIES_REGISTER_COUNT) { + throw new IllegalStateException("Invalid controller capabilities response size."); + } + + Integer irrigationControllerCount = values.get(0); + Integer fertilizerChannelCount = values.get(1); + Integer rawFeatureFlags = values.get(2); + Integer climateGreenhouseCount = values.get(3); + + return new ControllerCapabilities( + irrigationControllerCount, + fertilizerChannelCount, + isBitSet(rawFeatureFlags, 0), + isBitSet(rawFeatureFlags, 1), + isBitSet(rawFeatureFlags, 2), + climateGreenhouseCount, + rawFeatureFlags, + Instant.now() + ); + } + + private boolean isBitSet(Integer value, int bitOffset) { + return ((value >> bitOffset) & 1) == 1; + } +} \ No newline at end of file