优化配网进度实时更新
This commit is contained in:
@@ -39,13 +39,17 @@ public class EspProvisionManager {
|
||||
private static final long CONNECT_COOLDOWN = 1200L;
|
||||
private static final long QUICK_DISCONNECT_WINDOW = 3000L;
|
||||
private static final long RETRY_DELAY = 1200L;
|
||||
private static final long PROGRESS_UPDATE_INTERVAL = 500L;
|
||||
private static final int MAX_CONNECT_RETRY = 2;
|
||||
private static final int MAX_AUTO_PROGRESS = 99;
|
||||
|
||||
private ESPDevice espDevice;
|
||||
private ProvisionCallback callback;
|
||||
private boolean connecting;
|
||||
private boolean connected;
|
||||
private boolean provisioning;
|
||||
private int provisionProgress;
|
||||
private int provisionTargetProgress;
|
||||
private boolean eventBusRegistered;
|
||||
private boolean ignoreNextDisconnectEvent;
|
||||
private boolean expectDisconnected; // 标记是否预期断开(配网成功后)
|
||||
@@ -95,6 +99,21 @@ public class EspProvisionManager {
|
||||
}
|
||||
};
|
||||
|
||||
private final Runnable provisionProgressTask = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!provisioning) {
|
||||
return;
|
||||
}
|
||||
if (provisionProgress < provisionTargetProgress) {
|
||||
notifyProvisioning(provisionProgress + 1);
|
||||
}
|
||||
if (provisionProgress < MAX_AUTO_PROGRESS) {
|
||||
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private EspProvisionManager(Context context) {
|
||||
this.context = context.getApplicationContext();
|
||||
this.mainHandler = new Handler(Looper.getMainLooper());
|
||||
@@ -137,6 +156,10 @@ public class EspProvisionManager {
|
||||
return provisioning;
|
||||
}
|
||||
|
||||
public int getProvisionProgress() {
|
||||
return provisionProgress;
|
||||
}
|
||||
|
||||
public void connect(String deviceAddress, String deviceName) {
|
||||
connect(deviceAddress, deviceName, AppConfig.BLUETOOTH_DEVICE_UUID);
|
||||
}
|
||||
@@ -277,9 +300,12 @@ public class EspProvisionManager {
|
||||
}
|
||||
|
||||
provisioning = true;
|
||||
provisionProgress = 0;
|
||||
provisionTargetProgress = 29;
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
mainHandler.postDelayed(provisionTimeoutTask, ProvisionConfig.PROVISION_TIMEOUT);
|
||||
notifyProvisioning(0);
|
||||
startProvisionProgressTask();
|
||||
|
||||
espDevice.provision(ssid, password == null ? "" : password, new ProvisionListener() {
|
||||
@Override
|
||||
@@ -289,7 +315,7 @@ public class EspProvisionManager {
|
||||
|
||||
@Override
|
||||
public void wifiConfigSent() {
|
||||
notifyProvisioning(30);
|
||||
advanceProvisionProgress(30, 59);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -300,7 +326,7 @@ public class EspProvisionManager {
|
||||
|
||||
@Override
|
||||
public void wifiConfigApplied() {
|
||||
notifyProvisioning(60);
|
||||
advanceProvisionProgress(60, MAX_AUTO_PROGRESS);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -456,9 +482,12 @@ public class EspProvisionManager {
|
||||
private void resetState(boolean clearDevice) {
|
||||
mainHandler.removeCallbacks(connectionTimeoutTask);
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
stopProvisionProgressTask();
|
||||
connecting = false;
|
||||
connected = false;
|
||||
provisioning = false;
|
||||
provisionProgress = 0;
|
||||
provisionTargetProgress = 0;
|
||||
ignoreNextDisconnectEvent = false;
|
||||
expectDisconnected = false;
|
||||
if (clearDevice) {
|
||||
@@ -478,6 +507,7 @@ public class EspProvisionManager {
|
||||
|
||||
private void finishProvisionSuccess() {
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
stopProvisionProgressTask();
|
||||
provisioning = false;
|
||||
expectDisconnected = true; // 标记为预期断开
|
||||
notifyProvisioning(100);
|
||||
@@ -486,10 +516,27 @@ public class EspProvisionManager {
|
||||
|
||||
private void finishProvisionFailed(int errorCode, String message) {
|
||||
mainHandler.removeCallbacks(provisionTimeoutTask);
|
||||
stopProvisionProgressTask();
|
||||
provisioning = false;
|
||||
notifyFailed(errorCode, message);
|
||||
}
|
||||
|
||||
private void advanceProvisionProgress(int minProgress, int targetProgress) {
|
||||
int nextProgress = Math.max(provisionProgress, minProgress);
|
||||
provisionTargetProgress = Math.max(nextProgress, Math.min(targetProgress, MAX_AUTO_PROGRESS));
|
||||
notifyProvisioning(nextProgress);
|
||||
startProvisionProgressTask();
|
||||
}
|
||||
|
||||
private void startProvisionProgressTask() {
|
||||
mainHandler.removeCallbacks(provisionProgressTask);
|
||||
mainHandler.postDelayed(provisionProgressTask, PROGRESS_UPDATE_INTERVAL);
|
||||
}
|
||||
|
||||
private void stopProvisionProgressTask() {
|
||||
mainHandler.removeCallbacks(provisionProgressTask);
|
||||
}
|
||||
|
||||
private String getProvisionFailureMessage(ESPConstants.ProvisionFailureReason failureReason) {
|
||||
if (failureReason == ESPConstants.ProvisionFailureReason.AUTH_FAILED) {
|
||||
return "WiFi 密码错误";
|
||||
@@ -540,11 +587,13 @@ public class EspProvisionManager {
|
||||
}
|
||||
|
||||
private void notifyProvisioning(final int progress) {
|
||||
provisionProgress = Math.max(0, Math.min(progress, 100));
|
||||
runOnMainThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
provisionProgress = Math.max(0, Math.min(progress, 100));
|
||||
if (callback != null) {
|
||||
callback.onProvisioning(progress);
|
||||
callback.onProvisioning(provisionProgress);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user