Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Solved tap position + solved section count #2978

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Draft
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:cca="http://www.powsybl.org/schema/iidm/ext/cgmes_control_areas/1_0" id="sim1" caseDate="2021-02-02T09:27:39.856+01:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:cca="http://www.powsybl.org/schema/iidm/ext/cgmes_control_areas/1_0" id="sim1" caseDate="2021-02-02T09:27:39.856+01:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="P1" country="FR" tso="RTE" geographicalTags="A">
<iidm:voltageLevel id="VLGEN" nominalV="24.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:clbn="http://www.powsybl.org/schema/iidm/ext/cgmes_line_boundary_node/1_0" id="sim1" caseDate="2013-01-15T18:45:00.000+01:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:clbn="http://www.powsybl.org/schema/iidm/ext/cgmes_line_boundary_node/1_0" id="sim1" caseDate="2013-01-15T18:45:00.000+01:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="P1" country="FR" tso="RTE" geographicalTags="A">
<iidm:voltageLevel id="VLGEN" nominalV="24.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:cc="http://www.powsybl.org/schema/iidm/ext/cim_characteristics/1_0" id="sim1" caseDate="2020-09-08T14:28:13.738+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:cc="http://www.powsybl.org/schema/iidm/ext/cim_characteristics/1_0" id="sim1" caseDate="2020-09-08T14:28:13.738+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="P1" country="FR" tso="RTE" geographicalTags="A">
<iidm:voltageLevel id="VLGEN" nominalV="24.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:cmm="http://www.powsybl.org/schema/iidm/ext/cgmes_metadata_models/1_0" id="network" caseDate="2020-09-07T15:44:10.209+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:cmm="http://www.powsybl.org/schema/iidm/ext/cgmes_metadata_models/1_0" id="network" caseDate="2020-09-07T15:44:10.209+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="substation1" country="FR" tso="TSO1" geographicalTags="region1">
<iidm:voltageLevel id="voltageLevel1" nominalV="400.0" topologyKind="NODE_BREAKER">
<iidm:nodeBreakerTopology>
Expand Down
2 changes: 1 addition & 1 deletion entsoe-util/src/test/resources/entsoeAreaRef.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:ea="http://www.itesla_project.eu/schema/iidm/ext/entsoe_area/1_0" id="test" caseDate="2016-06-27T12:27:58.535+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:ea="http://www.itesla_project.eu/schema/iidm/ext/entsoe_area/1_0" id="test" caseDate="2016-06-27T12:27:58.535+02:00" forecastDistance="0" sourceFormat="test" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S" country="FR"></iidm:substation>
<iidm:extension id="S">
<ea:entsoeArea>BE</ea:entsoeArea>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee118cdf" caseDate="1993-08-25T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee118cdf" caseDate="1993-08-25T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="138.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee14cdf-solved" caseDate="1993-08-19T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee14cdf-solved" caseDate="1993-08-19T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="1.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee14cdf" caseDate="1993-08-19T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee14cdf" caseDate="1993-08-19T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="135.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee300cdf" caseDate="1991-05-13T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee300cdf" caseDate="1991-05-13T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="115.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee30cdf" caseDate="1993-08-20T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee30cdf" caseDate="1993-08-20T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="132.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee33" caseDate="2022-09-23T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee33" caseDate="2022-09-23T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="12.66" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee57cdf" caseDate="1993-08-25T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee57cdf" caseDate="1993-08-25T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="1.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee69" caseDate="2022-09-23T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee69" caseDate="2022-09-23T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="12.66" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee9cdf" caseDate="2009-04-26T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee9cdf" caseDate="2009-04-26T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="100.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_12" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee9zeroimpedancecdf" caseDate="2009-04-26T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:network xmlns:iidm="http://www.powsybl.org/schema/iidm/1_13" xmlns:slt="http://www.powsybl.org/schema/iidm/ext/slack_terminal/1_5" id="ieee9zeroimpedancecdf" caseDate="2009-04-26T00:00:00.000Z" forecastDistance="0" sourceFormat="IEEE-CDF" minimumValidationLevel="STEADY_STATE_HYPOTHESIS">
<iidm:substation id="S1">
<iidm:voltageLevel id="VL1" nominalV="100.0" topologyKind="BUS_BREAKER">
<iidm:busBreakerTopology>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,22 @@
* <td style="border: 1px solid black">The maximum number of sections that may be switched on</td>
* </tr>
* <tr>
* <td style="border: 1px solid black">CurrentSectionCount</td>
* <td style="border: 1px solid black">sectionCount</td>
* <td style="border: 1px solid black">integer</td>
* <td style="border: 1px solid black">-</td>
* <td style="border: 1px solid black">yes</td>
* <td style="border: 1px solid black"> - </td>
* <td style="border: 1px solid black">The current number of section that may be switched on</td>
* </tr>
* <tr>
* <td style="border: 1px solid black">solvedSectionCount</td>
* <td style="border: 1px solid black">integer</td>
* <td style="border: 1px solid black">-</td>
* <td style="border: 1px solid black">yes</td>
* <td style="border: 1px solid black"> - </td>
* <td style="border: 1px solid black">The number of section that may be switched on calculated after the load flow</td>
* </tr>
* <tr>
* <td style="border: 1px solid black">RegulatingTerminal</td>
* <td style="border: 1px solid black">Terminal</td>
* <td style="border: 1px solid black">-</td>
Expand Down Expand Up @@ -133,6 +141,28 @@ default OptionalInt findSectionCount() {
return OptionalInt.of(getSectionCount());
}

