module LibBladeRF.Utils ( bladeRFLogSetVerbosity
, bladeRFLibVersion
, bladeRFFwVersion
, bladeRFFPGAVersion
, bladeRFDeviceSpeed
, bladeRFLoadFPGA
, bladeRFGetDevInfo
, bladeRFGetSerial
, bladeRFGetFPGASize
, bladeRFEnableModule
, bladeRFSetLoopback
, bladeRFGetLoopback
) where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Bindings.LibBladeRF
import LibBladeRF.LibBladeRF
import LibBladeRF.Types
bladeRFLogSetVerbosity :: BladeRFLogLevel
-> IO ()
bladeRFLogSetVerbosity l = c'bladerf_log_set_verbosity $ (fromIntegral . fromEnum) l
toBladeRFVer :: C'bladerf_version -> String -> BladeRFVersion
toBladeRFVer brfv desc = BladeRFVersion { major = c'bladerf_version'major brfv
, minor = c'bladerf_version'minor brfv
, patch = c'bladerf_version'patch brfv
, descr = desc
}
bladeRFLibVersion :: IO BladeRFVersion
bladeRFLibVersion = do
brfv <- alloca $ \p -> do
c'bladerf_version p
peek p
desc <- peekCString $ c'bladerf_version'describe brfv
return $ toBladeRFVer brfv desc
bladeRFFwVersion :: DeviceHandle
-> IO BladeRFVersion
bladeRFFwVersion dev = do
brfv <- alloca $ \p -> do
c'bladerf_fw_version (unDeviceHandle dev) p
peek p
desc <- peekCString $ c'bladerf_version'describe brfv
return $ toBladeRFVer brfv desc
bladeRFFPGAVersion :: DeviceHandle
-> IO BladeRFVersion
bladeRFFPGAVersion dev = do
status <- c'bladerf_is_fpga_configured (unDeviceHandle dev)
if status > 0 then do
brfv <- alloca $ \p -> do
c'bladerf_fpga_version (unDeviceHandle dev) p
peek p
desc <- peekCString $ c'bladerf_version'describe brfv
return $ toBladeRFVer brfv desc
else
return BladeRFVersion { major = 0
, minor = 0
, patch = 0
, descr = "Unknown (FPGA not loaded)"
}
bladeRFLoadFPGA :: DeviceHandle
-> String
-> IO (BladeRFReturnType ())
bladeRFLoadFPGA dev s = do
p <- newCString s
ret <- c'bladerf_load_fpga (unDeviceHandle dev) p
return $ bladeRFErrorTy ret
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
brfv <- alloca $ \p -> do
c'bladerf_get_devinfo (unDeviceHandle dev) p
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
}
return info
bladeRFGetSerial :: DeviceHandle
-> IO String
bladeRFGetSerial dev = allocaBytes (c'BLADERF_SERIAL_LENGTH + 1) $ \cstring -> do
c'bladerf_get_serial (unDeviceHandle dev) cstring
peekCString cstring
bladeRFGetFPGASize :: DeviceHandle
-> IO BladeRFFPGASize
bladeRFGetFPGASize dev = do
sz <- alloca $ \p -> do
c'bladerf_get_fpga_size (unDeviceHandle dev) p
peek p
return $ (toEnum . fromEnum) sz
bladeRFEnableModule :: DeviceHandle
-> BladeRFModule
-> Bool
-> IO (BladeRFReturnType ())
bladeRFEnableModule dev m t = do
ret <- c'bladerf_enable_module (unDeviceHandle dev) ((fromIntegral . fromEnum) m) t
return $ bladeRFErrorTy ret
bladeRFSetLoopback :: DeviceHandle
-> BladeRFLoopback
-> IO (BladeRFReturnType ())
bladeRFSetLoopback dev l = do
ret <- c'bladerf_set_loopback (unDeviceHandle dev) ((fromIntegral . fromEnum) l)
return $ bladeRFErrorTy ret
bladeRFGetLoopback :: DeviceHandle
-> IO BladeRFLoopback
bladeRFGetLoopback dev = do
l <- alloca $ \lp -> do
c'bladerf_get_loopback (unDeviceHandle dev) lp
peek lp
return $ (toEnum . fromEnum) l