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 SerialPortReadObserver serialPortReadObserver; private boolean isOk = false; private final Object writeLock = new Object(); public SerialPortModel(String serialPortPath, int baudrate, int dataBits, int stopBits, int parity,SerialPortReadObserver portReadObserver) { this.serialPortPath = serialPortPath; this.baudrate = baudrate; this.dataBits = dataBits; this.stopBits = stopBits; this.parity = parity; this.serialPortReadObserver = portReadObserver; } 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() { 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 { synchronized (writeLock) { try { serialPort.getOutputStream().write(bytes); if(serialPortReadObserver!=null) { serialPortReadObserver.onResult(null); } } catch (IOException e) { e.printStackTrace(); if(serialPortReadObserver!=null) { serialPortReadObserver.onResult(e.getMessage()); } } } }); } public boolean isOk() { return isOk; } public void setOk(boolean ok) { isOk = ok; } }