/**
* Get the count of sections in service as calculated after the load flow.
* <p>
* It is expected to be greater than one and lesser than or equal to the
* maximum section count.
* <p>
* Depends on the working variant.
* @see VariantManager
*/
int getSolvedSectionCount();

/**
* Get the count of sections after the load flow in service if it is defined.
* Otherwise, get an empty optional.
* <p>
* Depends on the working variant.
* @see VariantManager
*/
default OptionalInt findSolvedSectionCount() {
return OptionalInt.of(getSolvedSectionCount());
}

/**
* Get the maximum number of sections that can be in service
*/
Expand All @@ -158,6 +188,25 @@ default ShuntCompensator unsetSectionCount() {
throw ValidationUtil.createUnsetMethodException();
}

/**
* Change the solved count of sections in service after the load flow calculation.
* <p>
* Depends on the working variant.
*
* @see VariantManager
* @param solvedSectionCount the number of sections wanted to be put in service
* @return the shunt compensator to chain method calls.
*/
ShuntCompensator setSolvedSectionCount(int solvedSectionCount);

/**
* Unset the solved count of sections in service.
* Note: this can be done <b>only</b> in SCADA validation level.
*/
default ShuntCompensator unsetSolvedSectionCount() {
throw ValidationUtil.createUnsetMethodException();
}

/**
* Get the susceptance (in S) of the shunt in its current state i.e. the sum of the sections' susceptances for all sections in service.
* Return 0 if no section is in service (disconnected state).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public interface ShuntCompensatorAdder extends InjectionAdder<ShuntCompensator,

ShuntCompensatorAdder setSectionCount(int sectionCount);

ShuntCompensatorAdder setSolvedSectionCount(int solvedSectionCount);

default ShuntCompensatorAdder setRegulatingTerminal(Terminal regulatingTerminal) {
throw new UnsupportedOperationException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ public interface TapChanger<
*/
int getTapPosition();

/**
* Get the solved tap position when loading the network. It is the position after the load flow.
* <p>
* Depends on the working variant.
* @see VariantManager
*/
int getSolvedTapPosition();

