SDRplay API的使用示例

摘要:
1CC?=gcc2CFLAGS?=-O2-g-Wall3LDLIBS+=-lpthread-lm-lsdrplay_api45all:播放_ sdr67%。o:%。c8$(CC)$(CFLAGS)-c$˂910播放_ sdr:播放_ sdr。o11$(CC)-g-oplay_sdrplay_sdr.o$(LDFLAGS)$(LDLIBS)1213运行:14./play_sdr1516运行:17rm-f*。oplay_sd1#include2#include3#include4#include5#include“sdrplay_api.h”67sdrplay.api_DeviceT*chosenDevice=NULL;89voidStreamACallback(short*xi,short*xq,sdrplay_api_StreamCbParamsT*params,unsignedintnumSamples,unssignedintreset,void*cbContext)10{11if printf(“%d,%d”,*(xi++),*(xq++));18//}1920返回;21}2223voidEventCallback(sdrplay_api_EventTeventId,sdrplay_api_TunerSelectTtuner,sdrpay_api_EEventParamsT*params,void*cbContext)24{25开关(eventId)26{27个案例sdrplay.api_GainChange:28printf(“sdrplay-api_EventCb:%s,tuner=%sgRdB=%dlnaGRdB=%dsystemGain=%.2f”,“sdrpplay_api_GainChange”,(tuner==sdrplaya_pi_tuner_A)?_调谐器-B“,params-˃gainParams.gRdB,params-˃gainParams.lnaGRdB,params-˃gainParams。当前增益);29断裂;3031casesdrplay_api_ PowerOverloadChange:32printf(“sdrplay_api_PowerOverloadChange:调谐器=%spowerOverloadChangeType=%s”,(调谐器==sdrplay.api_tuner_A)?“sdreplay_api_Tuner_A”:“sdrplay_api_Tuner_B”,(params-˃powerOverloadParams.powerOverloadChangeType==sdrplay_api_Overload_Detected)?“sdreplay_api_Overload_Detected”:“sdrplay_api_Overload_Corrected”);33//发送更新消息以确认收到的电源过载消息34 drplay_ api_ Update(选择设备-˃开发、调谐器、sdrplay_api_Update_Ctrl_OverloadMsgAck、sdrpplay_api_Uupdate_Ext1_None);35断裂;3637casesdrplay_api_DeviceRemoved:38printf(“sdrplay_api_EventCb:%s”,“sdrpay_api_DiviceRemoved”);39断裂;4041默认值:42printf(“sdrplay_api_EventCb:%d,未知”,事件ID);43断裂;44}45}4647无效用法(void)48{49printf(“用法:sdr_play.exe”);50退出(1);51}5253无效(intargc,char*argv[])54{55sdrplay_api_DeviceDevs[6];56unsignedinndev;57inti;58floatver=0.0;59sdrplay_api_ErrTerr;60sdrplay-api_Device参数T*deviceParams=NULL;61sdrplay.api_CallbackFnsTcbFns;62sdrplay_ pi_RxChannelParamsT*chParams;6364charc;65unsignedinchosenIdx=0;6667//OpenAPI68if((err=sdrplay_api_Open) )!= sdrplay_api_Success)69{70printf(“sdrplay_api_Openfailed%s”,sdrplay.api_GetErrorString(错误));71}72else73{74//启用调试输出75if((错误=sdrplay-api_DebugEnable(NULL,1))!=sdrplay _api_Ssuccess)76{77printf(”sdrplay/api_Debug Enablefailed%s“,sdrpplay_api_GetError String(错误)));78}7980//CheckAPI版本匹配81if!
 1 CC?=gcc
 2 CFLAGS?=-O2 -g -Wall
 3 LDLIBS+= -lpthread -lm -lsdrplay_api
 4 
 5 all: play_sdr
 6 
 7 %.o: %.c
 8     $(CC) $(CFLAGS) -c $<
 9 
