zoukankan      html  css  js  c++  java
  • SDRplay API的使用示例

     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 }
  • 相关阅读:
    添加定界符: AnsiQuotedStr
    c++ builder 中的 XMLDocument 类详解(13) 遍历XML文件
    c++ builder 中的 XMLDocument 类详解(11) 读取和设置版本号
    c++ builder 中的 XMLDocument 类详解(9) 关于 HasChildNodes 与 IsTextElement
    VBA 宏 与 Word 编程
    Iframe 高度自适应!
    第一次加载控件的问题.
    Server.Transfer 页面传值.
    Ajax 动态加载 用户控件脚本报 "缺少对象" 的错误!
    GridView的 RowCreated 里不能写有关控件的客户端事件属性!!
  • 原文地址:https://www.cnblogs.com/lyuyangly/p/15456106.html
Copyright © 2011-2022 走看看