### How to use:
```rust
use can_type_rs::frame::Frame;
use can_type_rs::identifier::Id;
use zlgcan_common::can::{CanChlCfgExt, CanChlCfgFactory, ZCanChlMode, ZCanChlType, CanMessage};
use zlgcan_common::device::ZCanDeviceType;
use zlgcan_common::error::ZCanError;
use zlgcan_driver::driver::{ZCanDriver, ZDevice};
#[test]
fn main() -> anyhow::Result<()> {
let dev_type = ZCanDeviceType::ZCAN_USBCANFD_200U;
let dev_idx = 0;
// Create driver instance
let mut driver = ZCanDriver::new(dev_type as u32, dev_idx, None)?;
// Open device
driver.open()?;
// Get device info and assert some information
let dev_info = driver.device_info()?;
assert_eq!(dev_info.can_channels(), 2);
assert_eq!(dev_info.canfd(), true);
// Create channel configuration factory
let factory = CanChlCfgFactory::new()?;
let ch1_cfg = factory.new_can_chl_cfg(dev_type as u32, ZCanChlType::CANFD_ISO as u8, ZCanChlMode::Normal as u8, 500_000,
CanChlCfgExt::new(None, Some(1_000_000), None, None, None, None))?;
let ch2_cfg = factory.new_can_chl_cfg(dev_type as u32, ZCanChlType::CANFD_ISO as u8, ZCanChlMode::Normal as u8, 500_000,
CanChlCfgExt::new(None, Some(1_000_000), None, None, None, None))?;
let cfg = vec![ch1_cfg, ch2_cfg];
// intialize channels
driver.init_can_chl(cfg)?;
// Create CANFD frame
let mut msg = CanMessage::new(
Id::from_bits(0x7df, false), [0x01, 0x02, 0x03, 0x04, 0x05].as_slice()
)
.ok_or(ZCanError::Other("invalid data length".to_string()))?;
msg.set_can_fd(true);
let frames = vec![msg];
// Transmit frame
let ret = driver.transmit_canfd(0, frames)?;
assert_eq!(ret, 1);
driver.close();
Ok(())
}
```
### How to test
* Enter `driver/tests` folder. Select test file by your device type.
* If the channels of device is less than 2:
* Connect another CAN device with you device's channel for a monitor.
* Then run the selected testcase.
* When see receive frame from the monitor, then send frame by the monitor device.
* It means pass when the testcase exited without any panic.
* If the channels of device is rather than 2:
* Connected the channels 0 and 1.
* Then run the selected testcase.
* It means pass when the testcase exited without any panic.
* All testcase will output the send and received debug info.
### The tested device list(include `windows` and `linux`):
* USBCAN1 (include office device and deriving device)
* USBCAN2 (only deriving device)
* USBCANFD-200U
* USBCANFD-400U (without supporting channel 3 and 4)
### LICENSE
* GNU LESSER GENERAL PUBLIC LICENSE V3