Remove most of the code referencing the static device var

Replace it with passing pointers around
This commit is contained in:
Greg Shuflin 2021-02-28 10:48:44 -08:00
parent c2471516fd
commit 2315ee4a74
3 changed files with 64 additions and 56 deletions

50
radio.c
View File

@ -58,11 +58,11 @@ static struct {
{ 0, 0 } { 0, 0 }
}; };
static radio_device_t *device; // Device-dependent interface
unsigned char radio_mem [1024*1024*2]; // Radio memory contents, up to 2 Mbytes unsigned char radio_mem [1024*1024*2]; // Radio memory contents, up to 2 Mbytes
int radio_progress; // Read/write progress counter int radio_progress; // Read/write progress counter
static radio_device_t *device; // Device-dependent interface
// //
// Close the serial port. // Close the serial port.
// //
@ -92,6 +92,7 @@ radio_device_t* radio_connect()
{ {
const char *ident; const char *ident;
int i; int i;
radio_device_t * dev = 0;
// Try TYT MD family. // Try TYT MD family.
ident = dfu_init(0x0483, 0xdf11); ident = dfu_init(0x0483, 0xdf11);
@ -113,16 +114,18 @@ radio_device_t* radio_connect()
for (i=0; radio_tab[i].ident; i++) { for (i=0; radio_tab[i].ident; i++) {
if (strcasecmp(ident, radio_tab[i].ident) == 0) { if (strcasecmp(ident, radio_tab[i].ident) == 0) {
device = radio_tab[i].device; dev = radio_tab[i].device;
break; break;
} }
} }
if (! device) { if (! dev) {
fprintf(stderr, "Unrecognized radio '%s'.\n", ident); fprintf(stderr, "Unrecognized radio '%s'.\n", ident);
exit(-1); exit(-1);
} }
fprintf(stderr, "Connect to %s.\n", device->name); fprintf(stderr, "Connect to %s.\n", dev->name);
return device;
device = dev;
return dev;
} }
// //
@ -179,11 +182,12 @@ void radio_upload(radio_device_t* dev, int cont_flag)
// //
// Read firmware image from the binary file. // Read firmware image from the binary file.
// //
void radio_read_image(const char *filename) radio_device_t* radio_read_image(const char *filename)
{ {
FILE *img; FILE *img;
struct stat st; struct stat st;
char ident[8]; char ident[8];
radio_device_t * dev = NULL;
fprintf(stderr, "Read codeplug from file '%s'.\n", filename); fprintf(stderr, "Read codeplug from file '%s'.\n", filename);
img = fopen(filename, "rb"); img = fopen(filename, "rb");
@ -200,11 +204,11 @@ void radio_read_image(const char *filename)
switch (st.st_size) { switch (st.st_size) {
case 851968: case 851968:
case 852533: case 852533:
device = &radio_uv380; dev = &radio_uv380;
break; break;
case 262144: case 262144:
case 262709: case 262709:
device = &radio_md380; dev = &radio_md380;
break; break;
case 1606528: case 1606528:
if (fread(ident, 1, 8, img) != 8) { if (fread(ident, 1, 8, img) != 8) {
@ -213,11 +217,11 @@ void radio_read_image(const char *filename)
} }
fseek(img, 0, SEEK_SET); fseek(img, 0, SEEK_SET);
if (memcmp(ident, "D868UVE", 7) == 0) { if (memcmp(ident, "D868UVE", 7) == 0) {
device = &radio_d868uv; dev = &radio_d868uv;
} else if (memcmp(ident, "D878UV", 6) == 0) { } else if (memcmp(ident, "D878UV", 6) == 0) {
device = &radio_d878uv; dev = &radio_d878uv;
} else if (memcmp(ident, "D6X2UV", 6) == 0) { } else if (memcmp(ident, "D6X2UV", 6) == 0) {
device = &radio_dmr6x2; dev = &radio_dmr6x2;
} else { } else {
fprintf(stderr, "%s: Unrecognized header '%.6s'\n", fprintf(stderr, "%s: Unrecognized header '%.6s'\n",
filename, ident); filename, ident);
@ -230,11 +234,11 @@ void radio_read_image(const char *filename)
exit(-1); exit(-1);
} }
if (memcmp(ident, "BF-5R", 5) == 0) { if (memcmp(ident, "BF-5R", 5) == 0) {
device = &radio_rd5r; dev = &radio_rd5r;
} else if (memcmp(ident, "MD-760P", 7) == 0) { } else if (memcmp(ident, "MD-760P", 7) == 0) {
device = &radio_gd77; dev = &radio_gd77;
} else if (memcmp(ident, "1801", 4) == 0) { } else if (memcmp(ident, "1801", 4) == 0) {
device = &radio_dm1801; dev = &radio_dm1801;
} else if (memcmp(ident, "MD-760", 6) == 0) { } else if (memcmp(ident, "MD-760", 6) == 0) {
fprintf(stderr, "Old Radioddity GD-77 v2.6 image not supported!\n"); fprintf(stderr, "Old Radioddity GD-77 v2.6 image not supported!\n");
exit(-1); exit(-1);
@ -251,14 +255,18 @@ void radio_read_image(const char *filename)
exit(-1); exit(-1);
} }
device->read_image(device, img);
dev->read_image(dev, img);
fclose(img); fclose(img);
device = dev;
return dev;
} }
// //
// Save firmware image to the binary file. // Save firmware image to the binary file.
// //
void radio_save_image(const char *filename) void radio_save_image(radio_device_t* device, const char *filename)
{ {
FILE *img; FILE *img;
@ -275,7 +283,7 @@ void radio_save_image(const char *filename)
// //
// Read the configuration from text file, and modify the firmware. // Read the configuration from text file, and modify the firmware.
// //
void radio_parse_config(const char *filename) void radio_parse_config(radio_device_t* device, const char *filename)
{ {
FILE *conf; FILE *conf;
char line [256], *p, *v; char line [256], *p, *v;
@ -358,7 +366,7 @@ badline: fprintf(stderr, "Invalid line: '%s'\n", line);
// //
// Print full information about the device configuration. // Print full information about the device configuration.
// //
void radio_print_config(FILE *out, int verbose) void radio_print_config(radio_device_t* device, FILE *out, int verbose)
{ {
if (verbose) { if (verbose) {
char buf [40]; char buf [40];
@ -380,7 +388,7 @@ void radio_print_config(FILE *out, int verbose)
// //
// Check the configuration is correct. // Check the configuration is correct.
// //
void radio_verify_config() void radio_verify_config(radio_device_t* device)
{ {
if (!device->verify_config(device)) { if (!device->verify_config(device)) {
// Message should be already printed. // Message should be already printed.
@ -391,7 +399,7 @@ void radio_verify_config()
// //
// Update contacts database on the device. // Update contacts database on the device.
// //
void radio_write_csv(const char *filename) void radio_write_csv(radio_device_t* device, const char *filename)
{ {
FILE *csv; FILE *csv;

View File

@ -109,17 +109,17 @@ pub extern "C" fn rust_main(_argc: c_int, _argv: *const *const c_char) -> c_int
let device = radio::connect(); //NOTE this changes the semantics of the program let device = radio::connect(); //NOTE this changes the semantics of the program
radio::read_image(&img); radio::read_image(&img);
radio::print_version(device); radio::print_version(device);
radio::parse_config(&config_filename); radio::parse_config(device, &config_filename);
radio::verify_config(); radio::verify_config(device);
radio::save_image("device.img"); radio::save_image(device, "device.img");
} else { } else {
// Update device from text config file. // Update device from text config file.
let device = radio::connect(); let device = radio::connect();
radio::download(device); radio::download(device);
radio::print_version(device); radio::print_version(device);
radio::save_image("device.img"); radio::save_image(device, "device.img");
radio::parse_config(&config_filename); radio::parse_config(device, &config_filename);
radio::verify_config(); radio::verify_config(device);
radio::upload(device, 1); radio::upload(device, 1);
radio::disconnect(); radio::disconnect();
} }
@ -128,9 +128,9 @@ pub extern "C" fn rust_main(_argc: c_int, _argv: *const *const c_char) -> c_int
print_usage(); print_usage();
} }
// Verify text config file. // Verify text config file.
radio::connect(); let device = radio::connect();
radio::parse_config(&matches.free[0]); radio::parse_config(device, &matches.free[0]);
radio::verify_config(); radio::verify_config(device);
radio::disconnect(); radio::disconnect();
} else if read_flag { } else if read_flag {
if matches.free.len() != 0 { if matches.free.len() != 0 {
@ -142,28 +142,28 @@ pub extern "C" fn rust_main(_argc: c_int, _argv: *const *const c_char) -> c_int
radio::download(device); radio::download(device);
radio::print_version(device); radio::print_version(device);
radio::disconnect(); radio::disconnect();
radio::save_image("device.img"); radio::save_image(device, "device.img");
// Print configuration to file. // Print configuration to file.
let filename = "device.conf"; let filename = "device.conf";
println!("Print configuration to file '{}.", filename); println!("Print configuration to file '{}.", filename);
radio::print_config(filename); radio::print_config(device, filename);
} else if csv_flag { } else if csv_flag {
if matches.free.len() != 1 { if matches.free.len() != 1 {
print_usage(); print_usage();
} }
radio::connect(); let device = radio::connect();
radio::write_csv(&matches.free[0]); radio::write_csv(device, &matches.free[0]);
radio::disconnect(); radio::disconnect();
} else { } else {
if matches.free.len() != 1 { if matches.free.len() != 1 {
print_usage(); print_usage();
} }
radio::read_image(&matches.free[0]); let device = radio::read_image(&matches.free[0]);
radio::print_config_to_stdout(); radio::print_config_to_stdout(device);
} }
exit(0); exit(0);

View File

@ -11,13 +11,13 @@ extern {
fn radio_download(device: *const RadioDeviceT); fn radio_download(device: *const RadioDeviceT);
fn radio_upload(device: *const RadioDeviceT, cont_flag: c_int); fn radio_upload(device: *const RadioDeviceT, cont_flag: c_int);
fn radio_list_c(); fn radio_list_c();
fn radio_verify_config(); fn radio_verify_config(device: *const RadioDeviceT);
fn radio_print_version(device: *const RadioDeviceT, stdout: *const libc::FILE); fn radio_print_version(device: *const RadioDeviceT, stdout: *const libc::FILE);
fn radio_print_config(file: *const libc::FILE, verbose: c_int); fn radio_print_config(device: *const RadioDeviceT, file: *const libc::FILE, verbose: c_int);
fn radio_read_image(filename: *const c_char); fn radio_read_image(filename: *const c_char) -> *const RadioDeviceT;
fn radio_save_image(filename: *const c_char); fn radio_save_image(device: *const RadioDeviceT, filename: *const c_char);
fn radio_parse_config(filename: *const c_char); fn radio_parse_config(device: *const RadioDeviceT, filename: *const c_char);
fn radio_write_csv(filename: *const c_char); fn radio_write_csv(device: *const RadioDeviceT, filename: *const c_char);
} }
/// Connect to the radio via the serial port. /// Connect to the radio via the serial port.
@ -58,49 +58,49 @@ pub fn list() {
} }
/// Check the configuration. /// Check the configuration.
pub fn verify_config() { pub fn verify_config(device: *const RadioDeviceT) {
unsafe { unsafe {
radio_verify_config(); radio_verify_config(device);
} }
} }
/// Read firmware image from the binary file. /// Read firmware image from the binary file.
pub fn read_image(filename: &str) { pub fn read_image(filename: &str) -> *const RadioDeviceT {
let filename = CString::new(filename.to_string()).unwrap(); let filename = CString::new(filename.to_string()).unwrap();
unsafe { unsafe {
radio_read_image(filename.as_ptr()); radio_read_image(filename.as_ptr())
} }
} }
/// Save firmware image to the binary file. /// Save firmware image to the binary file.
pub fn save_image(filename: &str) { pub fn save_image(device: *const RadioDeviceT, filename: &str) {
let filename = CString::new(filename.to_string()).unwrap(); let filename = CString::new(filename.to_string()).unwrap();
unsafe { unsafe {
radio_save_image(filename.as_ptr()) radio_save_image(device, filename.as_ptr())
} }
} }
/// Read the configuration from text file, and modify the firmware. /// Read the configuration from text file, and modify the firmware.
pub fn parse_config(filename: &str) { pub fn parse_config(device: *const RadioDeviceT, filename: &str) {
let filename = CString::new(filename.to_string()).unwrap(); let filename = CString::new(filename.to_string()).unwrap();
unsafe { unsafe {
radio_parse_config(filename.as_ptr()) radio_parse_config(device, filename.as_ptr())
} }
} }
/// Print full information about the device configuration. /// Print full information about the device configuration.
pub fn print_config(filename: &str) { pub fn print_config(device: *const RadioDeviceT, filename: &str) {
let file = std::fs::File::create(filename).unwrap(); let file = std::fs::File::create(filename).unwrap();
let fd = file.as_raw_fd(); let fd = file.as_raw_fd();
let mode = CString::new("w").unwrap(); let mode = CString::new("w").unwrap();
unsafe { unsafe {
let file =libc::fdopen(fd, mode.as_ptr()); let file =libc::fdopen(fd, mode.as_ptr());
radio_print_config(file, 1); radio_print_config(device, file, 1);
libc::fclose(file); libc::fclose(file);
} }
} }
pub fn print_config_to_stdout() { pub fn print_config_to_stdout(device: *const RadioDeviceT) {
let mode = CString::new("w").unwrap(); let mode = CString::new("w").unwrap();
unsafe { unsafe {
let stdout = libc::fdopen(libc::STDOUT_FILENO, mode.as_ptr()); let stdout = libc::fdopen(libc::STDOUT_FILENO, mode.as_ptr());
@ -109,7 +109,7 @@ pub fn print_config_to_stdout() {
} else { } else {
1 1
}; };
radio_print_config(stdout, verbosity); radio_print_config(device, stdout, verbosity);
} }
} }
@ -122,9 +122,9 @@ pub fn print_version(device: *const RadioDeviceT) {
} }
/// Update CSV contacts database. /// Update CSV contacts database.
pub fn write_csv(filename: &str) { pub fn write_csv(device: *const RadioDeviceT, filename: &str) {
let filename = CString::new(filename.to_string()).unwrap(); let filename = CString::new(filename.to_string()).unwrap();
unsafe { unsafe {
radio_write_csv(filename.as_ptr()); radio_write_csv(device, filename.as_ptr());
} }
} }