129 lines
4.4 KiB
Dart
129 lines
4.4 KiB
Dart
import 'package:equatable/equatable.dart';
|
||
import '../../domain/entities/machine_control_entity.dart';
|
||
import '../../domain/entities/running_status_entity.dart';
|
||
|
||
enum RemoteControlStatus { initial, controlling, error }
|
||
|
||
class RemoteControlState extends Equatable {
|
||
// --- 核心业务状态 ---
|
||
final RemoteControlStatus status;
|
||
final MachineControlEntity controlEntity; // 发送给机器的控制业务实体
|
||
final RunningStatusEntity runningStatusEntity; // 机器回传的状态业务实体
|
||
|
||
// --- 权限与平台逻辑 ---
|
||
final bool hasPermission; // 0x12 权限状态
|
||
final String permissionPlatform; // 权限来源平台 (如 "Web", "App")
|
||
final String currentPlatform; // 当前操作平台
|
||
final bool showPermissionRequestDialog; // 是否显示权限请求弹窗
|
||
|
||
// --- 安全与锁定 ---
|
||
final bool isEmergency; // 紧急停止状态
|
||
final bool isLocked; // 控制锁定状态
|
||
final String obstacleFlag; // 障碍物标志位文字(这是机器传过来的) (对应 Entity 里的 0/1)
|
||
|
||
// --- 网络与连接 ---
|
||
final int ping; // 延迟/心跳
|
||
final String? errorMessage; // 错误提示
|
||
|
||
// --- UI 视图配置 ---
|
||
final bool showLeftPip; // 左侧画中画显示
|
||
final bool showRightPip; // 右侧画中画显示
|
||
final bool topRightIsExpanded; // 顶部右侧按钮展开状态
|
||
final bool obstacleRecognitionFlag; // 障碍物识别标志位(这是UI显示的)
|
||
|
||
final String mainStreamUrl;
|
||
final String aiStreamUrl;
|
||
final bool isVideoEnabled;
|
||
|
||
const RemoteControlState({
|
||
this.status = RemoteControlStatus.initial,
|
||
required this.controlEntity,
|
||
required this.runningStatusEntity,
|
||
this.hasPermission = false,
|
||
this.permissionPlatform = '',
|
||
this.currentPlatform = '',
|
||
this.showPermissionRequestDialog = false,
|
||
this.isEmergency = false,
|
||
this.isLocked = false,
|
||
this.obstacleFlag = '无',
|
||
this.ping = 0,
|
||
this.errorMessage,
|
||
this.showLeftPip = true,
|
||
this.showRightPip = true,
|
||
this.topRightIsExpanded = false,
|
||
this.obstacleRecognitionFlag = false,
|
||
this.mainStreamUrl = '',
|
||
this.aiStreamUrl = '',
|
||
this.isVideoEnabled = true
|
||
});
|
||
|
||
// 辅助属性:判断当前是否具备物理驾驶条件
|
||
bool get canDrive => hasPermission && !isLocked;
|
||
|
||
RemoteControlState copyWith({
|
||
RemoteControlStatus? status,
|
||
MachineControlEntity? controlEntity,
|
||
RunningStatusEntity? runningStatusEntity,
|
||
bool? hasPermission,
|
||
String? permissionPlatform,
|
||
String? currentPlatform,
|
||
bool? showPermissionRequestDialog,
|
||
bool? isEmergency,
|
||
bool? isLocked,
|
||
String? obstacleFlag,
|
||
int? ping,
|
||
String? errorMessage,
|
||
bool? showLeftPip,
|
||
bool? showRightPip,
|
||
bool? topRightIsExpanded,
|
||
bool? obstacleRecognitionFlag,
|
||
bool? isVideoEnabled,
|
||
String? mainStreamUrl,
|
||
String? aiStreamUrl
|
||
}) {
|
||
return RemoteControlState(
|
||
status: status ?? this.status,
|
||
controlEntity: controlEntity ?? this.controlEntity,
|
||
runningStatusEntity: runningStatusEntity ?? this.runningStatusEntity,
|
||
hasPermission: hasPermission ?? this.hasPermission,
|
||
permissionPlatform: permissionPlatform ?? this.permissionPlatform,
|
||
currentPlatform: currentPlatform ?? this.currentPlatform,
|
||
showPermissionRequestDialog: showPermissionRequestDialog ?? this.showPermissionRequestDialog,
|
||
isEmergency: isEmergency ?? this.isEmergency,
|
||
isLocked: isLocked ?? this.isLocked,
|
||
obstacleFlag: obstacleFlag ?? this.obstacleFlag,
|
||
ping: ping ?? this.ping,
|
||
errorMessage: errorMessage ?? this.errorMessage,
|
||
showLeftPip: showLeftPip ?? this.showLeftPip,
|
||
showRightPip: showRightPip ?? this.showRightPip,
|
||
topRightIsExpanded: topRightIsExpanded ?? this.topRightIsExpanded,
|
||
obstacleRecognitionFlag: obstacleRecognitionFlag ?? this.obstacleRecognitionFlag,
|
||
isVideoEnabled: isVideoEnabled ?? this.isVideoEnabled,
|
||
mainStreamUrl: mainStreamUrl ?? this.mainStreamUrl,
|
||
aiStreamUrl: aiStreamUrl ?? this.aiStreamUrl
|
||
);
|
||
}
|
||
|
||
@override
|
||
List<Object?> get props => [
|
||
status,
|
||
controlEntity,
|
||
runningStatusEntity,
|
||
hasPermission,
|
||
permissionPlatform,
|
||
currentPlatform,
|
||
showPermissionRequestDialog,
|
||
isEmergency,
|
||
isLocked,
|
||
obstacleFlag,
|
||
ping,
|
||
errorMessage,
|
||
showLeftPip,
|
||
showRightPip,
|
||
topRightIsExpanded,
|
||
obstacleRecognitionFlag,
|
||
isVideoEnabled,
|
||
mainStreamUrl,
|
||
aiStreamUrl
|
||
];
|
||
} |