-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
More API functions #8
base: master
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ use libftdi1_sys as ffi; | |
|
||
use std::convert::TryInto; | ||
use std::io::{self, Read, Write}; | ||
use std::os::raw; | ||
|
||
pub mod error; | ||
|
||
|
@@ -169,6 +170,34 @@ impl Device { | |
err => panic!("unknown get_write_chunksize retval {:?}", err), | ||
} | ||
} | ||
|
||
pub fn read_pins(&mut self) -> Result<u8> { | ||
let mut pins : u8 = 0; | ||
let pins_ptr = std::slice::from_mut(&mut pins).as_mut_ptr(); | ||
|
||
let result = unsafe { ffi::ftdi_read_pins(self.context, pins_ptr) }; | ||
|
||
match result { | ||
0 => Ok(pins), | ||
-1 => Err(Error::RequestFailed), // read pins failed | ||
-2 => unreachable!("uninitialized context"), | ||
_ => Err(Error::unknown(self.context)), | ||
} | ||
} | ||
|
||
pub fn set_baudrate(&mut self, baudrate : u32) -> Result<()> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All our API needs docs, but this function probably the most for now. Does it include the "but the actual baud rate is 16 times higher" property in bitbang, assuming we implement it sooner or later (and do we want it to)? What accuracy does it guarantee? Can we somehow get back the actual baud rate configured? What happens to the baud rate what we switch modes once we support that? |
||
// TODO: libftdi1 will multiply baud rates in bitbang mode | ||
// by 4. This leads to UB if baudrate >= INT_MAX/4. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd just add the corresponding assert here to avoid the possible UB. |
||
let result = unsafe { ffi::ftdi_set_baudrate(self.context, baudrate as raw::c_int) }; | ||
|
||
match result { | ||
0 => Ok(()), | ||
-1 => Err(Error::InvalidInput("baud rate not supported")), | ||
-2 => Err(Error::RequestFailed), // set baudrate failed | ||
-3 => unreachable!("uninitialized context"), | ||
_ => Err(Error::unknown(self.context)) | ||
} | ||
} | ||
} | ||
|
||
impl Drop for Device { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the slice actually needed here? Why not just
ffi::ftdi_read_pins(self.context, &mut pins)
?