RP-01_Flutter/lib/CanLib/toomoss_can.dart

123 lines
4.1 KiB
Dart
Raw Normal View History

2025-04-29 16:32:14 +08:00
import 'abstract_can_device.dart';
import 'device_info.dart';
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'package:logging/logging.dart';
import 'dart:io';
class ToomossCAN extends AbstractCANDevice {
final Logger _logger = Logger('ToomossCAN');
late DynamicLibrary _dll;
bool _loadDll = false;
List<CANDev> _deviceList = [];
@override
bool initialize() {
// 加载USB2XXX.dll
try {
_dll = DynamicLibrary.open('USB2XXX.dll');
_logger.info("Load DLL success");
_loadDll = true;
}
catch (e) {
_logger.severe('Failed to load USB2XXX.dll: $e');
//记录当前工作路径
_logger.severe('Current working directory: ${Directory.current.path}');
return false;
}
return true;
}
@override
int refresh() {
// 实现刷新逻辑
if(_loadDll == false) {
_logger.info('refresh error:Failed to load USB2XXX.dll');
_logger.info(_loadDll.toString());
return 0;
}
_logger.info('刷新设备列表');
final usbScanDevice = _dll.lookupFunction<Int32 Function(Pointer<Int32>), int Function(Pointer<Int32>)>('USB_ScanDevice');
final devHandle = calloc<Int32>(20);
final deviceCount = usbScanDevice(devHandle);
if (deviceCount > 0) {
_logger.info('当前找到的设备数为: $deviceCount');
for (int i = 0; i < deviceCount; i++) {
final devHandleValue = devHandle[i];
final devGetDeviceInfo = _dll.lookupFunction<Bool Function(Int32, Pointer<ToomossDeviceInfo>, Pointer<Uint8>), bool Function(int, Pointer<ToomossDeviceInfo>, Pointer<Uint8>)>('DEV_GetDeviceInfo');
final devInfo = calloc<ToomossDeviceInfo>();
final funcStr = calloc<Uint8>(256);
final success = devGetDeviceInfo(devHandleValue, devInfo, funcStr);
if (success) {
//final firmwareName = devInfo.ref.firmwareName.cast<Utf8>().toDartString();
//final buildDate = devInfo.ref.buildDate.toDartString();
//final hardwareVersion = devInfo.ref.hardwareVersion;
final firmwareVersion = devInfo.ref.firmwareVersion;
final serialNumber = List<int>.generate(3, (index) => devInfo.ref.serialNumber[index]);
//final functions = devInfo.ref.Functions;
//final funcStrDart = funcStr.toDartString();
final int typp1 = (devHandleValue>>28)&0x0F;
final int typp2 = (devHandleValue>>24)&0x0F;
final toomossDevModel = '0${typp1}0$typp2';//型号
_deviceList.add(CANDev(
devname: 'Toomoss-$toomossDevModel',
devsn: serialNumber.map((num) => num.toRadixString(16).padLeft(2, '0')).join(''),
devchannel: 2, //
runstatus: false,
devhandle: devHandleValue,
firmwareversion: '${(firmwareVersion >> 24) & 0xFF}.${(firmwareVersion >> 16) & 0xFF}.${firmwareVersion & 0xFFFF}',
));
} else {
_logger.severe('Failed to get device info for device $i ,device id 0x${devHandleValue.toRadixString(16).toUpperCase()}');
}
calloc.free(devInfo);
calloc.free(funcStr);
}
} else {
_logger.info('无设备连接');
_deviceList.clear();
}
calloc.free(devHandle);
if(deviceCount > 0) {
// 遍历设备列表,输出每个设备的具体信息
for (var device in _deviceList) {
_logger.info('设备名称: ${device.devname}, 设备序列号: ${device.devsn}, 设备通道数: ${device.devchannel}, 运行状态: ${device.runstatus}, 设备句柄: ${device.devhandle.toRadixString(16).toUpperCase()}, 固件版本: ${device.firmwareversion}');
}
}
return deviceCount;
}
@override
List<CANDev> getDeviceList() {
// 实现获取设备列表逻辑
return _deviceList;
}
@override
bool start() {
// 实现启动逻辑
return true;
}
@override
bool stop() {
// 实现停止逻辑
return true;
}
@override
Future<bool> sendMessage(List<int> data) {
// 实现发送消息逻辑
return Future.value(true);
}
@override
Stream<List<int>> receiveMessage() {
// 实现接收消息逻辑
return Stream.empty();
}
}