module LibBladeRF.Utils ( bladeRFLibVersion
, bladeRFFwVersion
, bladeRFFPGAVersion
, bladeRFDeviceSpeed
, bladeRFLoadFPGA
, bladeRFGetDevInfo
, bladeRFGetSerial
, bladeRFGetFPGASize
, bladeRFEnableModule
) where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Bindings.LibBladeRF
import LibBladeRF.LibBladeRF
import LibBladeRF.Types
bladeRFLibVersion :: IO BladeRFVersion
bladeRFLibVersion = do
p <- malloc :: IO (Ptr C'bladerf_version)
c'bladerf_version p
brfv <- peek p
desc <- peekCString $ c'bladerf_version'describe brfv
let ver = BladeRFVersion { major = c'bladerf_version'major brfv
, minor = c'bladerf_version'minor brfv
, patch = c'bladerf_version'patch brfv
, descr = desc
}
free p
return ver
bladeRFFwVersion :: DeviceHandle
-> IO BladeRFVersion
bladeRFFwVersion dev = do
p <- malloc :: IO (Ptr C'bladerf_version)
c'bladerf_fw_version (unDeviceHandle dev) p
brfv <- peek p
desc <- peekCString $ c'bladerf_version'describe brfv
let ver = BladeRFVersion { major = c'bladerf_version'major brfv
, minor = c'bladerf_version'minor brfv
, patch = c'bladerf_version'patch brfv
, descr = desc
}
free p
return ver
bladeRFFPGAVersion :: DeviceHandle
-> IO BladeRFVersion
bladeRFFPGAVersion dev = do
status <- c'bladerf_is_fpga_configured (unDeviceHandle dev)
if status > 0 then do
p <- malloc :: IO (Ptr C'bladerf_version)
c'bladerf_fpga_version (unDeviceHandle dev) p
brfv <- peek p
desc <- peekCString $ c'bladerf_version'describe brfv
let ver = BladeRFVersion { major = c'bladerf_version'major brfv
, minor = c'bladerf_version'minor brfv
, patch = c'bladerf_version'patch brfv
, descr = desc
}
free p
return ver
else
return BladeRFVersion { major = 0
, minor = 0
, patch = 0
, descr = "Unknown (FPGA not loaded)"
}
bladeRFLoadFPGA :: DeviceHandle
-> String
-> IO ()
bladeRFLoadFPGA dev s = do
p <- newCString s
_ <- c'bladerf_load_fpga (unDeviceHandle dev) p
return ()
bladeRFDeviceSpeed :: DeviceHandle
-> IO BladeRFSpeed
bladeRFDeviceSpeed dev = do
speed <- c'bladerf_device_speed (unDeviceHandle dev)
return $ (toEnum . fromEnum) speed
bladeRFGetDevInfo :: DeviceHandle
-> IO BladeRFDeviceInfo
bladeRFGetDevInfo dev = do
p <- malloc :: IO (Ptr C'bladerf_devinfo)
c'bladerf_get_devinfo (unDeviceHandle dev) p
brfv <- peek p
let info = BladeRFDeviceInfo { backend = toEnum . fromEnum . c'bladerf_devinfo'backend $ brfv
, serial = map castCCharToChar . c'bladerf_devinfo'serial $ brfv
, usbBus = c'bladerf_devinfo'usb_bus brfv
, usbAddr = c'bladerf_devinfo'usb_addr brfv
, inst = c'bladerf_devinfo'instance brfv
}
free p
return info
bladeRFGetSerial :: DeviceHandle
-> IO String
bladeRFGetSerial dev = do
cstring <- mallocBytes 34
c'bladerf_get_serial (unDeviceHandle dev) cstring
serial <- peekCString cstring
free cstring
return serial
bladeRFGetFPGASize :: DeviceHandle
-> IO BladeRFFPGASize
bladeRFGetFPGASize dev = do
p <- malloc :: IO (Ptr C'bladerf_fpga_size)
c'bladerf_get_fpga_size (unDeviceHandle dev) p
sz <- peek p
free p
return $ (toEnum . fromEnum) sz
bladeRFEnableModule :: DeviceHandle
-> BladeRFModule
-> Bool
-> IO ()
bladeRFEnableModule dev m t = do
c'bladerf_enable_module (unDeviceHandle dev) ((fromIntegral . fromEnum) m) t
return ()