77#include <mir_sdr.h>
88
99#include <stdint.h>
10+ #include <stdlib.h>
11+
12+ #define SAMPLE_RATE (8000000)
13+
14+ volatile int working = 0 ;
15+ double freq = 200 ;
16+ double desiredfreq = 200 ;
1017
1118void tsdrplugin_getName (char * name ) {
1219 strcpy (name , "TSDR Mirics SDR Plugin" );
1320}
1421
1522uint32_t tsdrplugin_setsamplerate (uint32_t rate ) {
16- printf ("Mirics setsamplerate %d\n" , rate );
17- return TSDR_NOT_IMPLEMENTED ;
23+ return SAMPLE_RATE ;
1824}
1925
2026uint32_t tsdrplugin_getsamplerate () {
21- printf ("Mirics getsamplerate\n" );
22- return TSDR_NOT_IMPLEMENTED ;
27+ return SAMPLE_RATE ;
2328}
2429
2530int tsdrplugin_setbasefreq (uint32_t freq ) {
26- printf ( "Mirics setbasefreq %d\n" , freq ) ;
27- return TSDR_NOT_IMPLEMENTED ;
31+ desiredfreq = freq ;
32+ return TSDR_OK ;
2833}
2934
3035int tsdrplugin_stop (void ) {
31- printf ( "Mirics stop\n" ) ;
32- return TSDR_NOT_IMPLEMENTED ;
36+ working = 0 ;
37+ return TSDR_OK ;
3338}
3439
3540int tsdrplugin_setgain (float gain ) {
@@ -38,16 +43,62 @@ int tsdrplugin_setgain(float gain) {
3843}
3944
4045int tsdrplugin_setParams (const char * params ) {
41- float ver ;
42- int err ;
43-
44- err = mir_sdr_ApiVersion (& ver );
45- printf ("MIRICS VERSION %.4f with err %d\n" , ver , err );
46- printf ("Mirics setParams %s\n" , params );
47- return TSDR_NOT_IMPLEMENTED ;
46+ return TSDR_OK ;
4847}
4948
5049int tsdrplugin_readasync (tsdrplugin_readasync_function cb , void * ctx ) {
51- printf ("Mirics Readasync\n" );
52- return TSDR_NOT_IMPLEMENTED ;
50+ working = 1 ;
51+
52+ int err , sps , grc , rfc , fsc , i ;
53+ unsigned int fs ;
54+ int newGr = 40 ;
55+
56+ freq = desiredfreq ;
57+ err = mir_sdr_Init (newGr , 8 , freq / 1000000.0 , mir_sdr_BW_8_000 , mir_sdr_IF_Zero , & sps );
58+ if (err != 0 ) {
59+ mir_sdr_Uninit ();
60+ return TSDR_CANNOT_OPEN_DEVICE ;
61+ }
62+
63+ short * xi = (short * )malloc (sps * sizeof (short ));
64+ short * xq = (short * )malloc (sps * sizeof (short ));
65+
66+ int outbufsize = 2 * sps ;
67+ float * outbuf = (float * ) malloc (sizeof (float ) * outbufsize );
68+
69+ while (working ) {
70+ err = mir_sdr_ReadPacket (xi , xq , & fs , & grc , & rfc , & fsc );
71+ if (err != 0 ) break ;
72+
73+ if (freq != desiredfreq ) {
74+ freq = desiredfreq ;
75+ err = mir_sdr_SetRf (freq , 1 , 0 );
76+
77+ if (err == mir_sdr_RfUpdateError ) {
78+ mir_sdr_Uninit ();
79+ err = mir_sdr_Init (newGr , 8 , freq / 1000000.0 , mir_sdr_BW_8_000 , mir_sdr_IF_Zero , & sps );
80+ }
81+
82+ if (err != 0 ) {
83+ printf ("FS error id %d trying to set freq to %.4f\n" , err , freq );
84+ break ;
85+ }
86+ }
87+
88+
89+ for (i = 0 ; i < outbufsize ; i ++ ) {
90+ const short val = (i & 1 ) ? (xq [i >> 1 ]) : (xi [i >> 1 ]);
91+ outbuf [i ] = (val - 32767 ) / 32767.0 ;
92+ }
93+
94+ cb (outbuf , outbufsize , ctx );
95+ }
96+
97+ free (outbuf );
98+ free (xi );
99+ free (xq );
100+
101+ if (mir_sdr_Uninit () != 0 ) return TSDR_ERR_PLUGIN ;
102+
103+ return (err == 0 ) ? TSDR_OK : TSDR_ERR_PLUGIN ;
53104}
0 commit comments