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 _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), int Function(Pointer)>('USB_ScanDevice'); final devHandle = calloc(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, Pointer), bool Function(int, Pointer, Pointer)>('DEV_GetDeviceInfo'); final devInfo = calloc(); final funcStr = calloc(256); final success = devGetDeviceInfo(devHandleValue, devInfo, funcStr); if (success) { //final firmwareName = devInfo.ref.firmwareName.cast().toDartString(); //final buildDate = devInfo.ref.buildDate.toDartString(); //final hardwareVersion = devInfo.ref.hardwareVersion; final firmwareVersion = devInfo.ref.firmwareVersion; final serialNumber = List.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 getDeviceList() { // 实现获取设备列表逻辑 return _deviceList; } @override bool start() { // 实现启动逻辑 return true; } @override bool stop() { // 实现停止逻辑 return true; } @override Future sendMessage(List data) { // 实现发送消息逻辑 return Future.value(true); } @override Stream> receiveMessage() { // 实现接收消息逻辑 return Stream.empty(); } }