diff --git a/app_dashboard/build.gradle b/app_dashboard/build.gradle
index 6e88fed..467e426 100644
--- a/app_dashboard/build.gradle
+++ b/app_dashboard/build.gradle
@@ -96,6 +96,8 @@ repositories {
}
dependencies {
+ implementation libs.serialport
+ implementation libs.acra.http
implementation libs.appcompat
implementation libs.material
implementation libs.activity
@@ -111,6 +113,4 @@ dependencies {
implementation libs.banner
implementation libs.glide
annotationProcessor libs.glidecompiler
-
- implementation 'io.github.xmaihh:serialport:2.1.1'
}
\ No newline at end of file
diff --git a/app_dashboard/changelog.md b/app_dashboard/changelog.md
index b818168..880da99 100644
--- a/app_dashboard/changelog.md
+++ b/app_dashboard/changelog.md
@@ -9,7 +9,17 @@ author:
2. $ {VERSION_CODE} (去掉空格),会自动替换实际修订号,比如 1.1.4.$ {VERSION_CODE}
-->
-### [1.0.3.${VERSION_CODE}] - 2025.11.1
+### [1.0.4.${VERSION_CODE}] - 2026.1.5
+
+#### 文件下载
+
+* [dashboardclient_1.0.4.apk](dashboardclient_1.0.4.apk)
+
+#### 更新记录
+* 自动检测串口,检测时保证发送一次开机指令
+* 增加 acra
+
+### [1.0.3.22] - 2025.11.1
#### 文件下载
diff --git a/app_dashboard/src/main/AndroidManifest.xml b/app_dashboard/src/main/AndroidManifest.xml
index 755b7d0..c90cdea 100644
--- a/app_dashboard/src/main/AndroidManifest.xml
+++ b/app_dashboard/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
settingsLauncher;
+ private SerialPortDetector detector;
+ private ProgressDialog progressDialog;
+
private final View.OnTouchListener mDelayHideTouchListener = (view, motionEvent) -> {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
@@ -86,6 +92,7 @@ public class BuildingDashboardActivity extends FullscreenActivity {
super.setViews(binding.webview, binding.fullscreenContentControls);
super.onCreate(savedInstanceState);
+ initSerialPort();
initSettingsLauncher();
initListener();
initWebView();
@@ -107,6 +114,95 @@ public class BuildingDashboardActivity extends FullscreenActivity {
loadUrlWithRetry();
}
+ private void initSerialPort() {
+ String portPath = PreferenceConfiguration.getSerialPortPath(this);
+ int baudRate = PreferenceConfiguration.getSerialPortBaudRate(this);
+
+ // 初始化串口检测器
+ detector = new SerialPortDetector(portPath, baudRate);
+
+ // 每次启动都进行串口检测/验证
+ // 参数 true 表示确保设备开机(发送两个命令)
+ // 参数 false 表示仅检测串口(任一命令有响应即可)
+ Log.i(TAG, "Starting serial port detection/verification...");
+ startSerialPortDetection(true);
+ }
+
+ /**
+ * 启动串口检测
+ * @param ensurePowerOn 是否确保设备开机
+ */
+ private void startSerialPortDetection(boolean ensurePowerOn) {
+ // 显示进度对话框
+ progressDialog = new ProgressDialog(this);
+ progressDialog.setTitle("串口检测");
+ progressDialog.setMessage("正在检测串口...");
+ progressDialog.setCancelable(false);
+ progressDialog.show();
+
+ // 设置检测回调
+ detector.setCallback(new SerialPortDetector.DetectionCallback() {
+ @Override
+ public void onDetectionStart() {
+ Log.d(TAG, "Detection started");
+ runOnUiThread(() -> {
+ if (progressDialog != null) {
+ progressDialog.setMessage("开始检测串口...");
+ }
+ });
+ }
+
+ @Override
+ public void onDetectionProgress(String portPath, int current, int total) {
+ Log.d(TAG, "Testing port " + current + "/" + total + ": " + portPath);
+ runOnUiThread(() -> {
+ if (progressDialog != null) {
+ progressDialog.setMessage("正在测试串口 " + current + "/" + total + "\n" + portPath);
+ }
+ });
+ }
+
+ @Override
+ public void onDetectionSuccess(String portPath) {
+ Log.i(TAG, "Detection success: " + portPath);
+ runOnUiThread(() -> {
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ Toast.makeText(BuildingDashboardActivity.this,
+ "串口检测成功!\n路径: " + portPath,
+ Toast.LENGTH_LONG).show();
+
+ PreferenceConfiguration.setSerialPortPath(BuildingDashboardActivity.this, portPath);
+ });
+ }
+
+ @Override
+ public void onDetectionFailed() {
+ Log.e(TAG, "Detection failed");
+ runOnUiThread(() -> {
+ if (progressDialog != null) {
+ progressDialog.dismiss();
+ }
+ // 可以显示错误界面或重试选项
+ showDetectionFailedDialog();
+ });
+ }
+ });
+
+ // 开始检测
+ detector.startDetection(ensurePowerOn);
+ }
+
+ /**
+ * 显示检测失败的对话框
+ */
+ private void showDetectionFailedDialog() {
+ Toast.makeText(BuildingDashboardActivity.this,
+ "未找到有效的串口设备,请检查设备连接后重试。",
+ Toast.LENGTH_LONG).show();
+ }
+
private void loadUrlWithRetry() {
Log.i("WebView", "Loading " + mainUrl);
binding.webview.loadUrl(mainUrl);
@@ -284,8 +380,6 @@ public class BuildingDashboardActivity extends FullscreenActivity {
try {
JSONObject serialConfig = new JSONObject(serialConfigJson);
- String portPath = serialConfig.optString("DevicePath", "/dev/ttyS2");
- int baudRate = serialConfig.optInt("Baud", 9600);
if (serialConfig.has("Commands")) {
JSONArray commands = serialConfig.getJSONArray("Commands");
@@ -301,8 +395,6 @@ public class BuildingDashboardActivity extends FullscreenActivity {
Intent intent = new Intent(this, CommandBroadcastReceiver.class);
intent.setAction(CommandBroadcastReceiver.ACTION_SEND_COMMAND);
intent.putExtra(CommandBroadcastReceiver.EXTRA_COMMAND_HEX, hex);
- intent.putExtra(CommandBroadcastReceiver.EXTRA_PORT_PATH, portPath);
- intent.putExtra(CommandBroadcastReceiver.EXTRA_BAUD_RATE, baudRate);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, i, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
@@ -318,17 +410,14 @@ public class BuildingDashboardActivity extends FullscreenActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
- Log.d(TAG, "setExactAndAllowWhileIdle, Set repeating alarm for " + time + " with command " + hex + " on port " + portPath + " at " + baudRate + " baud");
+ Log.d(TAG, "setExactAndAllowWhileIdle, Set repeating alarm for " + time + " with command " + hex);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
- Log.d(TAG, "setExact, Set repeating alarm for " + time + " with command " + hex + " on port " + portPath + " at " + baudRate + " baud");
+ Log.d(TAG, "setExact, Set repeating alarm for " + time + " with command " + hex);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
- Log.d(TAG, "Set repeating alarm for " + time + " with command " + hex + " on port " + portPath + " at " + baudRate + " baud");
+ Log.d(TAG, "Set repeating alarm for " + time + " with command " + hex);
}
-
-// alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
-
}
}
diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/activity/StartActivity.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/activity/StartActivity.java
index 8390669..725490a 100644
--- a/app_dashboard/src/main/java/cn/ykbox/dashboard/activity/StartActivity.java
+++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/activity/StartActivity.java
@@ -21,9 +21,6 @@ public class StartActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- // 开机后手动发送一次开启电源指令
- SerialControlDevices.sendCommand("/dev/ttyS2", 9600, "ACEAB400ED");
-
mContext = this;
EdgeToEdge.enable(this);
setContentView(R.layout.activity_start);
diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/perferences/PreferenceConfiguration.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/perferences/PreferenceConfiguration.java
new file mode 100644
index 0000000..af93598
--- /dev/null
+++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/perferences/PreferenceConfiguration.java
@@ -0,0 +1,32 @@
+package cn.ykbox.dashboard.perferences;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+/**
+ * 配置管理
+ * TODO 代码中零散的读取配置选项代码都集中到这里
+ */
+public class PreferenceConfiguration {
+ private final static String TAG = "PreferenceConfiguration";
+
+ private static final String KEY_SERIAL_PORT_PATH = "k_serial_port_path";
+ private static final String KEY_SERIAL_PORT_BAUD_RATE = "k_serial_baud";
+
+ public static String getSerialPortPath(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ return prefs.getString(KEY_SERIAL_PORT_PATH, "");
+ }
+
+ public static void setSerialPortPath(Context context, String portPath) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ prefs.edit().putString(KEY_SERIAL_PORT_PATH, portPath).apply();
+ }
+
+ public static int getSerialPortBaudRate(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String baud = prefs.getString(KEY_SERIAL_PORT_BAUD_RATE, "9600");
+ return Integer.parseInt(baud);
+ }
+}
diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java
index 50b4650..d985648 100644
--- a/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java
+++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/receiver/CommandBroadcastReceiver.java
@@ -3,25 +3,29 @@ package cn.ykbox.dashboard.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
import android.util.Log;
+import androidx.preference.PreferenceManager;
+
+import cn.ykbox.dashboard.perferences.PreferenceConfiguration;
import cn.ykbox.dashboard.serial.SerialControlDevices;
public class CommandBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "CommandReceiver";
public static final String ACTION_SEND_COMMAND = "cn.ykbox.dashboard.ACTION_SEND_COMMAND";
public static final String EXTRA_COMMAND_HEX = "EXTRA_COMMAND_HEX";
- public static final String EXTRA_PORT_PATH = "EXTRA_PORT_PATH";
- public static final String EXTRA_BAUD_RATE = "EXTRA_BAUD_RATE"; // 新增:波特率的 Extra Key
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && ACTION_SEND_COMMAND.equals(intent.getAction())) {
String hexCommand = intent.getStringExtra(EXTRA_COMMAND_HEX);
- String portPath = intent.getStringExtra(EXTRA_PORT_PATH);
- int baudRate = intent.getIntExtra(EXTRA_BAUD_RATE, 9600);
- if (hexCommand != null && !hexCommand.isEmpty() && portPath != null && !portPath.isEmpty()) {
+ String portPath = PreferenceConfiguration.getSerialPortPath(context);
+ int baudRate = PreferenceConfiguration.getSerialPortBaudRate(context);
+
+ if (hexCommand != null && !hexCommand.isEmpty() && !TextUtils.isEmpty(portPath)) {
Log.d(TAG, "Received alarm to send command '" + hexCommand + "' to port '" + portPath + "' at " + baudRate + " baud");
// 使用新的静态方法发送指令
boolean success = SerialControlDevices.sendCommand(portPath, baudRate, hexCommand);
diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java
new file mode 100644
index 0000000..a5c1c6f
--- /dev/null
+++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/serial/SerialPortDetector.java
@@ -0,0 +1,304 @@
+package cn.ykbox.dashboard.serial;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import android_serialport_api.SerialPortFinder;
+import tp.xmaihh.serialport.SerialHelper;
+import tp.xmaihh.serialport.bean.ComBean;
+
+public class SerialPortDetector {
+ private static final String TAG = "SerialPortDetector";
+ // 测试命令
+ private static final String TEST_CMD_OFF = "ACEAB500ED"; // 关闭设备
+ private static final String TEST_CMD_ON = "ACEAB400ED"; // 打开设备
+
+ // 响应超时时间(毫秒)
+ private static final long RESPONSE_TIMEOUT = 6000;
+
+ private DetectionCallback callback;
+ private Handler mainHandler;
+
+ private String savedPath;
+ private int baudRate;
+
+ public interface DetectionCallback {
+ void onDetectionStart();
+ void onDetectionProgress(String portPath, int current, int total);
+ void onDetectionSuccess(String portPath);
+ void onDetectionFailed();
+ }
+
+ public SerialPortDetector(String savedPath, int baudRate) {
+ this.savedPath = savedPath;
+ this.baudRate = baudRate;
+ this.mainHandler = new Handler(Looper.getMainLooper());
+ }
+
+ public void setCallback(DetectionCallback callback) {
+ this.callback = callback;
+ }
+
+ /**
+ * 开始串口检测(智能检测)
+ * 先验证已保存的串口,如果不可用再进行全局检测
+ */
+ public void startDetection() {
+ startDetection(false);
+ }
+
+ /**
+ * 开始串口检测(智能检测)
+ * @param ensurePowerOn 是否确保设备开机(发送两个命令)
+ */
+ public void startDetection(boolean ensurePowerOn) {
+ new Thread(() -> {
+ notifyDetectionStart();
+
+ if (!TextUtils.isEmpty(savedPath)) {
+ Log.d(TAG, "Found saved serial port path: " + savedPath);
+ Log.d(TAG, "Verifying saved port: " + savedPath);
+
+ // 验证已保存的串口是否可用
+ if (testSerialPort(savedPath, baudRate, ensurePowerOn)) {
+ Log.i(TAG, "Saved serial port is valid: " + savedPath);
+ notifyDetectionSuccess(savedPath);
+ return;
+ } else {
+ Log.w(TAG, "Saved serial port is invalid, starting full detection");
+ }
+ } else {
+ Log.d(TAG, "No saved serial port path, starting full detection");
+ }
+
+ // 已保存的串口不可用或不存在,进行全局检测
+ performFullDetection(ensurePowerOn);
+ }).start();
+ }
+
+ private void performFullDetection(boolean ensurePowerOn) {
+ SerialPortFinder finder = new SerialPortFinder();
+ String[] devicePaths = finder.getAllDevicesPath();
+
+ if (devicePaths == null || devicePaths.length == 0) {
+ Log.e(TAG, "No serial ports found");
+ notifyDetectionFailed();
+ return;
+ }
+
+ Log.d(TAG, "Found " + devicePaths.length + " serial ports");
+
+ // 遍历所有串口
+ for (int i = 0; i < devicePaths.length; i++) {
+ String portPath = devicePaths[i];
+ notifyDetectionProgress(portPath, i + 1, devicePaths.length);
+
+ Log.d(TAG, "Testing port: " + portPath + " at " + baudRate + " baud");
+
+ if (testSerialPort(portPath, baudRate, ensurePowerOn)) {
+ Log.i(TAG, "Serial port detected successfully: " + portPath);
+ notifyDetectionSuccess(portPath);
+ return;
+ }
+ }
+
+ Log.e(TAG, "No valid serial port found");
+ notifyDetectionFailed();
+ }
+
+ /**
+ * 测试指定的串口
+ * @param portPath 串口路径
+ * @param baudRate 波特率
+ * @param ensurePowerOn 是否确保设备开机(发送两个命令)
+ */
+ private boolean testSerialPort(String portPath, int baudRate, boolean ensurePowerOn) {
+ TestSerialHelper serialHelper = null;
+
+ try {
+ serialHelper = new TestSerialHelper(portPath, baudRate);
+ serialHelper.open();
+
+ if (ensurePowerOn) {
+ // 需要确保设备开机,两个命令都要发送
+ Log.d(TAG, "Ensuring device power on by sending both commands");
+
+ boolean cmd1Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF);
+ boolean cmd2Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON);
+
+ // 只要有一个命令收到有效响应就认为串口可用
+ if (cmd1Success || cmd2Success) {
+ Log.d(TAG, "Device responded (CMD1: " + cmd1Success + ", CMD2: " + cmd2Success + ")");
+ return true;
+ }
+
+ return false;
+ } else {
+ // 只需要检测串口,任意一个命令有响应即可
+ if (sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF)) {
+ return true;
+ }
+ if (sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON)) {
+ return true;
+ }
+ return false;
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Error testing port " + portPath + ": " + e.getMessage());
+ return false;
+ } finally {
+ if (serialHelper != null) {
+ try {
+ serialHelper.close();
+ } catch (Exception e) {
+ Log.e(TAG, "Error closing port: " + e.getMessage());
+ }
+ }
+ }
+ }
+
+ /**
+ * 发送命令并等待响应
+ */
+ private boolean sendCommandAndWaitResponse(TestSerialHelper serialHelper, String command) {
+ try {
+ CountDownLatch latch = new CountDownLatch(1);
+ AtomicBoolean responseReceived = new AtomicBoolean(false);
+
+ serialHelper.setResponseListener((isValid) -> {
+ if (isValid) {
+ responseReceived.set(true);
+ }
+ latch.countDown();
+ });
+
+ // 清空之前的响应标志
+ serialHelper.resetResponse();
+
+ // 发送命令
+ serialHelper.sendHex(command);
+ Log.d(TAG, "Sent command: " + command);
+
+ // 等待响应
+ boolean timeout = !latch.await(RESPONSE_TIMEOUT, TimeUnit.MILLISECONDS);
+
+ if (timeout) {
+ Log.d(TAG, "Response timeout for command: " + command);
+ return false;
+ }
+
+ return responseReceived.get();
+
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Wait interrupted: " + e.getMessage());
+ return false;
+ }
+ }
+
+ // 回调通知方法
+ private void notifyDetectionStart() {
+ if (callback != null) {
+ mainHandler.post(() -> callback.onDetectionStart());
+ }
+ }
+
+ private void notifyDetectionProgress(String portPath, int current, int total) {
+ if (callback != null) {
+ mainHandler.post(() -> callback.onDetectionProgress(portPath, current, total));
+ }
+ }
+
+ private void notifyDetectionSuccess(String portPath) {
+ if (callback != null) {
+ mainHandler.post(() -> callback.onDetectionSuccess(portPath));
+ }
+ }
+
+ private void notifyDetectionFailed() {
+ if (callback != null) {
+ mainHandler.post(() -> callback.onDetectionFailed());
+ }
+ }
+
+ /**
+ * 内部测试用的 SerialHelper
+ */
+ private static class TestSerialHelper extends SerialHelper {
+ private ResponseListener responseListener;
+
+ public interface ResponseListener {
+ void onResponse(boolean isValid);
+ }
+
+ public TestSerialHelper(String sPort, int iBaudRate) {
+ super(sPort, iBaudRate);
+ }
+
+ public void setResponseListener(ResponseListener listener) {
+ this.responseListener = listener;
+ }
+
+ public void resetResponse() {
+ // 重置响应状态,为下一次测试做准备
+ }
+
+ @Override
+ protected void onDataReceived(ComBean comBean) {
+ byte[] data = comBean.bRec;
+
+ // 检查是否为有效响应格式: DA XX XX XX XX ED
+ if (isValidResponse(data)) {
+ Log.d(TAG, "Valid response received: " + bytesToHex(data));
+ if (responseListener != null) {
+ responseListener.onResponse(true);
+ }
+ } else {
+ Log.d(TAG, "Invalid response: " + bytesToHex(data));
+ if (responseListener != null) {
+ responseListener.onResponse(false);
+ }
+ }
+ }
+
+ /**
+ * 检查响应是否符合格式: DA XX XX XX XX ED
+ */
+ private boolean isValidResponse(byte[] data) {
+ if (data == null || data.length < 6) {
+ return false;
+ }
+
+ // 检查起始字节是否为 0xDA
+ if ((data[0] & 0xFF) != 0xDA) {
+ return false;
+ }
+
+ // 检查结束字节是否为 0xED
+ if ((data[data.length - 1] & 0xFF) != 0xED) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * 字节数组转十六进制字符串(用于日志)
+ */
+ private String bytesToHex(byte[] bytes) {
+ if (bytes == null) {
+ return "null";
+ }
+ StringBuilder sb = new StringBuilder();
+ for (byte b : bytes) {
+ sb.append(String.format("%02X ", b & 0xFF));
+ }
+ return sb.toString().trim();
+ }
+ }
+}
diff --git a/app_dashboard/src/main/res/xml/root_preferences.xml b/app_dashboard/src/main/res/xml/root_preferences.xml
index e7062bf..4898572 100644
--- a/app_dashboard/src/main/res/xml/root_preferences.xml
+++ b/app_dashboard/src/main/res/xml/root_preferences.xml
@@ -13,4 +13,17 @@
app:entryValues="@array/url_end_point_values"
app:defaultValue="@string/url_end_point_default_value" />
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index e5d3b8b..fd0a74d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,10 +15,11 @@ buildscript {
allprojects {
repositories {
maven { url 'https://jitpack.io' }
+ maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/jcenter' } // 代替 jc
+ maven { url 'https://repo1.maven.org/maven2/' }
google()
mavenCentral()
- maven { url 'https://repo1.maven.org/maven2/' }
}
// 提示过时的API
diff --git a/clear.bat b/clear.bat
deleted file mode 100644
index b09a1ac..0000000
--- a/clear.bat
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo off
-
-echo clear builds
-
-rd /s /q %~dp0\app_classtv\build
-rd /s /q %~dp0\app_sinclass\build
-rd /s /q %~dp0\app_sinclasspad\build
-rd /s /q %~dp0\app_sinclasspad2\build
-rd /s /q %~dp0\app_startap\build
-rd /s /q %~dp0\bjcast\build
-rd /s /q %~dp0\cccl\build
-rd /s /q %~dp0\demo_coaface\build
-rd /s /q %~dp0\demo_serial\build
-rd /s /q %~dp0\demo_serviceecd\build
-rd /s /q %~dp0\demo_twoscreen\build
-rd /s /q %~dp0\serialport\build
-rd /s /q %~dp0\serviceecd\build
-rd /s /q %~dp0\signageapi\build
-rd /s /q %~dp0\signageui\build
-rd /s /q %~dp0\signageutil\build
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 1223a30..10c52a3 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,4 +1,6 @@
[versions]
+serialport = "2.1.1"
+acraHttp = "5.13.1"
agp = "8.8.2"
exoplayer = "2.19.1"
banner = "2.2.2"
@@ -28,6 +30,8 @@ utilcodex = "1.31.1"
xlog = "1.11.1"
[libraries]
+serialport = { module = "io.github.xmaihh:serialport", version.ref = "serialport" }
+acra-http = { module = "ch.acra:acra-http", version.ref = "acraHttp" }
annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" }
banner = { module = "io.github.youth5201314:banner", version.ref = "banner" }
exoplayer = { module = "com.google.android.exoplayer:exoplayer", version.ref = "exoplayer" }
diff --git a/settings.gradle b/settings.gradle
index 89c2a1a..5bd2338 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,8 +1 @@
include ':app_dashboard'
-//include ':utils'
-//project(':utils').projectDir = new File("mod_utils/utils")
-//include ':signageapi'
-//project(':signageapi').projectDir = new File("mod_signageapi/signageapi")
-//include ':serialport'
-//project(':serialport').projectDir = new File("mod_serialport/serialport")
-//include ':dashboard'