133 lines
4.2 KiB
Dart
133 lines
4.2 KiB
Dart
import 'dart:convert';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:maibu_satabot_v2/core/data/base_model.dart';
|
|
import 'package:maibu_satabot_v2/features/remote_control/domain/entities/running_status_entity.dart';
|
|
|
|
import '../../../../core/network/enums/control_mode.dart';
|
|
|
|
class RunningStatusModel extends RunningStatusEntity
|
|
implements BaseModel<RunningStatusEntity> {
|
|
RunningStatusModel({
|
|
required super.voltage,
|
|
required super.leftTargetSpeed,
|
|
required super.rightTargetSpeed,
|
|
required super.leftMeasureSpeed,
|
|
required super.rightMeasureSpeed,
|
|
required super.leftCurrent,
|
|
required super.rightCurrent,
|
|
required super.leftMotorTemp,
|
|
required super.rightMotorTemp,
|
|
required super.chipTemp,
|
|
required super.yaw,
|
|
required super.pitch,
|
|
required super.roll,
|
|
required super.satelliteCnt,
|
|
required super.qual,
|
|
required super.headingStatus,
|
|
required super.latitude,
|
|
required super.longitude,
|
|
required super.time,
|
|
required super.knifeCuttingSpeed,
|
|
required super.controlMode,
|
|
required super.workingArea,
|
|
required super.battery,
|
|
required super.obstacleFlag,
|
|
});
|
|
|
|
@override
|
|
RunningStatusEntity toEntity() => this;
|
|
|
|
@override
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'voltage': voltage,
|
|
'leftTargetSpeed': leftTargetSpeed,
|
|
'rightTargetSpeed': rightTargetSpeed,
|
|
'leftMeasureSpeed': leftMeasureSpeed,
|
|
'rightMeasureSpeed': rightMeasureSpeed,
|
|
'leftCurrent': leftCurrent,
|
|
'rightCurrent': rightCurrent,
|
|
'leftMotorTemp': leftMotorTemp,
|
|
'rightMotorTemp': rightMotorTemp,
|
|
'chipTemp': chipTemp,
|
|
'yaw': yaw,
|
|
'pitch': pitch,
|
|
'roll': roll,
|
|
'satelliteCnt': satelliteCnt,
|
|
'qual': qual,
|
|
'headingStatus': headingStatus,
|
|
'latitude': latitude,
|
|
'longitude': longitude,
|
|
'time': time,
|
|
'knifeCuttingSpeed': knifeCuttingSpeed,
|
|
'controlMode': controlMode,
|
|
'workingArea': workingArea,
|
|
'battery': battery,
|
|
'obstacleFlag': obstacleFlag,
|
|
};
|
|
}
|
|
|
|
factory RunningStatusModel.fromBytes(Uint8List payload) {
|
|
// 将 Uint8List 转换为字符串 (通常是 utf8 或 ascii)
|
|
final rawString = utf8.decode(payload);
|
|
|
|
// 按逗号分割成数组
|
|
final parts = rawString.split(',');
|
|
|
|
// 辅助函数:安全转换数字,防止硬件发空字符串导致崩溃
|
|
double parseD(int index) =>
|
|
(index < parts.length && parts[index].isNotEmpty)
|
|
? double.tryParse(parts[index]) ?? 0.0
|
|
: 0.0;
|
|
|
|
int parseI(int index) => (index < parts.length && parts[index].isNotEmpty)
|
|
? int.tryParse(parts[index]) ?? 0
|
|
: 0;
|
|
|
|
String parseS(int index) => (index < parts.length) ? parts[index] : "";
|
|
|
|
ControlMode mapMode(int val) {
|
|
switch (val) {
|
|
case 1:
|
|
return ControlMode.LOCAL;
|
|
case 2:
|
|
return ControlMode.BLE;
|
|
case 3:
|
|
return ControlMode.TCP;
|
|
case 4:
|
|
return ControlMode.OTHER;
|
|
default:
|
|
return ControlMode.NONE; // 0 或其他异常值
|
|
}
|
|
}
|
|
|
|
return RunningStatusModel(
|
|
voltage: parseD(0), // 电压
|
|
leftTargetSpeed: parseI(1), // 左轮目标速度
|
|
rightTargetSpeed: parseI(2), // 右轮目标速度
|
|
leftMeasureSpeed: parseI(3), // 左轮测量速度
|
|
rightMeasureSpeed: parseI(4), // 右轮测量速度
|
|
leftCurrent: parseD(5), // 左轮电流
|
|
rightCurrent: parseD(6), // 右轮电流
|
|
leftMotorTemp: parseD(7), // 左轮温度
|
|
rightMotorTemp: parseD(8), // 右轮温度
|
|
chipTemp: parseD(9), // 芯片温度
|
|
yaw: parseD(10), // 偏航角
|
|
pitch: parseD(11), // 仰俯角
|
|
roll: parseD(12), // 翻滚角
|
|
satelliteCnt: parseI(13), // 卫星数
|
|
qual: parseI(14), // 定位质量 (0-7)
|
|
headingStatus: parseI(15), // 航向角状态
|
|
latitude: parseD(16), // 纬度
|
|
longitude: parseD(17), // 经度
|
|
time: parseS(18), // 时间字符串
|
|
knifeCuttingSpeed: parseI(19), // 割刀速度
|
|
controlMode: mapMode(20), // 控制模式 (0-4)
|
|
battery: parseD(21), // 电池电量 (0-100)
|
|
workingArea: parseD(22), // 作业面积
|
|
obstacleFlag: parseI(23), // 障碍物标志 (0/1)
|
|
);
|
|
}
|
|
}
|