libftd2xx 0.33.1

Rust safe wrapper around the libftd2xx-ffi crate.
Documentation
#![deny(unsafe_code, warnings)]
use libftd2xx::{FtStatus, Ftdi, FtdiCommon};
use std::convert::TryFrom;

fn main() -> Result<(), FtStatus> {
    let mut ft = Ftdi::new()?;
    const MAX_ADDR: u32 = 256;
    const BYTES_PER_ROW: u32 = 16;
    const WORDS_PER_ROW: u32 = BYTES_PER_ROW / 2;
    const NUM_ROWS: u32 = MAX_ADDR / BYTES_PER_ROW;

    let mut ascii: [u8; BYTES_PER_ROW as usize] = [0; BYTES_PER_ROW as usize];

    for r in 0..NUM_ROWS {
        print!("{:04x}  ", r * BYTES_PER_ROW);
        for x in 0..WORDS_PER_ROW {
            let word: u16 = ft.eeprom_word_read(x + r * WORDS_PER_ROW)?;
            let low = u8::try_from(word & 0xFF).unwrap();
            let high = u8::try_from(word >> 8).unwrap();
            print!("{high:02x} {low:02x} ");
            ascii[(x as usize) * 2] = high;
            ascii[(x as usize) * 2 + 1] = low;
            if x == WORDS_PER_ROW / 2 - 1 {
                print!(" ");
            }
        }

        print!(" ");

        for byte in ascii.iter() {
            let ch = if 0x20 <= *byte && *byte < 0x7f {
                *byte as char
            } else {
                '.'
            };
            print!("{ch}");
        }

        println!();
    }

    Ok(())
}