thread handle

This commit is contained in:
2023-03-06 15:56:46 +08:00
parent 56169543a2
commit 7c8b81f9ef
5 changed files with 83 additions and 21 deletions

1
.idea/.name generated Normal file
View File

@ -0,0 +1 @@
fengshui_compass

View File

@ -2,7 +2,6 @@ package com.motse.fengshui_compass.common;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.Looper;
import android.serialport.SerialPort; import android.serialport.SerialPort;
@ -19,7 +18,7 @@ public class SerialPortManager {
private OutputStream mOutputStream; private OutputStream mOutputStream;
private HandlerThread mWriteThread; private HandlerThread mWriteThread;
private Scheduler mSendScheduler; private Scheduler mSendScheduler;
private Handler handler; // private Handler handler;
private static class InstanceHolder { private static class InstanceHolder {
public static SerialPortManager sManager = new SerialPortManager(); public static SerialPortManager sManager = new SerialPortManager();
@ -31,12 +30,9 @@ public class SerialPortManager {
private SerialPort mSerialPort; private SerialPort mSerialPort;
private SerialPortManager() {
this.handler = null;
}
private SerialPortManager(Handler dataReceiveHandle) { private SerialPortManager() {
this.handler = dataReceiveHandle;
} }
/** /**
@ -45,8 +41,9 @@ public class SerialPortManager {
* @param device * @param device
* @return * @return
*/ */
public SerialPort open(Device device) { public SerialPort open(Device device, Handler dataHandle) {
return open(device.getPath(), device.getBaudrate()); // this.handler = dataHandle;
return open(device.getPath(), device.getBaudrate(), dataHandle);
} }
/** /**
@ -56,20 +53,19 @@ public class SerialPortManager {
* @param baudrateString * @param baudrateString
* @return * @return
*/ */
public SerialPort open(String devicePath, String baudrateString) { public SerialPort open(String devicePath, String baudrateString,Handler handler) {
if (mSerialPort != null) { if (mSerialPort != null) {
close(); close();
} }
try { try {
File device = new File(devicePath); File device = new File(devicePath);
int baurate = Integer.parseInt(baudrateString); int baurate = Integer.parseInt(baudrateString);
mSerialPort = new SerialPort(device, baurate); mSerialPort = new SerialPort(device, baurate);
if (handler != null) { // if (handler != null) {
mReadThread = new SerialReadThread(mSerialPort.getInputStream(), handler); mReadThread = new SerialReadThread(mSerialPort.getInputStream(), handler);
} else { // } else {
mReadThread = new SerialReadThread(mSerialPort.getInputStream()); // mReadThread = new SerialReadThread(mSerialPort.getInputStream());
} // }
mReadThread.start(); mReadThread.start();
mOutputStream = mSerialPort.getOutputStream(); mOutputStream = mSerialPort.getOutputStream();
@ -119,7 +115,7 @@ public class SerialPortManager {
* @param datas * @param datas
* @return * @return
*/ */
private void sendData(byte[] datas) throws Exception { public void sendData(byte[] datas) throws Exception {
mOutputStream.write(datas); mOutputStream.write(datas);
} }
} }

View File

@ -1,6 +1,9 @@
package com.motse.fengshui_compass.common; package com.motse.fengshui_compass.common;
import android.icu.util.Measure;
import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.os.SystemClock; import android.os.SystemClock;
import com.licheedev.hwutils.ByteUtil; import com.licheedev.hwutils.ByteUtil;
@ -40,7 +43,7 @@ public class SerialReadThread extends Thread {
if (available > 0) { if (available > 0) {
size = mInputStream.read(received); size = mInputStream.read(received);
if (size > 0) { if (size > 0) {
// TODO: onDataReceive(received, size); onDataReceive(received, size);
} }
} else { } else {
// 暂停一点时间免得一直循环造成CPU占用率过高 // 暂停一点时间免得一直循环造成CPU占用率过高
@ -68,6 +71,12 @@ public class SerialReadThread extends Thread {
private void onDataReceive(byte[] received, int size) { private void onDataReceive(byte[] received, int size) {
// TODO: 2018/3/22 解决粘包、分包等 // TODO: 2018/3/22 解决粘包、分包等
String hexStr = ByteUtil.bytes2HexStr(received, 0, size); String hexStr = ByteUtil.bytes2HexStr(received, 0, size);
Bundle bundle = new Bundle();
bundle.putString("hex_str", hexStr);
Message message = new Message();
message.setData(bundle);
message.what = 1;
dataHandler.sendMessage(message);
// LogManager.instance().post(new RecvMessage(hexStr)); // LogManager.instance().post(new RecvMessage(hexStr));
} }

View File

@ -9,16 +9,24 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import com.licheedev.hwutils.ByteUtil;
import com.motse.fengshui_compass.common.Device;
import com.motse.fengshui_compass.common.RotateThread; import com.motse.fengshui_compass.common.RotateThread;
import com.motse.fengshui_compass.common.SerialPortManager;
public class HomeViewModel extends ViewModel { public class HomeViewModel extends ViewModel {
private final MutableLiveData<Float> rotation; private final MutableLiveData<Float> rotation;
private MutableLiveData<Boolean> isSerialOpen;
RotateThread rotateThread; RotateThread rotateThread;
private Handler handler; private final Handler handler;
private Handler serialThreadHandle; private final Handler serialThreadHandle;
private final SerialPortManager serialPortManager;
public HomeViewModel() { public HomeViewModel() {
isSerialOpen = new MutableLiveData<>();
isSerialOpen.setValue(false);
serialPortManager = SerialPortManager.instance();
handler = new Handler(Looper.getMainLooper()) { handler = new Handler(Looper.getMainLooper()) {
@Override @Override
public void handleMessage(@NonNull Message msg) { public void handleMessage(@NonNull Message msg) {
@ -27,6 +35,14 @@ public class HomeViewModel extends ViewModel {
rotation.setValue(_rotation); rotation.setValue(_rotation);
} }
}; };
serialThreadHandle = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
String data = msg.getData().getString("hex_str");
System.out.println(data);
}
};
rotation = new MutableLiveData<>(); rotation = new MutableLiveData<>();
rotation.setValue((float) 0); rotation.setValue((float) 0);
} }
@ -36,6 +52,31 @@ public class HomeViewModel extends ViewModel {
rotateThread.start(); rotateThread.start();
} }
public void initSerialPort() {
Device device = new Device();
device.setBaudrate("115200");
device.setPath("/dev/ttyS2");
serialPortManager.open(device, serialThreadHandle);
}
public void destroySerialPort() {
serialPortManager.close();
}
public void openUpLaser() {
sendCommand("7E01010100000000000000010D0A");
}
public void sendCommand(String command) {
byte[] bytes = ByteUtil.hexStr2bytes(command);
try {
serialPortManager.sendData(bytes);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void destroyThread() { public void destroyThread() {
rotateThread.interrupt(); rotateThread.interrupt();
rotateThread = null; rotateThread = null;

View File

@ -9,13 +9,28 @@
<ImageView <ImageView
android:id="@+id/compass_image" android:id="@+id/compass_image"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:layout_marginEnd="32dp" android:layout_marginEnd="32dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/compass_rotated" android:src="@drawable/compass_rotated"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/range"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginBottom="64dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/range_input"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>