FunCubelib git clone https://github.com/alanbjohnston/funcubeLib.git sudo apt-get remove libportaudio2 libjack-jackd2-0 sudo apt-get install -y libjack0 sudo apt-get install -y build-essential libfftw3-dev libusb-1.0-0-dev portaudio19-dev libasound2-dev cd funcubeLib sudo make sudo make install // seems to work // FCl go apps sudo apt install -y golang go version # shows installed version cd git clone https://github.com/alanbjohnston/go.git cd go cd mkdir golang mkdir golang/bin mkdir golang/pkg mkdir golang/src mkdir golang/programs vi ~/.profile PATH=$PATH:/usr/local/golang/bin GOPATH=/home/pi/golang export $GOPATH= go build -o github.com/funcube-dev/go/fclib . instead: wget https://go.dev/dl/go1.23.5.linux-armv6l.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.5.linux-armv6l.tar.gz run: /usr/local/go/bin/go # github.com/funcube-dev/go/fclib funcubelibwrap_wrap.cxx:253:10: fatal error: funcubelib/wintypes.h: No such file or directory 253 | #include "funcubelib/wintypes.h" | ^~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. Try: sudo apt-get update sudo apt-get install -y swig pi@cubesatsim4:~/go/fclib $ ./update.sh /usr/local/go/bin/go env -w GO111MODULE=auto intialize packages: go mod init github.com/funcube-dev/go/fcio /usr/local/go/bin/go mod init github.com/funcube-dev/go pi@cubesatsim4:~/go $ /usr/local/go/bin/go mod tidy go env -w GO111MODULE=off Worked!!! pi@cubesatsim4:~/go/app/fcencode $ go run main.go 2025/01/25 16:34:33 Using Config: bindaddress -> 0.0.0.0 commandport -> 64515 dataport -> 64514 file -> idletimeout -> 3 limetxport -> 64516 limetxserver -> limeserver loopfile -> false rate -> 48000 2025/01/25 16:34:33 Lib version 11828 2025/01/25 16:34:33 Done 2025/01/25 16:34:33 Opening command listen socket... 2025/01/25 16:34:33 Opening listen socket... 2025/01/25 16:34:33 Initialised 1 2025/01/25 16:34:33 Ready to Send... 2025/01/25 16:34:33 Listening for commands on socket: 0.0.0.0:64515 2025/01/25 16:34:33 Listening on socket: 0.0.0.0:64514 ......................................................................................................................................................................................................................................^Csignal: interrupt pi@cubesatsim4:~/go/app/fcencode $ echo -n "file='block' dataport=64513" > fcencode.conf dd if=/dev/zero of=block count=1 bs=256 # vi binary :%!xxd :set binary try 01 first pi@cubesatsim4:~/go/app/fcgen $ go run main.go go: warning: ignoring go.mod in $GOPATH /home/pi/go 2025/01/25 17:31:45 Using Config: bindaddress -> 0.0.0.0 commandport -> 64515 dataport -> 64513 file -> block idletimeout -> 3 limetxport -> 64516 limetxserver -> limeserver loopfile -> false rate -> 48000 2025/01/25 17:31:45 Lib version 11828 2025/01/25 17:31:45 Done 2025/01/25 17:31:45 Opening command listen socket... <^2025/01/25 17:31:45 Listening for commands on socket: 0.0.0.0:64515 2025/01/25 17:31:45 Opening listen socket... 2025/01/25 17:31:45 Initialised 1 2025/01/25 17:31:45 Ready to Send... !2025/01/25 17:31:45 Listening on socket: 0.0.0.0:64513 esInit: esPreamble:768 ~~~~~~~~~~~~~~~~~~~~~~-~~~~~~~~~~~~~~~~~~~~~~~~~2025/01/25 17:31:45 Failed to connect dial tcp: lookup limeserver on 192.168.8.1:53: no such host ~~~~~~~~~~~~~~~~~~~.....2025/01/25 17:31:50 Failed to connect dial tcp: lookup limeserver on 192.168.8.1:53: no such host ....^Csignal: interrupt # ncat on 192.168.8.1:53 sudo nc -l 64516 > encoded1 & echo -n "connectport=64516 connectaddress='localhost' frequency=434900000 outdir='/home/pi/go/app/fctelem/data'" > fcdecode.conf go build main.go ./main pi@cubesatsim4:~/go/app/fcgen $ go run main.go go: warning: ignoring go.mod in $GOPATH /home/pi/go 2025/01/25 17:46:05 Using Config: bindaddress -> 0.0.0.0 commandport -> 64515 dataport -> 64513 file -> block idletimeout -> 3 limetxport -> 64516 limetxserver -> localhost loopfile -> false rate -> 48000 2025/01/25 17:46:05 Lib version 11828 2025/01/25 17:46:05 Done 2025/01/25 17:46:05 Opening command listen socket... 2025/01/25 17:46:05 Listening for commands on socket: 0.0.0.0:64515 2025/01/25 17:46:05 Opening listen socket... 2025/01/25 17:46:05 readData 2025/01/25 17:46:05 encodeData <^2025/01/25 17:46:05 Ready to Send... 2025/01/25 17:46:05 Listening on socket: 0.0.0.0:64513 2025/01/25 17:46:05 Initialised 1 !esInit: esPreamble:768 ~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->-~~>->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~esSync:32 ~~~~~~~~esFec:5200 ->->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->-~>->->->->->->->->->->->-~~~~~~~~>->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->->->->->-~~~~>->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->-~~~~~~>->->->->->->->->->->->-~>->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->-~~~~~~~~>->->->->->->->->->~~~~~~~~~~~~~~~~~->->->->->->->->->->->->-~~~~>->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->-~~>->->->~~~~~~~~~~ ~~~~~~~~~~~~~~.->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->-~~>->->->->~~~~~~~~~~~~~~~~->->->->->->->~~~~~~~~->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->-~~~~~~~>->->->->->->->~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->-~~~~~~~~>->->->->->->->->->->->->~~~~~~~~~~~~~~~~~~~~~~->->->->->->->->->->->->->->->->->->->->->->~~~~~~~~~~~~~~~~esPostamble:16 ~~~~~~~~esComplete: ->->->->->->->->->->->->->->->->->->->->->->->->~~.->->-|...........................^Csignal: interrupt Now trying to integrate libfuncube into my code: # export LD_LIBRARY_PATH=/mnt/usb-disk/ariss/lib:/usr/local/lib/iors_common:$LD_LIBRARY_PATH # export LD_LIBRARY_PATH=/usr/local/lib/libfuncube:$LD_LIBRARY_PATH # export LIBRARY_PATH=/usr/local/include/funcubelib/:$LIBRARY_PATH # from: https://github.com/ac2cz/iors_common/blob/master/Debug/install.sh #!/bin/bash LIB_DIR=/usr/local/lib/funcubelib INC_DIR=/usr/local/include/funcubelib if [ ! -d $LIB_DIR ]; then sudo mkdir $LIB_DIR fi if [ ! -d $INC_DIR ]; then sudo mkdir $INC_DIR fi sudo cp common/funcubeLib.h /usr/local/include/funcubelib sudo cp bin/funcubeLib.o /usr/local/lib/funcubelib didn't work full path and get mutex error sudo apt-get install libpthread-stubs0-dev -lpthread since -2 image sudo make clean sudo make output: pi@cubesatsim4:~/funcubeLib $ sudo make clean rm -f bin/*.o bin/*.so bin/*.a rmdir bin pi@cubesatsim4:~/funcubeLib $ sudo make mkdir bin g++ -std=c++14 -O3 -o bin/funcubeLib.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/funcubeLib.cpp g++ -std=c++14 -O3 -o bin/bpskDecoder.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/bpskDecoder.cpp g++ -std=c++14 -O3 -o bin/codecAO40.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/codecAO40.cpp g++ -std=c++14 -O3 -o bin/decode.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/decode.cpp g++ -std=c++14 -O3 -o bin/decodeManager.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/decodeManager.cpp In file included from common/funcubeLib.h:41, from common/decodeManager.cpp:22: common/wintypes.h: In instantiation of ‘void CWorkerThread::Run() [with T = void]’: common/wintypes.h:203:8: required from ‘static void* CWorkerThread::_thread(void*) [with T = void]’ common/wintypes.h:170:48: required from ‘HRESULT CWorkerThread::AddHandle(HANDLE, IWorkerThreadClient*, void*) [with T = void; HRESULT = int; HANDLE = void*]’ common/decodeManager.cpp:78:57: required from here common/wintypes.h:219:39: warning: narrowing conversion of ‘(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout / 1000)’ from ‘DWORD’ {aka ‘unsigned int’} to ‘__time_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~^~~~~ common/wintypes.h:219:65: warning: narrowing conversion of ‘(((long unsigned int)(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout % 1000)) * 1000000)’ from ‘long unsigned int’ to ‘__syscall_slong_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ g++ -std=c++14 -O3 -o bin/decodeWorker.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/decodeWorker.cpp In file included from common/funcubeLib.h:41, from common/decodeWorker.cpp:22: common/wintypes.h: In instantiation of ‘void CWorkerThread::Run() [with T = void]’: common/wintypes.h:203:8: required from ‘static void* CWorkerThread::_thread(void*) [with T = void]’ common/wintypes.h:170:48: required from ‘HRESULT CWorkerThread::AddHandle(HANDLE, IWorkerThreadClient*, void*) [with T = void; HRESULT = int; HANDLE = void*]’ common/decodeWorker.cpp:45:54: required from here common/wintypes.h:219:39: warning: narrowing conversion of ‘(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout / 1000)’ from ‘DWORD’ {aka ‘unsigned int’} to ‘__time_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~^~~~~ common/wintypes.h:219:65: warning: narrowing conversion of ‘(((long unsigned int)(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout % 1000)) * 1000000)’ from ‘long unsigned int’ to ‘__syscall_slong_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ g++ -std=c++14 -O3 -o bin/dongle.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/dongle.cpp g++ -std=c++14 -O3 -o bin/encode.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/encode.cpp g++ -std=c++14 -O3 -o bin/encodeWorker.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/encodeWorker.cpp In file included from common/funcubeLib.h:41, from common/encodeWorker.cpp:22: common/wintypes.h: In instantiation of ‘void CWorkerThread::Run() [with T = void]’: common/wintypes.h:203:8: required from ‘static void* CWorkerThread::_thread(void*) [with T = void]’ common/wintypes.h:170:48: required from ‘HRESULT CWorkerThread::AddHandle(HANDLE, IWorkerThreadClient*, void*) [with T = void; HRESULT = int; HANDLE = void*]’ common/encodeWorker.cpp:41:54: required from here common/wintypes.h:219:39: warning: narrowing conversion of ‘(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout / 1000)’ from ‘DWORD’ {aka ‘unsigned int’} to ‘__time_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~^~~~~ common/wintypes.h:219:65: warning: narrowing conversion of ‘(((long unsigned int)(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout % 1000)) * 1000000)’ from ‘long unsigned int’ to ‘__syscall_slong_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ g++ -std=c++14 -O3 -o bin/fec.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/fec.cpp g++ -std=c++14 -O3 -o bin/fft.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/fft.cpp g++ -std=c++14 -O3 -o bin/firFilter.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/firFilter.cpp g++ -std=c++14 -O3 -o bin/memPool.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/memPool.cpp g++ -std=c++14 -O3 -o bin/oscillator.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/oscillator.cpp g++ -std=c++14 -O3 -o bin/overlappedFft.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/overlappedFft.cpp g++ -std=c++14 -O3 -o bin/peakDetect.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/peakDetect.cpp g++ -std=c++14 -O3 -o bin/peakDetectWorker.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/peakDetectWorker.cpp In file included from common/funcubeLib.h:41, from common/peakDetectWorker.cpp:22: common/wintypes.h: In instantiation of ‘void CWorkerThread::Run() [with T = void]’: common/wintypes.h:203:8: required from ‘static void* CWorkerThread::_thread(void*) [with T = void]’ common/wintypes.h:170:48: required from ‘HRESULT CWorkerThread::AddHandle(HANDLE, IWorkerThreadClient*, void*) [with T = void; HRESULT = int; HANDLE = void*]’ common/peakDetectWorker.cpp:45:54: required from here common/wintypes.h:219:39: warning: narrowing conversion of ‘(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout / 1000)’ from ‘DWORD’ {aka ‘unsigned int’} to ‘__time_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~^~~~~ common/wintypes.h:219:65: warning: narrowing conversion of ‘(((long unsigned int)(((CWorkerThread*)this)->CWorkerThread::m_dwTimeout % 1000)) * 1000000)’ from ‘long unsigned int’ to ‘__syscall_slong_t’ {aka ‘long int’} [-Wnarrowing] 219 | struct timespec ts = { m_dwTimeout/1000, (m_dwTimeout%1000) * 1000000L }; | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ g++ -std=c++14 -O3 -o bin/rollingAverage.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/rollingAverage.cpp g++ -std=c++14 -O3 -o bin/stopWatch.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/stopWatch.cpp g++ -std=c++14 -O3 -o bin/sampleStopWatch.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/sampleStopWatch.cpp g++ -std=c++14 -O3 -o bin/viterbi.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/viterbi.cpp gcc -O3 -o bin/hid-libusb.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/hid-libusb.c gcc -O3 -o bin/fcd.o -pthread -I/usr/include/libusb-1.0 -fPIC -DLINUX -D_LINUX -c common/fcd.c ar -r bin/libfuncube.a bin/funcubeLib.o bin/bpskDecoder.o bin/codecAO40.o bin/decode.o bin/decodeManager.o bin/decodeWorker.o bin/dongle.o bin/encode.o bin/encodeWorker.o bin/fec.o bin/fft.o bin/firFilter.o bin/memPool.o bin/oscillator.o bin/overlappedFft.o bin/peakDetect.o bin/peakDetectWorker.o bin/rollingAverage.o bin/stopWatch.o bin/sampleStopWatch.o bin/viterbi.o bin/hid-libusb.o bin/fcd.o ar: creating bin/libfuncube.a pi@cubesatsim4:~/funcubeLib $ pi@cubesatsim4:~/test $ g++ -std=c++14 -O3 -pthread -fPIC -DLINUX -D_LINUX -I /usr/local/include/funcubelib/ main.c main.c:3:1: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type] 3 | main() { | ^~~~ pi@cubesatsim4:~/test $ Now get: pi@cubesatsim4:~/test $ g++ -std=c++14 -I /usr/local/include/funcubelib/ main.c -lfuncube -lpthread -lrt -fPIC In file included from main.h:3, from main.c:2: /usr/local/include/funcubelib/funcubeLib.h:48:23: error: expected initializer before ‘S8’ 48 | typedef signed __int8 S8; | ^~ /usr/local/include/funcubelib/funcubeLib.h:49:24: error: expected initializer before ‘S16’ 49 | typedef signed __int16 S16; | ^~~ /usr/local/include/funcubelib/funcubeLib.h:50:24: error: expected initializer before ‘S32’ 50 | typedef signed __int32 S32; | ^~~ /usr/local/include/funcubelib/funcubeLib.h:51:25: error: expected initializer before ‘U8’ 51 | typedef unsigned __int8 U8; | ^~ /usr/local/include/funcubelib/funcubeLib.h:52:26: error: expected initializer before ‘U16’ 52 | typedef unsigned __int16 U16; | ^~~ /usr/local/include/funcubelib/funcubeLib.h:53:26: error: expected initializer before ‘U32’ 53 | typedef unsigned __int32 U32; | ^~~ /usr/local/include/funcubelib/funcubeLib.h:69:7: error: ‘FLOAT’ does not name a type 69 | const FLOAT HZ_PER_BIN = 11.71875F; | ^~~~~ /usr/local/include/funcubelib/funcubeLib.h:71:7: error: ‘DOUBLE’ does not name a type 71 | const DOUBLE PI = 3.14159265358979323846; | ^~~~~~ /usr/local/include/funcubelib/funcubeLib.h:72:7: error: ‘DOUBLE’ does not name a type 72 | const DOUBLE HALF_PI = 1.57079632679489661923; | ^~~~~~ /usr/local/include/funcubelib/funcubeLib.h:73:7: error: ‘DOUBLE’ does not name a type 73 | const DOUBLE TWO_PI = 6.28318530717958647692; | ^~~~~~ In file included from main.h:3, from main.c:2: /usr/local/include/funcubelib/funcubeLib.h:89:24: error: expected ‘)’ before ‘*’ token 89 | typedef void (__stdcall * OnDataCallback)(BYTE* buffer, ULONG bufferSize, FLOAT frequency, INT errorCount); | ~ ^~ | ) /usr/local/include/funcubelib/funcubeLib.h:90:24: error: expected ‘)’ before ‘*’ token 90 | typedef void (__stdcall * OnDataReadyCallback)(); | ~ ^~ | ) /usr/local/include/funcubelib/funcubeLib.h:91:24: error: expected ‘)’ before ‘*’ token 91 | typedef void (__stdcall * OnLogMessageCallback)(int logLevel, const CHAR *logMessage); | ~ ^~ | ) /usr/local/include/funcubelib/funcubeLib.h:92:9: error: ISO C++ forbids declaration of ‘BOOL’ with no type [-fpermissive] 92 | typedef BOOL (__stdcall * DeviceEnumCallback)(LPCSTR name, LPCSTR apiName, int index, int inChannels, int outChannels); | ^~~~ /usr/local/include/funcubelib/funcubeLib.h:92:9: error: typedef ‘BOOL’ is initialized (use ‘decltype’ instead) /usr/local/include/funcubelib/funcubeLib.h:92:15: error: ‘__stdcall’ was not declared in this scope 92 | typedef BOOL (__stdcall * DeviceEnumCallback)(LPCSTR name, LPCSTR apiName, int index, int inChannels, int outChannels); | ^~~~~~~~~ /usr/local/include/funcubelib/funcubeLib.h:92:27: error: ‘DeviceEnumCallback’ was not declared in this scope 92 | typedef BOOL (__stdcall * DeviceEnumCallback)(LPCSTR name, LPCSTR apiName, int index, int inChannels, int outChannels); | ^~~~~~~~~~~~~~~~~~ /usr/local/include/funcubelib/funcubeLib.h:123:8: error: expected constructor, destructor, or type conversion before ‘(’ token 123 | STDAPI_(UINT) Library_GetVersion(); | ^ /usr/local/include/funcubelib/funcubeLib.h:124:8: error: expected constructor, destructor, or type conversion before ‘(’ token 124 | STDAPI_(BOOL) Library_CheckFftwExists(); | ^ /usr/local/include/funcubelib/funcubeLib.h:125:8: error: expected constructor, destructor, or type conversion before ‘(’ token 125 | STDAPI_(BOOL) Library_SetOnLogMessageCallback(OnLogMessageCallback callbackProc); | ^ /usr/local/include/funcubelib/funcubeLib.h:127:8: error: expected constructor, destructor, or type conversion before ‘(’ token 127 | STDAPI_(BOOL) Dongle_Initialize(); | ^ /usr/local/include/funcubelib/funcubeLib.h:128:8: error: expected constructor, destructor, or type conversion before ‘(’ token 128 | STDAPI_(BOOL) Dongle_Shutdown(); | ^ /usr/local/include/funcubelib/funcubeLib.h:129:8: error: expected constructor, destructor, or type conversion before ‘(’ token 129 | STDAPI_(BOOL) Dongle_Exists(); | ^ /usr/local/include/funcubelib/funcubeLib.h:130:8: error: expected constructor, destructor, or type conversion before ‘(’ token 130 | STDAPI_(ULONG) Dongle_GetFrequency(); | ^ /usr/local/include/funcubelib/funcubeLib.h:131:8: error: expected constructor, destructor, or type conversion before ‘(’ token 131 | STDAPI_(BOOL) Dongle_SetFrequency(ULONG frequency); | ^ /usr/local/include/funcubelib/funcubeLib.h:132:8: error: expected constructor, destructor, or type conversion before ‘(’ token 132 | STDAPI_(BOOL) Dongle_BiasTEnable(BOOL enable); | ^ /usr/local/include/funcubelib/funcubeLib.h:134:8: error: expected constructor, destructor, or type conversion before ‘(’ token 134 | STDAPI_(BOOL) Decode_Initialize(); | ^ /usr/local/include/funcubelib/funcubeLib.h:135:8: error: expected constructor, destructor, or type conversion before ‘(’ token 135 | STDAPI_(BOOL) Decode_Shutdown(); | ^ /usr/local/include/funcubelib/funcubeLib.h:136:8: error: expected constructor, destructor, or type conversion before ‘(’ token 136 | STDAPI_(BOOL) Decode_EnumDevices(DeviceEnumCallback callbackProc); | ^ /usr/local/include/funcubelib/funcubeLib.h:137:8: error: expected constructor, destructor, or type conversion before ‘(’ token 137 | STDAPI_(BOOL) Decode_Start(const char* inDeviceName, const char* outDeviceName, BOOL stereoIn, BOOL isFCDongle); | ^ /usr/local/include/funcubelib/funcubeLib.h:138:8: error: expected constructor, destructor, or type conversion before ‘(’ token 138 | STDAPI_(BOOL) Decode_StartByIndex(int inDeviceIdx, int outDeviceIdx, BOOL stereoIn, BOOL isFCDongle); | ^ /usr/local/include/funcubelib/funcubeLib.h:139:8: error: expected constructor, destructor, or type conversion before ‘(’ token 139 | STDAPI_(BOOL) Decode_Stop(); | ^ /usr/local/include/funcubelib/funcubeLib.h:140:8: error: expected constructor, destructor, or type conversion before ‘(’ token 140 | STDAPI_(VOID) Decode_SetManualTuneFrequency(FLOAT newVal); | ^ /usr/local/include/funcubelib/funcubeLib.h:141:8: error: expected constructor, destructor, or type conversion before ‘(’ token 141 | STDAPI_(VOID) Decode_SetAutoTuneFrequencyRange(FLOAT low, FLOAT high); | ^ /usr/local/include/funcubelib/funcubeLib.h:142:8: error: expected constructor, destructor, or type conversion before ‘(’ token 142 | STDAPI_(BOOL) Decode_CollectFftOutput(FLOAT* buffer, ULONG* bufferSize); | ^ /usr/local/include/funcubelib/funcubeLib.h:143:8: error: expected constructor, destructor, or type conversion before ‘(’ token 143 | STDAPI_(BOOL) Decode_CollectFftOutputByRange(FLOAT freqStart, FLOAT freqEnd, FLOAT* buffer, ULONG* bufferSize); | ^ /usr/local/include/funcubelib/funcubeLib.h:144:8: error: expected constructor, destructor, or type conversion before ‘(’ token 144 | STDAPI_(BOOL) Decode_SetOnDataCallback(OnDataCallback); | ^ /usr/local/include/funcubelib/funcubeLib.h:145:8: error: expected constructor, destructor, or type conversion before ‘(’ token 145 | STDAPI_(VOID) Decode_EnableMonitorAudio(BOOL enable); | ^ /usr/local/include/funcubelib/funcubeLib.h:146:8: error: expected constructor, destructor, or type conversion before ‘(’ token 146 | STDAPI_(VOID) Decode_RemoveDCOffset(BOOL remove); | ^ /usr/local/include/funcubelib/funcubeLib.h:147:8: error: expected constructor, destructor, or type conversion before ‘(’ token 147 | STDAPI_(BOOL) Decode_RefreshAudioDevices(); | ^ /usr/local/include/funcubelib/funcubeLib.h:148:8: error: expected constructor, destructor, or type conversion before ‘(’ token 148 | STDAPI_(BOOL) Decode_IsStarted(); | ^ /usr/local/include/funcubelib/funcubeLib.h:149:8: error: expected constructor, destructor, or type conversion before ‘(’ token 149 | STDAPI_(BOOL) Decode_SetTrackingParams(int mode); | ^ /usr/local/include/funcubelib/funcubeLib.h:150:8: error: expected constructor, destructor, or type conversion before ‘(’ token 150 | STDAPI_(VOID) Decode_SetPeakDetectParams(const UINT maxCalc, const DOUBLE delaySecs); | ^ /usr/local/include/funcubelib/funcubeLib.h:151:8: error: expected constructor, destructor, or type conversion before ‘(’ token 151 | STDAPI_(BOOL) Decode_SetWorkerCount(ULONG num); | ^ /usr/local/include/funcubelib/funcubeLib.h:152:8: error: expected constructor, destructor, or type conversion before ‘(’ token 152 | STDAPI_(BOOL) Decode_GetWorkerPeaks(FLOAT* frequency, ULONG* bufferLength); | ^ /usr/local/include/funcubelib/funcubeLib.h:153:8: error: expected constructor, destructor, or type conversion before ‘(’ token 153 | STDAPI_(BOOL) Decode_GetWorkerAvailability(UINT* availability, ULONG* bufferLength); | ^ /usr/local/include/funcubelib/funcubeLib.h:154:8: error: expected constructor, destructor, or type conversion before ‘(’ token 154 | STDAPI_(BOOL) Decode_ExcludePeaks(FLOAT* frequency, ULONG* bufferLength); | ^ /usr/local/include/funcubelib/funcubeLib.h:155:8: error: expected constructor, destructor, or type conversion before ‘(’ token 155 | STDAPI_(BOOL) Decode_SetOnDataReadyCallback(OnDataReadyCallback); | ^ /usr/local/include/funcubelib/funcubeLib.h:156:8: error: expected constructor, destructor, or type conversion before ‘(’ token 156 | STDAPI_(BOOL) Decode_CollectLastData(BYTE* buffer, ULONG* bufferSize, FLOAT* freq, INT* errorCount); | ^ /usr/local/include/funcubelib/funcubeLib.h:158:23: error: expected constructor, destructor, or type conversion before ‘Decode_LastError’ 158 | STDAPI_(const char *) Decode_LastError(); | ^~~~~~~~~~~~~~~~ /usr/local/include/funcubelib/funcubeLib.h:160:8: error: expected constructor, destructor, or type conversion before ‘(’ token 160 | STDAPI_(BOOL) Encode_Initialize(); | ^ /usr/local/include/funcubelib/funcubeLib.h:161:8: error: expected constructor, destructor, or type conversion before ‘(’ token 161 | STDAPI_(BOOL) Encode_Shutdown(); | ^ /usr/local/include/funcubelib/funcubeLib.h:162:8: error: expected constructor, destructor, or type conversion before ‘(’ token 162 | STDAPI_(BOOL) Encode_CanCollect(); | ^ /usr/local/include/funcubelib/funcubeLib.h:163:8: error: expected constructor, destructor, or type conversion before ‘(’ token 163 | STDAPI_(BOOL) Encode_AllDataCollected(); | ^ /usr/local/include/funcubelib/funcubeLib.h:164:8: error: expected constructor, destructor, or type conversion before ‘(’ token 164 | STDAPI_(BOOL) Encode_CollectSamples(BYTE* buffer, ULONG* bufferSize); | ^ /usr/local/include/funcubelib/funcubeLib.h:165:8: error: expected constructor, destructor, or type conversion before ‘(’ token 165 | STDAPI_(BOOL) Encode_PushData(const BYTE* buffer, const ULONG bufferSize); | ^ main.c:4:1: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type] 4 | main() { | ^~~~ pi@cubesatsim4:~/test $ Test working! pi@cubesatsim4:~/test $ g++ -std=c++14 -O3 -DLINUX -D_LINUX -I /usr/local/include/funcubelib/ main.c -lfuncube -lpthread -lrt -fPIC main.cpp:4:1: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type] 4 | main() { | ^~~~ pi@cubesatsim4:~/test $ IMPORTANT: added sudo apt-get install fftw3 then: pi@cubesatsim4:~/test $ g++ -std=c++14 -O3 -DLINUX -D_LINUX -I /usr/local/include/funcubelib/ -I/usr/include/libusb-1.0 -L/usr/lib main.cpp -lfuncube -lpthread -lrt -fPIC -lasound -ljack -lportaudio -lm -lfftw3 -lfftw3f fixed fft errors. Now usb: pi@cubesatsim4:~/test $ g++ -std=c++14 -O3 -DLINUX -D_LINUX -I /usr/local/includ e/funcubelib/ -I/usr/include/libusb-1.0 -L/usr/lib main.cpp -lfuncube -lpthread -lrt -fPIC -lasound -ljack -lportaudio -lm -lfftw3 -lfftw3f -lusb-1.0 main.cpp:4:1: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type] 4 | main() { | ^~~~ pi@cubesatsim4:~/test $ ls -all total 212 drwxr-xr-x 2 pi pi 4096 Jan 26 12:37 . drwxr-xr-x 33 pi pi 4096 Jan 26 09:51 .. -rwxr-xr-x 1 pi pi 197288 Jan 26 12:37 a.out -rw-r--r-- 1 pi pi 158 Jan 26 12:15 main.cpp -rw-r--r-- 1 pi pi 64 Jan 26 09:57 main.h pi@cubesatsim4:~/test $ close with fc-l-noax pi@cubesatsim4:~/CubeSatSim $ make debug g++ -std=c++14 -O3 -DLINUX -D_LINUX -DDEBUG_LOGGING -o cubesatsim -Wall -Wextra -L./ -L/usr/lib/ -I /usr/local/include/funcubelib -I/usr/local/include/ -I/usr/include/libusb-1.0 TelemEncoding.o codecAO40.o main.o -lwiringPi -lm -lfuncube -lpthread -lrt -fPIC -lfuncube -lpthread -lrt -fPIC -lasound -ljack -lportaudio -lfftw3 -lfftw3f -lusb-1.0 /usr/bin/ld: main.o: in function `get_tlm_fox()': main.c:(.text+0x1e30): undefined reference to `update_rs(unsigned char*, unsigned char)' /usr/bin/ld: main.c:(.text+0x1eb8): undefined reference to `update_rs(unsigned char*, unsigned char)' /usr/bin/ld: main.o: in function `get_tlm_fc()': main.c:(.text+0x46b0): undefined reference to `encode(unsigned char*, int)' collect2: error: ld returned 1 exit status make: *** [Makefile:46: cubesatsim] Error 1 pi@cubesatsim4:~/CubeSatSim $ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* Use of `sizeof` here assumes that `data` is a proper array and not a pointer */ memcpy(&buffer[count], data, sizeof(data)); /* Increase counter */ count += sizeof(data); Got working with just ao40 files added. With Sat Id 00 works with FunCube-1 Dashboard - shows "FC-EM" in Dashboard. Tried JY1 with Sat Id of 11 and it kind of works in JY1Sat Dashboard JY1Sat SSDV encode/decode used for encoding a JPEG into 256 blocks: https://github.com/daniestevez/gr-satellites/blob/80265836ed4c12cc9d15037678f3e7e87f23a96d/docs/source/utilities.rst#L8 Online FUncube TLM decoder: https://www.spacetk.com/onlinedecodertmparam.html JY1Sat data document: https://funcube.org.uk/wp-content/uploads/2018/11/jy1sat_data_budget-with-tlm-equations-2f.xls from https://funcube.org.uk/2018/11/15/jy1sat/ funcube format with 'extended' defined: https://github.com/daniestevez/gr-satellites/blob/80265836ed4c12cc9d15037678f3e7e87f23a96d/python/telemetry/funcube.py#L511 ChatGPT explanation: "This code defines a data structure for parsing or constructing binary data using the **`construct`** module in Python. The `construct` module allows you to define complex binary formats in a declarative way. Here’s a breakdown of how the code works: ### 1. **Frame Structure Definition** ```python Frame = Struct( 'header' / Header, 'extheader' / If(lambda c: c.header.satid == 'extended', Byte), 'realtime' / Switch(lambda c: c.header.satid, { 'FC1EM': RealTimeFC1, 'FC1FM': RealTimeFC1, 'FC2': RealTimeFC2, 'extended': Switch(lambda c: c.extheader, { 0x08: RealTimeNayif1, }, default=Bytes(54)), }), 'payload' / If(lambda c: hasattr(c.header.frametype, '__getitem__'), Switch(lambda c: c.header.frametype[:2], { 'WO': Bytes(200), 'HR': HRPayload, 'FM': FitterMessage, }) ), ) ``` This creates a `Frame` object using the `Struct` construct from the `construct` library. A `Struct` allows you to specify a sequence of fields that make up the structure of the binary data. ### 2. **Fields Breakdown** #### a. `'header' / Header` - **`'header'`** is the field name, and **`Header`** is a custom format (likely a `Struct` or some other construct) defined elsewhere in your code. This represents the main header of the frame. #### b. `'extheader' / If(lambda c: c.header.satid == 'extended', Byte)` - **`'extheader'`** is a conditional field. - **`If(lambda c: c.header.satid == 'extended', Byte)`**: This checks if the `satid` value inside the `header` is `'extended'`. If this condition is true, it expects an additional byte (`Byte`) to represent the `extheader`. If the condition is false, no data is read for this field. #### c. `'realtime' / Switch(lambda c: c.header.satid, {...})` - **`'realtime'`** is a dynamic field that depends on the `satid` in the `header`. The **`Switch`** statement evaluates the `satid` and chooses one of several possible formats based on its value. - The possible cases for `satid` are: - **`'FC1EM'`** and **`'FC1FM'`**: These both map to the same format, `RealTimeFC1`. - **`'FC2'`**: This maps to the `RealTimeFC2` format. - **`'extended'`**: In this case, there's another switch that evaluates `extheader` and uses the format `RealTimeNayif1` if `extheader == 0x08`. If `extheader` has any other value, it defaults to reading 54 bytes (`Bytes(54)`). #### d. `'payload' / If(lambda c: hasattr(c.header.frametype, '__getitem__'), ...)` - **`'payload'`** is a conditional field. - It checks if `framelist.frametype` has a method called `__getitem__`, which indicates that `framelist.frametype` is a sequence (like a list or string). If true, it further checks the first two characters of `framelist.frametype` using another **`Switch`** statement: - **`'WO'`**: This corresponds to reading 200 bytes (`Bytes(200)`). - **`'HR'`**: This corresponds to a custom format, `HRPayload`. - **`'FM'`**: This corresponds to a custom format, `FitterMessage`. ### 3. **Summary of Key Concepts:** - **`Struct`**: Used to define the overall structure of the frame, composed of multiple fields. - **`If`**: A conditional field that only appears if a certain condition is met. - **`Switch`**: A field that switches between different formats based on the value of some other data (in this case, the value of `satid` or `framelist.frametype`). - **`Bytes(n)`**: Reads `n` bytes directly from the binary stream. - **`RealTimeFC1`, `RealTimeFC2`, etc.**: These are likely predefined `Structs` or `Construct` types representing different parts of the frame data, which are used depending on conditions. ### 4. **What this code is doing:** The code is defining how a "frame" of data is structured. Based on the values in the `header`, it determines which additional fields to parse and what format to expect. For example: - If `satid` is `'extended'`, it includes an extra byte (`extheader`). - Based on the `satid`, it chooses different formats for the `realtime` field. - The `payload` field also depends on the type of frame, which is determined by the `framelist.frametype`. This kind of structure is useful for parsing binary protocols where different types of frames can have different formats, and the format depends on values in the data itself (like `satid` or `framelist.frametype`). Does this help clarify the code for you? If you'd like further explanation on any specific part, let me know!" Nayif info: https://funcube.org.uk/2017/02/08/nayif-1-launch-date-now-confirmed/ has test code: http://download.funcube.org.uk/nayif1_testfile.funcubebin JY-1 image decoding: https://github.com/daniestevez/gr-satellites/blob/main/apps/gr_satellites_ssdv chatgpt: Putting it all together First line filters the data: The first column must be 0xe0 or 0xe1. The second column must be 0x10. The data is then trimmed to only keep columns starting from index 56. Second line further refines the dataset: It looks for rows where the first column is 0x55 and the second column is 0x68. All columns of these rows are kept. fctelem pi@cubesatsim4:~/go/app/fctelem $ cat fcdecode.conf mkdir data echo -n "connectport=64513 connectaddress='localhost' frequency=434900000 outdir='/home/pi/go/app/fctelem/data'" > fcdecode.conf pi@cubesatsim4:~/go/app/fctelem $ go run main.go go: warning: ignoring go.mod in $GOPATH /home/pi/go 2025/02/05 22:19:18 Using Config: audiodevicein -> -1 audiodeviceout -> -1 biast -> false bindaddress -> 0.0.0.0 commandport -> 64513 connectaddress -> encodeserver connectlocations -> [] connectport -> 64514 dataport -> 64513 exclude -> [] file -> block1 frequency -> 1.4586e+08 limetxserver -> localhost numdecoders -> 5 outdir -> 2025/02/05 22:19:18 Got audioLib version 11828 2025/02/05 22:19:18 Failed to initialise FUNcube Dongle * Check the Dongle is plugged in, maybe try a powered usb hub? * Also ensure the docker container is starting with the --privileged flag, as device access is required exit status 1 install FCD: sudo apt-get install cmake libsoapysdr-dev soapysdr-tools libhidapi-dev libasound2-dev -y Also: # build cd git clone https://github.com/pothosware/SoapyFCDPP.git cd SoapyFCDPP mkdir build; cd build cmake ../ make && sudo make install # Will put the driver in /usr/local/lib/SoapySDR/module0.6 cp home/pi/SoapyFCDPP/build/libFCDPPSupport.so /usr/lib/sdrpp/plugins/ echo 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb56", GROUP:="users", MODE:="0666", SYMLINK+="FCD" SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb31", GROUP:="users", MODE:="0666", SYMLINK+="FCDPP"' >> 81-funcube.rules sudo mv 81-funcube.rules /etc/udev/rules.d/81-funcube.rules Now: pi@cubesatsim4:~/go/app/fctelem $ go run main.go go: warning: ignoring go.mod in $GOPATH /home/pi/go 2025/02/05 22:35:28 Using Config: audiodevicein -> -1 audiodeviceout -> -1 biast -> false bindaddress -> 0.0.0.0 commandport -> 64513 connectaddress -> localhost connectlocations -> [] connectport -> 64513 exclude -> [] frequency -> 434900000 numdecoders -> 5 outdir -> /home/pi/go/app/fctelem/data 2025/02/05 22:35:28 Got audioLib version 11828 2025/02/05 22:35:28 Found and Initialised FUNcube Dongle. 2025/02/05 22:35:28 Initialised Decode workers. 2025/02/05 22:35:28 Set decode callback function. 2025/02/05 22:35:28 Set FUNcube Dongle frequency:434900000Hz 2025/02/05 22:35:28 Set FUNcube Dongle 5V Bias-T OFF 2025/02/05 22:35:28 *** Starting decode workers (may produce a few ALSA errors, just ignore!) *** ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.front.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM front ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround51.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround21 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround51.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround21 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround40.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround40 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround51.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround41 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround51.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround50 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround51.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround51 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.surround71.0:CARD=0' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM surround71 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM iec958 ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM spdif ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_hdmi.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2' ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM spdif ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline 2025/02/05 22:35:52 *** Started decode workers, waiting for packet decodes *** 2025/02/05 22:35:52 Opening command listen socket... v[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /api/v1/stats --> main.serveStats.func1 (3 handlers) [GIN-debug] Listening and serving HTTP on 0.0.0.0:64513 2025/02/05 22:35:52 Starting send worker for: localhost:64513 K|DFDFDFDFDFTC|| K|DFDFDFDFDFTC|| S:515.625S:-515.625K|DNDNDFDFDFTC|| S:82945.3S:82359.4K|DNDNDNDNDFTC|| S:-82476.6K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDFDFDNTC|| S:85125S:-85593.8K|DNDFDFDNDNTC|| S:82570.3S:-83226.6K|DNDNDFDNDNTC|| S:-82640.6K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDFDFDNTC|| S:85289.1S:539.062K|DNDFDFDNDNTC|| S:82500S:83132.8K|DNDNDFDNDNTC|| S:-82382.8K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDFDFDNTC|| S:644.531S:1710.94K|DNDFDFDNDNTC|| S:-91617.2S:-90937.5K|DNDNDFDNDNTC|| S:82406.2K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDFDFDNTC|| S:4101.56S:1875K|DNDFDFDNDNTC|| S:3539.06S:6281.25K|DNDNDFDNDNTC|| S:492.188K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| K|DNDNDNDNDN| Data ready for collect Decoded Frequency: 4118.63Hz Error Count: 0 data: e0 10 0e 40 e5 40 e6 0e 40 00 00 00 00 00 77 8a 80 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 02 00 0f f8 55 68 01 00 01 14 10 38 0c 00 08 40 fc 2c 86 e6 30 09 f4 fb dd 68 03 e2 a8 ab 37 ba 7d de 9d 2a c7 77 03 46 cc 32 bd c1 1e c4 50 34 fb b3 60 6f c4 27 ec c1 f6 19 32 3a d0 05 6a 2a f5 b6 8f 7b 78 91 34 29 11 f3 b3 e5 ab 4e 8a cd ce 38 04 e7 b5 25 ce 91 7b 68 92 b4 c9 10 f2 b1 e6 2a ce 8c c9 db 90 0e 68 02 95 15 2d bd b4 d7 52 79 70 46 5d b1 b8 fb 0f 53 e9 53 5c e9 57 b6 76 e9 71 34 3f b8 7e 16 44 75 75 3f 8a 93 40 15 28 a7 c1 04 97 37 11 c1 0a ee 92 46 0a 8b 9c 64 9a d1 bc f0 e6 ad 61 6a f7 37 36 9b 22 4c 6e 6f 31 0e 32 71 d8 d0 06 5d 15 7e df 44 d4 6e 61 8e 68 ad fe 49 4e 23 2e ea 9b cf fb 39 ^+v^+v->K|DNDNDNDNDN| -|K|DNDNDFDNDNTC|| S:1804.69K|DNDNDFDFDNTC|| S:6257.81S:-515.625K|DNDNDFDNDNTC|| S:515.625K|DNDNDNDNDN| Data ready for collect Decoded Frequency: 4106.84Hz Error Count: 0 data: e1 10 0e 40 e5 40 e6 0e 3c 00 00 00 00 00 7a 4a 80 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 03 00 0f f8 55 68 01 00 02 14 10 38 17 00 0d 3c fe 14 b6 fa 16 a5 75 e7 08 ad c6 e8 0e 25 57 91 10 a7 d4 13 40 1f e2 a8 ab 16 f6 33 dd 79 be 4f 96 7c a1 b9 f7 4a 8b c7 af 27 9a af 40 05 14 00 58 80 06 49 ed 57 2f 74 9b ed 3e 58 a2 ba b7 29 24 a3 28 bb 83 13 f9 50 05 3a 2a f9 d1 35 11 0c b2 8b 7d cb 17 fa c0 8e ac c9 f5 00 e4 54 36 ba 7d d5 e2 3c 90 45 98 d3 ef bb 30 45 5f ab 1e 28 02 b5 15 3d e5 94 f6 12 ac 57 08 15 d9 43 8c 38 60 41 e8 72 2a 0a 00 28 a2 ac 4b a7 dd c1 65 0d e4 90 95 b7 9c 91 1b e4 73 40 15 e8 a2 ae c5 a4 df 4b 6e b7 02 10 91 3f dc 79 64 58 c3 7d 37 11 9a 00 a5 45 4b 73 6b 3d 9c c6 1b 98 ^+v^+v->K|DNDNDNDNDN| -|K|DNDNDNDNDN| Open browser to: https://github.com/alanbjohnston/go/releases/tag/v0.1 Download usbreset 04d8:fb31 cd ~/go/app/fctelem or cd ~/fctelem ./fctelem | python3 /home/pi/CubeSatSim/groundstation/fc_block_decode.py chromium-browser https://raspberrypi.com https://time.is/London --kiosk --noerrdialogs --disable-infobars --no-first-run --ozone-platform=wayland --enable-features=OverlayScrollbar --start-maximized pkill -o chromium &>/dev/null chromium-browser https://raspberrypi.com https://time.is/London --noerrdialogs --disable-infobars --no-first-run --ozone-platform=wayland --enable-features=OverlayScrollbar --start-maximized graphana sudo mkdir -p /etc/apt/keyrings/ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list sudo apt-get update sudo apt-get install -y grafana sudo /bin/systemctl enable grafana-server sudo /bin/systemctl start grafana-server fcdctl install libusb failed. had to cleanup due to corruption: cat /var/lib/dpkg/info/python3-pip.list sudo rm /var/lib/dpkg/info/python3-pip.list sudo apt install python3-pip --reinstall From Duncan on 6/12/25: Hi Alan, Here's the complete list is Sat IDs, with SAT SIM in there too... Dec Bin HEX 0 0000 0000 00 FUNcube EM 1 0000 0001 01 Ukube 2 0000 0010 02 FUNcube-1 3 0000 0011 03 EXTENDED PROTOCOL START 7 0000 0111 07 ESEO 11 0000 1011 0B NAYIF-1 15 0000 1111 0F JY1SAT EM 19 0001 0011 13 JY1SAT FM 23 0001 0111 17 Reserved SSC 27 0001 1011 1B Reserved SSC 31 0001 1111 1F Jovian-1 EM 35 0010 0011 23 Jovian-1 251 1111 1011 FB SAT SIM 255 1111 1111 FF SUPER EXTENDED PROTOCOL START