/
BaseFrontend.go
105 lines (91 loc) · 2.27 KB
/
BaseFrontend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package Frontend
import (
"github.com/opensatelliteproject/SatHelperApp/Logger"
"unsafe"
)
const SampleTypeFloatIQ = 0
const SampleTypeS16IQ = 1
const SampleTypeS8IQ = 2
type SampleCallbackData struct {
ComplexArray []complex64
Int16Array []int16
Int8Array []int8
SampleType int
NumSamples int
}
type SamplesCallback func(data SampleCallbackData)
type GoCallback struct {
callback SamplesCallback
}
func NewGoCallback() GoCallback {
return GoCallback{}
}
func (p *GoCallback) Info(str string) {
SLog.Info("%s", str)
}
func (p *GoCallback) Error(str string) {
SLog.Error("%s", str)
}
func (p *GoCallback) Warn(str string) {
SLog.Warn("%s", str)
}
func (p *GoCallback) Debug(str string) {
SLog.Debug("%s", str)
}
func (p *GoCallback) CbFloatIQ(data uintptr, length int) {
const arrayLen = 1 << 20
arr := (*[arrayLen]complex64)(unsafe.Pointer(data))[:length:length]
if p.callback != nil {
p.callback(SampleCallbackData{
ComplexArray: arr,
NumSamples: length,
SampleType: SampleTypeFloatIQ,
})
}
}
func (p *GoCallback) CbS16IQ(data uintptr, length int) {
// Length times two, because each sample contains an I and a Q in S16
const arrayLen = 1 << 20
var pairLength = length * 2
arr := (*[arrayLen]int16)(unsafe.Pointer(data))[:pairLength:pairLength]
if p.callback != nil {
p.callback(SampleCallbackData{
Int16Array: arr,
NumSamples: length,
SampleType: SampleTypeS16IQ,
})
}
}
func (p *GoCallback) CbS8IQ(data uintptr, length int) {
// Length times two, because each sample contains an I and a Q in S8
const arrayLen = 1 << 20
var pairLength = length * 2
arr := (*[arrayLen]int8)(unsafe.Pointer(data))[:pairLength:pairLength]
if p.callback != nil {
p.callback(SampleCallbackData{
Int8Array: arr,
NumSamples: length,
SampleType: SampleTypeS8IQ,
})
}
}
type BaseFrontend interface {
SetSampleRate(sampleRate uint32) uint32
SetCenterFrequency(centerFrequency uint32) uint32
GetAvailableSampleRates() []uint32
Start()
Stop()
SetAntenna(value string)
SetAGC(agc bool)
SetGain1(value uint8)
SetGain2(value uint8)
SetGain3(value uint8)
SetBiasT(value bool)
GetCenterFrequency() uint32
GetName() string
GetShortName() string
GetSampleRate() uint32
SetSamplesAvailableCallback(cb SamplesCallback)
Init() bool
Destroy()
}