Skip to content

Commit

Permalink
[Major] all providers now add their created instances to the registry
Browse files Browse the repository at this point in the history
This was previously done by a proxy class, which was removed as it caused other issues, in that the default create(int)-method could not be called, even though they are properly implemented
  • Loading branch information
eitch committed Feb 8, 2024
1 parent a236c4e commit a23db73
Show file tree
Hide file tree
Showing 29 changed files with 387 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.analog.AnalogInput;
import com.pi4j.io.gpio.analog.AnalogInputConfig;
import com.pi4j.io.gpio.analog.AnalogInputProviderBase;
Expand All @@ -42,30 +43,39 @@ public class TestAnalogInputProviderImpl extends AnalogInputProviderBase impleme
/**
* <p>Constructor for TestAnalogInputProviderImpl.</p>
*/
public TestAnalogInputProviderImpl(){ super(); }
public TestAnalogInputProviderImpl() {
super();
}

/**
* <p>Constructor for TestAnalogInputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
*/
public TestAnalogInputProviderImpl(String id){
public TestAnalogInputProviderImpl(String id) {
super(id);
}

/**
* <p>Constructor for TestAnalogInputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
* @param id a {@link java.lang.String} object.
* @param name a {@link java.lang.String} object.
*/
public TestAnalogInputProviderImpl(String id, String name){
public TestAnalogInputProviderImpl(String id, String name) {
super(id, name);
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public AnalogInput create(AnalogInputConfig config) {
return new TestAnalogInput(this, config);
TestAnalogInput input = new TestAnalogInput(this, config);
if (this.context.registry().exists(input.id()))
throw new IOAlreadyExistsException(config.id());
input.initialize(this.context);
this.context.registry().add(input);
return input;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.analog.AnalogOutput;
import com.pi4j.io.gpio.analog.AnalogOutputConfig;
import com.pi4j.io.gpio.analog.AnalogOutputProviderBase;
Expand All @@ -42,30 +43,39 @@ public class TestAnalogOutputProviderImpl extends AnalogOutputProviderBase imple
/**
* <p>Constructor for TestAnalogOutputProviderImpl.</p>
*/
public TestAnalogOutputProviderImpl(){ super(); }
public TestAnalogOutputProviderImpl() {
super();
}

/**
* <p>Constructor for TestAnalogOutputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
*/
public TestAnalogOutputProviderImpl(String id){
public TestAnalogOutputProviderImpl(String id) {
super(id);
}

/**
* <p>Constructor for TestAnalogOutputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
* @param id a {@link java.lang.String} object.
* @param name a {@link java.lang.String} object.
*/
public TestAnalogOutputProviderImpl(String id, String name){
public TestAnalogOutputProviderImpl(String id, String name) {
super(id, name);
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public AnalogOutput create(AnalogOutputConfig config) {
return new TestAnalogOutput();
TestAnalogOutput output = new TestAnalogOutput();
if (this.context.registry().exists(output.id()))
throw new IOAlreadyExistsException(config.id());
output.initialize(this.context);
this.context.registry().add(output);
return output;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.digital.DigitalInput;
import com.pi4j.io.gpio.digital.DigitalInputConfig;
import com.pi4j.io.gpio.digital.DigitalInputProviderBase;
Expand All @@ -42,30 +43,39 @@ public class TestDigitalInputProviderImpl extends DigitalInputProviderBase imple
/**
* <p>Constructor for TestDigitalInputProviderImpl.</p>
*/
public TestDigitalInputProviderImpl(){ super(); }
public TestDigitalInputProviderImpl() {
super();
}

/**
* <p>Constructor for TestDigitalInputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
*/
public TestDigitalInputProviderImpl(String id){
public TestDigitalInputProviderImpl(String id) {
super(id);
}

/**
* <p>Constructor for TestDigitalInputProviderImpl.</p>
*
* @param id a {@link java.lang.String} object.
* @param id a {@link java.lang.String} object.
* @param name a {@link java.lang.String} object.
*/
public TestDigitalInputProviderImpl(String id, String name){
public TestDigitalInputProviderImpl(String id, String name) {
super(id, name);
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public DigitalInput create(DigitalInputConfig config) {
return new TestDigitalInput(this, config);
TestDigitalInput input = new TestDigitalInput(this, config);
if (this.context.registry().exists(input.id()))
throw new IOAlreadyExistsException(config.id());
input.initialize(this.context);
this.context.registry().add(input);
return input;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import com.pi4j.context.Context;
import com.pi4j.exception.InitializeException;
import com.pi4j.exception.ShutdownException;
import com.pi4j.io.gpio.digital.*;
import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.digital.DigitalInput;
import com.pi4j.io.gpio.digital.DigitalInputConfig;
import com.pi4j.io.gpio.digital.DigitalInputProvider;
import com.pi4j.io.gpio.digital.DigitalInputProviderBase;
import com.pi4j.library.gpiod.internal.GpioLine;

public class GpioDDigitalInputProviderImpl extends DigitalInputProviderBase implements GpioDDigitalInputProvider {
Expand All @@ -24,7 +28,12 @@ public GpioDDigitalInputProviderImpl() {
public DigitalInput create(DigitalInputConfig config) {
// create new I/O instance based on I/O config
GpioLine line = this.chipClaim.getGpioChip().getLine(config.address());
return new GpioDDigitalInput(line, this, config);
GpioDDigitalInput digitalInput = new GpioDDigitalInput(line, this, config);
if (this.context.registry().exists(digitalInput.id()))
throw new IOAlreadyExistsException(config.id());
digitalInput.initialize(this.context);
this.context.registry().add(digitalInput);
return digitalInput;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.pi4j.context.Context;
import com.pi4j.exception.InitializeException;
import com.pi4j.exception.ShutdownException;
import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.digital.DigitalOutput;
import com.pi4j.io.gpio.digital.DigitalOutputConfig;
import com.pi4j.io.gpio.digital.DigitalOutputProvider;
Expand Down Expand Up @@ -60,7 +61,12 @@ public GpioDDigitalOutputProviderImpl() {
public DigitalOutput create(DigitalOutputConfig config) {
// create new I/O instance based on I/O config
GpioLine line = this.chipClaim.getGpioChip().getLine(config.address());
return new GpioDDigitalOutput(line, this, config);
GpioDDigitalOutput digitalOutput = new GpioDDigitalOutput(line, this, config);
if (this.context.registry().exists(digitalOutput.id()))
throw new IOAlreadyExistsException(config.id());
digitalOutput.initialize(this.context);
this.context.registry().add(digitalOutput);
return digitalOutput;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.digital.DigitalInput;
import com.pi4j.io.gpio.digital.DigitalInputConfig;
import com.pi4j.io.gpio.digital.DigitalInputProviderBase;
Expand All @@ -45,7 +46,7 @@ public class LinuxFsDigitalInputProviderImpl extends DigitalInputProviderBase im
/**
* <p>Constructor for LinuxFsDigitalInputProviderImpl.</p>
*/
public LinuxFsDigitalInputProviderImpl(String gpioFileSystemPath){
public LinuxFsDigitalInputProviderImpl(String gpioFileSystemPath) {
this.id = ID;
this.name = NAME;
this.gpioFileSystemPath = gpioFileSystemPath;
Expand All @@ -57,12 +58,18 @@ public int getPriority() {
return 50;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public DigitalInput create(DigitalInputConfig config) {
// create filesystem based GPIO instance using instance address (GPIO NUMBER)
LinuxGpio gpio = new LinuxGpio(this.gpioFileSystemPath, config.address());

return new LinuxFsDigitalInput(gpio, this, config);
LinuxFsDigitalInput digitalInput = new LinuxFsDigitalInput(gpio, this, config);
if (this.context.registry().exists(digitalInput.id()))
throw new IOAlreadyExistsException(config.id());
digitalInput.initialize(this.context);
this.context.registry().add(digitalInput);
return digitalInput;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.gpio.digital.DigitalOutput;
import com.pi4j.io.gpio.digital.DigitalOutputConfig;
import com.pi4j.io.gpio.digital.DigitalOutputProviderBase;
Expand All @@ -38,14 +39,15 @@
* @author Robert Savage (<a href="http://www.savagehomeautomation.com">http://www.savagehomeautomation.com</a>)
* @version $Id: $Id
*/
public class LinuxFsDigitalOutputProviderImpl extends DigitalOutputProviderBase implements LinuxFsDigitalOutputProvider {
public class LinuxFsDigitalOutputProviderImpl extends DigitalOutputProviderBase
implements LinuxFsDigitalOutputProvider {

final String gpioFileSystemPath;

/**
* <p>Constructor for LinuxFsDigitalOutputProviderImpl.</p>
*/
public LinuxFsDigitalOutputProviderImpl(String gpioFileSystemPath){
public LinuxFsDigitalOutputProviderImpl(String gpioFileSystemPath) {
this.id = ID;
this.name = NAME;
this.gpioFileSystemPath = gpioFileSystemPath;
Expand All @@ -57,12 +59,18 @@ public int getPriority() {
return 50;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public DigitalOutput create(DigitalOutputConfig config) {

// create filesystem based GPIO instance using instance address (GPIO NUMBER)
LinuxGpio gpio = new LinuxGpio(this.gpioFileSystemPath, config.address());
return new LinuxFsDigitalOutput(gpio, this, config);
LinuxFsDigitalOutput digitalOutput = new LinuxFsDigitalOutput(gpio, this, config);
if (this.context.registry().exists(digitalOutput.id()))
throw new IOAlreadyExistsException(config.id());
digitalOutput.initialize(this.context);
this.context.registry().add(digitalOutput);
return digitalOutput;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,14 @@
* #L%
*/

import java.util.HashMap;
import java.util.Map;

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.i2c.I2C;
import com.pi4j.io.i2c.I2CConfig;
import com.pi4j.io.i2c.I2CProviderBase;

import java.util.HashMap;
import java.util.Map;

public class LinuxFsI2CProviderImpl extends I2CProviderBase implements LinuxFsI2CProvider {

private final Map<Integer, LinuxFsI2CBus> i2CBusMap;
Expand All @@ -51,12 +52,14 @@ public int getPriority() {
}

@Override
public I2C create(I2CConfig config) {
synchronized (this) {
LinuxFsI2CBus i2CBus = this.i2CBusMap.computeIfAbsent(config.getBus(), busNr -> new LinuxFsI2CBus(config));

// create new I/O instance based on I/O config
return new LinuxFsI2C(i2CBus, this, config);
}
public synchronized I2C create(I2CConfig config) {
LinuxFsI2CBus i2CBus = this.i2CBusMap.computeIfAbsent(config.getBus(), busNr -> new LinuxFsI2CBus(config));
// create new I/O instance based on I/O config
LinuxFsI2C i2C = new LinuxFsI2C(i2CBus, this, config);
if (this.context.registry().exists(i2C.id()))
throw new IOAlreadyExistsException(config.id());
i2C.initialize(this.context);
this.context.registry().add(i2C);
return i2C;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* This file is part of the Pi4J project. More information about
* this project can be found here: https://pi4j.com/
* **********************************************************************
*
*
* This program 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
Expand All @@ -27,13 +27,16 @@
* #L%
*/

import com.pi4j.io.exception.IOAlreadyExistsException;
import com.pi4j.io.exception.IOException;
import com.pi4j.io.pwm.Pwm;
import com.pi4j.io.pwm.PwmConfig;
import com.pi4j.io.pwm.PwmProviderBase;
import com.pi4j.io.pwm.PwmType;
import com.pi4j.plugin.linuxfs.internal.LinuxPwm;

import static java.text.MessageFormat.format;

/**
* <p>LinuxFsPwmProviderImpl class.</p>
*
Expand Down Expand Up @@ -71,19 +74,24 @@ public LinuxFsPwmProviderImpl(String pwmFileSystemPath) {
this.pwmChip = LinuxPwm.DEFAULT_PWM_CHIP;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public Pwm create(PwmConfig config) {

// create new I/O instance based on I/O config
if(config.pwmType() == PwmType.HARDWARE){
if (config.pwmType() != PwmType.HARDWARE)
throw new IOException(format(
"The Linux file system PWM provider does not support software-emulated PWM pins; PIN ADDRESS={0}",
config.address()));

// create filesystem based PWM instance using instance address (PWM PIN NUMBER)
LinuxPwm pwm = new LinuxPwm(this.pwmFileSystemPath, this.pwmChip, config.address());
return new LinuxFsPwm(pwm, this, config);
}
else {
throw new IOException("The Linux file system PWM provider does not support software-emulated PWM pins; PIN ADDRESS=" + config.address());
}
// create filesystem based PWM instance using instance address (PWM PIN NUMBER)
LinuxPwm pwm = new LinuxPwm(this.pwmFileSystemPath, this.pwmChip, config.address());
LinuxFsPwm fsPwm = new LinuxFsPwm(pwm, this, config);
if (this.context.registry().exists(fsPwm.id()))
throw new IOAlreadyExistsException(config.id());
fsPwm.initialize(this.context);
this.context.registry().add(fsPwm);
return fsPwm;
}
}
Loading

0 comments on commit a23db73

Please sign in to comment.