diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index 9974194..3bb52f8 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -18,28 +18,27 @@ # Boston, MA 02110-1301, USA. ######################################################################## -# Rules for generating the source and sink xml wrappers +# Rules for generating the source and sink yml wrappers ######################################################################## include(GrPython) -macro(GEN_BLOCK_XML _generator _xml_block) +macro(GEN_BLOCK_YAML _generator _yaml_block) set(generator ${CMAKE_CURRENT_SOURCE_DIR}/${_generator}) - set(xml_block ${CMAKE_CURRENT_BINARY_DIR}/${_xml_block}) - list(APPEND xml_blocks ${xml_block}) + set(yaml_block ${CMAKE_CURRENT_BINARY_DIR}/${_yaml_block}) + list(APPEND yaml_blocks ${yaml_block}) add_custom_command( - DEPENDS ${generator} OUTPUT ${xml_block} - COMMAND ${PYTHON_EXECUTABLE} ${generator} ${xml_block} + DEPENDS ${generator} OUTPUT ${yaml_block} + COMMAND ${PYTHON_EXECUTABLE} ${generator} ${yaml_block} ) -endmacro(GEN_BLOCK_XML) +endmacro(GEN_BLOCK_YAML) -GEN_BLOCK_XML(gen_osmosdr_blocks.py rtlsdr_source.xml) -GEN_BLOCK_XML(gen_osmosdr_blocks.py osmosdr_source.xml) -GEN_BLOCK_XML(gen_osmosdr_blocks.py osmosdr_sink.xml) +GEN_BLOCK_YAML(gen_osmosdr_blocks.py rtlsdr_source.block.yml) +GEN_BLOCK_YAML(gen_osmosdr_blocks.py osmosdr_source.block.yml) +GEN_BLOCK_YAML(gen_osmosdr_blocks.py osmosdr_sink.block.yml) -add_custom_target(osmosdr_grc_xml_blocks ALL DEPENDS ${xml_blocks}) +add_custom_target(osmosdr_grc_yaml_blocks ALL DEPENDS ${yaml_blocks}) install(FILES - ${xml_blocks} -# DESTINATION ${GRC_BLOCKS_DIR} + ${yaml_blocks} DESTINATION share/gnuradio/grc/blocks ) diff --git a/grc/gen_osmosdr_blocks.py b/grc/gen_osmosdr_blocks.py index d1f2b1a..840320a 100644 --- a/grc/gen_osmosdr_blocks.py +++ b/grc/gen_osmosdr_blocks.py @@ -19,478 +19,388 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ MAIN_TMPL = """\ - - - $(title) $sourk.title() - $(prefix)_$(sourk) - $($sourk.title())s - 1 - import osmosdr - import time - osmosdr.$(sourk)( args="numchan=" + str(\$nchan) + " " + \$args ) -#for $m in range($max_mboards) -######################################################################## -\#if \$num_mboards() > $m and \$clock_source$(m)() -self.\$(id).set_clock_source(\$clock_source$(m), $m) -\#end if -######################################################################## -\#if \$num_mboards() > $m and \$time_source$(m)() -self.\$(id).set_time_source(\$time_source$(m), $m) -\#end if -######################################################################## -#end for -\#if \$sync() == 'sync' -self.\$(id).set_time_unknown_pps(osmosdr.time_spec_t()) -\#elif \$sync() == 'pc_clock' -self.\$(id).set_time_now(osmosdr.time_spec_t(time.time()), osmosdr.ALL_MBOARDS) -\#end if -self.\$(id).set_sample_rate(\$sample_rate) -#for $n in range($max_nchan) -\#if \$nchan() > $n -self.\$(id).set_center_freq(\$freq$(n), $n) -self.\$(id).set_freq_corr(\$corr$(n), $n) -#if $sourk == 'source': -self.\$(id).set_dc_offset_mode(\$dc_offset_mode$(n), $n) -self.\$(id).set_iq_balance_mode(\$iq_balance_mode$(n), $n) -self.\$(id).set_gain_mode(\$gain_mode$(n), $n) -#end if -self.\$(id).set_gain(\$gain$(n), $n) -self.\$(id).set_if_gain(\$if_gain$(n), $n) -self.\$(id).set_bb_gain(\$bb_gain$(n), $n) -self.\$(id).set_antenna(\$ant$(n), $n) -self.\$(id).set_bandwidth(\$bw$(n), $n) -\#end if -#end for - - set_sample_rate(\$sample_rate) - #for $n in range($max_nchan) - set_center_freq(\$freq$(n), $n) - set_freq_corr(\$corr$(n), $n) - #if $sourk == 'source': - set_dc_offset_mode(\$dc_offset_mode$(n), $n) - set_iq_balance_mode(\$iq_balance_mode$(n), $n) - set_gain_mode(\$gain_mode$(n), $n) - #end if - set_gain(\$gain$(n), $n) - set_if_gain(\$if_gain$(n), $n) - set_bb_gain(\$bb_gain$(n), $n) - set_antenna(\$ant$(n), $n) - set_bandwidth(\$bw$(n), $n) - #end for - - $(dir.title())put Type - type - enum - - - - Device Arguments - args - - string - - \#if \$args() - none - \#else - part - \#end if - - - - Sync - sync - - enum - \#if \$sync() then 'none' else 'part'# - - - - - - Num Mboards - num_mboards - 1 - int - part - #for $m in range(1, $max_mboards+1) - - #end for - - #for $m in range($max_mboards) - - Mb$(m): Clock Source - clock_source$(m) - - string - - \#if not \$num_mboards() > $m - all - \#elif \$clock_source$(m)() - none - \#else - part - \#end if - - - - - - - - - - Mb$(m): Time Source - time_source$(m) - - string - - \#if not \$num_mboards() > $m - all - \#elif \$time_source$(m)() - none - \#else - part - \#end if - - - - - - - #end for - - Num Channels - nchan - 1 - int - #for $n in range(1, $max_nchan+1) - - #end for - - - Sample Rate (sps) - sample_rate - samp_rate - real - - $params - $max_nchan >= \$nchan - \$nchan > 0 - $max_mboards >= \$num_mboards - \$num_mboards > 0 - \$nchan >= \$num_mboards - <$sourk> - $dir - \$type.type - \$nchan - - -The osmocom $sourk block: +id: ${prefix}_${sourk} +label: '${title} ${sourk.title()}' +category: '[OsmoSDR]' +flags: throttle -While primarily being developed for the OsmoSDR hardware, this block as well supports: +parameters: +- id: type + label: '${direction.title()}put Type' + dtype: enum + options: [fc32] + option_labels: [Complex Float32] + option_attributes: + type: [fc32] + hide: part +- id: args + label: 'Device Arguments' + dtype: string + default: '""' + hide: ${'$'}{ 'none' if args else 'part'} +- id: sync + label: Sync + dtype: enum + options: [sync, pc_clock, none] + option_labels: [Unknown PPS, PC Clock, Don't Sync] + hide: ${'$'}{ 'none' if sync else 'part'} +- id: num_mboards + label: 'Number MBoards' + dtype: int + default: 1 + options: [ ${", ".join([str(n) for n in range(1, max_mboards+1)])} ] + hide: part +% for m in range(max_mboards): +- id: clock_source${m} + label: 'MB${m}: Clock Source' + dtype: string + options: ['', internal, external, external_1pps, mimo, gpsdo] + option_labels: [Default, Internal, External, External 1PPS, MIMO Cable, O/B GPSDO] + hide: ${'$'}{ 'all' if not (num_mboards > ${m}) else ( 'none' if clock_source${m} else 'part' )} +- id: time_source${m} + label: 'MB${m}: Time Source' + dtype: string + options: ['', external, mimo, gpsdo] + option_labels: [Default, External, MIMO Cable, O/B GPSDO] + hide: ${'$'}{ 'all' if not (num_mboards > ${m}) else ( 'none' if time_source${m} else 'part' )} +% endfor +- id: nchan + label: 'Number Channels' + dtype: int + default: 1 + options: [ ${", ".join([str(n) for n in range(1, max_nchan+1)])} ] +- id: sample_rate + label: 'Sample Rate (sps)' + dtype: real + default: samp_rate +${params} -#if $sourk == 'source': - * FUNcube Dongle through libgnuradio-fcd - * FUNcube Dongle Pro+ through gr-fcdproplus - * sysmocom OsmoSDR Devices through libosmosdr - * RTL2832U based DVB-T dongles through librtlsdr - * RTL-TCP spectrum server (see librtlsdr project) - * MSi2500 based DVB-T dongles through libmirisdr - * SDRplay RSP devices through SDRplay library - * gnuradio .cfile input through libgnuradio-blocks - * RFSPACE SDR-IQ, SDR-IP, NetSDR (incl. X2 option) - * AirSpy Wideband Receiver through libairspy -#end if -#if $sourk == 'sink': - * gnuradio .cfile output through libgnuradio-blocks -#end if - * CCCamp 2015 rad1o Badge through libhackrf - * Great Scott Gadgets HackRF through libhackrf - * Nuand LLC bladeRF through libbladeRF library - * Ettus USRP Devices through Ettus UHD library - * Fairwaves UmTRX through Fairwaves' fork of UHD - * Red Pitaya SDR transceiver (http://bazaar.redpitaya.com) - * FreeSRP through libfreesrp library +inputs: +- domain: message + id: command + optional: true +% if sourk == 'source': -By using the osmocom $sourk block you can take advantage of a common software api in your application(s) independent of the underlying radio hardware. +outputs: +% endif +- domain: stream + dtype: ${'$'}{type.type} + multiplicity: ${'$'}{nchan} +% if sourk == 'sink': -Output Type: -This parameter controls the data type of the stream in gnuradio. Only complex float32 samples are supported at the moment. +outputs: +- domain: message + id: async_msgs + optional: true +% endif -Device Arguments: -The device argument is a comma delimited string used to locate devices on your system. Device arguments for multiple devices may be given by separating them with a space. -Use the device id or name/serial (if applicable) to specify a certain device or list of devices. If left blank, the first device found will be used. +templates: + imports: |- + import osmosdr + import time + make: | + osmosdr.${sourk}( + args="numchan=" + str(${'$'}{nchan}) + " " + ${'$'}{args} + ) + % for m in range(max_mboards): + ${'%'} if context.get('num_mboards')() > ${m}: + ${'%'} if context.get('clock_source${m}')(): + self.${'$'}{id}.set_clock_source(${'$'}{${'clock_source' + str(m)}}, ${m}) + ${'%'} endif + ${'%'} if context.get('time_source${m}')(): + self.${'$'}{id}.set_time_source(${'$'}{${'time_source' + str(m)}}, ${m}) + ${'%'} endif + ${'%'} endif + % endfor + ${'%'} if sync == 'sync': + self.${'$'}{id}.set_time_unknown_pps(osmosdr.time_spec_t()) + ${'%'} elif sync == 'pc_clock': + self.${'$'}{id}.set_time_now(osmosdr.time_spec_t(time.time()), osmosdr.ALL_MBOARDS) + ${'%'} endif + self.${'$'}{id}.set_sample_rate(${'$'}{sample_rate}) + % for n in range(max_nchan): + ${'%'} if context.get('nchan')() > ${n}: + self.${'$'}{id}.set_center_freq(${'$'}{${'freq' + str(n)}}, ${n}) + self.${'$'}{id}.set_freq_corr(${'$'}{${'corr' + str(n)}}, ${n}) + ${'%'} if context.get('sourk') == 'source': + self.${'$'}{id}.set_dc_offset_mode(${'$'}{${'dc_offset_mode' + str(n)}}, ${n}) + self.${'$'}{id}.set_iq_balance_mode(${'$'}{${'iq_balance_mode' + str(n)}}, ${n}) + self.${'$'}{id}.set_gain_mode(${'$'}{${'gain_mode' + str(n)}}, ${n}) + ${'%'} endif + self.${'$'}{id}.set_gain(${'$'}{${'gain' + str(n)}}, ${n}) + self.${'$'}{id}.set_if_gain(${'$'}{${'if_gain' + str(n)}}, ${n}) + self.${'$'}{id}.set_bb_gain(${'$'}{${'bb_gain' + str(n)}}, ${n}) + self.${'$'}{id}.set_antenna(${'$'}{${'ant' + str(n)}}, ${n}) + self.${'$'}{id}.set_bandwidth(${'$'}{${'bw' + str(n)}}, ${n}) + ${'%'} endif + % endfor + callbacks: + - set_sample_rate(${'$'}{sample_rate}) + % for n in range(max_nchan): + - set_center_freq(${'$'}{${'freq' + str(n)}}, ${n}) + - set_freq_corr(${'$'}{${'corr' + str(n)}}, ${n}) + % if sourk == 'source': + - set_dc_offset_mode(${'$'}{${'dc_offset_mode' + str(n)}}, ${n}) + - set_iq_balance_mode(${'$'}{${'iq_balance_mode' + str(n)}}, ${n}) + - set_gain_mode(${'$'}{${'gain_mode' + str(n)}}, ${n}) + % endif + - set_gain(${'$'}{${'gain' + str(n)}}, ${n}) + - set_if_gain(${'$'}{${'if_gain' + str(n)}}, ${n}) + - set_bb_gain(${'$'}{${'bb_gain' + str(n)}}, ${n}) + - set_antenna(${'$'}{${'ant' + str(n)}}, ${n}) + - set_bandwidth(${'$'}{${'bw' + str(n)}}, ${n}) + % endfor -Examples: +documentation: |- + The osmocom ${sourk} block: -Optional arguments are placed into [] brackets, remove the brackets before using them! Specific variable values are separated with a |, choose one of them. Variable values containing spaces shall be enclosed in '' as demonstrated in examples section below. -Lines ending with ... mean it's possible to bind devices together by specifying multiple device arguments separated with a space. + While primarily being developed for the OsmoSDR hardware, this block as well supports: -#if $sourk == 'source': - fcd=0[,device=hw:2][,type=2] - miri=0[,buffers=32] ... - rtl=serial_number ... - rtl=0[,rtl_xtal=28.8e6][,tuner_xtal=28.8e6] ... - rtl=1[,buffers=32][,buflen=N*512] ... - rtl=2[,direct_samp=0|1|2][,offset_tune=0|1][,bias=0|1] ... - rtl_tcp=127.0.0.1:1234[,psize=16384][,direct_samp=0|1|2][,offset_tune=0|1][,bias=0|1] ... - osmosdr=0[,buffers=32][,buflen=N*512] ... - file='/path/to/your file',rate=1e6[,freq=100e6][,repeat=true][,throttle=true] ... - netsdr=127.0.0.1[:50000][,nchan=2] - sdr-ip=127.0.0.1[:50000] - cloudiq=127.0.0.1[:50000] - sdr-iq=/dev/ttyUSB0 - airspy=0[,bias=0|1][,linearity][,sensitivity] -#end if -#if $sourk == 'sink': - file='/path/to/your file',rate=1e6[,freq=100e6][,append=true][,throttle=true] ... -#end if - redpitaya=192.168.1.100[:1001] - freesrp=0[,fx3='path/to/fx3.img',fpga='path/to/fpga.bin',loopback] - hackrf=0[,buffers=32][,bias=0|1][,bias_tx=0|1] - bladerf=0[,tamer=internal|external|external_1pps][,smb=25e6] - uhd[,serial=...][,lo_offset=0][,mcr=52e6][,nchan=2][,subdev='\\\\'B:0 A:0\\\\''] ... + % if sourk == 'source': + * sysmocom OsmoSDR Devices through libosmosdr + * RTL2832U based DVB-T dongles through librtlsdr + * RTL-TCP spectrum server (see librtlsdr project) + * MSi2500 based DVB-T dongles through libmirisdr + * SDRplay RSP devices through SDRplay library + * gnuradio .cfile input through libgnuradio-blocks + * RFSPACE SDR-IQ, SDR-IP, NetSDR (incl. X2 option) + * AirSpy Wideband Receiver through libairspy + % endif + % if sourk == 'sink': + * gnuradio .cfile output through libgnuradio-blocks + % endif + * CCCamp 2015 rad1o Badge through libhackrf + * Great Scott Gadgets HackRF through libhackrf + * Nuand LLC bladeRF through libbladeRF library + * Ettus USRP Devices through Ettus UHD library + * Fairwaves UmTRX through Fairwaves' fork of UHD + * Red Pitaya SDR transceiver (http://bazaar.redpitaya.com) + * FreeSRP through libfreesrp library -Num Channels: -Selects the total number of channels in this multi-device configuration. Required when specifying multiple device arguments. + By using the osmocom $sourk block you can take advantage of a common software api in your application(s) independent of the underlying radio hardware. -Sample Rate: -The sample rate is the number of samples per second output by this block on each channel. + Output Type: + This parameter controls the data type of the stream in gnuradio. Only complex float32 samples are supported at the moment. -Frequency: -The center frequency is the frequency the RF chain is tuned to. + Device Arguments: + The device argument is a comma delimited string used to locate devices on your system. Device arguments for multiple devices may be given by separating them with a space. + Use the device id or name/serial (if applicable) to specify a certain device or list of devices. If left blank, the first device found will be used. -Freq. Corr.: -The frequency correction factor in parts per million (ppm). Set to 0 if unknown. + Examples: -#if $sourk == 'source': -DC Offset Mode: -Controls the behavior of hardware DC offset corrrection. - Off: Disable correction algorithm (pass through). - Manual: Keep last estimated correction when switched from Automatic to Manual. - Automatic: Periodicallly find the best solution to compensate for DC offset. + Optional arguments are placed into [] brackets, remove the brackets before using them! Specific variable values are separated with a |, choose one of them. Variable values containing spaces shall be enclosed in '' as demonstrated in examples section below. + Lines ending with ... mean it's possible to bind devices together by specifying multiple device arguments separated with a space. -This functionality is available for USRP devices only. + % if sourk == 'source': + miri=0[,buffers=32] ... + rtl=serial_number ... + rtl=0[,rtl_xtal=28.8e6][,tuner_xtal=28.8e6] ... + rtl=1[,buffers=32][,buflen=N*512] ... + rtl=2[,direct_samp=0|1|2][,offset_tune=0|1][,bias=0|1] ... + rtl_tcp=127.0.0.1:1234[,psize=16384][,direct_samp=0|1|2][,offset_tune=0|1][,bias=0|1] ... + osmosdr=0[,buffers=32][,buflen=N*512] ... + file='/path/to/your file',rate=1e6[,freq=100e6][,repeat=true][,throttle=true] ... + netsdr=127.0.0.1[:50000][,nchan=2] + sdr-ip=127.0.0.1[:50000] + cloudiq=127.0.0.1[:50000] + sdr-iq=/dev/ttyUSB0 + airspy=0[,bias=0|1][,linearity][,sensitivity] + % endif + % if sourk == 'sink': + file='/path/to/your file',rate=1e6[,freq=100e6][,append=true][,throttle=true] ... + % endif + redpitaya=192.168.1.100[:1001] + freesrp=0[,fx3='path/to/fx3.img',fpga='path/to/fpga.bin',loopback] + hackrf=0[,buffers=32][,bias=0|1][,bias_tx=0|1] + bladerf=0[,tamer=internal|external|external_1pps][,smb=25e6] + uhd[,serial=...][,lo_offset=0][,mcr=52e6][,nchan=2][,subdev='\\\\'B:0 A:0\\\\''] ... -IQ Balance Mode: -Controls the behavior of software IQ imbalance corrrection. - Off: Disable correction algorithm (pass through). - Manual: Keep last estimated correction when switched from Automatic to Manual. - Automatic: Periodicallly find the best solution to compensate for image signals. + Num Channels: + Selects the total number of channels in this multi-device configuration. Required when specifying multiple device arguments. -This functionality depends on http://cgit.osmocom.org/cgit/gr-iqbal/ + Sample Rate: + The sample rate is the number of samples per second output by this block on each channel. -Gain Mode: -Chooses between the manual (default) and automatic gain mode where appropriate. -To allow manual control of RF/IF/BB gain stages, manual gain mode must be configured. -Currently, only RTL-SDR devices support automatic gain mode. + Frequency: + The center frequency is the frequency the RF chain is tuned to. -#end if -RF Gain: -Overall RF gain of the device. + Freq. Corr.: + The frequency correction factor in parts per million (ppm). Set to 0 if unknown. -IF Gain: -Overall intermediate frequency gain of the device. -This setting is available for RTL-SDR and OsmoSDR devices with E4000 tuners and HackRF in receive and transmit mode. Observations lead to a reasonable gain range from 15 to 30dB. + % if sourk == 'source': + DC Offset Mode: + Controls the behavior of hardware DC offset corrrection. + Off: Disable correction algorithm (pass through). + Manual: Keep last estimated correction when switched from Automatic to Manual. + Automatic: Periodicallly find the best solution to compensate for DC offset. -BB Gain: -Overall baseband gain of the device. -This setting is available for HackRF in receive mode. Observations lead to a reasonable gain range from 15 to 30dB. + This functionality is available for USRP devices only. -Antenna: -For devices with only one antenna, this may be left blank. -Otherwise, the user should specify one of the possible antenna choices. + IQ Balance Mode: + Controls the behavior of software IQ imbalance corrrection. + Off: Disable correction algorithm (pass through). + Manual: Keep last estimated correction when switched from Automatic to Manual. + Automatic: Periodicallly find the best solution to compensate for image signals. -Bandwidth: -Set the bandpass filter on the radio frontend. To use the default (automatic) bandwidth filter setting, this should be zero. + This functionality depends on http://cgit.osmocom.org/cgit/gr-iqbal/ -See the OsmoSDR project page for more detailed documentation: -http://sdr.osmocom.org/trac/wiki/GrOsmoSDR -http://sdr.osmocom.org/trac/wiki/rtl-sdr -http://sdr.osmocom.org/trac/ - - + Gain Mode: + Chooses between the manual (default) and automatic gain mode where appropriate. + To allow manual control of RF/IF/BB gain stages, manual gain mode must be configured. + Currently, only RTL-SDR devices support automatic gain mode. + + % endif + RF Gain: + Overall RF gain of the device. + + IF Gain: + Overall intermediate frequency gain of the device. + This setting is available for RTL-SDR and OsmoSDR devices with E4000 tuners and HackRF in receive and transmit mode. Observations lead to a reasonable gain range from 15 to 30dB. + + BB Gain: + Overall baseband gain of the device. + This setting is available for HackRF in receive mode. Observations lead to a reasonable gain range from 15 to 30dB. + + Antenna: + For devices with only one antenna, this may be left blank. + Otherwise, the user should specify one of the possible antenna choices. + + Bandwidth: + Set the bandpass filter on the radio frontend. To use the default (automatic) bandwidth filter setting, this should be zero. + + See the OsmoSDR project page for more detailed documentation: + http://sdr.osmocom.org/trac/wiki/GrOsmoSDR + http://sdr.osmocom.org/trac/wiki/rtl-sdr + http://sdr.osmocom.org/trac/ + +file_format: 1 """ +# MAIN_TMPL = """\ +# +# $max_nchan >= \$nchan +# \$nchan > 0 +# $max_mboards >= \$num_mboards +# \$num_mboards > 0 +# \$nchan >= \$num_mboards +# +# """ + PARAMS_TMPL = """ - - Ch$(n): Frequency (Hz) - freq$(n) - 100e6 - real - \#if \$nchan() > $n then 'none' else 'all'# - - - Ch$(n): Freq. Corr. (ppm) - corr$(n) - 0 - real - \#if \$nchan() > $n then 'none' else 'all'# - -#if $sourk == 'source': - - Ch$(n): DC Offset Mode - dc_offset_mode$(n) - 0 - int - \#if \$nchan() > $n then 'none' else 'all'# - - - - - - Ch$(n): IQ Balance Mode - iq_balance_mode$(n) - 0 - int - \#if \$nchan() > $n then 'none' else 'all'# - - - - - - Ch$(n): Gain Mode - gain_mode$(n) - False - bool - \#if \$nchan() > $n then 'none' else 'all'# - - - -#end if - - Ch$(n): RF Gain (dB) - gain$(n) - 10 - real - \#if \$nchan() > $n then 'none' else 'all'# - - - Ch$(n): IF Gain (dB) - if_gain$(n) - 20 - real - \#if \$nchan() > $n then 'none' else 'all'# - - - Ch$(n): BB Gain (dB) - bb_gain$(n) - 20 - real - \#if \$nchan() > $n then 'none' else 'all'# - - - Ch$(n): Antenna - ant$(n) - - string - - \#if not \$nchan() > $n - all - \#elif \$ant$(n)() - none - \#else - part - \#end if - - - - Ch$(n): Bandwidth (Hz) - bw$(n) - 0 - real - - \#if not \$nchan() > $n - all - \#elif \$bw$(n)() - none - \#else - part - \#end if - - +- id: freq${n} + label: 'Ch${n}: Frequency (Hz)' + dtype: real + default: 100e6 + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: corr${n} + label: 'Ch${n}: Frequency Correction (ppm)' + dtype: real + default: 0 + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +% if sourk == 'source': +- id: dc_offset_mode${n} + label: 'Ch${n}: DC Offset Mode' + dtype: int + default: 0 + options: [0, 1, 2] + option_labels: [Off, Manual, Automatic] + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: iq_balance_mode${n} + label: 'Ch${n}: IQ Balance Mode' + dtype: int + default: 0 + options: [0, 1, 2] + option_labels: [Off, Manual, Automatic] + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: gain_mode${n} + label: 'Ch${n}: Gain Mode' + dtype: bool + default: False + options: [False, True] + option_labels: [Manual, Automatic] + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +% endif +- id: gain${n} + label: 'Ch${n}: RF Gain (dB)' + dtype: real + default: 10 + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: if_gain${n} + label: 'Ch${n}: IF Gain (dB)' + dtype: real + default: 20 + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: bb_gain${n} + label: 'Ch${n}: BB Gain (dB)' + dtype: real + default: 20 + hide: ${'$'}{'none' if (nchan > ${n}) else 'all'} +- id: ant${n} + label: 'Ch${n}: Antenna' + dtype: string + default: "" + hide: ${'$'}{'all' if not (nchan > ${n}) else ('none' if eval('ant' + str(${n})) else 'part')} +- id: bw${n} + label: 'Ch${n}: Bandwidth (Hz)' + dtype: real + default: 0 + hide: ${'$'}{'all' if not (nchan > ${n}) else ('none' if eval('bw' + str(${n})) else 'part')} """ -def parse_tmpl(_tmpl, **kwargs): - from Cheetah import Template - return str(Template.Template(_tmpl, kwargs)) -max_num_mboards = 8 -max_num_channels = max_num_mboards*4 +def parse_tmpl(_tmpl, **kwargs): + from mako.template import Template + from mako import exceptions + + try: + block_template = Template(_tmpl) + return str(block_template.render(**kwargs)) + except: + print(exceptions.text_error_template().render()) + +MAX_NUM_MBOARDS = 8 +MAX_NUM_CHANNELS = MAX_NUM_MBOARDS * 4 import os.path if __name__ == '__main__': - import sys - for file in sys.argv[1:]: - head, tail = os.path.split(file) + import sys - if tail.startswith('rtlsdr'): - title = 'RTL-SDR' - prefix = 'rtlsdr' - elif tail.startswith('osmosdr'): - title = 'osmocom' - prefix = 'osmosdr' - else: raise Exception, 'file %s has wrong syntax!'%tail + for file in sys.argv[1:]: + head, tail = os.path.split(file) - if tail.endswith ('source.xml'): - sourk = 'source' - dir = 'out' - elif tail.endswith ('sink.xml'): - sourk = 'sink' - dir = 'in' - else: raise Exception, 'is %s a source or sink?'%file + if tail.startswith('rtlsdr'): + title = 'RTL-SDR' + prefix = 'rtlsdr' + elif tail.startswith('osmosdr'): + title = 'osmocom' + prefix = 'osmosdr' + else: + raise Exception("file {} has wrong syntax!".format(tail)) - params = ''.join([parse_tmpl(PARAMS_TMPL, n=n, sourk=sourk) for n in range(max_num_channels)]) - open(file, 'w').write(parse_tmpl(MAIN_TMPL, - max_nchan=max_num_channels, - max_mboards=max_num_mboards, - params=params, - title=title, - prefix=prefix, - sourk=sourk, - dir=dir, - )) + if tail.endswith('source.block.yml'): + sourk = 'source' + direction = 'out' + elif tail.endswith('sink.block.yml'): + sourk = 'sink' + direction = 'in' + else: + raise Exception("is {} a source or sink?".format(file)) + + params = ''.join([ + parse_tmpl(PARAMS_TMPL, n=n, sourk=sourk) + for n in range(MAX_NUM_CHANNELS) + ]) + + open(file, 'w').write( + parse_tmpl( + MAIN_TMPL, + max_nchan=MAX_NUM_CHANNELS, + max_mboards=MAX_NUM_MBOARDS, + params=params, + title=title, + prefix=prefix, + sourk=sourk, + direction=direction, + ) + )