Output.java
- /*
- * Copyright © 2016 Greg Chabala
- *
- * This file is part of brick-control-lab.
- *
- * brick-control-lab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * brick-control-lab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with brick-control-lab. If not, see http://www.gnu.org/licenses/.
- */
- package org.chabala.brick.controllab;
- import java.io.IOException;
- import java.util.Collections;
- import java.util.EnumSet;
- import java.util.Set;
- /**
- * Handle for an output port (or group of ports) on a specific control lab instance.
- * Obtain via {@link ControlLab#getOutput(OutputId)} or {@link ControlLab#getOutput(Set)}.
- */
- public class Output {
- private final ControlLab controlLab;
- private final Set<OutputId> outputIdSet;
- /**
- * Called internally by {@link ControlLab#getOutput(OutputId)}.
- * @param controlLab the control lab this output is a handle to
- * @param outputId the output port ID on that control lab
- */
- Output(ControlLab controlLab, OutputId outputId) {
- this(controlLab, EnumSet.of(outputId));
- }
- /**
- * Called internally by {@link ControlLab#getOutput(Set)}.
- * @param controlLab the control lab this output is a handle to
- * @param outputIdSet the output IDs this output should reference
- */
- Output(ControlLab controlLab, Set<OutputId> outputIdSet) {
- this.controlLab = controlLab;
- this.outputIdSet = outputIdSet;
- }
- /**
- * Returns set of {@link OutputId}s this {@link Output} relates to. In normal
- * usage, this is unlikely to be called as one would obtain the {@link Output}
- * from {@link ControlLab#getOutput(OutputId)} and immediately chain one of the
- * fluent method calls. But it can useful to inspect the {@link OutputId}s if the
- * {@link Output} reference is retained and seperated from the creation site.
- * @return set of {@link OutputId}s this {@link Output} relates to
- */
- public Set<OutputId> getOutputIdSet() {
- return Collections.unmodifiableSet(outputIdSet);
- }
- /**
- * Stops sending power to this output.
- * @return self reference to the output for chaining
- * @throws IOException if any number of possible communication issues occurs
- */
- public Output turnOff() throws IOException {
- controlLab.turnOutputOff(outputIdSet);
- return this;
- }
- /**
- * Starts sending power to this output.
- * @return self reference to the output for chaining
- * @throws IOException if any number of possible communication issues occurs
- */
- public Output turnOn() throws IOException {
- controlLab.turnOutputOn(outputIdSet);
- return this;
- }
- /**
- * Sets the {@link Direction} of this output. Direction may be changed
- * while the output is powered or unpowered.
- * @param direction desired direction
- * @return self reference to the output for chaining
- * @throws IOException if any number of possible communication issues occurs
- */
- public Output setDirection(Direction direction) throws IOException {
- controlLab.setOutputDirection(direction, outputIdSet);
- return this;
- }
- /**
- * Reverses the {@link Direction} of this output. This is a convenience method
- * that is the same as
- * {@link Output#setDirection(Direction) setDirection(}{@link Direction#REVERSE Direction.REVERSE)}.
- * @return self reference to the output for chaining
- * @throws IOException if any number of possible communication issues occurs
- */
- public Output reverseDirection() throws IOException {
- return setDirection(Direction.REVERSE);
- }
- /**
- * Sets the {@link PowerLevel} of this output. Power level may be changed
- * while the output is powered or unpowered.
- * @param powerLevel desired power level
- * @return self reference to the output for chaining
- * @throws IOException if any number of possible communication issues occurs
- */
- public Output setPowerLevel(PowerLevel powerLevel) throws IOException {
- controlLab.setOutputPowerLevel(powerLevel, outputIdSet);
- return this;
- }
- /** {@inheritDoc} */
- @Override
- public String toString() {
- return "Output{" +
- "controlLab=" + controlLab +
- ", outputIdSet=" + outputIdSet +
- '}';
- }
- }