gain full implemented

This commit is contained in:
Eray Arslan 2020-08-02 00:40:58 +03:00
parent d6bcde04a6
commit 8b521ae877
2 changed files with 210 additions and 6 deletions

View File

@ -25,7 +25,7 @@ func cbGo(dev *C.struct_bladerf,
cb := (*Callback)(userData)
for i := 0; i < 4096; i++ {
for i := 0; i < cb.bufferSize; i++ {
cb.results = append(
cb.results,
int16(*((*C.int16_t)(unsafe.Pointer(uintptr(samples) + (size * uintptr(i)))))),
@ -35,7 +35,7 @@ func cbGo(dev *C.struct_bladerf,
cb.cb(cb.results)
cb.results = nil
return C.malloc(C.size_t(size * 4096 * 2 * 1))
return C.malloc(C.size_t(size * cb.bufferSize * 2 * 1))
}
type GainMode int
@ -168,6 +168,10 @@ type DevInfo struct {
type Range struct {
bfRange *C.struct_bladerf_range
min int64
max int64
step int64
scale float64
}
type BladeRF struct {
@ -182,6 +186,12 @@ type Stream struct {
stream *C.struct_bladerf_stream
}
type GainModes struct {
gainModes *C.struct_bladerf_gain_modes
name string
mode GainMode
}
func GetVersion() Version {
var version C.struct_bladerf_version
C.bladerf_version(&version)
@ -338,6 +348,28 @@ func SetGain(bladeRF *BladeRF, module IOModule, gain int) error {
return GetError(C.bladerf_set_gain((*bladeRF).bladeRF, C.bladerf_module(module), C.int(gain)))
}
func GetGain(bladeRF *BladeRF, module IOModule) (int, error) {
var gain C.bladerf_gain
err := GetError(C.bladerf_get_gain((*bladeRF).bladeRF, C.bladerf_module(module), &gain))
if err == nil {
return int(gain), nil
}
return int(gain), err
}
func GetGainStage(bladeRF *BladeRF, module IOModule, stage string) (int, error) {
val := C.CString(stage)
defer C.free(unsafe.Pointer(val))
var gain C.bladerf_gain
err := GetError(C.bladerf_get_gain_stage((*bladeRF).bladeRF, C.bladerf_module(module), val, &gain))
if err == nil {
return int(gain), nil
}
return int(gain), err
}
func GetGainMode(bladeRF *BladeRF, module IOModule) (GainMode, error) {
var mode C.bladerf_gain_mode
@ -347,7 +379,119 @@ func GetGainMode(bladeRF *BladeRF, module IOModule) (GainMode, error) {
return result, nil
}
return -1, err
return result, err
}
func SetGainStage(bladeRF *BladeRF, module IOModule, stage string, gain int) error {
val := C.CString(stage)
defer C.free(unsafe.Pointer(val))
return GetError(C.bladerf_set_gain_stage((*bladeRF).bladeRF, C.bladerf_module(module), val, C.int(gain)))
}
func GetGainStageRange(bladeRF *BladeRF, module IOModule, stage string) (Range, error) {
var bfRange *C.struct_bladerf_range
val := C.CString(stage)
defer C.free(unsafe.Pointer(val))
err := GetError(C.bladerf_get_gain_stage_range((*bladeRF).bladeRF, C.bladerf_module(module), val, &bfRange))
if err == nil {
return Range{
bfRange: bfRange,
min: int64(bfRange.min),
max: int64(bfRange.max),
step: int64(bfRange.step),
scale: float64(bfRange.scale),
}, nil
}
return Range{}, err
}
func GetGainRange(bladeRF *BladeRF, module IOModule) (Range, error) {
var bfRange *C.struct_bladerf_range
err := GetError(C.bladerf_get_gain_range((*bladeRF).bladeRF, C.bladerf_module(module), &bfRange))
if err == nil {
return Range{
bfRange: bfRange,
min: int64(bfRange.min),
max: int64(bfRange.max),
step: int64(bfRange.step),
scale: float64(bfRange.scale),
}, nil
}
return Range{}, err
}
func GetNumberOfGainStages(bladeRF *BladeRF, module IOModule) int {
count := int(C.bladerf_get_gain_stages((*bladeRF).bladeRF, C.bladerf_module(module), nil, 0))
if count < 1 {
return 0
}
return count
}
func GetGainStages(bladeRF *BladeRF, module IOModule) []string {
var stage *C.char
var stages []string
count := int(C.bladerf_get_gain_stages(
(*bladeRF).bladeRF,
C.bladerf_module(module),
&stage,
C.ulong(GetNumberOfGainStages(bladeRF, module))),
)
if count < 1 {
return stages
}
first := C.GoString(stage)
stages = append(stages, first)
for i := 0; i < count-1; i++ {
size := unsafe.Sizeof(*stage)
stage = (*C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(stage)) + size))
stages = append(stages, C.GoString(stage))
}
return stages
}
func GetGainModes(bladeRF *BladeRF, module IOModule) []GainModes {
var gainMode *C.struct_bladerf_gain_modes
var gainModes []GainModes
count := int(C.bladerf_get_gain_modes((*bladeRF).bladeRF, C.bladerf_module(module), &gainMode))
if count < 1 {
return gainModes
}
first := GainModes{
gainModes: gainMode,
name: C.GoString(gainMode.name),
mode: GainMode(gainMode.mode),
}
gainModes = append(gainModes, first)
for i := 0; i < count-1; i++ {
size := unsafe.Sizeof(*gainMode)
gainMode = (*C.struct_bladerf_gain_modes)(unsafe.Pointer(uintptr(unsafe.Pointer(gainMode)) + size))
gainModes = append(gainModes, GainModes{
gainModes: gainMode,
name: C.GoString(gainMode.name),
mode: GainMode(gainMode.mode),
})
}
return gainModes
}
func SetGainMode(bladeRF *BladeRF, module IOModule, mode GainMode) error {
@ -386,8 +530,9 @@ func SyncRX(bladeRF *BladeRF, bufferSize uintptr) []int16 {
}
type Callback struct {
cb func(data []int16)
results []int16
cb func(data []int16)
results []int16
bufferSize int
}
func InitStream(bladeRF *BladeRF, format Format, numBuffers int, samplesPerBuffer int, numTransfers int, callback func(data []int16)) *Stream {
@ -398,7 +543,7 @@ func InitStream(bladeRF *BladeRF, format Format, numBuffers int, samplesPerBuffe
var res []int16
cb := Callback{cb: callback, results: res}
cb := Callback{cb: callback, results: res, bufferSize: samplesPerBuffer}
C.bladerf_init_stream(
&((stream).stream),

View File

@ -19,6 +19,11 @@ var audioFifo = fifo.NewQueue()
var demodulator demodcore.DemodCore
/*
RX Gain Stage names: lna, rxvga1, rxvga2
TX Gain Stage names: txvga1, txvga2
*/
func ProcessAudio(out []float32) {
if audioFifo.Len() > 0 {
var z = audioFifo.Next().([]float32)
@ -62,6 +67,27 @@ func TestBladeRF(t *testing.T) {
Close(rf)
}
func TestSetGainStage(t *testing.T) {
log.SetVerbosity(log.Debug)
devices := GetDeviceList()
if len(devices) == 0 {
fmt.Println("NO DEVICE")
return
}
rf := OpenWithDevInfo(devices[0])
defer Close(rf)
stages := GetGainStages(&rf, IORX)
fmt.Println(len(stages))
bfRange, _ := GetGainStageRange(&rf, IORX, stages[0])
_ = SetGainStage(&rf, IORX, stages[0], int(bfRange.max))
gain, _ := GetGainStage(&rf, IORX, stages[0])
fmt.Println(gain)
}
func TestStream(t *testing.T) {
var err error
@ -159,6 +185,39 @@ func cb(data []int16) {
}
}
func TestGetGainModes(t *testing.T) {
log.SetVerbosity(log.Debug)
devices := GetDeviceList()
if len(devices) == 0 {
fmt.Println("NO DEVICE")
return
}
rf := OpenWithDevInfo(devices[0])
defer Close(rf)
GetGainModes(&rf, IORX)
}
func TestGetGainRange(t *testing.T) {
log.SetVerbosity(log.Debug)
devices := GetDeviceList()
if len(devices) == 0 {
fmt.Println("NO DEVICE")
return
}
rf := OpenWithDevInfo(devices[0])
defer Close(rf)
bfRange, _ := GetGainRange(&rf, IORX)
fmt.Println(bfRange.max)
}
func TestAsyncStream(t *testing.T) {
log.SetVerbosity(log.Debug)