/**
* Get an optional containing the current tap position if it is defined.
* Otherwise, get an empty optional.
Expand All @@ -56,6 +64,28 @@ default OptionalInt findTapPosition() {
return OptionalInt.of(getTapPosition());
}

/**
* Get an optional containing the solved tap position if it is defined.
* Otherwise, get an empty optional.
* <p>
* Depends on the working variant.
* @see VariantManager
*/
default OptionalInt findSolvedTapPosition() {
return OptionalInt.of(getSolvedTapPosition());
}

/**
* Set the solved tap position, which is the position after a load flow.
* <p>
* It is expected to be contained between the lowest and the highest tap position.
* <p>
* Depends on the working variant.
* @see VariantManager
*/
C setSolvedTapPosition(int solvedTapPosition);


/**
* Set the current tap position.
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public interface TapChangerAdder<

S setTapPosition(int tapPosition);

S setSolvedTapPosition(int solvedTapPosition);

S setRegulating(boolean regulating);

S setRegulationTerminal(Terminal regulationTerminal);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,12 @@ abstract class AbstractTapChanger<H extends TapChangerParent, C extends Abstract

protected final TDoubleArrayList targetDeadband;

protected final ArrayList<Integer> solvedTapPosition;

protected AbstractTapChanger(H parent,
int lowTapPosition, List<S> steps, TerminalExt regulationTerminal,
Integer tapPosition, boolean regulating, double targetDeadband, String type) {
Integer tapPosition, boolean regulating, double targetDeadband, String type,
Integer solvedTapPosition) {
// The Ref object should be the one corresponding to the subnetwork of the tap changer holder
// (to avoid errors when the subnetwork is detached)
this.network = parent.getParentNetwork().getRootNetworkRef();
Expand All @@ -58,9 +61,11 @@ protected AbstractTapChanger(H parent,
regulatingPoint.setRegulatingTerminal(regulationTerminal);
this.tapPosition = new ArrayList<>(variantArraySize);
this.targetDeadband = new TDoubleArrayList(variantArraySize);
this.solvedTapPosition = new ArrayList<>(variantArraySize);
for (int i = 0; i < variantArraySize; i++) {
this.tapPosition.add(tapPosition);
this.targetDeadband.add(targetDeadband);
this.solvedTapPosition.add(solvedTapPosition);
}
this.type = Objects.requireNonNull(type);
relativeNeutralPosition = getRelativeNeutralPosition();
Expand Down Expand Up @@ -104,11 +109,37 @@ public int getTapPosition() {
return position;
}

public int getSolvedTapPosition() {
Integer initialPosition = solvedTapPosition.get(network.get().getVariantIndex());
if (initialPosition == null) {
throw ValidationUtil.createUndefinedValueGetterException();
}
return initialPosition;
}

public C setSolvedTapPosition(int solvedTapPosition) {
NetworkImpl n = getNetwork();
if (solvedTapPosition < lowTapPosition
|| solvedTapPosition > getHighTapPosition()) {
throwIncorrectTapPosition(solvedTapPosition, getHighTapPosition());
}
int variantIndex = n.getVariantIndex();
Integer oldValue = this.solvedTapPosition.set(variantIndex, solvedTapPosition);
String variantId = n.getVariantManager().getVariantId(variantIndex);
parent.getNetwork().getListeners().notifyUpdate(parent.getTransformer(), () -> getTapChangerAttribute() + ".solvedTapPosition", variantId, oldValue, solvedTapPosition);
return (C) this;
}

public OptionalInt findTapPosition() {
Integer position = tapPosition.get(network.get().getVariantIndex());
return position == null ? OptionalInt.empty() : OptionalInt.of(position);
}

public OptionalInt findSolvedTapPosition() {
Integer initialPosition = solvedTapPosition.get(network.get().getVariantIndex());
return initialPosition == null ? OptionalInt.empty() : OptionalInt.of(initialPosition);
}

public OptionalInt getNeutralPosition() {
return relativeNeutralPosition != null ? OptionalInt.of(lowTapPosition + relativeNeutralPosition) : OptionalInt.empty();
}
Expand Down
Loading