1- use std:: ffi:: CString ;
1+ use std:: {
2+ ffi:: { c_void, CString } ,
3+ ptr,
4+ } ;
25
36use ni_fpga_sys:: { NiFpgaApi , NiFpgaApiContainer , Offset , Session } ;
47
5- use crate :: Error ;
8+ use crate :: { hmb :: Hmb , Error , Status } ;
69
710trait StatusHelper {
811 fn to_result ( self ) -> Result < ( ) , Error > ;
@@ -27,12 +30,14 @@ macro_rules! type_wrapper {
2730 $readarr_fun_name: ident, $readarr_ffi_name: ident, $writearr_fun_name: ident, $writearr_ffi_name: ident) => {
2831 pub fn $read_fun_name( & self , indicator: Offset , value: & mut $type) -> Result <( ) , Error > {
2932 self . api
33+ . base
3034 . $read_ffi_name( self . session, indicator, value as * mut $type)
3135 . to_result( )
3236 }
3337
34- pub fn $write_fun_name( & self , indicator: Offset , value: $type) -> Result <( ) , Error > {
38+ pub fn $write_fun_name( & mut self , indicator: Offset , value: $type) -> Result <( ) , Error > {
3539 self . api
40+ . base
3641 . $write_ffi_name( self . session, indicator, value)
3742 . to_result( )
3843 }
@@ -43,12 +48,18 @@ macro_rules! type_wrapper {
4348 value: & mut [ $type] ,
4449 ) -> Result <( ) , Error > {
4550 self . api
51+ . base
4652 . $readarr_ffi_name( self . session, indicator, value. as_mut_ptr( ) , value. len( ) )
4753 . to_result( )
4854 }
4955
50- pub fn $writearr_fun_name( & self , indicator: Offset , value: & [ $type] ) -> Result <( ) , Error > {
56+ pub fn $writearr_fun_name(
57+ & mut self ,
58+ indicator: Offset ,
59+ value: & [ $type] ,
60+ ) -> Result <( ) , Error > {
5161 self . api
62+ . base
5263 . $writearr_ffi_name( self . session, indicator, value. as_ptr( ) , value. len( ) )
5364 . to_result( )
5465 }
@@ -156,6 +167,34 @@ impl NiFpga {
156167 NiFpgaDll_WriteArrayI64
157168 ) ;
158169
170+ pub fn open_hmb ( & self , memory_name : & CString ) -> Result < Hmb , Error > {
171+ match & self . api . hmb {
172+ Some ( hmb) => {
173+ let mut memory_size: usize = 0 ;
174+ let mut virtual_address: * mut c_void = ptr:: null_mut ( ) ;
175+ match hmb
176+ . NiFpgaDll_OpenHmb (
177+ self . session ,
178+ memory_name. as_ptr ( ) ,
179+ & mut memory_size,
180+ & mut virtual_address,
181+ )
182+ . to_result ( )
183+ {
184+ Ok ( _) => Ok ( Hmb :: new (
185+ hmb,
186+ self . session ,
187+ memory_name. clone ( ) ,
188+ memory_size,
189+ virtual_address,
190+ ) ) ,
191+ Err ( err) => Err ( err) ,
192+ }
193+ }
194+ None => Err ( Error :: FPGA ( Status :: ResourceNotInitialized ) ) ,
195+ }
196+ }
197+
159198 pub fn open (
160199 bitfile : & CString ,
161200 signature : & CString ,
@@ -167,14 +206,15 @@ impl NiFpga {
167206 Err ( err) => return Err ( Error :: DlOpen ( err) ) ,
168207 } ;
169208
170- let mut session: u32 = 0 ;
209+ let mut session: Session = 0 ;
171210 match api
211+ . base
172212 . NiFpgaDll_Open (
173213 bitfile. as_ptr ( ) ,
174214 signature. as_ptr ( ) ,
175215 resource. as_ptr ( ) ,
176216 attribute,
177- & mut session as * mut Session ,
217+ & mut session,
178218 )
179219 . to_result ( )
180220 {
@@ -185,6 +225,7 @@ impl NiFpga {
185225
186226 pub fn close ( self , attribute : u32 ) -> Result < ( ) , Error > {
187227 self . api
228+ . base
188229 . NiFpgaDll_Close ( self . session , attribute)
189230 . to_result ( )
190231 }
@@ -194,6 +235,6 @@ impl Drop for NiFpga {
194235 fn drop ( & mut self ) {
195236 // TODO figure out what to do here with attribute
196237 // and the return value
197- self . api . NiFpgaDll_Close ( self . session , 0 ) ;
238+ self . api . base . NiFpgaDll_Close ( self . session , 0 ) ;
198239 }
199240}
0 commit comments