90 lines
2.4 KiB
Dart
90 lines
2.4 KiB
Dart
import 'dart:typed_data';
|
||
import 'package:maibu_satabot_v2/core/data/base_model.dart';
|
||
import 'package:maibu_satabot_v2/features/remote_control/domain/entities/machine_control_entity.dart';
|
||
|
||
class MachineControlModel extends MachineControlEntity implements BaseModel<MachineControlEntity>{
|
||
MachineControlModel({
|
||
required super.leftSpeed,
|
||
required super.rightSpeed,
|
||
required super.chassisLift,
|
||
required super.mowerSpeed,
|
||
required super.ignitionStatus,
|
||
required super.isEmergency,
|
||
});
|
||
|
||
factory MachineControlModel.fromEntity(MachineControlEntity entity) {
|
||
return MachineControlModel(
|
||
leftSpeed: entity.leftSpeed,
|
||
rightSpeed: entity.rightSpeed,
|
||
chassisLift: entity.chassisLift,
|
||
mowerSpeed: entity.mowerSpeed,
|
||
ignitionStatus: entity.ignitionStatus,
|
||
isEmergency: entity.isEmergency,
|
||
);
|
||
}
|
||
|
||
/// 需要传入计算好的左右轮速度
|
||
Uint8List toRawPacket(Map<String, int> speeds) {
|
||
// 1. 调用 Codec:生成协议定义的 8 字节 Payload
|
||
final payload = encodeRemoteControlPayload(
|
||
left: speeds['left'] ?? 0,
|
||
right: speeds['right'] ?? 0,
|
||
lift: chassisLift,
|
||
mower: mowerSpeed,
|
||
ignition: ignitionStatus,
|
||
emergency: isEmergency ? 1 : 0,
|
||
);
|
||
|
||
// 2. 调用 Builder:封装帧头、指令、CRC、帧尾
|
||
return payload;
|
||
}
|
||
|
||
@override
|
||
MachineControlEntity toEntity() {
|
||
return MachineControlEntity(
|
||
leftSpeed: leftSpeed,
|
||
rightSpeed: rightSpeed,
|
||
chassisLift: chassisLift,
|
||
mowerSpeed: mowerSpeed,
|
||
ignitionStatus: ignitionStatus,
|
||
isEmergency: isEmergency,
|
||
);
|
||
}
|
||
|
||
@override
|
||
Map<String, dynamic> toJson() {
|
||
return {
|
||
'leftSpeed': leftSpeed,
|
||
'rightSpeed': rightSpeed,
|
||
'chassisLift': chassisLift,
|
||
'mowerSpeed': mowerSpeed,
|
||
'ignitionStatus': ignitionStatus,
|
||
'isEmergency': isEmergency,
|
||
};
|
||
}
|
||
|
||
Uint8List encodeRemoteControlPayload({
|
||
required int left,
|
||
required int right,
|
||
int lift = 0,
|
||
int mower = 0,
|
||
int ignition = 0,
|
||
int emergency = 0,
|
||
}) {
|
||
final bd = ByteData(8); // 只分配 8 字节
|
||
int pos = 0;
|
||
|
||
bd.setInt16(pos, left, Endian.little);
|
||
pos += 2;
|
||
bd.setInt16(pos, right, Endian.little);
|
||
pos += 2;
|
||
bd.setUint8(pos++, lift);
|
||
bd.setUint8(pos++, mower);
|
||
bd.setUint8(pos++, ignition);
|
||
bd.setUint8(pos++, emergency);
|
||
|
||
return bd.buffer.asUint8List();
|
||
}
|
||
|
||
}
|