pile_nav_new/lib/pages/setting/child_pages/XyChange/connect.dart

186 lines
5.2 KiB
Dart
Raw Normal View History

2024-08-29 17:45:39 +08:00
import 'dart:typed_data';
import 'package:flutter/material.dart';
import '../connect/bluetooth_page.dart';
import '../connect/config/SocketSetting.dart';
import '../connect/config/app_config.dart';
import '../connect/config/blueParams.dart';
import '../connect/config/connect_type.dart';
import 'coor_trans.dart';
class Connect {
SocketSetting socket = SocketSetting();
BlueSetting blueSetting = BlueSetting();
Config config = Config();
init() async {
await AppConfig.load();
config = Config.fromJson(AppConfig.config);
if (config.connectType != null) {
// if (config.connectType == "wifi") {
// config.connectType = ConnectType.wifi;
// } else {
// config.connectType = ConnectType.bluetooth;
// }
blueToothController.connectedType.value =
config.connectType ?? ConnectType.none;
if (config.connectType == ConnectType.wifi) {
if (config.ip != null) {
socket.ip = config.ip ?? "192.168.4.1";
socket.port = config.port ?? 6000;
await socket.connect();
}
} else {
if (config.deviceId != "") {
blueToothController.connectedDeviceID.value = config.deviceId!;
//蓝牙
await blueSetting.connect(config.deviceId!);
}
}
}
}
disconnect(ConnectType type) {
if (type == ConnectType.wifi) {
socket.disConnect();
} else {
blueSetting.disConnect(blueToothController.connectedDeviceID.value);
}
}
// 实时读写
write(Uint8List value) {
if (blueToothController.connectedType.value == ConnectType.wifi) {
socket.write(value);
} else if (blueToothController.connectedType.value ==
ConnectType.bluetooth) {
blueSetting.write(blueToothController.connectedDeviceID.value, value);
} else {
print("暂无连接");
}
}
writeCoorTransValue(String deviceId, CoorTransModel coorTrans) {
Uint8List bytes = Uint8List(20);
ByteData data = ByteData.view(bytes.buffer);
// 0xF0 + 2字节地址 + 1字节数据长度以字节为单位+ 数据
data.setInt8(0, 0xF0);
data.setInt16(1, 608, Endian.little);
data.setInt8(3, 16);
// data.setFloat64(4, coorTrans.L0);
// 椭球基准 601 2
sendData(
bytes, 601, 2, [toCoordString(coorTrans.dstEllipsoid).index], deviceId);
// L0,elevation 608 16
Future.delayed(const Duration(milliseconds: 2000), () {
sendData(
bytes,
608,
16,
[(coorTrans.L0 * 1e8).toInt(), (coorTrans.elevation * 1000).toInt()],
deviceId);
});
// x 616 16
Future.delayed(const Duration(milliseconds: 3000), () {
sendData(
bytes,
616,
16,
[(coorTrans.dx * 1000).toInt(), (coorTrans.wx * 1000).toInt()],
deviceId);
});
// y 624 16
Future.delayed(const Duration(milliseconds: 4000), () {
sendData(
bytes,
624,
16,
[(coorTrans.dy * 1000).toInt(), (coorTrans.wy * 1000).toInt()],
deviceId);
});
// z 632 16
Future.delayed(const Duration(milliseconds: 4000), () {
sendData(
bytes,
632,
16,
[(coorTrans.dz * 1000).toInt(), (coorTrans.wz * 1000).toInt()],
deviceId);
});
// k 640 8
Future.delayed(const Duration(milliseconds: 5000), () {
ByteData data = ByteData.view(bytes.buffer);
data.setInt8(0, 0xF0);
data.setInt16(1, 640, Endian.little);
data.setInt8(3, 8);
data.setInt64(4, (coorTrans.k * 1000).toInt(), Endian.little);
write(bytes);
});
Future.delayed(const Duration(milliseconds: 7000), () {
save(deviceId, bytes, data);
});
}
void sendData(Uint8List bytes, int code, int length, List<int> values,
String deviceId) {
ByteData data = ByteData.view(bytes.buffer);
data.setInt8(0, 0xF0);
data.setInt16(1, code, Endian.little);
data.setInt8(3, length);
for (int i = 0; i < values.length; i++) {
data.setInt64(4 + i * 8, (values[i] * 1000).toInt(), Endian.little);
}
write(bytes);
}
save(String deviceId, Uint8List bytes, ByteData data) {
// 采用 0X55BB 600 2
data.setInt16(1, 600, Endian.little);
data.setInt8(3, 2);
data.setUint16(4, 0x55AA, Endian.little);
write(bytes);
}
Coord toCoordString(String coord) {
switch (coord) {
case "BJ54":
return Coord.BJ54;
case "XA80":
return Coord.XA80;
case "WGS84":
return Coord.WGS84;
case "WGS2000":
return Coord.WGS2000;
default:
return Coord.WGS2000;
}
}
writeAntenna(Offset center, Offset right, String deviceId) {
Uint8List bytes = Uint8List(20);
ByteData data = ByteData.view(bytes.buffer);
// 604 8 X0右侧天线 X1 中心点
data.setInt8(0, 0xF0);
data.setInt16(1, 604, Endian.little);
data.setInt8(3, 8);
data.setInt16(4, (right.dx * 1000).toInt(), Endian.little);
data.setInt16(6, (right.dy * 1000).toInt(), Endian.little);
data.setInt16(8, (center.dx * 1000).toInt(), Endian.little);
data.setInt16(10, (center.dy * 1000).toInt(), Endian.little);
write(bytes);
Future.delayed(const Duration(milliseconds: 1000), () {
save(deviceId, bytes, data);
});
}
}