move radio_connect to rust

This commit is contained in:
Greg Shuflin 2021-03-01 00:11:41 -08:00
parent b1116daba2
commit 2a7c32924c
2 changed files with 23 additions and 60 deletions

43
radio.c
View File

@ -82,49 +82,6 @@ void radio_print_version(radio_device_t* dev, FILE *out)
dev->print_version(dev, out); dev->print_version(dev, out);
} }
//
// Connect to the radio and identify the type of device.
//
radio_device_t* radio_connect()
{
const char *ident;
int i;
radio_device_t * dev = 0;
// Try TYT MD family.
ident = dfu_init(0x0483, 0xdf11);
if (! ident) {
// Try RD-5R, DM-1801 and GD-77.
if (hid_init(0x15a2, 0x0073) >= 0)
ident = hid_identify();
}
if (! ident) {
// Try AT-D868UV.
if (serial_init(0x28e9, 0x018a) >= 0)
ident = serial_identify();
}
if (! ident) {
fprintf(stderr, "No radio detected.\n");
fprintf(stderr, "Check your USB cable!\n");
exit(-1);
}
for (i=0; radio_tab[i].ident; i++) {
if (strcasecmp(ident, radio_tab[i].ident) == 0) {
dev = radio_tab[i].device;
break;
}
}
if (! dev) {
fprintf(stderr, "Unrecognized radio '%s'.\n", ident);
exit(-1);
}
fprintf(stderr, "Connect to %s.\n", dev->name);
set_active_device(dev);
return dev;
}
// //
// Read firmware image from the device. // Read firmware image from the device.
// //

View File

@ -1,7 +1,7 @@
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use libc::{c_char, c_int, c_uint}; use libc::{c_char, c_int, c_uint};
use std::os::unix::io::AsRawFd; use std::os::unix::io::AsRawFd;
use sys::process::exit; use std::process::exit;
include!(concat!(env!("OUT_DIR"), "/bindings.rs")); include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
@ -13,7 +13,9 @@ pub struct radio_tab_t {
extern { extern {
fn radio_connect() -> *const radio_device_t; fn set_active_device(device: *const radio_device_t);
//fn radio_connect() -> *const radio_device_t;
fn radio_download(device: *const radio_device_t); fn radio_download(device: *const radio_device_t);
fn radio_upload(device: *const radio_device_t, cont_flag: c_int); fn radio_upload(device: *const radio_device_t, cont_flag: c_int);
@ -44,20 +46,21 @@ extern {
/// and identify the type of device. /// and identify the type of device.
pub fn connect() -> *const radio_device_t { pub fn connect() -> *const radio_device_t {
unsafe { unsafe {
let mut ident: *const c_char;
let mut ident: *const c_char = std::ptr::null();
// Try TYT MD family. // Try TYT MD family.
ident = dfu_init(0x0483, 0xdf11); ident = dfu_init(0x0483, 0xdf11);
if ident.is_null() { if ident.is_null() {
// Try RD-5R, DM-1801 and GD-77. // Try RD-5R, DM-1801 and GD-77.
if (hid_init(0x15a2, 0x0073) >= 0) if hid_init(0x15a2, 0x0073) >= 0 {
ident = hid_identify(); ident = hid_identify();
}
} }
if ident.is_null() { if ident.is_null() {
// Try AT-D868UV. // Try AT-D868UV.
if (serial_init(0x28e9, 0x018a) >= 0) if serial_init(0x28e9, 0x018a) >= 0 {
ident = serial_identify(); ident = serial_identify();
}
} }
if ident.is_null() { if ident.is_null() {
@ -66,33 +69,36 @@ pub fn connect() -> *const radio_device_t {
exit(-1); exit(-1);
} }
let mut device: *const radio_device_t = std::ptr::null();
let mut ptr = get_radio_tab();
let ident_str = CStr::from_ptr(ident).to_str().unwrap(); let ident_str = CStr::from_ptr(ident).to_str().unwrap();
let mut device: *const radio_device_t = std::ptr::null();
let mut radio_tab_ptr = get_radio_tab();
loop { loop {
let ident_ptr = (*ptr).ident; let ident_ptr = (*radio_tab_ptr).ident;
if ident_ptr.is_null() { if ident_ptr.is_null() {
break; break;
} }
let name_ptr = (*(*ptr).device).name;
let table_ident = CStr::from_ptr(ident_ptr).to_str().unwrap().to_string(); let table_ident = CStr::from_ptr(ident_ptr).to_str().unwrap();
if table_ident.eq_ignore_ascii_case(ident_str) { if ident_str.eq_ignore_ascii_case(table_ident) {
device = ptr; device = (*radio_tab_ptr).device;
break; break;
} }
ptr = ptr.offset(1); radio_tab_ptr = radio_tab_ptr.offset(1);
} }
if device.is_null() { if device.is_null() {
eprintln!("Unrecognized radio '{}'.", ident_str); eprintln!("Unrecognized radio '{}'.", ident_str);
exit(-1); exit(-1);
} }
//TODO need to reset device static let name_ptr = (*device).name;
let name = CStr::from_ptr(name_ptr).to_str().unwrap();
println!("Connect to {}", name);
set_active_device(device);
return device;
} }
} }