Skip to content

Commit 9d1e49b

Browse files
committed
#454 Small refactoring, adding normal I2C methods for direct write (without register).
1 parent fb2536a commit 9d1e49b

File tree

6 files changed

+42
-27
lines changed

6 files changed

+42
-27
lines changed

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/FFMPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.pi4j.plugin.ffm.providers.gpio.DigitalInputFFMProviderImpl;
88
import com.pi4j.plugin.ffm.providers.gpio.DigitalOutputFFMProviderImpl;
99
import com.pi4j.plugin.ffm.providers.i2c.I2CFFMProviderImpl;
10-
import com.pi4j.plugin.ffm.providers.pwm.FFMPwmProviderImpl;
10+
import com.pi4j.plugin.ffm.providers.pwm.PwmFFMProviderImpl;
1111
import com.pi4j.plugin.ffm.providers.spi.SpiFFMProviderImpl;
1212
import com.pi4j.provider.Provider;
1313

@@ -23,7 +23,7 @@ public void initialize(PluginService service) {
2323
new DigitalOutputFFMProviderImpl(),
2424
new I2CFFMProviderImpl(),
2525
new SpiFFMProviderImpl(),
26-
new FFMPwmProviderImpl()
26+
new PwmFFMProviderImpl()
2727
};
2828
service.register(providers);
2929
}

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/gpio/DigitalInputFFM.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ public class DigitalInputFFM extends DigitalInputBase implements DigitalInput {
4545
private final PullResistance pull;
4646
private int chipFileDescriptor;
4747

48-
private static final ThreadFactory factory = Thread.ofVirtual().name("pin-input-event-detection-", 0).factory();
48+
private final ThreadFactory factory;
4949
// executor services for event watcher
50-
private static final ExecutorService eventTaskProcessor = Executors.newSingleThreadExecutor(factory);
50+
private final ExecutorService eventTaskProcessor;
5151

5252
private boolean closed = false;
5353

@@ -57,6 +57,8 @@ public DigitalInputFFM(String chipName, DigitalInputProvider provider, DigitalIn
5757
this.chipName = "/dev/" + chipName;
5858
this.debounce = config.debounce();
5959
this.pull = config.pull();
60+
this.factory = Thread.ofVirtual().name("ffm-input-event-detection-pin-", pin).factory();
61+
this.eventTaskProcessor = Executors.newSingleThreadExecutor(factory);
6062
}
6163

6264
@Override
@@ -237,6 +239,7 @@ public void run() {
237239
if (buf[i] == 0) {
238240
continue;
239241
}
242+
// convert byte array of events to java object with heap memory segment
240243
System.arraycopy(buf, i, holder, 0, eventSize);
241244
var memoryBuffer = MemorySegment.ofArray(holder);
242245
var event = LineEvent.createEmpty().from(memoryBuffer);

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/i2c/I2CSMBus.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.pi4j.plugin.ffm.providers.i2c;
22

3+
import com.pi4j.exception.Pi4JException;
34
import com.pi4j.io.i2c.I2CBase;
45
import com.pi4j.io.i2c.I2CConfig;
56
import com.pi4j.io.i2c.I2CProvider;
@@ -19,7 +20,7 @@ public class I2CSMBus extends I2CBase<I2CBusFFM> {
1920
*
2021
* @param provider a {@link I2CProvider} object.
2122
* @param config a {@link I2CConfig} object.
22-
* @param i2CBus a {@link I2CBus} object.
23+
* @param i2CBus a {@link I2CBusFFM} object.
2324
*/
2425
public I2CSMBus(I2CProvider provider, I2CConfig config, I2CBusFFM i2CBus) {
2526
super(provider, config, i2CBus);
@@ -37,12 +38,10 @@ private int writeInternal(int register, byte[] data) {
3738
return i2CBus.execute(this, (i2cFileDescriptor) -> {
3839
if (data.length == 1) {
3940
return SMBUS.writeByteData(i2cFileDescriptor, (byte) register, data[0]);
41+
} else if (i2CBus.hasFunctionality(I2CFunctionality.I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)) {
42+
return SMBUS.writeBlockData(i2cFileDescriptor, (byte) register, data);
4043
} else {
41-
return 0;
42-
// var buffer = new byte[data.length + 1];
43-
// buffer[0] = (byte) register;
44-
// System.arraycopy(data, 0, buffer, 1, data.length);
45-
// return FILE.write(i2cFileDescriptor, buffer);
44+
throw new Pi4JException("No support any of I2C device write mode.");
4645
}
4746
});
4847
}
@@ -57,12 +56,12 @@ private int writeInternal(int register, byte[] data) {
5756
private byte[] readInternal(int register, int size) {
5857
i2CBus.selectDevice(config.device());
5958
return i2CBus.execute(this, (i2cFileDescriptor) -> {
60-
//FILE.write(i2cFileDescriptor, new byte[]{(byte) register});
61-
//return FILE.read(i2cFileDescriptor, new byte[size], size);
6259
if (size == 1) {
6360
return new byte[] {SMBUS.readByteData(i2cFileDescriptor, (byte) register)};
61+
} else if (i2CBus.hasFunctionality(I2CFunctionality.I2C_FUNC_SMBUS_READ_BLOCK_DATA)) {
62+
return SMBUS.readBlockData(i2cFileDescriptor, (byte) register, new byte[size]);
6463
} else {
65-
return new byte[0];
64+
throw new Pi4JException("No support any of I2C device read mode.");
6665
}
6766
});
6867
}
@@ -71,13 +70,15 @@ private byte[] readInternal(int register, int size) {
7170
@Override
7271
public int read() {
7372
i2CBus.selectDevice(config.device());
73+
// this is needed, because we are receiving raw bytes, which we have to convert to proper int
7474
return Byte.toUnsignedInt(i2CBus.execute(this, SMBUS::readByte));
7575
}
7676

7777
@Override
78-
public int read(byte[] buffer, int offset, int length) {
79-
//TODO: how to implement? That is not a part os standard
80-
return 0;
78+
public int read(byte[] data, int offset, int length) {
79+
var buffer = new byte[data.length - 1];
80+
System.arraycopy(data, 1, buffer, 0, length);
81+
return readRegister(data[0], buffer, offset, length);
8182
}
8283

8384
@Override
@@ -88,19 +89,30 @@ public int write(byte b) {
8889

8990
@Override
9091
public int write(byte[] data, int offset, int length) {
91-
//TODO: how to implement? That is not a part os standard
92-
return 0;
92+
var buffer = new byte[data.length - 1];
93+
System.arraycopy(data, 1, buffer, 0, length);
94+
return writeRegister(data[0], buffer, offset, length);
9395
}
9496

9597
@Override
9698
public int readRegister(int register) {
99+
i2CBus.selectDevice(config.device());
100+
// this is needed, because we are receiving raw bytes, which we have to convert to proper int
97101
return Byte.toUnsignedInt(readInternal(register, 1)[0]);
98102
}
99103

100104
@Override
101-
public int readRegister(byte[] register, byte[] buffer, int offset, int length) {
102-
//TODO: how to implement? That is not a part os standard
103-
return 0;
105+
public int readRegister(byte[] register, byte[] data, int offset, int length) {
106+
Objects.checkFromIndexSize(offset, length, data.length);
107+
// Prepare the data for multibyte register
108+
// Sequence:
109+
// - set address to first byte, all other bytes send with data.
110+
// - read the byte without address (internal chip cursor will point to the correct address)
111+
var byteRegister = register[0];
112+
var readData = new byte[data.length + register.length - 1];
113+
System.arraycopy(Arrays.copyOfRange(register, 1, register.length), 0, readData, 0, register.length - 1);
114+
System.arraycopy(data, 0, readData, register.length - 1, data.length);
115+
return readRegister(byteRegister, readData);
104116
}
105117

106118
@Override

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/pwm/FFMPWM.java renamed to plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/pwm/PwmFFM.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
import org.slf4j.Logger;
1111
import org.slf4j.LoggerFactory;
1212

13-
public class FFMPWM extends PwmBase implements Pwm {
13+
public class PwmFFM extends PwmBase implements Pwm {
1414
protected Logger logger = LoggerFactory.getLogger(this.getClass());
1515

1616

17-
public FFMPWM(PwmProvider provider, PwmConfig config, int range){
17+
public PwmFFM(PwmProvider provider, PwmConfig config, int range){
1818
super(provider, config);
1919
}
2020

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/pwm/FFMPwmProviderImpl.java renamed to plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/pwm/PwmFFMProviderImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import com.pi4j.io.pwm.PwmProvider;
66
import com.pi4j.io.pwm.PwmProviderBase;
77

8-
public class FFMPwmProviderImpl extends PwmProviderBase implements PwmProvider {
8+
public class PwmFFMProviderImpl extends PwmProviderBase implements PwmProvider {
99

10-
public FFMPwmProviderImpl() {
10+
public PwmFFMProviderImpl() {
1111
this.id = "FFMPwmProviderImpl";
1212
this.name = "FFMPwmProviderImpl";
1313
}

plugins/pi4j-plugin-ffm/src/main/java/com/pi4j/plugin/ffm/providers/spi/SpiFFM.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ public class SpiFFM extends SpiBase implements Spi {
2424

2525

2626
private int spiFileDescriptor;
27-
private String path;
27+
private final String path;
2828

2929
public SpiFFM(SpiProvider provider, SpiConfig config) {
3030
super(provider, config);
31+
this.path = SPI_BUS + config.bus().getBus() + "." + config.address();
3132
}
3233

3334
@Override
3435
public Spi initialize(Context context) throws InitializeException {
3536
super.initialize(context);
3637

37-
path = SPI_BUS + config.bus().getBus() + "." + config.address();
3838
logger.info("{} - setting up SPIBus...", path);
3939
logger.debug("{} - opening device file.", path);
4040
this.spiFileDescriptor = FILE.open(path, FileFlag.O_RDWR);

0 commit comments

Comments
 (0)