use std::ffi::c_char;
use crate::{
antenna::{self, ffi},
ffi::{
ffi_create_c_array, ffi_create_c_string, ffi_free_c_array,
ffi_free_rust_c_string,
},
MetafitsContext,
};
#[repr(C)]
pub struct Antenna {
pub ant: u32,
pub tile_id: u32,
pub tile_name: *mut c_char,
pub rfinput_x: usize,
pub rfinput_y: usize,
pub electrical_length_m: f64,
pub north_m: f64,
pub east_m: f64,
pub height_m: f64,
}
impl Antenna {
pub fn populate_array(metafits_context: &MetafitsContext) -> (*mut ffi::Antenna, usize) {
let mut item_vec: Vec<ffi::Antenna> = Vec::new();
for item in metafits_context.antennas.iter() {
let out_item = {
let antenna::Antenna {
ant,
tile_id,
tile_name: _,
rfinput_x,
rfinput_y,
electrical_length_m,
north_m,
east_m,
height_m,
} = item;
let tile_name_c_str = ffi_create_c_string(&item.tile_name);
antenna::ffi::Antenna {
ant: *ant,
tile_id: *tile_id,
tile_name: tile_name_c_str,
rfinput_x: metafits_context
.rf_inputs
.iter()
.position(|x| x == rfinput_x)
.unwrap(),
rfinput_y: metafits_context
.rf_inputs
.iter()
.position(|y| y == rfinput_y)
.unwrap(),
electrical_length_m: *electrical_length_m,
north_m: *north_m,
east_m: *east_m,
height_m: *height_m,
}
};
item_vec.push(out_item);
}
ffi_create_c_array(item_vec)
}
fn destroy_item(item: *mut ffi::Antenna) {
if item.is_null() {
return;
}
let a = unsafe { &mut *item };
if !a.tile_name.is_null() {
ffi_free_rust_c_string(a.tile_name);
}
}
pub fn destroy_array(items_ptr: *mut ffi::Antenna, items_len: usize) {
let items_slice = unsafe { std::slice::from_raw_parts_mut(items_ptr, items_len) };
for item in items_slice {
Self::destroy_item(item);
}
ffi_free_c_array(items_ptr, items_len);
}
}