123 lines
4.1 KiB
Dart
123 lines
4.1 KiB
Dart
|
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();
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|