10 play_sdr: play_sdr.o
11     $(CC) -g -o play_sdr play_sdr.o $(LDFLAGS) $(LDLIBS)
12 
13 run:
14     ./play_sdr
15 
16 clean:
17     rm -f *.o play_sdr
  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <unistd.h>
  4 #include <stdlib.h>
  5 #include "sdrplay_api.h"
  6 
  7 sdrplay_api_DeviceT *chosenDevice = NULL;
  8 
  9 void StreamACallback(short *xi, short *xq, sdrplay_api_StreamCbParamsT *params, unsigned int numSamples, unsigned int reset, void *cbContext)
 10 {
 11     if (reset)
 12         printf("sdrplay_api_StreamACallback: numSamples=%d
", numSamples);
 13 
 14     // Process stream callback data here
 15     printf("New sample block: %d
", numSamples);
 16 //    for (size_t i = 0; i < numSamples; ++i) {
 17 //        printf("%d, %d
", *(xi++), *(xq++));
 18 //    }
 19 
 20     return;
 21 }
 22 
 23 void EventCallback(sdrplay_api_EventT eventId, sdrplay_api_TunerSelectT tuner, sdrplay_api_EventParamsT *params, void *cbContext)
 24 {
 25     switch(eventId)
 26     {
 27     case sdrplay_api_GainChange:
 28         printf("sdrplay_api_EventCb: %s, tuner=%s gRdB=%d lnaGRdB=%d systemGain=%.2f
", "sdrplay_api_GainChange", (tuner == sdrplay_api_Tuner_A)? "sdrplay_api_Tuner_A": "sdrplay_api_Tuner_B", params->gainParams.gRdB, params->gainParams.lnaGRdB, params->gainParams.currGain);
 29         break;
 30 
 31     case sdrplay_api_PowerOverloadChange:
 32         printf("sdrplay_api_PowerOverloadChange: tuner=%s powerOverloadChangeType=%s
", (tuner == sdrplay_api_Tuner_A)? "sdrplay_api_Tuner_A": "sdrplay_api_Tuner_B", (params->powerOverloadParams.powerOverloadChangeType == sdrplay_api_Overload_Detected)? "sdrplay_api_Overload_Detected": "sdrplay_api_Overload_Corrected");
 33         // Send update message to acknowledge power overload message received
 34         sdrplay_api_Update(chosenDevice->dev, tuner, sdrplay_api_Update_Ctrl_OverloadMsgAck, sdrplay_api_Update_Ext1_None);
 35         break;
 36 
 37     case sdrplay_api_DeviceRemoved:
 38         printf("sdrplay_api_EventCb: %s
", "sdrplay_api_DeviceRemoved");
 39         break;
 40 
 41     default:
 42         printf("sdrplay_api_EventCb: %d, unknown event
", eventId);
 43         break;
 44     }
 45 }
 46 
 47 void usage(void)
 48 {
 49     printf("Usage: sdr_play.exe
");
 50     exit(1);
 51 }
 52 
 53 int main(int argc, char *argv[])
 54 {
 55     sdrplay_api_DeviceT devs[6];
 56     unsigned int ndev; 
 57     int i;
 58     float ver = 0.0;
 59     sdrplay_api_ErrT err;
 60     sdrplay_api_DeviceParamsT *deviceParams = NULL;
 61     sdrplay_api_CallbackFnsT cbFns;
 62     sdrplay_api_RxChannelParamsT *chParams;
 63 
 64     char c;
 65     unsigned int chosenIdx = 0;
 66 
 67     // Open API
 68     if ((err = sdrplay_api_Open()) != sdrplay_api_Success)
 69     {
 70         printf("sdrplay_api_Open failed %s
", sdrplay_api_GetErrorString(err));
 71     }
 72     else
 73     {
 74         // Enable debug logging output
 75         if ((err = sdrplay_api_DebugEnable(NULL, 1)) != sdrplay_api_Success)
 76         {
 77             printf("sdrplay_api_DebugEnable failed %s
", sdrplay_api_GetErrorString(err));
 78         }
 79 
 80         // Check API versions match
 81         if ((err = sdrplay_api_ApiVersion(&ver)) != sdrplay_api_Success)
 82         {
 83             printf("sdrplay_api_ApiVersion failed %s
", sdrplay_api_GetErrorString(err));
 84         }
 85         if (ver != SDRPLAY_API_VERSION)
 86         {
 87             printf("API version don't match (local=%.2f dll=%.2f)
", SDRPLAY_API_VERSION, ver);
 88             goto CloseApi;
 89         }
 90 
 91         // Lock API while device selection is performed
 92         sdrplay_api_LockDeviceApi();
 93 
 94         // Fetch list of available devices
 95         if ((err = sdrplay_api_GetDevices(devs, &ndev, sizeof(devs) / sizeof(sdrplay_api_DeviceT))) != sdrplay_api_Success)
 96         {
 97             printf("sdrplay_api_GetDevices failed %s
", sdrplay_api_GetErrorString(err));
 98             goto UnlockDeviceAndCloseApi;
 99         }
100         printf("MaxDevs=%ld NumDevs=%d
", sizeof(devs) / sizeof(sdrplay_api_DeviceT), ndev);
101         if (ndev > 0)
102         {
103             for (i = 0; i < (int)ndev; i++)
104             {
105                 printf("Dev%d: SerNo=%s hwVer=%d tuner=0x%.2x
", i, devs[i].SerNo, devs[i].hwVer, devs[i].tuner);
106             }
107 
108             // Pick first device of any type
109             for (i = 0; i < (int)ndev; i++)
110             {
111                 chosenIdx = i;
112                 break;
113             }
114             if (i == ndev)
115             {
116                 printf("Couldn't find a suitable device to open - exiting
");
117                 goto UnlockDeviceAndCloseApi;
118             }
119             printf("chosenDevice = %d
", chosenIdx);
120             chosenDevice = &devs[chosenIdx];
121 
122             // Select chosen device
123             if ((err = sdrplay_api_SelectDevice(chosenDevice)) != sdrplay_api_Success)
124             {
125                 printf("sdrplay_api_SelectDevice failed %s
", sdrplay_api_GetErrorString(err));
126                 goto UnlockDeviceAndCloseApi;
127             }
128 
129             // Unlock API now that device is selected
130             sdrplay_api_UnlockDeviceApi();
131 
132             // Retrieve device parameters so they can be changed if wanted
133             if ((err = sdrplay_api_GetDeviceParams(chosenDevice->dev, &deviceParams)) != sdrplay_api_Success)
134             {
135                 printf("sdrplay_api_GetDeviceParams failed %s
", sdrplay_api_GetErrorString(err));
136                 goto CloseApi;
137             }
138 
139             // Check for NULL pointers before changing settings
140             if (deviceParams == NULL)
141             {
142                 printf("sdrplay_api_GetDeviceParams returned NULL deviceParams pointer
");
143                 goto CloseApi;
144             }
145 
146             // Configure dev parameters
147             if (deviceParams->devParams != NULL) // This will be NULL for slave devices as only the master can change these parameters
148             {
149                 // Only need to update non-default settings
150                 // Change from default Fs 2MHz - 10MHz
151                 deviceParams->devParams->fsFreq.fsHz = 2.0e6;
152             }
153 
154             // Configure tuner parameters (depends on selected Tuner which set of parameters to use)
155             chParams = (chosenDevice->tuner == sdrplay_api_Tuner_B)? deviceParams->rxChannelB: deviceParams->rxChannelA;
156             if (chParams != NULL)
157             {
158                 chParams->tunerParams.rfFreq.rfHz = 95.0e6;
159                 chParams->tunerParams.bwType = sdrplay_api_BW_1_536;
160                 chParams->tunerParams.ifType = sdrplay_api_IF_Zero;
161                 chParams->tunerParams.gain.gRdB = 35;
162                 chParams->tunerParams.gain.LNAstate = 1;
163 
164                 // Disable AGC
165                 //chParams->ctrlParams.agc.enable = sdrplay_api_AGC_DISABLE;
166                 chParams->ctrlParams.agc.enable = sdrplay_api_AGC_100HZ;
167             }
168             else
169             {
170                 printf("sdrplay_api_GetDeviceParams returned NULL chParams pointer
");
171                 goto CloseApi;
172             }
173 
174             // Assign callback functions to be passed to sdrplay_api_Init()
175             cbFns.StreamACbFn = StreamACallback;
176             cbFns.EventCbFn = EventCallback;
177 
178             // Now we're ready to start by calling the initialisation function
179             // This will configure the device and start streaming
180             if ((err = sdrplay_api_Init(chosenDevice->dev, &cbFns, NULL)) != sdrplay_api_Success)
181             {
182                 printf("sdrplay_api_Init failed %s
", sdrplay_api_GetErrorString(err));
183                 goto CloseApi;
184             } else {
185                 printf("sdrplay_api_Init success!
");
186             }
187 
188             while (1) // Small loop allowing user to control gain reduction in +/-1dB steps using keyboard keys
189             {
190                 c = getchar();
191                 if (c == 'q')
192                 {
193                     break;
194                 }
195                 else if (c == 'u')
196                 {
197                     chParams->tunerParams.gain.gRdB += 1;
198                     // Limit it to a maximum of 59dB
199                     if (chParams->tunerParams.gain.gRdB > 59)
200                         chParams->tunerParams.gain.gRdB = 20;
201                     if ((err = sdrplay_api_Update(chosenDevice->dev, chosenDevice->tuner, sdrplay_api_Update_Tuner_Gr, sdrplay_api_Update_Ext1_None)) != sdrplay_api_Success)
202                     {
203                         printf("sdrplay_api_Update sdrplay_api_Update_Tuner_Gr failed %s
", sdrplay_api_GetErrorString(err));
204                         break;
205                     }
206                 }
207                 else if (c == 'd')
208                 {
209                     chParams->tunerParams.gain.gRdB -= 1;
210                     // Limit it to a minimum of 20dB
211                     if (chParams->tunerParams.gain.gRdB < 20)
212                         chParams->tunerParams.gain.gRdB = 59;
213                     if ((err = sdrplay_api_Update(chosenDevice->dev, chosenDevice->tuner, sdrplay_api_Update_Tuner_Gr, sdrplay_api_Update_Ext1_None)) != sdrplay_api_Success)
214                     {
215                         printf("sdrplay_api_Update sdrplay_api_Update_Tuner_Gr failed %s
", sdrplay_api_GetErrorString(err));
216                         break;
217                     }
218                 }
219             usleep(100000);
220             }
221 
222             // Finished with device so uninitialise it
223             if ((err = sdrplay_api_Uninit(chosenDevice->dev)) != sdrplay_api_Success)
224             {
225                 printf("sdrplay_api_Uninit failed %s
", sdrplay_api_GetErrorString(err));
226                 goto CloseApi;
227             }
228 
229             // Release device (make it available to other applications)
230             sdrplay_api_ReleaseDevice(chosenDevice);
231         }
232 UnlockDeviceAndCloseApi:
233         // Unlock API
234         sdrplay_api_UnlockDeviceApi();
235 
236 CloseApi:
237         // Close API
238         sdrplay_api_Close();
239     }
240 
241     return 0;
242 }

免责声明:文章转载自《SDRplay API的使用示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Azkaban简介与安装nodejs qr-image 生成二维码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux 视频设备驱动V4L2最常用的控制命令使用说明

Linux视频设备驱动常用控制命令使用说明设置视频设备属性通过ioctl来进行设置,ioctl有三个参数,分别是fd, cmd,和parameter,表示设备描述符,控制命令和控制命令参数。1. 控制命令VIDIOC_QUERYCAP功能: 查询设备驱动的功能 ;参数说明:参数类型为V4L2的能力描述类型struct v4l2_capability;str...

IntelliJ IDEA 无法热加载自动更新,On 'update' action:选项里面没有update classes and resources这项

1 出现的问题项目无法热启动,在tomcate配置中无法加载 update classes and resources 2 解决的方法:在配置的tomcat的Deployment中,使用带有war exploded的项目,而不是只有war的项目。这样重启一下idea,就可以看到update classes and resources...

Eclipse 3.6 更新中文语言包的方法

在网上找3.6版的中文包更新方法,总是找不到,找到的大都是3.3、3.4的更新方法: 看到论坛里太多的人要eclipse的中文语言包,但自从3.2.1之后官方不提供单独的下载,所以很多朋友用了3.3.x的版本,原来的语言包插件都不能使用了。今天到eclipse官方查资料,看到了一个新的子项目Babel (网址:http://www.eclipse.org...

MongoDB新增字段

如果我需要在表market_entity中新增字段adj_close_price,并且给所有的记录都设置默认值0.0在mongo shell中执行以下命令 db.getCollection('market_entity').update({},{$set:{adj_close_price:'0.0'}},{multi:true}) 至于为什么要这样写,请看...

[Git] git代码统计

copy : https://www.cnblogs.com/liyropt/archive/2012/12/31/2841053.html 命令行 查看git上的个人代码量: git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; lo...

将文件映射到内存

mmap的好处: 和read、write系统调用相比不会产生无关的副本; 如果不出错就不会有系统调用、操作环境切换等开销; 不再需要lseek调用。 mmap的坏处: 内存映射总是PAGESIZE的整数倍,会浪费一定的内存; 如果要映射的内容非常大的时候可能找不到连续的线性地址空间; 创建并维护内核相关数据结构,这部分可能抵消双重副本节省下的开销...