package com.doumee.keyCabinet.utils.i485;
|
|
import android.serialport.SerialPort;
|
import android.util.Log;
|
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledFuture;
|
import java.util.concurrent.TimeUnit;
|
|
public class SerialPortModel {
|
|
public static final String TAG = SerialPortModel.class.getSimpleName();
|
|
private void logI(String str) {
|
Log.i(TAG, str);
|
}
|
|
private String serialPortPath;
|
private int baudrate;
|
private int dataBits;
|
private int stopBits;
|
private int parity;
|
private SerialPort serialPort;
|
private ScheduledExecutorService scheduledExecutorService;
|
private ExecutorService singleThreadExecutor;
|
private ScheduledFuture scheduledFuture;
|
private boolean isOk = false;
|
|
private final Object writeLock = new Object();
|
|
public SerialPortModel(String serialPortPath, int baudrate, int dataBits, int stopBits, int parity) {
|
this.serialPortPath = serialPortPath;
|
this.baudrate = baudrate;
|
this.dataBits = dataBits;
|
this.stopBits = stopBits;
|
this.parity = parity;
|
}
|
|
public boolean open() {
|
try {
|
File device = new File(serialPortPath);
|
serialPort = SerialPort
|
.newBuilder(device, baudrate)
|
.dataBits(dataBits)
|
.stopBits(stopBits)
|
.parity(parity)
|
.build();
|
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
|
singleThreadExecutor = Executors.newSingleThreadExecutor();
|
} catch (IOException e) {
|
e.printStackTrace();
|
return false;
|
}
|
return true;
|
}
|
|
public void close() {
|
try {
|
serialPort.getInputStream().close();
|
serialPort.getOutputStream().close();
|
serialPort.close();
|
serialPort = null;
|
scheduledExecutorService.shutdown();
|
singleThreadExecutor.shutdown();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
|
public void startRead(SerialPortReadObserver serialPortReadObserver) {
|
scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
|
InputStream inputStream = serialPort.getInputStream();
|
byte[] bytes = new byte[2048];
|
int length = 0;
|
try {
|
length = inputStream.read(bytes);
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
// logI("startRead - length: " + length);
|
if (length <= 0) return;
|
//String result = new String(bytes, 0, length);
|
byte[] bytes2 = new byte[length];
|
for(int i=0;i<length;i++){
|
bytes2[i] = bytes[i];
|
}
|
serialPortReadObserver.onResultBytes(bytes2);
|
}, 0, 50, TimeUnit.MILLISECONDS);
|
}
|
|
public void stopRead() {
|
scheduledFuture.cancel(true);
|
}
|
|
public void write(byte[] bytes,SerialPortReadObserver serialPortReadObserver) {
|
singleThreadExecutor.execute(() -> {
|
synchronized (writeLock) {
|
try {
|
serialPort.getOutputStream().write(bytes);
|
serialPortReadObserver.onResult(null);
|
} catch (IOException e) {
|
e.printStackTrace();
|
serialPortReadObserver.onResult(e.getMessage());
|
}
|
}
|
});
|
}
|
|
public boolean isOk() {
|
return isOk;
|
}
|
|
public void setOk(boolean ok) {
|
isOk = ok;
|
}
|
}
|