Add controller capabilities reader

This commit is contained in:
litoral05
2026-05-19 16:47:03 +01:00
parent fa32550aaa
commit 49f8d944eb
3 changed files with 90 additions and 0 deletions
@@ -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
) {
}
@@ -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();
}
}
@@ -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<Integer> 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;
}
}