├── .gitignore
├── README.md
└── gr-wmbus
├── .cproject
├── .project
├── .pydevproject
├── CMakeLists.txt
├── README.txt
├── apps
├── CMakeLists.txt
├── hist.py
├── plot_dmod.m
└── wmbus_rx.py
├── cmake
├── Modules
│ ├── CMakeParseArgumentsCopy.cmake
│ ├── FindGnuradioCore.cmake
│ ├── FindGruel.cmake
│ ├── GrMiscUtils.cmake
│ ├── GrPlatform.cmake
│ ├── GrPython.cmake
│ ├── GrSwig.cmake
│ └── GrTest.cmake
└── cmake_uninstall.cmake.in
├── docs
├── CMakeLists.txt
└── doxygen
│ ├── CMakeLists.txt
│ ├── Doxyfile.in
│ ├── Doxyfile.swig_doc.in
│ ├── doxyxml
│ ├── __init__.py
│ ├── base.py
│ ├── doxyindex.py
│ ├── example
│ │ ├── Doxyfile
│ │ ├── aadvark.cc
│ │ ├── aadvark.h
│ │ └── xml
│ │ │ ├── aadvark_8cc.xml
│ │ │ ├── aadvark_8h.xml
│ │ │ ├── classAadvark.xml
│ │ │ ├── combine.xslt
│ │ │ ├── compound.xsd
│ │ │ ├── index.xml
│ │ │ └── index.xsd
│ ├── generated
│ │ ├── __init__.py
│ │ ├── compound.py
│ │ ├── compoundsuper.py
│ │ ├── index.py
│ │ └── indexsuper.py
│ └── text.py
│ ├── other
│ ├── group_defs.dox
│ └── main_page.dox
│ └── swig_doc.py
├── grc
├── CMakeLists.txt
├── wmbus_demod.grc
├── wmbus_demod.py.xml
├── wmbus_phy1.grc
├── wmbus_phy1.py.xml
├── wmbus_phy2.grc
└── wmbus_phy2.py.xml
├── include
├── CMakeLists.txt
└── wmbus_api.h
├── lib
└── CMakeLists.txt
├── python
├── CMakeLists.txt
├── __init__.py
├── wmbus_blocks.py
├── wmbus_blocks.pyc
├── wmbus_demod.py
├── wmbus_phy1.py
└── wmbus_phy2.py
└── swig
├── CMakeLists.txt
└── wmbus_swig.i
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled Object files
2 | *.slo
3 | *.lo
4 | *.o
5 |
6 | # Compiled Dynamic libraries
7 | *.so
8 |
9 | # Compiled Static libraries
10 | *.lai
11 | *.la
12 | *.a
13 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | gr-wmbus
2 | ========
3 |
4 | Receiver for wireless m-bus (EN 13757-4) based on the rtl-sdr
--------------------------------------------------------------------------------
/gr-wmbus/.cproject:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/gr-wmbus/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | gr-wmbus
4 |
5 |
6 |
7 |
8 |
9 | org.python.pydev.PyDevBuilder
10 |
11 |
12 |
13 |
14 | org.eclipse.cdt.managedbuilder.core.genmakebuilder
15 | clean,full,incremental,
16 |
17 |
18 |
19 |
20 | org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
21 | full,incremental,
22 |
23 |
24 |
25 |
26 |
27 | org.eclipse.cdt.core.cnature
28 | org.eclipse.cdt.core.ccnature
29 | org.eclipse.cdt.managedbuilder.core.managedBuildNature
30 | org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
31 | org.python.pydev.pythonNature
32 |
33 |
34 |
--------------------------------------------------------------------------------
/gr-wmbus/.pydevproject:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Default
6 | python 2.7
7 |
8 |
--------------------------------------------------------------------------------
/gr-wmbus/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Project setup
22 | ########################################################################
23 | cmake_minimum_required(VERSION 2.6)
24 | project(gr-wmbus CXX C)
25 | enable_testing()
26 |
27 | #select the release build type by default to get optimization flags
28 | if(NOT CMAKE_BUILD_TYPE)
29 | set(CMAKE_BUILD_TYPE "Release")
30 | message(STATUS "Build type not specified: defaulting to release.")
31 | endif(NOT CMAKE_BUILD_TYPE)
32 | set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
33 |
34 | list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
35 |
36 | ########################################################################
37 | # Compiler specific setup
38 | ########################################################################
39 | if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
40 | #http://gcc.gnu.org/wiki/Visibility
41 | add_definitions(-fvisibility=hidden)
42 | endif()
43 |
44 | ########################################################################
45 | # Find boost
46 | ########################################################################
47 | if(UNIX AND EXISTS "/usr/lib64")
48 | list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix
49 | endif(UNIX AND EXISTS "/usr/lib64")
50 | set(Boost_ADDITIONAL_VERSIONS
51 | "1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" "1.39.0" "1.39"
52 | "1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
53 | "1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" "1.49.0" "1.49"
54 | "1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" "1.54.0" "1.54"
55 | "1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
56 | "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
57 | "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
58 | )
59 | find_package(Boost "1.35")
60 |
61 | if(NOT Boost_FOUND)
62 | message(FATAL_ERROR "Boost required to compile wmbus")
63 | endif()
64 |
65 | ########################################################################
66 | # Install directories
67 | ########################################################################
68 | include(GrPlatform) #define LIB_SUFFIX
69 | set(GR_RUNTIME_DIR bin)
70 | set(GR_LIBRARY_DIR lib${LIB_SUFFIX})
71 | set(GR_INCLUDE_DIR include)
72 | set(GR_DATA_DIR share)
73 | set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME})
74 | set(GR_DOC_DIR ${GR_DATA_DIR}/doc)
75 | set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME})
76 | set(GR_CONF_DIR etc)
77 | set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d)
78 | set(GR_LIBEXEC_DIR libexec)
79 | set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME})
80 | set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks)
81 |
82 | ########################################################################
83 | # Find gnuradio build dependencies
84 | ########################################################################
85 | find_package(Gruel)
86 | find_package(GnuradioCore)
87 |
88 | if(NOT GRUEL_FOUND)
89 | message(FATAL_ERROR "Gruel required to compile wmbus")
90 | endif()
91 |
92 | if(NOT GNURADIO_CORE_FOUND)
93 | message(FATAL_ERROR "GnuRadio Core required to compile wmbus")
94 | endif()
95 |
96 | ########################################################################
97 | # Setup the include and linker paths
98 | ########################################################################
99 | include_directories(
100 | ${CMAKE_SOURCE_DIR}/include
101 | ${Boost_INCLUDE_DIRS}
102 | ${GRUEL_INCLUDE_DIRS}
103 | ${GNURADIO_CORE_INCLUDE_DIRS}
104 | )
105 |
106 | link_directories(
107 | ${Boost_LIBRARY_DIRS}
108 | ${GRUEL_LIBRARY_DIRS}
109 | ${GNURADIO_CORE_LIBRARY_DIRS}
110 | )
111 |
112 | # Set component parameters
113 | set(GR_WMBUS_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE)
114 | set(GR_WMBUS_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE INTERNAL "" FORCE)
115 |
116 | ########################################################################
117 | # Create uninstall target
118 | ########################################################################
119 | configure_file(
120 | ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
121 | ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
122 | @ONLY)
123 |
124 | add_custom_target(uninstall
125 | ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
126 | )
127 |
128 | ########################################################################
129 | # Add subdirectories
130 | ########################################################################
131 | #add_subdirectory(include)
132 | #add_subdirectory(lib)
133 | #add_subdirectory(swig)
134 | add_subdirectory(python)
135 | add_subdirectory(grc)
136 | add_subdirectory(apps)
137 | add_subdirectory(docs)
138 |
--------------------------------------------------------------------------------
/gr-wmbus/README.txt:
--------------------------------------------------------------------------------
1 | Receiver for wireless mbus aka EN 13757-4
--------------------------------------------------------------------------------
/gr-wmbus/apps/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | include(GrPython)
21 |
22 | GR_PYTHON_INSTALL(
23 | PROGRAMS
24 | wmbus_rx.py
25 | DESTINATION bin
26 | )
27 |
--------------------------------------------------------------------------------
/gr-wmbus/apps/hist.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """
4 | Make a histogram of normally distributed random numbers and plot the
5 | analytic PDF over it
6 | """
7 | import numpy as np
8 | import matplotlib.pyplot as plt
9 | import matplotlib.mlab as mlab
10 |
11 | import struct
12 |
13 | sbet_file = open('./traces/foo5.frame1.demod4.u8')
14 | sbet_data = sbet_file.read()
15 |
16 | x = []
17 | for s in sbet_data:
18 | (a) = struct.unpack("B", s)
19 | #x.append(a[0])
20 | x.append(a[0] & 0x03)
21 | x.append((a[0]/4) & 0x03)
22 | x.append((a[0]/4/4) & 0x03)
23 |
24 | fig = plt.figure()
25 | ax = fig.add_subplot(111)
26 |
27 | # the histogram of the data
28 | n, bins, patches = ax.hist(x, 64, normed=1, facecolor='green', alpha=0.75)
29 |
30 | # hist uses np.histogram under the hood to create 'n' and 'bins'.
31 | # np.histogram returns the bin edges, so there will be 50 probability
32 | # density values in n, 51 bin edges in bins and 50 patches. To get
33 | # everything lined up, we'll compute the bin centers
34 | #bincenters = 0.5*(bins[1:]+bins[:-1])
35 | # add a 'best fit' line for the normal PDF
36 | #y = mlab.normpdf( bincenters, mu, sigma)
37 | #l = ax.plot(bincenters, y, 'r--', linewidth=1)
38 |
39 | ax.set_xlabel('Smarts')
40 | ax.set_ylabel('Probability')
41 | #ax.set_title(r'$\mathrm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')
42 | ax.set_xlim(-.5, 63.5)
43 | #ax.set_ylim(0, 0.03)
44 | ax.grid(True)
45 |
46 | plt.show()
47 |
--------------------------------------------------------------------------------
/gr-wmbus/apps/plot_dmod.m:
--------------------------------------------------------------------------------
1 | function plot_dmod(sstart,slen,ofs)
2 |
3 | if nargin < 3
4 | ofs=0
5 | endif
6 |
7 | d1 = read_float_binary('fmdemod.dat');
8 | d2 = read_float_binary('clock_recovery.dat');
9 | d3 = read_char_binary('slicer.dat') -.5;
10 | %plot([1:12772],d1, [1:16:797*16],d2)
11 | %toggle_plplot_use
12 |
13 | mlen = min([floor(length(d1)/16) length(d2) length(d3)]);
14 | slen = min(slen, mlen-sstart);
15 | d2f = reshape(repmat(d2,1,16)',1,16*length(d2));
16 | d3f = reshape(repmat(d3,1,16)',1,16*length(d3));
17 |
18 | idx = [1:slen*16];
19 | idx = idx + 16*sstart;
20 | scale = 16;%1.6e3;
21 | %plot(idx/scale,d1(idx), idx/scale,d2f(idx), idx/scale,d3f(idx));
22 | plot(idx/scale,d1(idx), (idx-ofs)/scale,d2f(idx), (idx-ofs)/scale,d3f(idx));
23 | %plot(idx/scale,d2f(idx));
24 | grid on
25 | xlim([min(idx/scale) max(idx/scale)])
--------------------------------------------------------------------------------
/gr-wmbus/apps/wmbus_rx.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import struct
4 | from array import array
5 | import numpy
6 | from numpy.numarray.functions import ones
7 | from optparse import OptionParser
8 | from gnuradio import gr
9 | from gnuradio.extras import block_gateway
10 | from gnuradio import digital
11 | from gnuradio.digital import packet_utils
12 | from gnuradio.eng_option import eng_option
13 | from gruel.pmt.pmt_swig import pmt_print
14 | from gnuradio.extras.extras_swig import pmt_symbol_to_string
15 | import gnuradio.gr.gr_threading as _threading
16 | import osmosdr
17 | import crcmod.predefined
18 | from wmbus.wmbus_phy1 import *
19 | from wmbus.wmbus_phy2 import *
20 |
21 | def to_hex(data, start=0, end=-1, format=2):
22 | s = ''
23 | if -1 == end:
24 | end = len(data)
25 | for i in range(start,end):
26 | if format == 2:
27 | s += ( "{:02X}".format(data[i]) )
28 | else:
29 | s += ( "{:01X}".format(data[i]) )
30 | return s
31 |
32 |
33 | def gen_map():
34 | map = [16] * 64
35 | coded = [22, 13, 14, 11, 28, 25, 26, 19, 44, 37, 38, 35, 52, 49, 50, 41]
36 | uncoded = range(0,16)
37 | for i in range(0,16):
38 | map[coded[i]] = uncoded[i]
39 | return map
40 |
41 |
42 | class _queue_watcher_thread(_threading.Thread):
43 | def __init__(self, rcvd_pktq, callback):
44 | _threading.Thread.__init__(self)
45 | self.setDaemon(1)
46 | self.rcvd_pktq = rcvd_pktq
47 | self.callback = callback
48 | self.keep_running = True
49 | self.start()
50 |
51 | def run(self):
52 | while self.keep_running:
53 | msg = self.rcvd_pktq.delete_head()
54 | if self.callback:
55 | self.callback(msg)
56 |
57 | class wmbus_pdu:
58 | def __init__(self, data, verbose=0):
59 | self.crc16 = crcmod.predefined.PredefinedCrc('crc-16-en-13757')
60 | data_len = len(data)
61 | #print to_hex(data)
62 |
63 | # 5.5.2.2 Mode T: First block
64 | # L-field C-field M-field A-field CRC-field
65 | # 1 byte 1 byte 2 bytes 6 bytes 2 bytes
66 | self.decodeOk = True
67 | self.L = (data[0])
68 | self.C = (data[1])
69 | self.M = sum([data[2+i]*2**(i*8) for i in range(2)])
70 | #self.A = numpy.int8(data [4:10])
71 | self.A = to_hex(data[4:10]) #[hex(x) for x in data[4:10]]
72 | self.crc = sum([data[11-i]*2**(i*8) for i in range(2)])
73 |
74 | self.crc16.update(data[0:10])
75 | self.crcCalc = self.crc16.crcValue
76 | self.crcOk = (self.crcCalc == self.crc)
77 | self.decodeOk = self.decodeOk and self.crcOk
78 |
79 | self.data = []
80 | self.datacrc = []
81 | self.datacrcCalc = []
82 | self.data1 = ''
83 | self.data1crc = 0
84 | self.data1crcCalc = 0
85 |
86 | L_left = self.L - 9 # fist block L and CRC are not counted
87 |
88 | self.ci = data[12]
89 | L_left -= 1
90 | d_start = 13
91 | d_end = d_start + min(L_left, 15)
92 | L_left -= 15
93 | if d_end + 2 > data_len:
94 | if verbose > 1:
95 | print 'data truncated'
96 | self.decodeOk = False
97 | return
98 | self.data1 = to_hex(data[d_start:d_end]) #[hex(x) for x in data[d_start:d_end]]
99 | self.data1crc = sum([data[d_end+1-i]*2**(i*8) for i in range(2)])
100 | self.crc16 = crcmod.predefined.PredefinedCrc('crc-16-en-13757')
101 | self.crc16.update(data[12:d_end])
102 | self.data1crcCalc = self.crc16.crcValue
103 | self.decodeOk = self.decodeOk and (self.data1crcCalc == self.data1crc)
104 |
105 | while L_left > 0:
106 | d_start = d_end + 2
107 | d_end = d_start + min(L_left, 16)
108 | L_left -= 16
109 | #print to_hex(data[d_start:d_end])
110 | #print (data[d_start:d_end])
111 | #if True:
112 | # self.crc16 = crcmod.predefined.PredefinedCrc('crc-16-en-13757')
113 | # datadata = data[d_start:d_end]
114 | # print to_hex(datadata)
115 | # self.crc16.update(datadata)
116 | # print '{:X}'.format(self.crc16.crcValue)
117 | if d_end + 2 > data_len:
118 | if verbose > 1:
119 | print 'data truncated'
120 | self.decodeOk = False
121 | break
122 | self.data.append( to_hex(data[d_start:d_end]) )#[hex(x) for x in data[d_start:d_end]] )
123 | crc = sum([data[d_end+1-i]*2**(i*8) for i in range(2)])
124 | self.datacrc.append( crc )
125 | self.crc16 = crcmod.predefined.PredefinedCrc('crc-16-en-13757')
126 | self.crc16.update(data[d_start:d_end])
127 | self.datacrcCalc.append( self.crc16.crcValue )
128 | self.decodeOk = self.decodeOk and (self.crc16.crcValue ==crc)
129 |
130 | def __str__(self):
131 | #s = "[L:{:02X} C:{:02X} M:{:04X} A:{} crc:{:04X}]".format(self.L, self.C, self.M, self.A, self.crc)
132 | s = "[L:{:02X} C:{:02X} M:{:04X} A:{} crc:{:04X} {}]\n".format(self.L, self.C, self.M, self.A, self.crc, self.check_crc(self.crc,self.crcCalc))
133 | s += "[CI:{:02X} D:{} crc:{:04X} {}]\n".format(self.ci,self.data1,self.data1crc,self.check_crc(self.data1crc,self.data1crcCalc))
134 | for i in range(len(self.data)):
135 | s += "[D:{} crc:{:04X} {}]\n".format(self.data[i], self.datacrc[i], self.check_crc(self.datacrc[i], self.datacrcCalc[i]))
136 | return s
137 |
138 | def check_crc(self, crc_is, crc_should):
139 | if crc_is == crc_should:
140 | return 'ok'
141 | return "should:{:04X}".format(crc_should)
142 |
143 |
144 | class wmbus_rx(gr.top_block):
145 |
146 | def __init__(self, filename=None, capture=None, verbose=False, freq_error=-0.0021875):
147 | gr.top_block.__init__(self)
148 | self.verbose = verbose
149 | self.rx_chips_min = 16
150 | self.chip_error_threshold = 10
151 |
152 | if None != filename:
153 | self.source = gr.file_source(gr.sizeof_gr_complex, filename)
154 | else:
155 | self.source = osmosdr.source_c( args="nchan=" + str(1) + " " + "" )
156 | #print self.source.get_gain_range().to_pp_string()
157 | self.source.set_sample_rate(1.6e6)
158 | self.source.set_center_freq(868.95e6, 0)
159 | self.source.set_freq_corr(0, 0)
160 | self.source.set_gain_mode(0, 0)
161 | # -1.0 1.5 4.0 6.5 9.0 11.5 14.0 16.5 19.0 21.5 24.0 29.0 34.0 42.0
162 | self.source.set_gain(14, 0)
163 | self.source.set_if_gain(42, 0)
164 |
165 | if None != capture:
166 | self.sink = gr.file_sink(gr.sizeof_gr_complex, capture)
167 | else:
168 | self.msgq = gr.msg_queue(4)
169 | self.sink = wmbus_phy1(msgq=self.msgq, verbose=verbose, freq_error=freq_error);
170 | self._watcher = _queue_watcher_thread(self.msgq, self.callback)
171 |
172 | self.connect(self.source, self.sink)
173 |
174 | #self.msrc = gr.message_source(gr.sizeof_char, self.msgq)
175 | #self.mbus_phy2 = mbus_phy2();
176 |
177 | #self.connect(self.msrc, self.mbus_phy2)
178 |
179 |
180 | def callback(self, msg):
181 | vec = numpy.fromstring(msg.to_string(), numpy.uint8).tolist()
182 | phy2 = wmbus_phy2()
183 | phy2.gr_vector_source_x_0.set_data(vec)
184 | phy2.run()
185 | data = phy2.gr_vector_sink_x_0.data()
186 | err = phy2.gr_vector_sink_x_1.data()
187 | #dec_ok = (sum(err) < 5)#6*8)
188 | err_cnt = 0
189 | data2 = None
190 | for i in range(len(err)):
191 | err_cnt = err_cnt + err[i]
192 | if err_cnt > self.chip_error_threshold:
193 | data2 = data[0:i]
194 | if None == data2:
195 | data2 = data
196 | dec_ok = (len(data2) > self.rx_chips_min)
197 |
198 | if dec_ok:
199 | pdu = wmbus_pdu(array('B', data), self.verbose)
200 | if pdu.decodeOk or self.verbose > 0 and pdu.crcOk or self.verbose > 1:
201 | print pdu
202 | elif len(data) > self.rx_chips_min and self.verbose > 2:
203 | print 'Decode error'
204 | if self.verbose > 1:
205 | print to_hex(vec, format=1)
206 | print to_hex(err, format=1)
207 |
208 |
209 | if __name__ == '__main__':
210 | parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
211 | parser.add_option("-f", "--file", type="string", default=None,
212 | help="Process the specified file [default=%default]")
213 | parser.add_option("-c", "--capture", type="string", default=None,
214 | help="Capture only to the given file [default=%default]")
215 | parser.add_option("-v", "--verbose", type="int", default=0,
216 | help="Verbose output [default=%default]")
217 | parser.add_option("-e", "--freq_error", type="float", default=-0.0021875,
218 | help="Frequency error [default=%default]")
219 | (options, args) = parser.parse_args()
220 | #tb = wmbus_rx('/home/user/git/mbus/mine/traces/foo3.frame.f32')
221 | tb = wmbus_rx(options.file, options.capture, options.verbose, options.freq_error)
222 | tb.run()
223 | #print gen_map()
224 |
225 |
226 | for i in range(100000):
227 | f = i**2
228 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/CMakeParseArgumentsCopy.cmake:
--------------------------------------------------------------------------------
1 | # CMAKE_PARSE_ARGUMENTS( args...)
2 | #
3 | # CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions for
4 | # parsing the arguments given to that macro or function.
5 | # It processes the arguments and defines a set of variables which hold the
6 | # values of the respective options.
7 | #
8 | # The argument contains all options for the respective macro,
9 | # i.e. keywords which can be used when calling the macro without any value
10 | # following, like e.g. the OPTIONAL keyword of the install() command.
11 | #
12 | # The argument contains all keywords for this macro
13 | # which are followed by one value, like e.g. DESTINATION keyword of the
14 | # install() command.
15 | #
16 | # The argument contains all keywords for this macro
17 | # which can be followed by more than one value, like e.g. the TARGETS or
18 | # FILES keywords of the install() command.
19 | #
20 | # When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
21 | # keywords listed in , and
22 | # a variable composed of the given
23 | # followed by "_" and the name of the respective keyword.
24 | # These variables will then hold the respective value from the argument list.
25 | # For the keywords this will be TRUE or FALSE.
26 | #
27 | # All remaining arguments are collected in a variable
28 | # _UNPARSED_ARGUMENTS, this can be checked afterwards to see whether
29 | # your macro was called with unrecognized parameters.
30 | #
31 | # As an example here a my_install() macro, which takes similar arguments as the
32 | # real install() command:
33 | #
34 | # function(MY_INSTALL)
35 | # set(options OPTIONAL FAST)
36 | # set(oneValueArgs DESTINATION RENAME)
37 | # set(multiValueArgs TARGETS CONFIGURATIONS)
38 | # cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
39 | # ...
40 | #
41 | # Assume my_install() has been called like this:
42 | # my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
43 | #
44 | # After the cmake_parse_arguments() call the macro will have set the following
45 | # variables:
46 | # MY_INSTALL_OPTIONAL = TRUE
47 | # MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
48 | # MY_INSTALL_DESTINATION = "bin"
49 | # MY_INSTALL_RENAME = "" (was not used)
50 | # MY_INSTALL_TARGETS = "foo;bar"
51 | # MY_INSTALL_CONFIGURATIONS = "" (was not used)
52 | # MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
53 | #
54 | # You can the continue and process these variables.
55 | #
56 | # Keywords terminate lists of values, e.g. if directly after a one_value_keyword
57 | # another recognized keyword follows, this is interpreted as the beginning of
58 | # the new option.
59 | # E.g. my_install(TARGETS foo DESTINATION OPTIONAL) would result in
60 | # MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION would
61 | # be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
62 |
63 | #=============================================================================
64 | # Copyright 2010 Alexander Neundorf
65 | #
66 | # Distributed under the OSI-approved BSD License (the "License");
67 | # see accompanying file Copyright.txt for details.
68 | #
69 | # This software is distributed WITHOUT ANY WARRANTY; without even the
70 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
71 | # See the License for more information.
72 | #=============================================================================
73 | # (To distribute this file outside of CMake, substitute the full
74 | # License text for the above reference.)
75 |
76 |
77 | if(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
78 | return()
79 | endif()
80 | set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)
81 |
82 |
83 | function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
84 | # first set all result variables to empty/FALSE
85 | foreach(arg_name ${_singleArgNames} ${_multiArgNames})
86 | set(${prefix}_${arg_name})
87 | endforeach(arg_name)
88 |
89 | foreach(option ${_optionNames})
90 | set(${prefix}_${option} FALSE)
91 | endforeach(option)
92 |
93 | set(${prefix}_UNPARSED_ARGUMENTS)
94 |
95 | set(insideValues FALSE)
96 | set(currentArgName)
97 |
98 | # now iterate over all arguments and fill the result variables
99 | foreach(currentArg ${ARGN})
100 | list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
101 | list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
102 | list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword
103 |
104 | if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
105 | if(insideValues)
106 | if("${insideValues}" STREQUAL "SINGLE")
107 | set(${prefix}_${currentArgName} ${currentArg})
108 | set(insideValues FALSE)
109 | elseif("${insideValues}" STREQUAL "MULTI")
110 | list(APPEND ${prefix}_${currentArgName} ${currentArg})
111 | endif()
112 | else(insideValues)
113 | list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
114 | endif(insideValues)
115 | else()
116 | if(NOT ${optionIndex} EQUAL -1)
117 | set(${prefix}_${currentArg} TRUE)
118 | set(insideValues FALSE)
119 | elseif(NOT ${singleArgIndex} EQUAL -1)
120 | set(currentArgName ${currentArg})
121 | set(${prefix}_${currentArgName})
122 | set(insideValues "SINGLE")
123 | elseif(NOT ${multiArgIndex} EQUAL -1)
124 | set(currentArgName ${currentArg})
125 | set(${prefix}_${currentArgName})
126 | set(insideValues "MULTI")
127 | endif()
128 | endif()
129 |
130 | endforeach(currentArg)
131 |
132 | # propagate the result variables to the caller:
133 | foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
134 | set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
135 | endforeach(arg_name)
136 | set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)
137 |
138 | endfunction(CMAKE_PARSE_ARGUMENTS _options _singleArgs _multiArgs)
139 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/FindGnuradioCore.cmake:
--------------------------------------------------------------------------------
1 | INCLUDE(FindPkgConfig)
2 | PKG_CHECK_MODULES(PC_GNURADIO_CORE gnuradio-core)
3 |
4 | FIND_PATH(
5 | GNURADIO_CORE_INCLUDE_DIRS
6 | NAMES gr_random.h
7 | HINTS $ENV{GNURADIO_CORE_DIR}/include/gnuradio
8 | ${PC_GNURADIO_CORE_INCLUDEDIR}
9 | ${CMAKE_INSTALL_PREFIX}/include/gnuradio
10 | PATHS /usr/local/include/gnuradio
11 | /usr/include/gnuradio
12 | )
13 |
14 | FIND_LIBRARY(
15 | GNURADIO_CORE_LIBRARIES
16 | NAMES gnuradio-core
17 | HINTS $ENV{GNURADIO_CORE_DIR}/lib
18 | ${PC_GNURADIO_CORE_LIBDIR}
19 | ${CMAKE_INSTALL_PREFIX}/lib64
20 | ${CMAKE_INSTALL_PREFIX}/lib
21 | PATHS /usr/local/lib
22 | /usr/local/lib64
23 | /usr/lib
24 | /usr/lib64
25 | )
26 |
27 | INCLUDE(FindPackageHandleStandardArgs)
28 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GNURADIO_CORE DEFAULT_MSG GNURADIO_CORE_LIBRARIES GNURADIO_CORE_INCLUDE_DIRS)
29 | MARK_AS_ADVANCED(GNURADIO_CORE_LIBRARIES GNURADIO_CORE_INCLUDE_DIRS)
30 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/FindGruel.cmake:
--------------------------------------------------------------------------------
1 | INCLUDE(FindPkgConfig)
2 | PKG_CHECK_MODULES(PC_GRUEL gruel)
3 |
4 | FIND_PATH(
5 | GRUEL_INCLUDE_DIRS
6 | NAMES gruel/attributes.h
7 | HINTS $ENV{GRUEL_DIR}/include
8 | ${PC_GRUEL_INCLUDEDIR}
9 | ${CMAKE_INSTALL_PREFIX}/include
10 | PATHS /usr/local/include
11 | /usr/include
12 | )
13 |
14 | FIND_LIBRARY(
15 | GRUEL_LIBRARIES
16 | NAMES gruel
17 | HINTS $ENV{GRUEL_DIR}/lib
18 | ${PC_GRUEL_LIBDIR}
19 | ${CMAKE_INSTALL_PREFIX}/lib
20 | ${CMAKE_INSTALL_PREFIX}/lib64
21 | PATHS /usr/local/lib
22 | /usr/local/lib64
23 | /usr/lib
24 | /usr/lib64
25 | )
26 |
27 | INCLUDE(FindPackageHandleStandardArgs)
28 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GRUEL DEFAULT_MSG GRUEL_LIBRARIES GRUEL_INCLUDE_DIRS)
29 | MARK_AS_ADVANCED(GRUEL_LIBRARIES GRUEL_INCLUDE_DIRS)
30 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/GrMiscUtils.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_MISC_UTILS_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_MISC_UTILS_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Set global variable macro.
27 | # Used for subdirectories to export settings.
28 | # Example: include and library paths.
29 | ########################################################################
30 | function(GR_SET_GLOBAL var)
31 | set(${var} ${ARGN} CACHE INTERNAL "" FORCE)
32 | endfunction(GR_SET_GLOBAL)
33 |
34 | ########################################################################
35 | # Set the pre-processor definition if the condition is true.
36 | # - def the pre-processor definition to set and condition name
37 | ########################################################################
38 | function(GR_ADD_COND_DEF def)
39 | if(${def})
40 | add_definitions(-D${def})
41 | endif(${def})
42 | endfunction(GR_ADD_COND_DEF)
43 |
44 | ########################################################################
45 | # Check for a header and conditionally set a compile define.
46 | # - hdr the relative path to the header file
47 | # - def the pre-processor definition to set
48 | ########################################################################
49 | function(GR_CHECK_HDR_N_DEF hdr def)
50 | include(CheckIncludeFileCXX)
51 | CHECK_INCLUDE_FILE_CXX(${hdr} ${def})
52 | GR_ADD_COND_DEF(${def})
53 | endfunction(GR_CHECK_HDR_N_DEF)
54 |
55 | ########################################################################
56 | # Include subdirectory macro.
57 | # Sets the CMake directory variables,
58 | # includes the subdirectory CMakeLists.txt,
59 | # resets the CMake directory variables.
60 | #
61 | # This macro includes subdirectories rather than adding them
62 | # so that the subdirectory can affect variables in the level above.
63 | # This provides a work-around for the lack of convenience libraries.
64 | # This way a subdirectory can append to the list of library sources.
65 | ########################################################################
66 | macro(GR_INCLUDE_SUBDIRECTORY subdir)
67 | #insert the current directories on the front of the list
68 | list(INSERT _cmake_source_dirs 0 ${CMAKE_CURRENT_SOURCE_DIR})
69 | list(INSERT _cmake_binary_dirs 0 ${CMAKE_CURRENT_BINARY_DIR})
70 |
71 | #set the current directories to the names of the subdirs
72 | set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
73 | set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${subdir})
74 |
75 | #include the subdirectory CMakeLists to run it
76 | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
77 | include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt)
78 |
79 | #reset the value of the current directories
80 | list(GET _cmake_source_dirs 0 CMAKE_CURRENT_SOURCE_DIR)
81 | list(GET _cmake_binary_dirs 0 CMAKE_CURRENT_BINARY_DIR)
82 |
83 | #pop the subdir names of the front of the list
84 | list(REMOVE_AT _cmake_source_dirs 0)
85 | list(REMOVE_AT _cmake_binary_dirs 0)
86 | endmacro(GR_INCLUDE_SUBDIRECTORY)
87 |
88 | ########################################################################
89 | # Check if a compiler flag works and conditionally set a compile define.
90 | # - flag the compiler flag to check for
91 | # - have the variable to set with result
92 | ########################################################################
93 | macro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE flag have)
94 | include(CheckCXXCompilerFlag)
95 | CHECK_CXX_COMPILER_FLAG(${flag} ${have})
96 | if(${have})
97 | add_definitions(${flag})
98 | endif(${have})
99 | endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE)
100 |
101 | ########################################################################
102 | # Generates the .la libtool file
103 | # This appears to generate libtool files that cannot be used by auto*.
104 | # Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest])
105 | # Notice: there is not COMPONENT option, these will not get distributed.
106 | ########################################################################
107 | function(GR_LIBTOOL)
108 | if(NOT DEFINED GENERATE_LIBTOOL)
109 | set(GENERATE_LIBTOOL OFF) #disabled by default
110 | endif()
111 |
112 | if(GENERATE_LIBTOOL)
113 | include(CMakeParseArgumentsCopy)
114 | CMAKE_PARSE_ARGUMENTS(GR_LIBTOOL "" "TARGET;DESTINATION" "" ${ARGN})
115 |
116 | find_program(LIBTOOL libtool)
117 | if(LIBTOOL)
118 | include(CMakeMacroLibtoolFile)
119 | CREATE_LIBTOOL_FILE(${GR_LIBTOOL_TARGET} /${GR_LIBTOOL_DESTINATION})
120 | endif(LIBTOOL)
121 | endif(GENERATE_LIBTOOL)
122 |
123 | endfunction(GR_LIBTOOL)
124 |
125 | ########################################################################
126 | # Do standard things to the library target
127 | # - set target properties
128 | # - make install rules
129 | # Also handle gnuradio custom naming conventions w/ extras mode.
130 | ########################################################################
131 | function(GR_LIBRARY_FOO target)
132 | #parse the arguments for component names
133 | include(CMakeParseArgumentsCopy)
134 | CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN})
135 |
136 | #set additional target properties
137 | set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER})
138 |
139 | #install the generated files like so...
140 | install(TARGETS ${target}
141 | LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file
142 | ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file
143 | RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file
144 | )
145 |
146 | #extras mode enabled automatically on linux
147 | if(NOT DEFINED LIBRARY_EXTRAS)
148 | set(LIBRARY_EXTRAS ${LINUX})
149 | endif()
150 |
151 | #special extras mode to enable alternative naming conventions
152 | if(LIBRARY_EXTRAS)
153 |
154 | #create .la file before changing props
155 | GR_LIBTOOL(TARGET ${target} DESTINATION ${GR_LIBRARY_DIR})
156 |
157 | #give the library a special name with ultra-zero soversion
158 | set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_NAME ${target}-${LIBVER} SOVERSION "0.0.0")
159 | set(target_name lib${target}-${LIBVER}.so.0.0.0)
160 |
161 | #custom command to generate symlinks
162 | add_custom_command(
163 | TARGET ${target}
164 | POST_BUILD
165 | COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
166 | COMMAND ${CMAKE_COMMAND} -E create_symlink ${target_name} ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
167 | COMMAND ${CMAKE_COMMAND} -E touch ${target_name} #so the symlinks point to something valid so cmake 2.6 will install
168 | )
169 |
170 | #and install the extra symlinks
171 | install(
172 | FILES
173 | ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so
174 | ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0
175 | DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT}
176 | )
177 |
178 | endif(LIBRARY_EXTRAS)
179 | endfunction(GR_LIBRARY_FOO)
180 |
181 | ########################################################################
182 | # Create a dummy custom command that depends on other targets.
183 | # Usage:
184 | # GR_GEN_TARGET_DEPS(unique_name target_deps ...)
185 | # ADD_CUSTOM_COMMAND( ${target_deps})
186 | #
187 | # Custom command cant depend on targets, but can depend on executables,
188 | # and executables can depend on targets. So this is the process:
189 | ########################################################################
190 | function(GR_GEN_TARGET_DEPS name var)
191 | file(
192 | WRITE ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
193 | "int main(void){return 0;}\n"
194 | )
195 | execute_process(
196 | COMMAND ${CMAKE_COMMAND} -E copy_if_different
197 | ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp.in
198 | ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp
199 | )
200 | add_executable(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
201 | if(ARGN)
202 | add_dependencies(${name} ${ARGN})
203 | endif(ARGN)
204 |
205 | if(CMAKE_CROSSCOMPILING)
206 | set(${var} "DEPENDS;${name}" PARENT_SCOPE) #cant call command when cross
207 | else()
208 | set(${var} "DEPENDS;${name};COMMAND;${name}" PARENT_SCOPE)
209 | endif()
210 | endfunction(GR_GEN_TARGET_DEPS)
211 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/GrPlatform.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_PLATFORM_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_PLATFORM_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Setup additional defines for OS types
27 | ########################################################################
28 | if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
29 | set(LINUX TRUE)
30 | endif()
31 |
32 | if(LINUX AND EXISTS "/etc/debian_version")
33 | set(DEBIAN TRUE)
34 | endif()
35 |
36 | if(LINUX AND EXISTS "/etc/redhat-release")
37 | set(REDHAT TRUE)
38 | endif()
39 |
40 | ########################################################################
41 | # when the library suffix should be 64 (applies to redhat linux family)
42 | ########################################################################
43 | if(NOT DEFINED LIB_SUFFIX AND REDHAT AND CMAKE_SYSTEM_PROCESSOR MATCHES "64$")
44 | set(LIB_SUFFIX 64)
45 | endif()
46 | set(LIB_SUFFIX ${LIB_SUFFIX} CACHE STRING "lib directory suffix")
47 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/GrPython.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_PYTHON_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_PYTHON_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Setup the python interpreter:
27 | # This allows the user to specify a specific interpreter,
28 | # or finds the interpreter via the built-in cmake module.
29 | ########################################################################
30 | #this allows the user to override PYTHON_EXECUTABLE
31 | if(PYTHON_EXECUTABLE)
32 |
33 | set(PYTHONINTERP_FOUND TRUE)
34 |
35 | #otherwise if not set, try to automatically find it
36 | else(PYTHON_EXECUTABLE)
37 |
38 | #use the built-in find script
39 | find_package(PythonInterp)
40 |
41 | #and if that fails use the find program routine
42 | if(NOT PYTHONINTERP_FOUND)
43 | find_program(PYTHON_EXECUTABLE NAMES python python2.7 python2.6 python2.5)
44 | if(PYTHON_EXECUTABLE)
45 | set(PYTHONINTERP_FOUND TRUE)
46 | endif(PYTHON_EXECUTABLE)
47 | endif(NOT PYTHONINTERP_FOUND)
48 |
49 | endif(PYTHON_EXECUTABLE)
50 |
51 | #make the path to the executable appear in the cmake gui
52 | set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} CACHE FILEPATH "python interpreter")
53 |
54 | #make sure we can use -B with python (introduced in 2.6)
55 | if(PYTHON_EXECUTABLE)
56 | execute_process(
57 | COMMAND ${PYTHON_EXECUTABLE} -B -c ""
58 | OUTPUT_QUIET ERROR_QUIET
59 | RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
60 | )
61 | if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
62 | set(PYTHON_DASH_B "-B")
63 | endif()
64 | endif(PYTHON_EXECUTABLE)
65 |
66 | ########################################################################
67 | # Check for the existence of a python module:
68 | # - desc a string description of the check
69 | # - mod the name of the module to import
70 | # - cmd an additional command to run
71 | # - have the result variable to set
72 | ########################################################################
73 | macro(GR_PYTHON_CHECK_MODULE desc mod cmd have)
74 | message(STATUS "")
75 | message(STATUS "Python checking for ${desc}")
76 | execute_process(
77 | COMMAND ${PYTHON_EXECUTABLE} -c "
78 | #########################################
79 | try: import ${mod}
80 | except: exit(-1)
81 | try: assert ${cmd}
82 | except: exit(-1)
83 | #########################################"
84 | RESULT_VARIABLE ${have}
85 | )
86 | if(${have} EQUAL 0)
87 | message(STATUS "Python checking for ${desc} - found")
88 | set(${have} TRUE)
89 | else(${have} EQUAL 0)
90 | message(STATUS "Python checking for ${desc} - not found")
91 | set(${have} FALSE)
92 | endif(${have} EQUAL 0)
93 | endmacro(GR_PYTHON_CHECK_MODULE)
94 |
95 | ########################################################################
96 | # Sets the python installation directory GR_PYTHON_DIR
97 | ########################################################################
98 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
99 | from distutils import sysconfig
100 | print sysconfig.get_python_lib(plat_specific=True, prefix='')
101 | " OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
102 | )
103 | file(TO_CMAKE_PATH ${GR_PYTHON_DIR} GR_PYTHON_DIR)
104 |
105 | ########################################################################
106 | # Create an always-built target with a unique name
107 | # Usage: GR_UNIQUE_TARGET( )
108 | ########################################################################
109 | function(GR_UNIQUE_TARGET desc)
110 | file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
111 | execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
112 | unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
113 | print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
114 | OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
115 | add_custom_target(${_target} ALL DEPENDS ${ARGN})
116 | endfunction(GR_UNIQUE_TARGET)
117 |
118 | ########################################################################
119 | # Install python sources (also builds and installs byte-compiled python)
120 | ########################################################################
121 | function(GR_PYTHON_INSTALL)
122 | include(CMakeParseArgumentsCopy)
123 | CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN})
124 |
125 | ####################################################################
126 | if(GR_PYTHON_INSTALL_FILES)
127 | ####################################################################
128 | install(${ARGN}) #installs regular python files
129 |
130 | #create a list of all generated files
131 | unset(pysrcfiles)
132 | unset(pycfiles)
133 | unset(pyofiles)
134 | foreach(pyfile ${GR_PYTHON_INSTALL_FILES})
135 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
136 | list(APPEND pysrcfiles ${pyfile})
137 |
138 | #determine if this file is in the source or binary directory
139 | file(RELATIVE_PATH source_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${pyfile})
140 | string(LENGTH "${source_rel_path}" source_rel_path_len)
141 | file(RELATIVE_PATH binary_rel_path ${CMAKE_CURRENT_BINARY_DIR} ${pyfile})
142 | string(LENGTH "${binary_rel_path}" binary_rel_path_len)
143 |
144 | #and set the generated path appropriately
145 | if(${source_rel_path_len} GREATER ${binary_rel_path_len})
146 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${binary_rel_path})
147 | else()
148 | set(pygenfile ${CMAKE_CURRENT_BINARY_DIR}/${source_rel_path})
149 | endif()
150 | list(APPEND pycfiles ${pygenfile}c)
151 | list(APPEND pyofiles ${pygenfile}o)
152 |
153 | #ensure generation path exists
154 | get_filename_component(pygen_path ${pygenfile} PATH)
155 | file(MAKE_DIRECTORY ${pygen_path})
156 |
157 | endforeach(pyfile)
158 |
159 | #the command to generate the pyc files
160 | add_custom_command(
161 | DEPENDS ${pysrcfiles} OUTPUT ${pycfiles}
162 | COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pycfiles}
163 | )
164 |
165 | #the command to generate the pyo files
166 | add_custom_command(
167 | DEPENDS ${pysrcfiles} OUTPUT ${pyofiles}
168 | COMMAND ${PYTHON_EXECUTABLE} -O ${CMAKE_BINARY_DIR}/python_compile_helper.py ${pysrcfiles} ${pyofiles}
169 | )
170 |
171 | #create install rule and add generated files to target list
172 | set(python_install_gen_targets ${pycfiles} ${pyofiles})
173 | install(FILES ${python_install_gen_targets}
174 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
175 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
176 | )
177 |
178 |
179 | ####################################################################
180 | elseif(GR_PYTHON_INSTALL_PROGRAMS)
181 | ####################################################################
182 | file(TO_NATIVE_PATH ${PYTHON_EXECUTABLE} pyexe_native)
183 |
184 | foreach(pyfile ${GR_PYTHON_INSTALL_PROGRAMS})
185 | get_filename_component(pyfile_name ${pyfile} NAME)
186 | get_filename_component(pyfile ${pyfile} ABSOLUTE)
187 | string(REPLACE "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" pyexefile "${pyfile}.exe")
188 | list(APPEND python_install_gen_targets ${pyexefile})
189 |
190 | get_filename_component(pyexefile_path ${pyexefile} PATH)
191 | file(MAKE_DIRECTORY ${pyexefile_path})
192 |
193 | add_custom_command(
194 | OUTPUT ${pyexefile} DEPENDS ${pyfile}
195 | COMMAND ${PYTHON_EXECUTABLE} -c
196 | \"open('${pyexefile}', 'w').write('\#!${pyexe_native}\\n'+open('${pyfile}').read())\"
197 | COMMENT "Shebangin ${pyfile_name}"
198 | )
199 |
200 | #on windows, python files need an extension to execute
201 | get_filename_component(pyfile_ext ${pyfile} EXT)
202 | if(WIN32 AND NOT pyfile_ext)
203 | set(pyfile_name "${pyfile_name}.py")
204 | endif()
205 |
206 | install(PROGRAMS ${pyexefile} RENAME ${pyfile_name}
207 | DESTINATION ${GR_PYTHON_INSTALL_DESTINATION}
208 | COMPONENT ${GR_PYTHON_INSTALL_COMPONENT}
209 | )
210 | endforeach(pyfile)
211 |
212 | endif()
213 |
214 | GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})
215 |
216 | endfunction(GR_PYTHON_INSTALL)
217 |
218 | ########################################################################
219 | # Write the python helper script that generates byte code files
220 | ########################################################################
221 | file(WRITE ${CMAKE_BINARY_DIR}/python_compile_helper.py "
222 | import sys, py_compile
223 | files = sys.argv[1:]
224 | srcs, gens = files[:len(files)/2], files[len(files)/2:]
225 | for src, gen in zip(srcs, gens):
226 | py_compile.compile(file=src, cfile=gen, doraise=True)
227 | ")
228 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/GrSwig.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_SWIG_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_SWIG_CMAKE TRUE)
24 |
25 | include(GrPython)
26 |
27 | ########################################################################
28 | # Builds a swig documentation file to be generated into python docstrings
29 | # Usage: GR_SWIG_MAKE_DOCS(output_file input_path input_path....)
30 | #
31 | # Set the following variable to specify extra dependent targets:
32 | # - GR_SWIG_DOCS_SOURCE_DEPS
33 | # - GR_SWIG_DOCS_TARGET_DEPS
34 | ########################################################################
35 | function(GR_SWIG_MAKE_DOCS output_file)
36 | find_package(Doxygen)
37 | if(DOXYGEN_FOUND)
38 |
39 | #setup the input files variable list, quote formated
40 | set(input_files)
41 | unset(INPUT_PATHS)
42 | foreach(input_path ${ARGN})
43 | if (IS_DIRECTORY ${input_path}) #when input path is a directory
44 | file(GLOB input_path_h_files ${input_path}/*.h)
45 | else() #otherwise its just a file, no glob
46 | set(input_path_h_files ${input_path})
47 | endif()
48 | list(APPEND input_files ${input_path_h_files})
49 | set(INPUT_PATHS "${INPUT_PATHS} \"${input_path}\"")
50 | endforeach(input_path)
51 |
52 | #determine the output directory
53 | get_filename_component(name ${output_file} NAME_WE)
54 | get_filename_component(OUTPUT_DIRECTORY ${output_file} PATH)
55 | set(OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/${name}_swig_docs)
56 | make_directory(${OUTPUT_DIRECTORY})
57 |
58 | #generate the Doxyfile used by doxygen
59 | configure_file(
60 | ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.swig_doc.in
61 | ${OUTPUT_DIRECTORY}/Doxyfile
62 | @ONLY)
63 |
64 | #Create a dummy custom command that depends on other targets
65 | include(GrMiscUtils)
66 | GR_GEN_TARGET_DEPS(_${name}_tag tag_deps ${GR_SWIG_DOCS_TARGET_DEPS})
67 |
68 | #call doxygen on the Doxyfile + input headers
69 | add_custom_command(
70 | OUTPUT ${OUTPUT_DIRECTORY}/xml/index.xml
71 | DEPENDS ${input_files} ${GR_SWIG_DOCS_SOURCE_DEPS} ${tag_deps}
72 | COMMAND ${DOXYGEN_EXECUTABLE} ${OUTPUT_DIRECTORY}/Doxyfile
73 | COMMENT "Generating doxygen xml for ${name} docs"
74 | )
75 |
76 | #call the swig_doc script on the xml files
77 | add_custom_command(
78 | OUTPUT ${output_file}
79 | DEPENDS ${input_files} ${OUTPUT_DIRECTORY}/xml/index.xml
80 | COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
81 | ${CMAKE_SOURCE_DIR}/docs/doxygen/swig_doc.py
82 | ${OUTPUT_DIRECTORY}/xml
83 | ${output_file}
84 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
85 | )
86 |
87 | else(DOXYGEN_FOUND)
88 | file(WRITE ${output_file} "\n") #no doxygen -> empty file
89 | endif(DOXYGEN_FOUND)
90 | endfunction(GR_SWIG_MAKE_DOCS)
91 |
92 | ########################################################################
93 | # Build a swig target for the common gnuradio use case. Usage:
94 | # GR_SWIG_MAKE(target ifile ifile ifile...)
95 | #
96 | # Set the following variables before calling:
97 | # - GR_SWIG_FLAGS
98 | # - GR_SWIG_INCLUDE_DIRS
99 | # - GR_SWIG_LIBRARIES
100 | # - GR_SWIG_SOURCE_DEPS
101 | # - GR_SWIG_TARGET_DEPS
102 | # - GR_SWIG_DOC_FILE
103 | # - GR_SWIG_DOC_DIRS
104 | ########################################################################
105 | macro(GR_SWIG_MAKE name)
106 | set(ifiles ${ARGN})
107 |
108 | #do swig doc generation if specified
109 | if (GR_SWIG_DOC_FILE)
110 | set(GR_SWIG_DOCS_SOURCE_DEPS ${GR_SWIG_SOURCE_DEPS})
111 | set(GR_SWIG_DOCS_TAREGT_DEPS ${GR_SWIG_TARGET_DEPS})
112 | GR_SWIG_MAKE_DOCS(${GR_SWIG_DOC_FILE} ${GR_SWIG_DOC_DIRS})
113 | list(APPEND GR_SWIG_SOURCE_DEPS ${GR_SWIG_DOC_FILE})
114 | endif()
115 |
116 | #append additional include directories
117 | find_package(PythonLibs)
118 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_PATH}) #deprecated name (now dirs)
119 | list(APPEND GR_SWIG_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
120 | list(APPEND GR_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR})
121 | list(APPEND GR_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR})
122 |
123 | #determine include dependencies for swig file
124 | execute_process(
125 | COMMAND ${PYTHON_EXECUTABLE}
126 | ${CMAKE_BINARY_DIR}/get_swig_deps.py
127 | "${ifiles}" "${GR_SWIG_INCLUDE_DIRS}"
128 | OUTPUT_STRIP_TRAILING_WHITESPACE
129 | OUTPUT_VARIABLE SWIG_MODULE_${name}_EXTRA_DEPS
130 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
131 | )
132 |
133 | #Create a dummy custom command that depends on other targets
134 | include(GrMiscUtils)
135 | GR_GEN_TARGET_DEPS(_${name}_swig_tag tag_deps ${GR_SWIG_TARGET_DEPS})
136 | set(tag_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.tag)
137 | add_custom_command(
138 | OUTPUT ${tag_file}
139 | DEPENDS ${GR_SWIG_SOURCE_DEPS} ${tag_deps}
140 | COMMAND ${CMAKE_COMMAND} -E touch ${tag_file}
141 | )
142 |
143 | #append the specified include directories
144 | include_directories(${GR_SWIG_INCLUDE_DIRS})
145 | list(APPEND SWIG_MODULE_${name}_EXTRA_DEPS ${tag_file})
146 |
147 | #setup the swig flags with flags and include directories
148 | set(CMAKE_SWIG_FLAGS -fvirtual -modern -keyword -w511 -module ${name} ${GR_SWIG_FLAGS})
149 | foreach(dir ${GR_SWIG_INCLUDE_DIRS})
150 | list(APPEND CMAKE_SWIG_FLAGS "-I${dir}")
151 | endforeach(dir)
152 |
153 | #set the C++ property on the swig .i file so it builds
154 | set_source_files_properties(${ifiles} PROPERTIES CPLUSPLUS ON)
155 |
156 | #setup the actual swig library target to be built
157 | include(UseSWIG)
158 | SWIG_ADD_MODULE(${name} python ${ifiles})
159 | SWIG_LINK_LIBRARIES(${name} ${PYTHON_LIBRARIES} ${GR_SWIG_LIBRARIES})
160 |
161 | endmacro(GR_SWIG_MAKE)
162 |
163 | ########################################################################
164 | # Install swig targets generated by GR_SWIG_MAKE. Usage:
165 | # GR_SWIG_INSTALL(
166 | # TARGETS target target target...
167 | # [DESTINATION destination]
168 | # [COMPONENT component]
169 | # )
170 | ########################################################################
171 | macro(GR_SWIG_INSTALL)
172 |
173 | include(CMakeParseArgumentsCopy)
174 | CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN})
175 |
176 | foreach(name ${GR_SWIG_INSTALL_TARGETS})
177 | install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME}
178 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
179 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
180 | )
181 |
182 | include(GrPython)
183 | GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py
184 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
185 | COMPONENT ${GR_SWIG_INSTALL_COMPONENT}
186 | )
187 |
188 | GR_LIBTOOL(
189 | TARGET ${SWIG_MODULE_${name}_REAL_NAME}
190 | DESTINATION ${GR_SWIG_INSTALL_DESTINATION}
191 | )
192 |
193 | endforeach(name)
194 |
195 | endmacro(GR_SWIG_INSTALL)
196 |
197 | ########################################################################
198 | # Generate a python file that can determine swig dependencies.
199 | # Used by the make macro above to determine extra dependencies.
200 | # When you build C++, CMake figures out the header dependencies.
201 | # This code essentially performs that logic for swig includes.
202 | ########################################################################
203 | file(WRITE ${CMAKE_BINARY_DIR}/get_swig_deps.py "
204 |
205 | import os, sys, re
206 |
207 | include_matcher = re.compile('[#|%]include\\s*[<|\"](.*)[>|\"]')
208 | include_dirs = sys.argv[2].split(';')
209 |
210 | def get_swig_incs(file_path):
211 | file_contents = open(file_path, 'r').read()
212 | return include_matcher.findall(file_contents, re.MULTILINE)
213 |
214 | def get_swig_deps(file_path, level):
215 | deps = [file_path]
216 | if level == 0: return deps
217 | for inc_file in get_swig_incs(file_path):
218 | for inc_dir in include_dirs:
219 | inc_path = os.path.join(inc_dir, inc_file)
220 | if not os.path.exists(inc_path): continue
221 | deps.extend(get_swig_deps(inc_path, level-1))
222 | return deps
223 |
224 | if __name__ == '__main__':
225 | ifiles = sys.argv[1].split(';')
226 | deps = sum([get_swig_deps(ifile, 3) for ifile in ifiles], [])
227 | #sys.stderr.write(';'.join(set(deps)) + '\\n\\n')
228 | print(';'.join(set(deps)))
229 | ")
230 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/Modules/GrTest.cmake:
--------------------------------------------------------------------------------
1 | # Copyright 2010-2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | if(DEFINED __INCLUDED_GR_TEST_CMAKE)
21 | return()
22 | endif()
23 | set(__INCLUDED_GR_TEST_CMAKE TRUE)
24 |
25 | ########################################################################
26 | # Add a unit test and setup the environment for a unit test.
27 | # Takes the same arguments as the ADD_TEST function.
28 | #
29 | # Before calling set the following variables:
30 | # GR_TEST_TARGET_DEPS - built targets for the library path
31 | # GR_TEST_LIBRARY_DIRS - directories for the library path
32 | # GR_TEST_PYTHON_DIRS - directories for the python path
33 | ########################################################################
34 | function(GR_ADD_TEST test_name)
35 |
36 | if(WIN32)
37 | #Ensure that the build exe also appears in the PATH.
38 | list(APPEND GR_TEST_TARGET_DEPS ${ARGN})
39 |
40 | #In the land of windows, all libraries must be in the PATH.
41 | #Since the dependent libraries are not yet installed,
42 | #we must manually set them in the PATH to run tests.
43 | #The following appends the path of a target dependency.
44 | foreach(target ${GR_TEST_TARGET_DEPS})
45 | get_target_property(location ${target} LOCATION)
46 | if(location)
47 | get_filename_component(path ${location} PATH)
48 | string(REGEX REPLACE "\\$\\(.*\\)" ${CMAKE_BUILD_TYPE} path ${path})
49 | list(APPEND GR_TEST_LIBRARY_DIRS ${path})
50 | endif(location)
51 | endforeach(target)
52 |
53 | #SWIG generates the python library files into a subdirectory.
54 | #Therefore, we must append this subdirectory into PYTHONPATH.
55 | #Only do this for the python directories matching the following:
56 | foreach(pydir ${GR_TEST_PYTHON_DIRS})
57 | get_filename_component(name ${pydir} NAME)
58 | if(name MATCHES "^(swig|lib|src)$")
59 | list(APPEND GR_TEST_PYTHON_DIRS ${pydir}/${CMAKE_BUILD_TYPE})
60 | endif()
61 | endforeach(pydir)
62 | endif(WIN32)
63 |
64 | file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} srcdir)
65 | file(TO_NATIVE_PATH "${GR_TEST_LIBRARY_DIRS}" libpath) #ok to use on dir list?
66 | file(TO_NATIVE_PATH "${GR_TEST_PYTHON_DIRS}" pypath) #ok to use on dir list?
67 |
68 | set(environs "GR_DONT_LOAD_PREFS=1" "srcdir=${srcdir}")
69 |
70 | #http://www.cmake.org/pipermail/cmake/2009-May/029464.html
71 | #Replaced this add test + set environs code with the shell script generation.
72 | #Its nicer to be able to manually run the shell script to diagnose problems.
73 | #ADD_TEST(${ARGV})
74 | #SET_TESTS_PROPERTIES(${test_name} PROPERTIES ENVIRONMENT "${environs}")
75 |
76 | if(UNIX)
77 | set(binpath "${CMAKE_CURRENT_BINARY_DIR}:$PATH")
78 | #set both LD and DYLD paths to cover multiple UNIX OS library paths
79 | list(APPEND libpath "$LD_LIBRARY_PATH" "$DYLD_LIBRARY_PATH")
80 | list(APPEND pypath "$PYTHONPATH")
81 |
82 | #replace list separator with the path separator
83 | string(REPLACE ";" ":" libpath "${libpath}")
84 | string(REPLACE ";" ":" pypath "${pypath}")
85 | list(APPEND environs "PATH=${binpath}" "LD_LIBRARY_PATH=${libpath}" "DYLD_LIBRARY_PATH=${libpath}" "PYTHONPATH=${pypath}")
86 |
87 | #generate a bat file that sets the environment and runs the test
88 | find_program(SHELL sh)
89 | set(sh_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.sh)
90 | file(WRITE ${sh_file} "#!${SHELL}\n")
91 | #each line sets an environment variable
92 | foreach(environ ${environs})
93 | file(APPEND ${sh_file} "export ${environ}\n")
94 | endforeach(environ)
95 | #load the command to run with its arguments
96 | foreach(arg ${ARGN})
97 | file(APPEND ${sh_file} "${arg} ")
98 | endforeach(arg)
99 | file(APPEND ${sh_file} "\n")
100 |
101 | #make the shell file executable
102 | execute_process(COMMAND chmod +x ${sh_file})
103 |
104 | add_test(${test_name} ${SHELL} ${sh_file})
105 |
106 | endif(UNIX)
107 |
108 | if(WIN32)
109 | list(APPEND libpath ${DLL_PATHS} "%PATH%")
110 | list(APPEND pypath "%PYTHONPATH%")
111 |
112 | #replace list separator with the path separator (escaped)
113 | string(REPLACE ";" "\\;" libpath "${libpath}")
114 | string(REPLACE ";" "\\;" pypath "${pypath}")
115 | list(APPEND environs "PATH=${libpath}" "PYTHONPATH=${pypath}")
116 |
117 | #generate a bat file that sets the environment and runs the test
118 | set(bat_file ${CMAKE_CURRENT_BINARY_DIR}/${test_name}_test.bat)
119 | file(WRITE ${bat_file} "@echo off\n")
120 | #each line sets an environment variable
121 | foreach(environ ${environs})
122 | file(APPEND ${bat_file} "SET ${environ}\n")
123 | endforeach(environ)
124 | #load the command to run with its arguments
125 | foreach(arg ${ARGN})
126 | file(APPEND ${bat_file} "${arg} ")
127 | endforeach(arg)
128 | file(APPEND ${bat_file} "\n")
129 |
130 | add_test(${test_name} ${bat_file})
131 | endif(WIN32)
132 |
133 | endfunction(GR_ADD_TEST)
134 |
--------------------------------------------------------------------------------
/gr-wmbus/cmake/cmake_uninstall.cmake.in:
--------------------------------------------------------------------------------
1 | # http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
2 |
3 | IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
4 | MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
5 | ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
6 |
7 | FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
8 | STRING(REGEX REPLACE "\n" ";" files "${files}")
9 | FOREACH(file ${files})
10 | MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
11 | IF(EXISTS "$ENV{DESTDIR}${file}")
12 | EXEC_PROGRAM(
13 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
14 | OUTPUT_VARIABLE rm_out
15 | RETURN_VALUE rm_retval
16 | )
17 | IF(NOT "${rm_retval}" STREQUAL 0)
18 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
19 | ENDIF(NOT "${rm_retval}" STREQUAL 0)
20 | ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}")
21 | EXEC_PROGRAM(
22 | "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
23 | OUTPUT_VARIABLE rm_out
24 | RETURN_VALUE rm_retval
25 | )
26 | IF(NOT "${rm_retval}" STREQUAL 0)
27 | MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
28 | ENDIF(NOT "${rm_retval}" STREQUAL 0)
29 | ELSE(EXISTS "$ENV{DESTDIR}${file}")
30 | MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
31 | ENDIF(EXISTS "$ENV{DESTDIR}${file}")
32 | ENDFOREACH(file)
33 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Setup dependencies
22 | ########################################################################
23 | find_package(Doxygen)
24 |
25 | ########################################################################
26 | # Begin conditional configuration
27 | ########################################################################
28 | if(ENABLE_DOXYGEN)
29 |
30 | ########################################################################
31 | # Add subdirectories
32 | ########################################################################
33 | add_subdirectory(doxygen)
34 |
35 | endif(ENABLE_DOXYGEN)
36 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Create the doxygen configuration file
22 | ########################################################################
23 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
24 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
25 | file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir)
26 | file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
27 |
28 | set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
29 | set(enable_html_docs YES)
30 | set(enable_latex_docs NO)
31 | set(enable_xml_docs YES)
32 |
33 | configure_file(
34 | ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
35 | ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
36 | @ONLY)
37 |
38 | set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html)
39 |
40 | ########################################################################
41 | # Make and install doxygen docs
42 | ########################################################################
43 | add_custom_command(
44 | OUTPUT ${BUILT_DIRS}
45 | COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
46 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
47 | COMMENT "Generating documentation with doxygen"
48 | )
49 |
50 | add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS})
51 |
52 | install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR})
53 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/__init__.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Python interface to contents of doxygen xml documentation.
23 |
24 | Example use:
25 | See the contents of the example folder for the C++ and
26 | doxygen-generated xml used in this example.
27 |
28 | >>> # Parse the doxygen docs.
29 | >>> import os
30 | >>> this_dir = os.path.dirname(globals()['__file__'])
31 | >>> xml_path = this_dir + "/example/xml/"
32 | >>> di = DoxyIndex(xml_path)
33 |
34 | Get a list of all top-level objects.
35 |
36 | >>> print([mem.name() for mem in di.members()])
37 | [u'Aadvark', u'aadvarky_enough', u'main']
38 |
39 | Get all functions.
40 |
41 | >>> print([mem.name() for mem in di.in_category(DoxyFunction)])
42 | [u'aadvarky_enough', u'main']
43 |
44 | Check if an object is present.
45 |
46 | >>> di.has_member(u'Aadvark')
47 | True
48 | >>> di.has_member(u'Fish')
49 | False
50 |
51 | Get an item by name and check its properties.
52 |
53 | >>> aad = di.get_member(u'Aadvark')
54 | >>> print(aad.brief_description)
55 | Models the mammal Aadvark.
56 | >>> print(aad.detailed_description)
57 | Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
58 |
59 | This line is uninformative and is only to test line breaks in the comments.
60 | >>> [mem.name() for mem in aad.members()]
61 | [u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness']
62 | >>> aad.get_member(u'print').brief_description
63 | u'Outputs the vital aadvark statistics.'
64 |
65 | """
66 |
67 | from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
68 |
69 | def _test():
70 | import os
71 | this_dir = os.path.dirname(globals()['__file__'])
72 | xml_path = this_dir + "/example/xml/"
73 | di = DoxyIndex(xml_path)
74 | # Get the Aadvark class
75 | aad = di.get_member('Aadvark')
76 | aad.brief_description
77 | import doctest
78 | return doctest.testmod()
79 |
80 | if __name__ == "__main__":
81 | _test()
82 |
83 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/base.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | A base class is created.
23 |
24 | Classes based upon this are used to make more user-friendly interfaces
25 | to the doxygen xml docs than the generated classes provide.
26 | """
27 |
28 | import os
29 | import pdb
30 |
31 | from xml.parsers.expat import ExpatError
32 |
33 | from generated import compound
34 |
35 |
36 | class Base(object):
37 |
38 | class Duplicate(StandardError):
39 | pass
40 |
41 | class NoSuchMember(StandardError):
42 | pass
43 |
44 | class ParsingError(StandardError):
45 | pass
46 |
47 | def __init__(self, parse_data, top=None):
48 | self._parsed = False
49 | self._error = False
50 | self._parse_data = parse_data
51 | self._members = []
52 | self._dict_members = {}
53 | self._in_category = {}
54 | self._data = {}
55 | if top is not None:
56 | self._xml_path = top._xml_path
57 | # Set up holder of references
58 | else:
59 | top = self
60 | self._refs = {}
61 | self._xml_path = parse_data
62 | self.top = top
63 |
64 | @classmethod
65 | def from_refid(cls, refid, top=None):
66 | """ Instantiate class from a refid rather than parsing object. """
67 | # First check to see if its already been instantiated.
68 | if top is not None and refid in top._refs:
69 | return top._refs[refid]
70 | # Otherwise create a new instance and set refid.
71 | inst = cls(None, top=top)
72 | inst.refid = refid
73 | inst.add_ref(inst)
74 | return inst
75 |
76 | @classmethod
77 | def from_parse_data(cls, parse_data, top=None):
78 | refid = getattr(parse_data, 'refid', None)
79 | if refid is not None and top is not None and refid in top._refs:
80 | return top._refs[refid]
81 | inst = cls(parse_data, top=top)
82 | if refid is not None:
83 | inst.refid = refid
84 | inst.add_ref(inst)
85 | return inst
86 |
87 | def add_ref(self, obj):
88 | if hasattr(obj, 'refid'):
89 | self.top._refs[obj.refid] = obj
90 |
91 | mem_classes = []
92 |
93 | def get_cls(self, mem):
94 | for cls in self.mem_classes:
95 | if cls.can_parse(mem):
96 | return cls
97 | raise StandardError(("Did not find a class for object '%s'." \
98 | % (mem.get_name())))
99 |
100 | def convert_mem(self, mem):
101 | try:
102 | cls = self.get_cls(mem)
103 | converted = cls.from_parse_data(mem, self.top)
104 | if converted is None:
105 | raise StandardError('No class matched this object.')
106 | self.add_ref(converted)
107 | return converted
108 | except StandardError, e:
109 | print e
110 |
111 | @classmethod
112 | def includes(cls, inst):
113 | return isinstance(inst, cls)
114 |
115 | @classmethod
116 | def can_parse(cls, obj):
117 | return False
118 |
119 | def _parse(self):
120 | self._parsed = True
121 |
122 | def _get_dict_members(self, cat=None):
123 | """
124 | For given category a dictionary is returned mapping member names to
125 | members of that category. For names that are duplicated the name is
126 | mapped to None.
127 | """
128 | self.confirm_no_error()
129 | if cat not in self._dict_members:
130 | new_dict = {}
131 | for mem in self.in_category(cat):
132 | if mem.name() not in new_dict:
133 | new_dict[mem.name()] = mem
134 | else:
135 | new_dict[mem.name()] = self.Duplicate
136 | self._dict_members[cat] = new_dict
137 | return self._dict_members[cat]
138 |
139 | def in_category(self, cat):
140 | self.confirm_no_error()
141 | if cat is None:
142 | return self._members
143 | if cat not in self._in_category:
144 | self._in_category[cat] = [mem for mem in self._members
145 | if cat.includes(mem)]
146 | return self._in_category[cat]
147 |
148 | def get_member(self, name, cat=None):
149 | self.confirm_no_error()
150 | # Check if it's in a namespace or class.
151 | bits = name.split('::')
152 | first = bits[0]
153 | rest = '::'.join(bits[1:])
154 | member = self._get_dict_members(cat).get(first, self.NoSuchMember)
155 | # Raise any errors that are returned.
156 | if member in set([self.NoSuchMember, self.Duplicate]):
157 | raise member()
158 | if rest:
159 | return member.get_member(rest, cat=cat)
160 | return member
161 |
162 | def has_member(self, name, cat=None):
163 | try:
164 | mem = self.get_member(name, cat=cat)
165 | return True
166 | except self.NoSuchMember:
167 | return False
168 |
169 | def data(self):
170 | self.confirm_no_error()
171 | return self._data
172 |
173 | def members(self):
174 | self.confirm_no_error()
175 | return self._members
176 |
177 | def process_memberdefs(self):
178 | mdtss = []
179 | for sec in self._retrieved_data.compounddef.sectiondef:
180 | mdtss += sec.memberdef
181 | # At the moment we lose all information associated with sections.
182 | # Sometimes a memberdef is in several sectiondef.
183 | # We make sure we don't get duplicates here.
184 | uniques = set([])
185 | for mem in mdtss:
186 | converted = self.convert_mem(mem)
187 | pair = (mem.name, mem.__class__)
188 | if pair not in uniques:
189 | uniques.add(pair)
190 | self._members.append(converted)
191 |
192 | def retrieve_data(self):
193 | filename = os.path.join(self._xml_path, self.refid + '.xml')
194 | try:
195 | self._retrieved_data = compound.parse(filename)
196 | except ExpatError:
197 | print('Error in xml in file %s' % filename)
198 | self._error = True
199 | self._retrieved_data = None
200 |
201 | def check_parsed(self):
202 | if not self._parsed:
203 | self._parse()
204 |
205 | def confirm_no_error(self):
206 | self.check_parsed()
207 | if self._error:
208 | raise self.ParsingError()
209 |
210 | def error(self):
211 | self.check_parsed()
212 | return self._error
213 |
214 | def name(self):
215 | # first see if we can do it without processing.
216 | if self._parse_data is not None:
217 | return self._parse_data.name
218 | self.check_parsed()
219 | return self._retrieved_data.compounddef.name
220 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/doxyindex.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Classes providing more user-friendly interfaces to the doxygen xml
23 | docs than the generated classes provide.
24 | """
25 |
26 | import os
27 |
28 | from generated import index
29 | from base import Base
30 | from text import description
31 |
32 | class DoxyIndex(Base):
33 | """
34 | Parses a doxygen xml directory.
35 | """
36 |
37 | __module__ = "gnuradio.utils.doxyxml"
38 |
39 | def _parse(self):
40 | if self._parsed:
41 | return
42 | super(DoxyIndex, self)._parse()
43 | self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
44 | for mem in self._root.compound:
45 | converted = self.convert_mem(mem)
46 | # For files we want the contents to be accessible directly
47 | # from the parent rather than having to go through the file
48 | # object.
49 | if self.get_cls(mem) == DoxyFile:
50 | if mem.name.endswith('.h'):
51 | self._members += converted.members()
52 | self._members.append(converted)
53 | else:
54 | self._members.append(converted)
55 |
56 |
57 | def generate_swig_doc_i(self):
58 | """
59 | %feature("docstring") gr_make_align_on_samplenumbers_ss::align_state "
60 | Wraps the C++: gr_align_on_samplenumbers_ss::align_state";
61 | """
62 | pass
63 |
64 |
65 | class DoxyCompMem(Base):
66 |
67 |
68 | kind = None
69 |
70 | def __init__(self, *args, **kwargs):
71 | super(DoxyCompMem, self).__init__(*args, **kwargs)
72 |
73 | @classmethod
74 | def can_parse(cls, obj):
75 | return obj.kind == cls.kind
76 |
77 | def set_descriptions(self, parse_data):
78 | bd = description(getattr(parse_data, 'briefdescription', None))
79 | dd = description(getattr(parse_data, 'detaileddescription', None))
80 | self._data['brief_description'] = bd
81 | self._data['detailed_description'] = dd
82 |
83 | class DoxyCompound(DoxyCompMem):
84 | pass
85 |
86 | class DoxyMember(DoxyCompMem):
87 | pass
88 |
89 |
90 | class DoxyFunction(DoxyMember):
91 |
92 | __module__ = "gnuradio.utils.doxyxml"
93 |
94 | kind = 'function'
95 |
96 | def _parse(self):
97 | if self._parsed:
98 | return
99 | super(DoxyFunction, self)._parse()
100 | self.set_descriptions(self._parse_data)
101 | self._data['params'] = []
102 | prms = self._parse_data.param
103 | for prm in prms:
104 | self._data['params'].append(DoxyParam(prm))
105 |
106 | brief_description = property(lambda self: self.data()['brief_description'])
107 | detailed_description = property(lambda self: self.data()['detailed_description'])
108 | params = property(lambda self: self.data()['params'])
109 |
110 | Base.mem_classes.append(DoxyFunction)
111 |
112 |
113 | class DoxyParam(DoxyMember):
114 |
115 | __module__ = "gnuradio.utils.doxyxml"
116 |
117 | def _parse(self):
118 | if self._parsed:
119 | return
120 | super(DoxyParam, self)._parse()
121 | self.set_descriptions(self._parse_data)
122 | self._data['declname'] = self._parse_data.declname
123 |
124 | brief_description = property(lambda self: self.data()['brief_description'])
125 | detailed_description = property(lambda self: self.data()['detailed_description'])
126 | declname = property(lambda self: self.data()['declname'])
127 |
128 | class DoxyClass(DoxyCompound):
129 |
130 | __module__ = "gnuradio.utils.doxyxml"
131 |
132 | kind = 'class'
133 |
134 | def _parse(self):
135 | if self._parsed:
136 | return
137 | super(DoxyClass, self)._parse()
138 | self.retrieve_data()
139 | if self._error:
140 | return
141 | self.set_descriptions(self._retrieved_data.compounddef)
142 | # Sectiondef.kind tells about whether private or public.
143 | # We just ignore this for now.
144 | self.process_memberdefs()
145 |
146 | brief_description = property(lambda self: self.data()['brief_description'])
147 | detailed_description = property(lambda self: self.data()['detailed_description'])
148 |
149 | Base.mem_classes.append(DoxyClass)
150 |
151 |
152 | class DoxyFile(DoxyCompound):
153 |
154 | __module__ = "gnuradio.utils.doxyxml"
155 |
156 | kind = 'file'
157 |
158 | def _parse(self):
159 | if self._parsed:
160 | return
161 | super(DoxyFile, self)._parse()
162 | self.retrieve_data()
163 | self.set_descriptions(self._retrieved_data.compounddef)
164 | if self._error:
165 | return
166 | self.process_memberdefs()
167 |
168 | brief_description = property(lambda self: self.data()['brief_description'])
169 | detailed_description = property(lambda self: self.data()['detailed_description'])
170 |
171 | Base.mem_classes.append(DoxyFile)
172 |
173 |
174 | class DoxyNamespace(DoxyCompound):
175 |
176 | __module__ = "gnuradio.utils.doxyxml"
177 |
178 | kind = 'namespace'
179 |
180 | Base.mem_classes.append(DoxyNamespace)
181 |
182 |
183 | class DoxyGroup(DoxyCompound):
184 |
185 | __module__ = "gnuradio.utils.doxyxml"
186 |
187 | kind = 'group'
188 |
189 | def _parse(self):
190 | if self._parsed:
191 | return
192 | super(DoxyGroup, self)._parse()
193 | self.retrieve_data()
194 | if self._error:
195 | return
196 | cdef = self._retrieved_data.compounddef
197 | self._data['title'] = description(cdef.title)
198 | # Process inner groups
199 | grps = cdef.innergroup
200 | for grp in grps:
201 | converted = DoxyGroup.from_refid(grp.refid, top=self.top)
202 | self._members.append(converted)
203 | # Process inner classes
204 | klasses = cdef.innerclass
205 | for kls in klasses:
206 | converted = DoxyClass.from_refid(kls.refid, top=self.top)
207 | self._members.append(converted)
208 | # Process normal members
209 | self.process_memberdefs()
210 |
211 | title = property(lambda self: self.data()['title'])
212 |
213 |
214 | Base.mem_classes.append(DoxyGroup)
215 |
216 |
217 | class DoxyFriend(DoxyMember):
218 |
219 | __module__ = "gnuradio.utils.doxyxml"
220 |
221 | kind = 'friend'
222 |
223 | Base.mem_classes.append(DoxyFriend)
224 |
225 |
226 | class DoxyOther(Base):
227 |
228 | __module__ = "gnuradio.utils.doxyxml"
229 |
230 | kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum', 'dir', 'page'])
231 |
232 | @classmethod
233 | def can_parse(cls, obj):
234 | return obj.kind in cls.kinds
235 |
236 | Base.mem_classes.append(DoxyOther)
237 |
238 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/aadvark.cc:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2010 Free Software Foundation, Inc.
4 | *
5 | * This file is part of GNU Radio
6 | *
7 | * GNU Radio is free software; you can redistribute it and/or modify
8 | * it under the terms of the GNU General Public License as published by
9 | * the Free Software Foundation; either version 3, or (at your option)
10 | * any later version.
11 | *
12 | * GNU Radio is distributed in the hope that it will be useful,
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 | * GNU General Public License for more details.
16 | *
17 | * You should have received a copy of the GNU General Public License
18 | * along with GNU Radio; see the file COPYING. If not, write to
19 | * the Free Software Foundation, Inc., 51 Franklin Street,
20 | * Boston, MA 02110-1301, USA.
21 | */
22 | #include
23 | #include "aadvark.h"
24 |
25 | void Aadvark::print() {
26 | std::cout << "aadvark is " << aadvarkness << "/10 aadvarky" << std::endl;
27 | }
28 |
29 | Aadvark::Aadvark(int aaness): aadvarkness(aaness) {}
30 |
31 | bool aadvarky_enough(Aadvark aad) {
32 | if (aad.get_aadvarkness() > 6)
33 | return true;
34 | else
35 | return false;
36 | }
37 |
38 | int Aadvark::get_aadvarkness() {
39 | return aadvarkness;
40 | }
41 |
42 | int main() {
43 | Aadvark arold = Aadvark(6);
44 | arold.print();
45 | if (aadvarky_enough(arold))
46 | std::cout << "He is aadvarky enough" << std::endl;
47 | else
48 | std::cout << "He is not aadvarky enough" << std::endl;
49 | }
50 |
51 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/aadvark.h:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 | /*
3 | * Copyright 2010 Free Software Foundation, Inc.
4 | *
5 | * This file is part of GNU Radio
6 | *
7 | * GNU Radio is free software; you can redistribute it and/or modify
8 | * it under the terms of the GNU General Public License as published by
9 | * the Free Software Foundation; either version 3, or (at your option)
10 | * any later version.
11 | *
12 | * GNU Radio is distributed in the hope that it will be useful,
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 | * GNU General Public License for more details.
16 | *
17 | * You should have received a copy of the GNU General Public License
18 | * along with GNU Radio; see the file COPYING. If not, write to
19 | * the Free Software Foundation, Inc., 51 Franklin Street,
20 | * Boston, MA 02110-1301, USA.
21 | */
22 | #include
23 |
24 | /*!
25 | * \brief Models the mammal Aadvark.
26 | *
27 | * Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
28 | *
29 | * This line is uninformative and is only to test line breaks in the comments.
30 | */
31 | class Aadvark {
32 | public:
33 | //! \brief Outputs the vital aadvark statistics.
34 | void print();
35 | //! \param aaness The aadvarkness of an aadvark is a measure of how aadvarky it is.
36 | Aadvark(int aaness);
37 | int get_aadvarkness();
38 | private:
39 | int aadvarkness;
40 | };
41 |
42 | bool aadvarky_enough(Aadvark aad);
43 |
44 | int main();
45 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/aadvark_8cc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | aadvark.cc
5 | iostream
6 | aadvark.h
7 | aadvark.cc
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | bool
22 | bool aadvarky_enough
23 | (Aadvark aad)
24 | aadvarky_enough
25 |
26 | [Aadvark]
27 | aad
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | int
39 | int main
40 | ()
41 | main
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | #include<iostream>
57 | #include"aadvark.h"
58 |
59 | void[Aadvark::print](){
60 | std::cout<<"aadvarkis"<<aadvarkness<<"/10aadvarky"<<std::endl;
61 | }
62 |
63 | [Aadvark::Aadvark](intaaness):aadvarkness(aaness){}
64 |
65 | boolaadvarky_enough([Aadvark]aad){
66 | if(aad.get_aadvarkness()>6)
67 | returntrue;
68 | else
69 | returnfalse;
70 | }
71 |
72 | intAadvark::get_aadvarkness(){
73 | returnaadvarkness;
74 | }
75 |
76 | intmain(){
77 | [Aadvark]arold=[Aadvark](6);
78 | arold.[print]();
79 | if(aadvarky_enough(arold))
80 | std::cout<<"Heisaadvarkyenough"<<std::endl;
81 | else
82 | std::cout<<"Heisnotaadvarkyenough"<<std::endl;
83 | }
84 |
85 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/aadvark_8h.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | aadvark.h
5 | iostream
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | Aadvark
18 |
19 |
20 | bool
21 | bool aadvarky_enough
22 | (Aadvark aad)
23 | aadvarky_enough
24 |
25 | [Aadvark]
26 | aad
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | int
38 | int main
39 | ()
40 | main
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | #include<iostream>
56 |
57 | class[Aadvark]{
58 | public:
59 | void[print]();
60 | [Aadvark](intaaness);
61 | intget_aadvarkness();
62 | private:
63 | intaadvarkness;
64 | };
65 |
66 | boolaadvarky_enough([Aadvark]aad);
67 |
68 | intmain();
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/classAadvark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Aadvark
5 | aadvark.h
6 |
7 |
8 | int
9 | int Aadvark::aadvarkness
10 |
11 | aadvarkness
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | void
24 | void Aadvark::print
25 | ()
26 | print
27 |
28 | Outputs the vital aadvark statistics.
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | Aadvark::Aadvark
38 | (int aaness)
39 | Aadvark
40 |
41 | int
42 | aaness
43 |
44 |
45 |
46 |
47 |
48 |
49 | aaness
50 |
51 |
52 | The aadvarkness of an aadvark is a measure of how aadvarky it is.
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | int
62 | int Aadvark::get_aadvarkness
63 | ()
64 | get_aadvarkness
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | Models the mammal [Aadvark].
76 |
77 | Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.This line is uninformative and is only to test line breaks in the comments.
78 |
79 |
80 | AadvarkAadvark
81 | Aadvarkaadvarkness
82 | Aadvarkget_aadvarkness
83 | Aadvarkprint
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/combine.xslt:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/index.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Aadvark
4 | aadvarkness
5 | print
6 | Aadvark
7 | get_aadvarkness
8 |
9 | aadvark.cc
10 | aadvarky_enough
11 | main
12 |
13 | aadvark.h
14 | aadvarky_enough
15 | main
16 |
17 |
18 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/example/xml/index.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/generated/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Contains generated files produced by generateDS.py.
3 |
4 | These do the real work of parsing the doxygen xml files but the
5 | resultant classes are not very friendly to navigate so the rest of the
6 | doxyxml module processes them further.
7 | """
8 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/generated/index.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """
4 | Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
5 | """
6 |
7 | from xml.dom import minidom
8 |
9 | import os
10 | import sys
11 | import compound
12 |
13 | import indexsuper as supermod
14 |
15 | class DoxygenTypeSub(supermod.DoxygenType):
16 | def __init__(self, version=None, compound=None):
17 | supermod.DoxygenType.__init__(self, version, compound)
18 |
19 | def find_compounds_and_members(self, details):
20 | """
21 | Returns a list of all compounds and their members which match details
22 | """
23 |
24 | results = []
25 | for compound in self.compound:
26 | members = compound.find_members(details)
27 | if members:
28 | results.append([compound, members])
29 | else:
30 | if details.match(compound):
31 | results.append([compound, []])
32 |
33 | return results
34 |
35 | supermod.DoxygenType.subclass = DoxygenTypeSub
36 | # end class DoxygenTypeSub
37 |
38 |
39 | class CompoundTypeSub(supermod.CompoundType):
40 | def __init__(self, kind=None, refid=None, name='', member=None):
41 | supermod.CompoundType.__init__(self, kind, refid, name, member)
42 |
43 | def find_members(self, details):
44 | """
45 | Returns a list of all members which match details
46 | """
47 |
48 | results = []
49 |
50 | for member in self.member:
51 | if details.match(member):
52 | results.append(member)
53 |
54 | return results
55 |
56 | supermod.CompoundType.subclass = CompoundTypeSub
57 | # end class CompoundTypeSub
58 |
59 |
60 | class MemberTypeSub(supermod.MemberType):
61 |
62 | def __init__(self, kind=None, refid=None, name=''):
63 | supermod.MemberType.__init__(self, kind, refid, name)
64 |
65 | supermod.MemberType.subclass = MemberTypeSub
66 | # end class MemberTypeSub
67 |
68 |
69 | def parse(inFilename):
70 |
71 | doc = minidom.parse(inFilename)
72 | rootNode = doc.documentElement
73 | rootObj = supermod.DoxygenType.factory()
74 | rootObj.build(rootNode)
75 |
76 | return rootObj
77 |
78 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/generated/indexsuper.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | #
4 | # Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
5 | #
6 |
7 | import sys
8 | import getopt
9 | from string import lower as str_lower
10 | from xml.dom import minidom
11 | from xml.dom import Node
12 |
13 | #
14 | # User methods
15 | #
16 | # Calls to the methods in these classes are generated by generateDS.py.
17 | # You can replace these methods by re-implementing the following class
18 | # in a module named generatedssuper.py.
19 |
20 | try:
21 | from generatedssuper import GeneratedsSuper
22 | except ImportError, exp:
23 |
24 | class GeneratedsSuper:
25 | def format_string(self, input_data, input_name=''):
26 | return input_data
27 | def format_integer(self, input_data, input_name=''):
28 | return '%d' % input_data
29 | def format_float(self, input_data, input_name=''):
30 | return '%f' % input_data
31 | def format_double(self, input_data, input_name=''):
32 | return '%e' % input_data
33 | def format_boolean(self, input_data, input_name=''):
34 | return '%s' % input_data
35 |
36 |
37 | #
38 | # If you have installed IPython you can uncomment and use the following.
39 | # IPython is available from http://ipython.scipy.org/.
40 | #
41 |
42 | ## from IPython.Shell import IPShellEmbed
43 | ## args = ''
44 | ## ipshell = IPShellEmbed(args,
45 | ## banner = 'Dropping into IPython',
46 | ## exit_msg = 'Leaving Interpreter, back to program.')
47 |
48 | # Then use the following line where and when you want to drop into the
49 | # IPython shell:
50 | # ipshell(' -- Entering ipshell.\nHit Ctrl-D to exit')
51 |
52 | #
53 | # Globals
54 | #
55 |
56 | ExternalEncoding = 'ascii'
57 |
58 | #
59 | # Support/utility functions.
60 | #
61 |
62 | def showIndent(outfile, level):
63 | for idx in range(level):
64 | outfile.write(' ')
65 |
66 | def quote_xml(inStr):
67 | s1 = (isinstance(inStr, basestring) and inStr or
68 | '%s' % inStr)
69 | s1 = s1.replace('&', '&')
70 | s1 = s1.replace('<', '<')
71 | s1 = s1.replace('>', '>')
72 | return s1
73 |
74 | def quote_attrib(inStr):
75 | s1 = (isinstance(inStr, basestring) and inStr or
76 | '%s' % inStr)
77 | s1 = s1.replace('&', '&')
78 | s1 = s1.replace('<', '<')
79 | s1 = s1.replace('>', '>')
80 | if '"' in s1:
81 | if "'" in s1:
82 | s1 = '"%s"' % s1.replace('"', """)
83 | else:
84 | s1 = "'%s'" % s1
85 | else:
86 | s1 = '"%s"' % s1
87 | return s1
88 |
89 | def quote_python(inStr):
90 | s1 = inStr
91 | if s1.find("'") == -1:
92 | if s1.find('\n') == -1:
93 | return "'%s'" % s1
94 | else:
95 | return "'''%s'''" % s1
96 | else:
97 | if s1.find('"') != -1:
98 | s1 = s1.replace('"', '\\"')
99 | if s1.find('\n') == -1:
100 | return '"%s"' % s1
101 | else:
102 | return '"""%s"""' % s1
103 |
104 |
105 | class MixedContainer:
106 | # Constants for category:
107 | CategoryNone = 0
108 | CategoryText = 1
109 | CategorySimple = 2
110 | CategoryComplex = 3
111 | # Constants for content_type:
112 | TypeNone = 0
113 | TypeText = 1
114 | TypeString = 2
115 | TypeInteger = 3
116 | TypeFloat = 4
117 | TypeDecimal = 5
118 | TypeDouble = 6
119 | TypeBoolean = 7
120 | def __init__(self, category, content_type, name, value):
121 | self.category = category
122 | self.content_type = content_type
123 | self.name = name
124 | self.value = value
125 | def getCategory(self):
126 | return self.category
127 | def getContenttype(self, content_type):
128 | return self.content_type
129 | def getValue(self):
130 | return self.value
131 | def getName(self):
132 | return self.name
133 | def export(self, outfile, level, name, namespace):
134 | if self.category == MixedContainer.CategoryText:
135 | outfile.write(self.value)
136 | elif self.category == MixedContainer.CategorySimple:
137 | self.exportSimple(outfile, level, name)
138 | else: # category == MixedContainer.CategoryComplex
139 | self.value.export(outfile, level, namespace,name)
140 | def exportSimple(self, outfile, level, name):
141 | if self.content_type == MixedContainer.TypeString:
142 | outfile.write('<%s>%s%s>' % (self.name, self.value, self.name))
143 | elif self.content_type == MixedContainer.TypeInteger or \
144 | self.content_type == MixedContainer.TypeBoolean:
145 | outfile.write('<%s>%d%s>' % (self.name, self.value, self.name))
146 | elif self.content_type == MixedContainer.TypeFloat or \
147 | self.content_type == MixedContainer.TypeDecimal:
148 | outfile.write('<%s>%f%s>' % (self.name, self.value, self.name))
149 | elif self.content_type == MixedContainer.TypeDouble:
150 | outfile.write('<%s>%g%s>' % (self.name, self.value, self.name))
151 | def exportLiteral(self, outfile, level, name):
152 | if self.category == MixedContainer.CategoryText:
153 | showIndent(outfile, level)
154 | outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
155 | (self.category, self.content_type, self.name, self.value))
156 | elif self.category == MixedContainer.CategorySimple:
157 | showIndent(outfile, level)
158 | outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
159 | (self.category, self.content_type, self.name, self.value))
160 | else: # category == MixedContainer.CategoryComplex
161 | showIndent(outfile, level)
162 | outfile.write('MixedContainer(%d, %d, "%s",\n' % \
163 | (self.category, self.content_type, self.name,))
164 | self.value.exportLiteral(outfile, level + 1)
165 | showIndent(outfile, level)
166 | outfile.write(')\n')
167 |
168 |
169 | class _MemberSpec(object):
170 | def __init__(self, name='', data_type='', container=0):
171 | self.name = name
172 | self.data_type = data_type
173 | self.container = container
174 | def set_name(self, name): self.name = name
175 | def get_name(self): return self.name
176 | def set_data_type(self, data_type): self.data_type = data_type
177 | def get_data_type(self): return self.data_type
178 | def set_container(self, container): self.container = container
179 | def get_container(self): return self.container
180 |
181 |
182 | #
183 | # Data representation classes.
184 | #
185 |
186 | class DoxygenType(GeneratedsSuper):
187 | subclass = None
188 | superclass = None
189 | def __init__(self, version=None, compound=None):
190 | self.version = version
191 | if compound is None:
192 | self.compound = []
193 | else:
194 | self.compound = compound
195 | def factory(*args_, **kwargs_):
196 | if DoxygenType.subclass:
197 | return DoxygenType.subclass(*args_, **kwargs_)
198 | else:
199 | return DoxygenType(*args_, **kwargs_)
200 | factory = staticmethod(factory)
201 | def get_compound(self): return self.compound
202 | def set_compound(self, compound): self.compound = compound
203 | def add_compound(self, value): self.compound.append(value)
204 | def insert_compound(self, index, value): self.compound[index] = value
205 | def get_version(self): return self.version
206 | def set_version(self, version): self.version = version
207 | def export(self, outfile, level, namespace_='', name_='DoxygenType', namespacedef_=''):
208 | showIndent(outfile, level)
209 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
210 | self.exportAttributes(outfile, level, namespace_, name_='DoxygenType')
211 | if self.hasContent_():
212 | outfile.write('>\n')
213 | self.exportChildren(outfile, level + 1, namespace_, name_)
214 | showIndent(outfile, level)
215 | outfile.write('%s%s>\n' % (namespace_, name_))
216 | else:
217 | outfile.write(' />\n')
218 | def exportAttributes(self, outfile, level, namespace_='', name_='DoxygenType'):
219 | outfile.write(' version=%s' % (self.format_string(quote_attrib(self.version).encode(ExternalEncoding), input_name='version'), ))
220 | def exportChildren(self, outfile, level, namespace_='', name_='DoxygenType'):
221 | for compound_ in self.compound:
222 | compound_.export(outfile, level, namespace_, name_='compound')
223 | def hasContent_(self):
224 | if (
225 | self.compound is not None
226 | ):
227 | return True
228 | else:
229 | return False
230 | def exportLiteral(self, outfile, level, name_='DoxygenType'):
231 | level += 1
232 | self.exportLiteralAttributes(outfile, level, name_)
233 | if self.hasContent_():
234 | self.exportLiteralChildren(outfile, level, name_)
235 | def exportLiteralAttributes(self, outfile, level, name_):
236 | if self.version is not None:
237 | showIndent(outfile, level)
238 | outfile.write('version = %s,\n' % (self.version,))
239 | def exportLiteralChildren(self, outfile, level, name_):
240 | showIndent(outfile, level)
241 | outfile.write('compound=[\n')
242 | level += 1
243 | for compound in self.compound:
244 | showIndent(outfile, level)
245 | outfile.write('model_.compound(\n')
246 | compound.exportLiteral(outfile, level, name_='compound')
247 | showIndent(outfile, level)
248 | outfile.write('),\n')
249 | level -= 1
250 | showIndent(outfile, level)
251 | outfile.write('],\n')
252 | def build(self, node_):
253 | attrs = node_.attributes
254 | self.buildAttributes(attrs)
255 | for child_ in node_.childNodes:
256 | nodeName_ = child_.nodeName.split(':')[-1]
257 | self.buildChildren(child_, nodeName_)
258 | def buildAttributes(self, attrs):
259 | if attrs.get('version'):
260 | self.version = attrs.get('version').value
261 | def buildChildren(self, child_, nodeName_):
262 | if child_.nodeType == Node.ELEMENT_NODE and \
263 | nodeName_ == 'compound':
264 | obj_ = CompoundType.factory()
265 | obj_.build(child_)
266 | self.compound.append(obj_)
267 | # end class DoxygenType
268 |
269 |
270 | class CompoundType(GeneratedsSuper):
271 | subclass = None
272 | superclass = None
273 | def __init__(self, kind=None, refid=None, name=None, member=None):
274 | self.kind = kind
275 | self.refid = refid
276 | self.name = name
277 | if member is None:
278 | self.member = []
279 | else:
280 | self.member = member
281 | def factory(*args_, **kwargs_):
282 | if CompoundType.subclass:
283 | return CompoundType.subclass(*args_, **kwargs_)
284 | else:
285 | return CompoundType(*args_, **kwargs_)
286 | factory = staticmethod(factory)
287 | def get_name(self): return self.name
288 | def set_name(self, name): self.name = name
289 | def get_member(self): return self.member
290 | def set_member(self, member): self.member = member
291 | def add_member(self, value): self.member.append(value)
292 | def insert_member(self, index, value): self.member[index] = value
293 | def get_kind(self): return self.kind
294 | def set_kind(self, kind): self.kind = kind
295 | def get_refid(self): return self.refid
296 | def set_refid(self, refid): self.refid = refid
297 | def export(self, outfile, level, namespace_='', name_='CompoundType', namespacedef_=''):
298 | showIndent(outfile, level)
299 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
300 | self.exportAttributes(outfile, level, namespace_, name_='CompoundType')
301 | if self.hasContent_():
302 | outfile.write('>\n')
303 | self.exportChildren(outfile, level + 1, namespace_, name_)
304 | showIndent(outfile, level)
305 | outfile.write('%s%s>\n' % (namespace_, name_))
306 | else:
307 | outfile.write(' />\n')
308 | def exportAttributes(self, outfile, level, namespace_='', name_='CompoundType'):
309 | outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
310 | outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
311 | def exportChildren(self, outfile, level, namespace_='', name_='CompoundType'):
312 | if self.name is not None:
313 | showIndent(outfile, level)
314 | outfile.write('<%sname>%s%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
315 | for member_ in self.member:
316 | member_.export(outfile, level, namespace_, name_='member')
317 | def hasContent_(self):
318 | if (
319 | self.name is not None or
320 | self.member is not None
321 | ):
322 | return True
323 | else:
324 | return False
325 | def exportLiteral(self, outfile, level, name_='CompoundType'):
326 | level += 1
327 | self.exportLiteralAttributes(outfile, level, name_)
328 | if self.hasContent_():
329 | self.exportLiteralChildren(outfile, level, name_)
330 | def exportLiteralAttributes(self, outfile, level, name_):
331 | if self.kind is not None:
332 | showIndent(outfile, level)
333 | outfile.write('kind = "%s",\n' % (self.kind,))
334 | if self.refid is not None:
335 | showIndent(outfile, level)
336 | outfile.write('refid = %s,\n' % (self.refid,))
337 | def exportLiteralChildren(self, outfile, level, name_):
338 | showIndent(outfile, level)
339 | outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
340 | showIndent(outfile, level)
341 | outfile.write('member=[\n')
342 | level += 1
343 | for member in self.member:
344 | showIndent(outfile, level)
345 | outfile.write('model_.member(\n')
346 | member.exportLiteral(outfile, level, name_='member')
347 | showIndent(outfile, level)
348 | outfile.write('),\n')
349 | level -= 1
350 | showIndent(outfile, level)
351 | outfile.write('],\n')
352 | def build(self, node_):
353 | attrs = node_.attributes
354 | self.buildAttributes(attrs)
355 | for child_ in node_.childNodes:
356 | nodeName_ = child_.nodeName.split(':')[-1]
357 | self.buildChildren(child_, nodeName_)
358 | def buildAttributes(self, attrs):
359 | if attrs.get('kind'):
360 | self.kind = attrs.get('kind').value
361 | if attrs.get('refid'):
362 | self.refid = attrs.get('refid').value
363 | def buildChildren(self, child_, nodeName_):
364 | if child_.nodeType == Node.ELEMENT_NODE and \
365 | nodeName_ == 'name':
366 | name_ = ''
367 | for text__content_ in child_.childNodes:
368 | name_ += text__content_.nodeValue
369 | self.name = name_
370 | elif child_.nodeType == Node.ELEMENT_NODE and \
371 | nodeName_ == 'member':
372 | obj_ = MemberType.factory()
373 | obj_.build(child_)
374 | self.member.append(obj_)
375 | # end class CompoundType
376 |
377 |
378 | class MemberType(GeneratedsSuper):
379 | subclass = None
380 | superclass = None
381 | def __init__(self, kind=None, refid=None, name=None):
382 | self.kind = kind
383 | self.refid = refid
384 | self.name = name
385 | def factory(*args_, **kwargs_):
386 | if MemberType.subclass:
387 | return MemberType.subclass(*args_, **kwargs_)
388 | else:
389 | return MemberType(*args_, **kwargs_)
390 | factory = staticmethod(factory)
391 | def get_name(self): return self.name
392 | def set_name(self, name): self.name = name
393 | def get_kind(self): return self.kind
394 | def set_kind(self, kind): self.kind = kind
395 | def get_refid(self): return self.refid
396 | def set_refid(self, refid): self.refid = refid
397 | def export(self, outfile, level, namespace_='', name_='MemberType', namespacedef_=''):
398 | showIndent(outfile, level)
399 | outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
400 | self.exportAttributes(outfile, level, namespace_, name_='MemberType')
401 | if self.hasContent_():
402 | outfile.write('>\n')
403 | self.exportChildren(outfile, level + 1, namespace_, name_)
404 | showIndent(outfile, level)
405 | outfile.write('%s%s>\n' % (namespace_, name_))
406 | else:
407 | outfile.write(' />\n')
408 | def exportAttributes(self, outfile, level, namespace_='', name_='MemberType'):
409 | outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
410 | outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
411 | def exportChildren(self, outfile, level, namespace_='', name_='MemberType'):
412 | if self.name is not None:
413 | showIndent(outfile, level)
414 | outfile.write('<%sname>%s%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
415 | def hasContent_(self):
416 | if (
417 | self.name is not None
418 | ):
419 | return True
420 | else:
421 | return False
422 | def exportLiteral(self, outfile, level, name_='MemberType'):
423 | level += 1
424 | self.exportLiteralAttributes(outfile, level, name_)
425 | if self.hasContent_():
426 | self.exportLiteralChildren(outfile, level, name_)
427 | def exportLiteralAttributes(self, outfile, level, name_):
428 | if self.kind is not None:
429 | showIndent(outfile, level)
430 | outfile.write('kind = "%s",\n' % (self.kind,))
431 | if self.refid is not None:
432 | showIndent(outfile, level)
433 | outfile.write('refid = %s,\n' % (self.refid,))
434 | def exportLiteralChildren(self, outfile, level, name_):
435 | showIndent(outfile, level)
436 | outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
437 | def build(self, node_):
438 | attrs = node_.attributes
439 | self.buildAttributes(attrs)
440 | for child_ in node_.childNodes:
441 | nodeName_ = child_.nodeName.split(':')[-1]
442 | self.buildChildren(child_, nodeName_)
443 | def buildAttributes(self, attrs):
444 | if attrs.get('kind'):
445 | self.kind = attrs.get('kind').value
446 | if attrs.get('refid'):
447 | self.refid = attrs.get('refid').value
448 | def buildChildren(self, child_, nodeName_):
449 | if child_.nodeType == Node.ELEMENT_NODE and \
450 | nodeName_ == 'name':
451 | name_ = ''
452 | for text__content_ in child_.childNodes:
453 | name_ += text__content_.nodeValue
454 | self.name = name_
455 | # end class MemberType
456 |
457 |
458 | USAGE_TEXT = """
459 | Usage: python .py [ -s ]
460 | Options:
461 | -s Use the SAX parser, not the minidom parser.
462 | """
463 |
464 | def usage():
465 | print USAGE_TEXT
466 | sys.exit(1)
467 |
468 |
469 | def parse(inFileName):
470 | doc = minidom.parse(inFileName)
471 | rootNode = doc.documentElement
472 | rootObj = DoxygenType.factory()
473 | rootObj.build(rootNode)
474 | # Enable Python to collect the space used by the DOM.
475 | doc = None
476 | sys.stdout.write('\n')
477 | rootObj.export(sys.stdout, 0, name_="doxygenindex",
478 | namespacedef_='')
479 | return rootObj
480 |
481 |
482 | def parseString(inString):
483 | doc = minidom.parseString(inString)
484 | rootNode = doc.documentElement
485 | rootObj = DoxygenType.factory()
486 | rootObj.build(rootNode)
487 | # Enable Python to collect the space used by the DOM.
488 | doc = None
489 | sys.stdout.write('\n')
490 | rootObj.export(sys.stdout, 0, name_="doxygenindex",
491 | namespacedef_='')
492 | return rootObj
493 |
494 |
495 | def parseLiteral(inFileName):
496 | doc = minidom.parse(inFileName)
497 | rootNode = doc.documentElement
498 | rootObj = DoxygenType.factory()
499 | rootObj.build(rootNode)
500 | # Enable Python to collect the space used by the DOM.
501 | doc = None
502 | sys.stdout.write('from index import *\n\n')
503 | sys.stdout.write('rootObj = doxygenindex(\n')
504 | rootObj.exportLiteral(sys.stdout, 0, name_="doxygenindex")
505 | sys.stdout.write(')\n')
506 | return rootObj
507 |
508 |
509 | def main():
510 | args = sys.argv[1:]
511 | if len(args) == 1:
512 | parse(args[0])
513 | else:
514 | usage()
515 |
516 |
517 |
518 |
519 | if __name__ == '__main__':
520 | main()
521 | #import pdb
522 | #pdb.run('main()')
523 |
524 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/doxyxml/text.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Utilities for extracting text from generated classes.
23 | """
24 |
25 | def is_string(txt):
26 | if isinstance(txt, str):
27 | return True
28 | try:
29 | if isinstance(txt, unicode):
30 | return True
31 | except NameError:
32 | pass
33 | return False
34 |
35 | def description(obj):
36 | if obj is None:
37 | return None
38 | return description_bit(obj).strip()
39 |
40 | def description_bit(obj):
41 | if hasattr(obj, 'content'):
42 | contents = [description_bit(item) for item in obj.content]
43 | result = ''.join(contents)
44 | elif hasattr(obj, 'content_'):
45 | contents = [description_bit(item) for item in obj.content_]
46 | result = ''.join(contents)
47 | elif hasattr(obj, 'value'):
48 | result = description_bit(obj.value)
49 | elif is_string(obj):
50 | return obj
51 | else:
52 | raise StandardError('Expecting a string or something with content, content_ or value attribute')
53 | # If this bit is a paragraph then add one some line breaks.
54 | if hasattr(obj, 'name') and obj.name == 'para':
55 | result += "\n\n"
56 | return result
57 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/other/group_defs.dox:
--------------------------------------------------------------------------------
1 | /*!
2 | * \defgroup block GNU Radio WMBUS C++ Signal Processing Blocks
3 | * \brief All C++ blocks that can be used from the WMBUS GNU Radio
4 | * module are listed here or in the subcategories below.
5 | *
6 | */
7 |
8 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/other/main_page.dox:
--------------------------------------------------------------------------------
1 | /*! \mainpage
2 |
3 | Welcome to the GNU Radio WMBUS Block
4 |
5 | This is the intro page for the Doxygen manual generated for the WMBUS
6 | block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
7 | documentation about the new GNU Radio modules contained in this
8 | project.
9 |
10 | */
11 |
--------------------------------------------------------------------------------
/gr-wmbus/docs/doxygen/swig_doc.py:
--------------------------------------------------------------------------------
1 | #
2 | # Copyright 2010,2011 Free Software Foundation, Inc.
3 | #
4 | # This file is part of GNU Radio
5 | #
6 | # GNU Radio is free software; you can redistribute it and/or modify
7 | # it under the terms of the GNU General Public License as published by
8 | # the Free Software Foundation; either version 3, or (at your option)
9 | # any later version.
10 | #
11 | # GNU Radio is distributed in the hope that it will be useful,
12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | # GNU General Public License for more details.
15 | #
16 | # You should have received a copy of the GNU General Public License
17 | # along with GNU Radio; see the file COPYING. If not, write to
18 | # the Free Software Foundation, Inc., 51 Franklin Street,
19 | # Boston, MA 02110-1301, USA.
20 | #
21 | """
22 | Creates the swig_doc.i SWIG interface file.
23 | Execute using: python swig_doc.py xml_path outputfilename
24 |
25 | The file instructs SWIG to transfer the doxygen comments into the
26 | python docstrings.
27 |
28 | """
29 |
30 | import sys
31 |
32 | try:
33 | from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
34 | except ImportError:
35 | from gnuradio.doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile, base
36 |
37 |
38 | def py_name(name):
39 | bits = name.split('_')
40 | return '_'.join(bits[1:])
41 |
42 | def make_name(name):
43 | bits = name.split('_')
44 | return bits[0] + '_make_' + '_'.join(bits[1:])
45 |
46 |
47 | class Block(object):
48 | """
49 | Checks if doxyxml produced objects correspond to a gnuradio block.
50 | """
51 |
52 | @classmethod
53 | def includes(cls, item):
54 | if not isinstance(item, DoxyClass):
55 | return False
56 | # Check for a parsing error.
57 | if item.error():
58 | return False
59 | return item.has_member(make_name(item.name()), DoxyFriend)
60 |
61 |
62 | def utoascii(text):
63 | """
64 | Convert unicode text into ascii and escape quotes.
65 | """
66 | if text is None:
67 | return ''
68 | out = text.encode('ascii', 'replace')
69 | out = out.replace('"', '\\"')
70 | return out
71 |
72 |
73 | def combine_descriptions(obj):
74 | """
75 | Combines the brief and detailed descriptions of an object together.
76 | """
77 | description = []
78 | bd = obj.brief_description.strip()
79 | dd = obj.detailed_description.strip()
80 | if bd:
81 | description.append(bd)
82 | if dd:
83 | description.append(dd)
84 | return utoascii('\n\n'.join(description)).strip()
85 |
86 |
87 | entry_templ = '%feature("docstring") {name} "{docstring}"'
88 | def make_entry(obj, name=None, templ="{description}", description=None):
89 | """
90 | Create a docstring entry for a swig interface file.
91 |
92 | obj - a doxyxml object from which documentation will be extracted.
93 | name - the name of the C object (defaults to obj.name())
94 | templ - an optional template for the docstring containing only one
95 | variable named 'description'.
96 | description - if this optional variable is set then it's value is
97 | used as the description instead of extracting it from obj.
98 | """
99 | if name is None:
100 | name=obj.name()
101 | if "operator " in name:
102 | return ''
103 | if description is None:
104 | description = combine_descriptions(obj)
105 | docstring = templ.format(description=description)
106 | if not docstring:
107 | return ''
108 | return entry_templ.format(
109 | name=name,
110 | docstring=docstring,
111 | )
112 |
113 |
114 | def make_func_entry(func, name=None, description=None, params=None):
115 | """
116 | Create a function docstring entry for a swig interface file.
117 |
118 | func - a doxyxml object from which documentation will be extracted.
119 | name - the name of the C object (defaults to func.name())
120 | description - if this optional variable is set then it's value is
121 | used as the description instead of extracting it from func.
122 | params - a parameter list that overrides using func.params.
123 | """
124 | if params is None:
125 | params = func.params
126 | params = [prm.declname for prm in params]
127 | if params:
128 | sig = "Params: (%s)" % ", ".join(params)
129 | else:
130 | sig = "Params: (NONE)"
131 | templ = "{description}\n\n" + sig
132 | return make_entry(func, name=name, templ=utoascii(templ),
133 | description=description)
134 |
135 |
136 | def make_class_entry(klass, description=None):
137 | """
138 | Create a class docstring for a swig interface file.
139 | """
140 | output = []
141 | output.append(make_entry(klass, description=description))
142 | for func in klass.in_category(DoxyFunction):
143 | name = klass.name() + '::' + func.name()
144 | output.append(make_func_entry(func, name=name))
145 | return "\n\n".join(output)
146 |
147 |
148 | def make_block_entry(di, block):
149 | """
150 | Create class and function docstrings of a gnuradio block for a
151 | swig interface file.
152 | """
153 | descriptions = []
154 | # Get the documentation associated with the class.
155 | class_desc = combine_descriptions(block)
156 | if class_desc:
157 | descriptions.append(class_desc)
158 | # Get the documentation associated with the make function
159 | make_func = di.get_member(make_name(block.name()), DoxyFunction)
160 | make_func_desc = combine_descriptions(make_func)
161 | if make_func_desc:
162 | descriptions.append(make_func_desc)
163 | # Get the documentation associated with the file
164 | try:
165 | block_file = di.get_member(block.name() + ".h", DoxyFile)
166 | file_desc = combine_descriptions(block_file)
167 | if file_desc:
168 | descriptions.append(file_desc)
169 | except base.Base.NoSuchMember:
170 | # Don't worry if we can't find a matching file.
171 | pass
172 | # And join them all together to make a super duper description.
173 | super_description = "\n\n".join(descriptions)
174 | # Associate the combined description with the class and
175 | # the make function.
176 | output = []
177 | output.append(make_class_entry(block, description=super_description))
178 | creator = block.get_member(block.name(), DoxyFunction)
179 | output.append(make_func_entry(make_func, description=super_description,
180 | params=creator.params))
181 | return "\n\n".join(output)
182 |
183 |
184 | def make_swig_interface_file(di, swigdocfilename, custom_output=None):
185 |
186 | output = ["""
187 | /*
188 | * This file was automatically generated using swig_doc.py.
189 | *
190 | * Any changes to it will be lost next time it is regenerated.
191 | */
192 | """]
193 |
194 | if custom_output is not None:
195 | output.append(custom_output)
196 |
197 | # Create docstrings for the blocks.
198 | blocks = di.in_category(Block)
199 | make_funcs = set([])
200 | for block in blocks:
201 | try:
202 | make_func = di.get_member(make_name(block.name()), DoxyFunction)
203 | make_funcs.add(make_func.name())
204 | output.append(make_block_entry(di, block))
205 | except block.ParsingError:
206 | print('Parsing error for block %s' % block.name())
207 |
208 | # Create docstrings for functions
209 | # Don't include the make functions since they have already been dealt with.
210 | funcs = [f for f in di.in_category(DoxyFunction) if f.name() not in make_funcs]
211 | for f in funcs:
212 | try:
213 | output.append(make_func_entry(f))
214 | except f.ParsingError:
215 | print('Parsing error for function %s' % f.name())
216 |
217 | # Create docstrings for classes
218 | block_names = [block.name() for block in blocks]
219 | klasses = [k for k in di.in_category(DoxyClass) if k.name() not in block_names]
220 | for k in klasses:
221 | try:
222 | output.append(make_class_entry(k))
223 | except k.ParsingError:
224 | print('Parsing error for class %s' % k.name())
225 |
226 | # Docstrings are not created for anything that is not a function or a class.
227 | # If this excludes anything important please add it here.
228 |
229 | output = "\n\n".join(output)
230 |
231 | swig_doc = file(swigdocfilename, 'w')
232 | swig_doc.write(output)
233 | swig_doc.close()
234 |
235 | if __name__ == "__main__":
236 | # Parse command line options and set up doxyxml.
237 | err_msg = "Execute using: python swig_doc.py xml_path outputfilename"
238 | if len(sys.argv) != 3:
239 | raise StandardError(err_msg)
240 | xml_path = sys.argv[1]
241 | swigdocfilename = sys.argv[2]
242 | di = DoxyIndex(xml_path)
243 |
244 | # gnuradio.gr.msq_queue.insert_tail and delete_head create errors unless docstrings are defined!
245 | # This is presumably a bug in SWIG.
246 | #msg_q = di.get_member(u'gr_msg_queue', DoxyClass)
247 | #insert_tail = msg_q.get_member(u'insert_tail', DoxyFunction)
248 | #delete_head = msg_q.get_member(u'delete_head', DoxyFunction)
249 | output = []
250 | #output.append(make_func_entry(insert_tail, name='gr_py_msg_queue__insert_tail'))
251 | #output.append(make_func_entry(delete_head, name='gr_py_msg_queue__delete_head'))
252 | custom_output = "\n\n".join(output)
253 |
254 | # Generate the docstrings interface file.
255 | make_swig_interface_file(di, swigdocfilename, custom_output=custom_output)
256 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | install(FILES
21 | wmbus_demod.grc
22 | wmbus_phy1.grc
23 | wmbus_phy2.grc
24 | wmbus_demod.py.xml
25 | wmbus_phy1.py.xml
26 | wmbus_phy2.py.xml
27 | DESTINATION share/gnuradio/grc/blocks
28 | )
29 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/wmbus_demod.py.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Wireless M-Bus Demod
4 | wmbus_demod
5 | Custom
6 | execfile("/home/user/.grc_gnuradio/wmbus_demod.py")
7 | wmbus_demod(
8 | samp_rate=$samp_rate,
9 | samp_per_sym=$samp_per_sym,
10 | freq_error=$freq_error,
11 | )
12 | set_samp_rate($samp_rate)
13 | set_samp_per_sym($samp_per_sym)
14 | set_freq_error($freq_error)
15 |
16 | samp_rate
17 | samp_rate
18 | 1600000
19 | raw
20 |
21 |
22 | samp_per_sym
23 | samp_per_sym
24 | 16
25 | raw
26 |
27 |
28 | freq_error
29 | freq_error
30 | -0.0025000
31 | raw
32 |
33 |
34 | in
35 | complex
36 | 1
37 |
38 |
39 | out
40 | byte
41 | 1
42 |
43 |
44 |
45 | /home/user/.grc_gnuradio/wmbus_demod.py
46 |
47 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/wmbus_phy1.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sat Oct 13 16:01:48 2012
4 |
5 | options
6 |
7 | id
8 | wmbus_phy1
9 |
10 |
11 | _enabled
12 | True
13 |
14 |
15 | title
16 |
17 |
18 |
19 | author
20 |
21 |
22 |
23 | description
24 |
25 |
26 |
27 | window_size
28 | 1280, 1024
29 |
30 |
31 | generate_options
32 | hb
33 |
34 |
35 | category
36 | Custom
37 |
38 |
39 | run_options
40 | run
41 |
42 |
43 | run
44 | True
45 |
46 |
47 | max_nouts
48 | 0
49 |
50 |
51 | realtime_scheduling
52 |
53 |
54 |
55 | _coordinate
56 | (17, 19)
57 |
58 |
59 | _rotation
60 | 0
61 |
62 |
63 |
64 | gr_complex_to_mag_squared
65 |
66 | id
67 | gr_complex_to_mag_squared_0
68 |
69 |
70 | _enabled
71 | True
72 |
73 |
74 | vlen
75 | 1
76 |
77 |
78 | _coordinate
79 | (206, 221)
80 |
81 |
82 | _rotation
83 | 0
84 |
85 |
86 |
87 | parameter
88 |
89 | id
90 | samp_rate
91 |
92 |
93 | _enabled
94 | True
95 |
96 |
97 | label
98 |
99 |
100 |
101 | value
102 | 1600000
103 |
104 |
105 | type
106 | intx
107 |
108 |
109 | short_id
110 |
111 |
112 |
113 | _coordinate
114 | (217, 7)
115 |
116 |
117 | _rotation
118 | 0
119 |
120 |
121 |
122 | gr_nlog10_ff
123 |
124 | id
125 | gr_nlog10_ff_0
126 |
127 |
128 | _enabled
129 | True
130 |
131 |
132 | n
133 | 10
134 |
135 |
136 | k
137 | 0
138 |
139 |
140 | vlen
141 | 1
142 |
143 |
144 | _coordinate
145 | (419, 210)
146 |
147 |
148 | _rotation
149 | 0
150 |
151 |
152 |
153 | parameter
154 |
155 | id
156 | samp_per_sym
157 |
158 |
159 | _enabled
160 | True
161 |
162 |
163 | label
164 |
165 |
166 |
167 | value
168 | 16
169 |
170 |
171 | type
172 | intx
173 |
174 |
175 | short_id
176 |
177 |
178 |
179 | _coordinate
180 | (322, 6)
181 |
182 |
183 | _rotation
184 | 0
185 |
186 |
187 |
188 | parameter
189 |
190 | id
191 | verbose
192 |
193 |
194 | _enabled
195 | True
196 |
197 |
198 | label
199 |
200 |
201 |
202 | value
203 | 0
204 |
205 |
206 | type
207 | intx
208 |
209 |
210 | short_id
211 |
212 |
213 |
214 | _coordinate
215 | (447, 9)
216 |
217 |
218 | _rotation
219 | 0
220 |
221 |
222 |
223 | any_sink
224 |
225 | id
226 | any_sink_0_1
227 |
228 |
229 | _enabled
230 | True
231 |
232 |
233 | block_desc
234 | framer
235 |
236 |
237 | block_maker
238 | mbus.framer(msgq, verbose)
239 |
240 |
241 | num_inputs
242 | 2
243 |
244 |
245 | _coordinate
246 | (822, 117)
247 |
248 |
249 | _rotation
250 | 0
251 |
252 |
253 |
254 | any_sink
255 |
256 | id
257 | any_sink_0
258 |
259 |
260 | _enabled
261 | False
262 |
263 |
264 | block_desc
265 | print_char
266 |
267 |
268 | block_maker
269 | baz.print_char()
270 |
271 |
272 | num_inputs
273 | 1
274 |
275 |
276 | _coordinate
277 | (853, 240)
278 |
279 |
280 | _rotation
281 | 0
282 |
283 |
284 |
285 | parameter
286 |
287 | id
288 | msgq
289 |
290 |
291 | _enabled
292 | True
293 |
294 |
295 | label
296 |
297 |
298 |
299 | value
300 | 0
301 |
302 |
303 | type
304 |
305 |
306 |
307 | short_id
308 |
309 |
310 |
311 | _coordinate
312 | (644, 17)
313 |
314 |
315 | _rotation
316 | 0
317 |
318 |
319 |
320 | parameter
321 |
322 | id
323 | freq_error
324 |
325 |
326 | _enabled
327 | True
328 |
329 |
330 | label
331 |
332 |
333 |
334 | value
335 | -0.0025000
336 |
337 |
338 | type
339 | eng_float
340 |
341 |
342 | short_id
343 |
344 |
345 |
346 | _coordinate
347 | (534, 10)
348 |
349 |
350 | _rotation
351 | 0
352 |
353 |
354 |
355 | fir_filter_xxx
356 |
357 | id
358 | fir_filter_xxx_0
359 |
360 |
361 | _enabled
362 | True
363 |
364 |
365 | type
366 | fff
367 |
368 |
369 | decim
370 | samp_per_sym
371 |
372 |
373 | taps
374 | 16*[1./16]
375 |
376 |
377 | _coordinate
378 | (561, 207)
379 |
380 |
381 | _rotation
382 | 0
383 |
384 |
385 |
386 | pad_source
387 |
388 | id
389 | pad_source_0
390 |
391 |
392 | _enabled
393 | True
394 |
395 |
396 | label
397 | in
398 |
399 |
400 | type
401 | complex
402 |
403 |
404 | vlen
405 | 1
406 |
407 |
408 | _coordinate
409 | (31, 139)
410 |
411 |
412 | _rotation
413 | 0
414 |
415 |
416 |
417 | wmbus_demod
418 |
419 | id
420 | wmbus_demod_0
421 |
422 |
423 | _enabled
424 | True
425 |
426 |
427 | samp_rate
428 | 1600000
429 |
430 |
431 | samp_per_sym
432 | 16
433 |
434 |
435 | freq_error
436 | -0.0025000
437 |
438 |
439 | _coordinate
440 | (222, 107)
441 |
442 |
443 | _rotation
444 | 0
445 |
446 |
447 |
448 | any
449 |
450 | id
451 | any_0
452 |
453 |
454 | _enabled
455 | True
456 |
457 |
458 | block_desc
459 | correlate_preamble
460 |
461 |
462 | block_maker
463 | mbus.correlate_preamble()
464 |
465 |
466 | num_inputs
467 | 1
468 |
469 |
470 | num_outputs
471 | 1
472 |
473 |
474 | _coordinate
475 | (472, 110)
476 |
477 |
478 | _rotation
479 | 0
480 |
481 |
482 |
483 | import
484 |
485 | id
486 | import_0
487 |
488 |
489 | _enabled
490 | True
491 |
492 |
493 | import
494 | import wmbus_blocks as mbus
495 |
496 |
497 | _coordinate
498 | (731, 23)
499 |
500 |
501 | _rotation
502 | 0
503 |
504 |
505 |
506 | import
507 |
508 | id
509 | import_1
510 |
511 |
512 | _enabled
513 | False
514 |
515 |
516 | import
517 | import baz
518 |
519 |
520 | _coordinate
521 | (820, 23)
522 |
523 |
524 | _rotation
525 | 0
526 |
527 |
528 |
529 | any_0
530 | any_sink_0_1
531 | 0
532 | 0
533 |
534 |
535 | gr_complex_to_mag_squared_0
536 | gr_nlog10_ff_0
537 | 0
538 | 0
539 |
540 |
541 | gr_nlog10_ff_0
542 | fir_filter_xxx_0
543 | 0
544 | 0
545 |
546 |
547 | fir_filter_xxx_0
548 | any_sink_0_1
549 | 0
550 | 1
551 |
552 |
553 | pad_source_0
554 | gr_complex_to_mag_squared_0
555 | 0
556 | 0
557 |
558 |
559 | any_0
560 | any_sink_0
561 | 0
562 | 0
563 |
564 |
565 | pad_source_0
566 | wmbus_demod_0
567 | 0
568 | 0
569 |
570 |
571 | wmbus_demod_0
572 | any_0
573 | 0
574 | 0
575 |
576 |
577 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/wmbus_phy1.py.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Wmbus Phy1
4 | wmbus_phy1
5 | Custom
6 | execfile("/home/user/.grc_gnuradio/wmbus_phy1.py")
7 | wmbus_phy1(
8 | samp_rate=$samp_rate,
9 | samp_per_sym=$samp_per_sym,
10 | verbose=$verbose,
11 | msgq=$msgq,
12 | freq_error=$freq_error,
13 | )
14 | set_samp_rate($samp_rate)
15 | set_samp_per_sym($samp_per_sym)
16 | set_verbose($verbose)
17 | set_msgq($msgq)
18 | set_freq_error($freq_error)
19 |
20 | samp_rate
21 | samp_rate
22 | 1600000
23 | raw
24 |
25 |
26 | samp_per_sym
27 | samp_per_sym
28 | 16
29 | raw
30 |
31 |
32 | verbose
33 | verbose
34 | 0
35 | raw
36 |
37 |
38 | msgq
39 | msgq
40 | 0
41 | raw
42 |
43 |
44 | freq_error
45 | freq_error
46 | -0.0025000
47 | raw
48 |
49 |
50 | in
51 | complex
52 | 1
53 |
54 |
55 |
56 | /home/user/.grc_gnuradio/wmbus_phy1.py
57 |
58 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/wmbus_phy2.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sat Oct 13 16:35:53 2012
4 |
5 | gr_file_sink
6 |
7 | id
8 | gr_file_sink_0_0
9 |
10 |
11 | _enabled
12 | False
13 |
14 |
15 | file
16 | /home/user/git/mbus/mine/traces/foo5.frame1.demod4.u8
17 |
18 |
19 | type
20 | byte
21 |
22 |
23 | vlen
24 | 1
25 |
26 |
27 | unbuffered
28 | False
29 |
30 |
31 | _coordinate
32 | (748, 115)
33 |
34 |
35 | _rotation
36 | 0
37 |
38 |
39 |
40 | any_sink
41 |
42 | id
43 | any_sink_0
44 |
45 |
46 | _enabled
47 | False
48 |
49 |
50 | block_desc
51 | print_char
52 |
53 |
54 | block_maker
55 | baz.print_char()
56 |
57 |
58 | num_inputs
59 | 1
60 |
61 |
62 | _coordinate
63 | (757, 36)
64 |
65 |
66 | _rotation
67 | 0
68 |
69 |
70 |
71 | gr_pack_k_bits_bb
72 |
73 | id
74 | gr_pack_k_bits_bb_0
75 |
76 |
77 | _enabled
78 | True
79 |
80 |
81 | k
82 | 6
83 |
84 |
85 | _coordinate
86 | (285, 119)
87 |
88 |
89 | _rotation
90 | 0
91 |
92 |
93 |
94 | gr_file_sink
95 |
96 | id
97 | gr_file_sink_0
98 |
99 |
100 | _enabled
101 | False
102 |
103 |
104 | file
105 | /home/user/git/mbus/mine/foo.u8
106 |
107 |
108 | type
109 | byte
110 |
111 |
112 | vlen
113 | 1
114 |
115 |
116 | unbuffered
117 | False
118 |
119 |
120 | _coordinate
121 | (892, 270)
122 |
123 |
124 | _rotation
125 | 0
126 |
127 |
128 |
129 | gr_vector_source_x
130 |
131 | id
132 | gr_vector_source_x_0
133 |
134 |
135 | _enabled
136 | True
137 |
138 |
139 | type
140 | byte
141 |
142 |
143 | vector
144 | frame
145 |
146 |
147 | repeat
148 | False
149 |
150 |
151 | vlen
152 | 1
153 |
154 |
155 | _coordinate
156 | (39, 106)
157 |
158 |
159 | _rotation
160 | 0
161 |
162 |
163 |
164 | any_sink
165 |
166 | id
167 | any_sink_0_1
168 |
169 |
170 | _enabled
171 | False
172 |
173 |
174 | block_desc
175 | print_char
176 |
177 |
178 | block_maker
179 | baz.print_char()
180 |
181 |
182 | num_inputs
183 | 1
184 |
185 |
186 | _coordinate
187 | (377, 204)
188 |
189 |
190 | _rotation
191 | 0
192 |
193 |
194 |
195 | any_sink
196 |
197 | id
198 | any_sink_0_0
199 |
200 |
201 | _enabled
202 | False
203 |
204 |
205 | block_desc
206 | print_char
207 |
208 |
209 | block_maker
210 | baz.print_char()
211 |
212 |
213 | num_inputs
214 | 1
215 |
216 |
217 | _coordinate
218 | (871, 357)
219 |
220 |
221 | _rotation
222 | 0
223 |
224 |
225 |
226 | digital_map_bb
227 |
228 | id
229 | digital_map_bb_0
230 |
231 |
232 | _enabled
233 | True
234 |
235 |
236 | map
237 | [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 3, 16, 1, 2, 16, 16, 16, 16, 7, 16, 16, 0, 16, 16, 5, 6, 16, 4, 16, 16, 16, 16, 16, 16, 11, 16, 9, 10, 16, 16, 15, 16, 16, 8, 16, 16, 16, 16, 13, 14, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]
238 |
239 |
240 | _coordinate
241 | (474, 120)
242 |
243 |
244 | _rotation
245 | 0
246 |
247 |
248 |
249 | gr_unpacked_to_packed_xx
250 |
251 | id
252 | gr_unpacked_to_packed_xx_0
253 |
254 |
255 | _enabled
256 | True
257 |
258 |
259 | type
260 | byte
261 |
262 |
263 | bits_per_chunk
264 | 4
265 |
266 |
267 | endianness
268 | gr.GR_MSB_FIRST
269 |
270 |
271 | num_ports
272 | 1
273 |
274 |
275 | _coordinate
276 | (592, 293)
277 |
278 |
279 | _rotation
280 | 0
281 |
282 |
283 |
284 | gr_vector_sink_x
285 |
286 | id
287 | gr_vector_sink_x_0
288 |
289 |
290 | _enabled
291 | True
292 |
293 |
294 | type
295 | byte
296 |
297 |
298 | vlen
299 | 1
300 |
301 |
302 | _coordinate
303 | (978, 207)
304 |
305 |
306 | _rotation
307 | 0
308 |
309 |
310 |
311 | gr_unpacked_to_packed_xx
312 |
313 | id
314 | gr_unpacked_to_packed_xx_0_0
315 |
316 |
317 | _enabled
318 | False
319 |
320 |
321 | type
322 | byte
323 |
324 |
325 | bits_per_chunk
326 | 4
327 |
328 |
329 | endianness
330 | gr.GR_MSB_FIRST
331 |
332 |
333 | num_ports
334 | 1
335 |
336 |
337 | _coordinate
338 | (633, 394)
339 |
340 |
341 | _rotation
342 | 0
343 |
344 |
345 |
346 | digital_map_bb
347 |
348 | id
349 | digital_map_bb_1
350 |
351 |
352 | _enabled
353 | True
354 |
355 |
356 | map
357 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
358 |
359 |
360 | _coordinate
361 | (403, 354)
362 |
363 |
364 | _rotation
365 | 0
366 |
367 |
368 |
369 | gr_vector_sink_x
370 |
371 | id
372 | gr_vector_sink_x_1
373 |
374 |
375 | _enabled
376 | True
377 |
378 |
379 | type
380 | byte
381 |
382 |
383 | vlen
384 | 1
385 |
386 |
387 | _coordinate
388 | (970, 438)
389 |
390 |
391 | _rotation
392 | 0
393 |
394 |
395 |
396 | any_sink
397 |
398 | id
399 | any_sink_0_1_0
400 |
401 |
402 | _enabled
403 | False
404 |
405 |
406 | block_desc
407 | print_char
408 |
409 |
410 | block_maker
411 | baz.print_char()
412 |
413 |
414 | num_inputs
415 | 1
416 |
417 |
418 | _coordinate
419 | (119, 238)
420 |
421 |
422 | _rotation
423 | 0
424 |
425 |
426 |
427 | import
428 |
429 | id
430 | import_1
431 |
432 |
433 | _enabled
434 | False
435 |
436 |
437 | import
438 | import baz
439 |
440 |
441 | _coordinate
442 | (227, 22)
443 |
444 |
445 | _rotation
446 | 0
447 |
448 |
449 |
450 | variable
451 |
452 | id
453 | frame
454 |
455 |
456 | _enabled
457 | True
458 |
459 |
460 | value
461 | [1,1]
462 |
463 |
464 | _coordinate
465 | (342, 21)
466 |
467 |
468 | _rotation
469 | 0
470 |
471 |
472 |
473 | options
474 |
475 | id
476 | wmbus_phy2
477 |
478 |
479 | _enabled
480 | True
481 |
482 |
483 | title
484 |
485 |
486 |
487 | author
488 |
489 |
490 |
491 | description
492 |
493 |
494 |
495 | window_size
496 | 1280, 1024
497 |
498 |
499 | generate_options
500 | no_gui
501 |
502 |
503 | category
504 | Custom
505 |
506 |
507 | run_options
508 | run
509 |
510 |
511 | run
512 | True
513 |
514 |
515 | max_nouts
516 | 0
517 |
518 |
519 | realtime_scheduling
520 |
521 |
522 |
523 | _coordinate
524 | (10, 10)
525 |
526 |
527 | _rotation
528 | 0
529 |
530 |
531 |
532 | gr_vector_source_x_0
533 | gr_pack_k_bits_bb_0
534 | 0
535 | 0
536 |
537 |
538 | gr_pack_k_bits_bb_0
539 | digital_map_bb_0
540 | 0
541 | 0
542 |
543 |
544 | digital_map_bb_0
545 | gr_unpacked_to_packed_xx_0
546 | 0
547 | 0
548 |
549 |
550 | gr_unpacked_to_packed_xx_0
551 | gr_file_sink_0
552 | 0
553 | 0
554 |
555 |
556 | gr_unpacked_to_packed_xx_0
557 | any_sink_0_0
558 | 0
559 | 0
560 |
561 |
562 | gr_unpacked_to_packed_xx_0
563 | gr_vector_sink_x_0
564 | 0
565 | 0
566 |
567 |
568 | digital_map_bb_0
569 | any_sink_0
570 | 0
571 | 0
572 |
573 |
574 | digital_map_bb_0
575 | gr_file_sink_0_0
576 | 0
577 | 0
578 |
579 |
580 | gr_pack_k_bits_bb_0
581 | any_sink_0_1
582 | 0
583 | 0
584 |
585 |
586 | gr_vector_source_x_0
587 | any_sink_0_1_0
588 | 0
589 | 0
590 |
591 |
592 | digital_map_bb_0
593 | digital_map_bb_1
594 | 0
595 | 0
596 |
597 |
598 | digital_map_bb_1
599 | gr_unpacked_to_packed_xx_0_0
600 | 0
601 | 0
602 |
603 |
604 | gr_unpacked_to_packed_xx_0_0
605 | gr_vector_sink_x_1
606 | 0
607 | 0
608 |
609 |
610 | digital_map_bb_1
611 | gr_vector_sink_x_1
612 | 0
613 | 0
614 |
615 |
616 |
--------------------------------------------------------------------------------
/gr-wmbus/grc/wmbus_phy2.py.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Wmbus Phy2
4 | wmbus_phy2
5 | Custom
6 | execfile("/home/user/.grc_gnuradio/wmbus_phy2.py")
7 | wmbus_phy2()
8 |
9 |
10 | /home/user/.grc_gnuradio/wmbus_phy2.py
11 |
12 |
--------------------------------------------------------------------------------
/gr-wmbus/include/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Install public header files
22 | ########################################################################
23 | install(FILES
24 | wmbus_api.h
25 | DESTINATION include/wmbus
26 | )
27 |
--------------------------------------------------------------------------------
/gr-wmbus/include/wmbus_api.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2011 Free Software Foundation, Inc.
3 | *
4 | * This file is part of GNU Radio
5 | *
6 | * GNU Radio is free software; you can redistribute it and/or modify
7 | * it under the terms of the GNU General Public License as published by
8 | * the Free Software Foundation; either version 3, or (at your option)
9 | * any later version.
10 | *
11 | * GNU Radio is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with GNU Radio; see the file COPYING. If not, write to
18 | * the Free Software Foundation, Inc., 51 Franklin Street,
19 | * Boston, MA 02110-1301, USA.
20 | */
21 |
22 | #ifndef INCLUDED_WMBUS_API_H
23 | #define INCLUDED_WMBUS_API_H
24 |
25 | #include
26 |
27 | #ifdef gnuradio_wmbus_EXPORTS
28 | # define WMBUS_API __GR_ATTR_EXPORT
29 | #else
30 | # define WMBUS_API __GR_ATTR_IMPORT
31 | #endif
32 |
33 | #endif /* INCLUDED_WMBUS_API_H */
34 |
--------------------------------------------------------------------------------
/gr-wmbus/lib/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # GNU Radio is free software; you can redistribute it and/or modify
4 | # it under the terms of the GNU General Public License as published by
5 | # the Free Software Foundation; either version 3, or (at your option)
6 | # any later version.
7 | #
8 | # GNU Radio is distributed in the hope that it will be useful,
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 | # GNU General Public License for more details.
12 | #
13 | # You should have received a copy of the GNU General Public License
14 | # along with GNU Radio; see the file COPYING. If not, write to
15 | # the Free Software Foundation, Inc., 51 Franklin Street,
16 | # Boston, MA 02110-1301, USA.
17 |
18 | ########################################################################
19 | # Setup library
20 | ########################################################################
21 | include(GrPlatform) #define LIB_SUFFIX
22 |
23 | add_library(gnuradio-wmbus SHARED )
24 | target_link_libraries(gnuradio-wmbus ${Boost_LIBRARIES} ${GRUEL_LIBRARIES} ${GNURADIO_CORE_LIBRARIES})
25 | set_target_properties(gnuradio-wmbus PROPERTIES DEFINE_SYMBOL "gnuradio_wmbus_EXPORTS")
26 |
27 | ########################################################################
28 | # Install built library files
29 | ########################################################################
30 | install(TARGETS gnuradio-wmbus
31 | LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file
32 | ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
33 | RUNTIME DESTINATION bin # .dll file
34 | )
35 |
36 | ########################################################################
37 | # Build and register unit test
38 | ########################################################################
39 | find_package(Boost COMPONENTS unit_test_framework)
40 |
41 | include(GrTest)
42 | set(GR_TEST_TARGET_DEPS gnuradio-wmbus)
43 | #turn each test cpp file into an executable with an int main() function
44 | add_definitions(-DBOOST_TEST_DYN_LINK -DBOOST_TEST_MAIN)
45 |
46 |
--------------------------------------------------------------------------------
/gr-wmbus/python/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Include python install macros
22 | ########################################################################
23 | include(GrPython)
24 | if(NOT PYTHONINTERP_FOUND)
25 | return()
26 | endif()
27 |
28 | ########################################################################
29 | # Install python sources
30 | ########################################################################
31 | GR_PYTHON_INSTALL(
32 | FILES
33 | __init__.py
34 | wmbus_blocks.py
35 | wmbus_demod.py
36 | wmbus_phy1.py
37 | wmbus_phy2.py
38 | DESTINATION ${GR_PYTHON_DIR}/wmbus
39 | )
40 |
41 | ########################################################################
42 | # Handle the unit tests
43 | ########################################################################
44 | include(GrTest)
45 |
46 | set(GR_TEST_TARGET_DEPS gnuradio-wmbus)
47 | set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
48 |
--------------------------------------------------------------------------------
/gr-wmbus/python/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oWCTejLVlFyNztcBnOoh/gr-wmbus/c7ca69a052b4a7cf1d4472511ccb06eaf9ab1dcc/gr-wmbus/python/__init__.py
--------------------------------------------------------------------------------
/gr-wmbus/python/wmbus_blocks.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | import numpy
4 | from gnuradio import gr
5 | from gnuradio.extras import block_gateway
6 | from gnuradio import digital
7 | from gnuradio.digital import packet_utils
8 | from optparse import OptionParser
9 | from gnuradio.eng_option import eng_option
10 | from gruel.pmt.pmt_swig import pmt_print
11 | from gnuradio.extras.extras_swig import pmt_symbol_to_string
12 | from numpy.numarray.functions import ones
13 |
14 | class correlate_preamble(gr.hier_block2):
15 | """
16 | The total preamble (header + synchronisation) chips sequence for this mode shall
17 | be nx(01) 0000111101 with n >= 19.
18 | """
19 |
20 | def __init__(self, preamble="010101010", sync_word="0000111101"):
21 | """
22 | @param preamble: the preamble chips
23 | @param sync_word: the sync word bits
24 | """
25 | gr.hier_block2.__init__(
26 | self, "correlate_preamble",
27 | gr.io_signature(1, 1, gr.sizeof_char*1),
28 | gr.io_signature(1, 1, gr.sizeof_char*1),
29 | )
30 |
31 | if not packet_utils.is_1_0_string(preamble):
32 | raise ValueError, "Invalid access_code %r. Must be string of 1's and 0's" % (preamble,)
33 | self.preamble = digital.correlate_access_code_tag_bb(preamble, 0, "preamble")
34 |
35 | if not packet_utils.is_1_0_string(sync_word):
36 | raise ValueError, "Invalid access_code %r. Must be string of 1's and 0's" % (sync_word,)
37 | self.sync = digital.correlate_access_code_tag_bb(sync_word, 0, "sync")
38 |
39 | self.connect(self, self.sync, self.preamble, self)
40 |
41 |
42 | class framer(gr.block):
43 |
44 | def __init__(self, msgq, verbose=0):
45 | gr.block.__init__(
46 | self,
47 | name = "framer",
48 | in_sig = [numpy.uint8, numpy.float32],
49 | out_sig = None, #[numpy.uint8],
50 | )
51 | self.state = 0;
52 | self.power_drops = 0
53 | self.msgq = msgq
54 | self.pkt = ones(10000, dtype=numpy.uint8)
55 | self.pos_write = 0
56 | self.preamble_power = 0
57 | self.power_threshold = 9
58 | self.power_drop_threshold = 6*8
59 | self.debug = (verbose > 2);
60 |
61 |
62 | def work(self, input_items, output_items):
63 | nread = self.nitems_read(0) #number of items read on port 0
64 | ninput_items = len(input_items[0])
65 |
66 | #read all tags associated with port 0 for items in this work function
67 | tags = self.get_tags_in_range(0, nread, nread+ninput_items)
68 |
69 | #for ff in range(0,ninput_items):
70 | # print (nread+ff, input_items[0][ff], input_items[1][ff])
71 | # for tag in tags:
72 | # if tag.offset == nread+ff:
73 | # print pmt_symbol_to_string(tag.key)
74 |
75 | #work stuff here...
76 | pos_read = 0;
77 | for tag in tags:
78 | # process
79 | pos_read_end = tag.offset-nread
80 | self.process(input_items, pos_read, pos_read_end)
81 | pos_read = pos_read_end
82 |
83 | # state change
84 | tag_key = pmt_symbol_to_string(tag.key)
85 | if self.debug: print tag_key
86 | if tag_key == "preamble":
87 | self.state = 1
88 | self.preamble_power = input_items[1][nread-tag.offset]
89 | self.make_pkt()
90 | elif tag_key == "sync":
91 | self.state = 2
92 | self.make_pkt()
93 |
94 | pos_read_end = ninput_items
95 | self.process(input_items, pos_read, pos_read_end)
96 |
97 | return (ninput_items)
98 |
99 | def stop(self):
100 | self.make_pkt()
101 | return True
102 |
103 | def process(self, input_items, start, end):
104 | if self.state == 2:
105 | for i in range(start,end):
106 | if input_items[1][i] < self.preamble_power - self.power_threshold:
107 | self.power_drops += 1
108 | else:
109 | self.power_drops = 0
110 | if self.power_drops > self.power_drop_threshold:
111 | end = i
112 | self.state = 0
113 | break;
114 | self.pkt[self.pos_write:self.pos_write+(end-start)] = input_items[0][start:end]
115 | self.pos_write += end-start
116 | if self.state == 0:
117 | if self.debug: print "carrier lost"
118 | self.make_pkt()
119 |
120 | def make_pkt(self):
121 | if self.pos_write > 0:
122 | msg = gr.message_from_string(self.pkt[0:self.pos_write].tostring(), 0, 0, 0);
123 | self.msgq.insert_tail(msg)
124 | self.pos_write = 0;
125 |
126 |
127 |
--------------------------------------------------------------------------------
/gr-wmbus/python/wmbus_blocks.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oWCTejLVlFyNztcBnOoh/gr-wmbus/c7ca69a052b4a7cf1d4472511ccb06eaf9ab1dcc/gr-wmbus/python/wmbus_blocks.pyc
--------------------------------------------------------------------------------
/gr-wmbus/python/wmbus_demod.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | ##################################################
3 | # Gnuradio Python Flow Graph
4 | # Title: Wireless M-Bus Demod
5 | # Generated: Sat Oct 13 15:58:56 2012
6 | ##################################################
7 |
8 | from gnuradio import digital
9 | from gnuradio import gr
10 | from gnuradio.gr import firdes
11 |
12 | class wmbus_demod(gr.hier_block2):
13 |
14 | def __init__(self, samp_rate=1600000, samp_per_sym=16, freq_error=-0.0025000):
15 | gr.hier_block2.__init__(
16 | self, "Wireless M-Bus Demod",
17 | gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
18 | gr.io_signature(1, 1, gr.sizeof_char*1),
19 | )
20 |
21 | ##################################################
22 | # Parameters
23 | ##################################################
24 | self.samp_rate = samp_rate
25 | self.samp_per_sym = samp_per_sym
26 | self.freq_error = freq_error
27 |
28 | ##################################################
29 | # Variables
30 | ##################################################
31 | self.cutoff = cutoff = 120e3
32 | self.chip_rate = chip_rate = samp_rate/samp_per_sym
33 |
34 | ##################################################
35 | # Blocks
36 | ##################################################
37 | self.low_pass_filter_0 = gr.fir_filter_ccf(1, firdes.low_pass(
38 | 1, samp_rate, cutoff, cutoff/2, firdes.WIN_HAMMING, 6.76))
39 | self.gr_sub_xx_0 = gr.sub_ff(1)
40 | self.gr_single_pole_iir_filter_xx_0 = gr.single_pole_iir_filter_ff(0.0512/samp_per_sym, 1)
41 | self.gr_quadrature_demod_cf_0 = gr.quadrature_demod_cf(1)
42 | self.digital_clock_recovery_mm_xx_0 = digital.clock_recovery_mm_ff(samp_per_sym*(1+freq_error), .25 *0.06*0.06*4, 0.5, 0.06*2, 0.002*2)
43 | self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
44 |
45 | ##################################################
46 | # Connections
47 | ##################################################
48 | self.connect((self.gr_quadrature_demod_cf_0, 0), (self.gr_single_pole_iir_filter_xx_0, 0))
49 | self.connect((self.gr_single_pole_iir_filter_xx_0, 0), (self.gr_sub_xx_0, 1))
50 | self.connect((self.gr_quadrature_demod_cf_0, 0), (self.gr_sub_xx_0, 0))
51 | self.connect((self.gr_sub_xx_0, 0), (self.digital_clock_recovery_mm_xx_0, 0))
52 | self.connect((self.digital_clock_recovery_mm_xx_0, 0), (self.digital_binary_slicer_fb_0, 0))
53 | self.connect((self.low_pass_filter_0, 0), (self.gr_quadrature_demod_cf_0, 0))
54 | self.connect((self.digital_binary_slicer_fb_0, 0), (self, 0))
55 | self.connect((self, 0), (self.low_pass_filter_0, 0))
56 |
57 | def get_samp_rate(self):
58 | return self.samp_rate
59 |
60 | def set_samp_rate(self, samp_rate):
61 | self.samp_rate = samp_rate
62 | self.set_chip_rate(self.samp_rate/self.samp_per_sym)
63 | self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, self.cutoff, self.cutoff/2, firdes.WIN_HAMMING, 6.76))
64 |
65 | def get_samp_per_sym(self):
66 | return self.samp_per_sym
67 |
68 | def set_samp_per_sym(self, samp_per_sym):
69 | self.samp_per_sym = samp_per_sym
70 | self.set_chip_rate(self.samp_rate/self.samp_per_sym)
71 | self.gr_single_pole_iir_filter_xx_0.set_taps(0.0512/self.samp_per_sym)
72 | self.digital_clock_recovery_mm_xx_0.set_omega(self.samp_per_sym*(1+self.freq_error))
73 |
74 | def get_freq_error(self):
75 | return self.freq_error
76 |
77 | def set_freq_error(self, freq_error):
78 | self.freq_error = freq_error
79 | self.digital_clock_recovery_mm_xx_0.set_omega(self.samp_per_sym*(1+self.freq_error))
80 |
81 | def get_cutoff(self):
82 | return self.cutoff
83 |
84 | def set_cutoff(self, cutoff):
85 | self.cutoff = cutoff
86 | self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.samp_rate, self.cutoff, self.cutoff/2, firdes.WIN_HAMMING, 6.76))
87 |
88 | def get_chip_rate(self):
89 | return self.chip_rate
90 |
91 | def set_chip_rate(self, chip_rate):
92 | self.chip_rate = chip_rate
93 |
94 |
95 |
--------------------------------------------------------------------------------
/gr-wmbus/python/wmbus_phy1.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | ##################################################
3 | # Gnuradio Python Flow Graph
4 | # Title: Wmbus Phy1
5 | # Generated: Sat Oct 13 16:01:50 2012
6 | ##################################################
7 |
8 | from gnuradio import filter
9 | from gnuradio import gr
10 | from gnuradio.filter import firdes
11 | from gnuradio.gr import firdes
12 | import wmbus_blocks as mbus
13 | from wmbus.wmbus_demod import *
14 |
15 | class wmbus_phy1(gr.hier_block2):
16 |
17 | def __init__(self, samp_rate=1600000, samp_per_sym=16, verbose=0, msgq=0, freq_error=-0.0025000):
18 | gr.hier_block2.__init__(
19 | self, "Wmbus Phy1",
20 | gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
21 | gr.io_signature(0, 0, 0),
22 | )
23 |
24 | ##################################################
25 | # Parameters
26 | ##################################################
27 | self.samp_rate = samp_rate
28 | self.samp_per_sym = samp_per_sym
29 | self.verbose = verbose
30 | self.msgq = msgq
31 | self.freq_error = freq_error
32 |
33 | ##################################################
34 | # Blocks
35 | ##################################################
36 | self.wmbus_demod_0 = wmbus_demod(
37 | samp_rate=1600000,
38 | samp_per_sym=16,
39 | freq_error=-0.0025000,
40 | )
41 | self.gr_nlog10_ff_0 = gr.nlog10_ff(10, 1, 0)
42 | self.gr_complex_to_mag_squared_0 = gr.complex_to_mag_squared(1)
43 | self.fir_filter_xxx_0 = filter.fir_filter_fff(samp_per_sym, (16*[1./16]))
44 | self.any_sink_0_1 = mbus.framer(msgq, verbose)
45 | self.any_0 = mbus.correlate_preamble()
46 |
47 | ##################################################
48 | # Connections
49 | ##################################################
50 | self.connect((self.any_0, 0), (self.any_sink_0_1, 0))
51 | self.connect((self.gr_complex_to_mag_squared_0, 0), (self.gr_nlog10_ff_0, 0))
52 | self.connect((self.gr_nlog10_ff_0, 0), (self.fir_filter_xxx_0, 0))
53 | self.connect((self.fir_filter_xxx_0, 0), (self.any_sink_0_1, 1))
54 | self.connect((self, 0), (self.gr_complex_to_mag_squared_0, 0))
55 | self.connect((self, 0), (self.wmbus_demod_0, 0))
56 | self.connect((self.wmbus_demod_0, 0), (self.any_0, 0))
57 |
58 | def get_samp_rate(self):
59 | return self.samp_rate
60 |
61 | def set_samp_rate(self, samp_rate):
62 | self.samp_rate = samp_rate
63 |
64 | def get_samp_per_sym(self):
65 | return self.samp_per_sym
66 |
67 | def set_samp_per_sym(self, samp_per_sym):
68 | self.samp_per_sym = samp_per_sym
69 |
70 | def get_verbose(self):
71 | return self.verbose
72 |
73 | def set_verbose(self, verbose):
74 | self.verbose = verbose
75 |
76 | def get_msgq(self):
77 | return self.msgq
78 |
79 | def set_msgq(self, msgq):
80 | self.msgq = msgq
81 |
82 | def get_freq_error(self):
83 | return self.freq_error
84 |
85 | def set_freq_error(self, freq_error):
86 | self.freq_error = freq_error
87 |
88 |
89 |
--------------------------------------------------------------------------------
/gr-wmbus/python/wmbus_phy2.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | ##################################################
3 | # Gnuradio Python Flow Graph
4 | # Title: Wmbus Phy2
5 | # Generated: Sat Oct 13 16:36:00 2012
6 | ##################################################
7 |
8 | from gnuradio import digital
9 | from gnuradio import eng_notation
10 | from gnuradio import gr
11 | from gnuradio.eng_option import eng_option
12 | from gnuradio.gr import firdes
13 | from optparse import OptionParser
14 |
15 | class wmbus_phy2(gr.top_block):
16 |
17 | def __init__(self):
18 | gr.top_block.__init__(self, "Wmbus Phy2")
19 |
20 | ##################################################
21 | # Variables
22 | ##################################################
23 | self.frame = frame = [1,1]
24 |
25 | ##################################################
26 | # Blocks
27 | ##################################################
28 | self.gr_vector_source_x_0 = gr.vector_source_b((frame), False, 1)
29 | self.gr_vector_sink_x_1 = gr.vector_sink_b(1)
30 | self.gr_vector_sink_x_0 = gr.vector_sink_b(1)
31 | self.gr_unpacked_to_packed_xx_0 = gr.unpacked_to_packed_bb(4, gr.GR_MSB_FIRST)
32 | self.gr_pack_k_bits_bb_0 = gr.pack_k_bits_bb(6)
33 | self.digital_map_bb_1 = digital.map_bb(([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]))
34 | self.digital_map_bb_0 = digital.map_bb(([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 3, 16, 1, 2, 16, 16, 16, 16, 7, 16, 16, 0, 16, 16, 5, 6, 16, 4, 16, 16, 16, 16, 16, 16, 11, 16, 9, 10, 16, 16, 15, 16, 16, 8, 16, 16, 16, 16, 13, 14, 16, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]))
35 |
36 | ##################################################
37 | # Connections
38 | ##################################################
39 | self.connect((self.gr_vector_source_x_0, 0), (self.gr_pack_k_bits_bb_0, 0))
40 | self.connect((self.gr_pack_k_bits_bb_0, 0), (self.digital_map_bb_0, 0))
41 | self.connect((self.digital_map_bb_0, 0), (self.gr_unpacked_to_packed_xx_0, 0))
42 | self.connect((self.gr_unpacked_to_packed_xx_0, 0), (self.gr_vector_sink_x_0, 0))
43 | self.connect((self.digital_map_bb_0, 0), (self.digital_map_bb_1, 0))
44 | self.connect((self.digital_map_bb_1, 0), (self.gr_vector_sink_x_1, 0))
45 |
46 | def get_frame(self):
47 | return self.frame
48 |
49 | def set_frame(self, frame):
50 | self.frame = frame
51 |
52 | if __name__ == '__main__':
53 | parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
54 | (options, args) = parser.parse_args()
55 | tb = wmbus_phy2()
56 | tb.run()
57 |
58 |
--------------------------------------------------------------------------------
/gr-wmbus/swig/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # Copyright 2011 Free Software Foundation, Inc.
2 | #
3 | # This file is part of GNU Radio
4 | #
5 | # GNU Radio is free software; you can redistribute it and/or modify
6 | # it under the terms of the GNU General Public License as published by
7 | # the Free Software Foundation; either version 3, or (at your option)
8 | # any later version.
9 | #
10 | # GNU Radio is distributed in the hope that it will be useful,
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | # GNU General Public License for more details.
14 | #
15 | # You should have received a copy of the GNU General Public License
16 | # along with GNU Radio; see the file COPYING. If not, write to
17 | # the Free Software Foundation, Inc., 51 Franklin Street,
18 | # Boston, MA 02110-1301, USA.
19 |
20 | ########################################################################
21 | # Include swig generation macros
22 | ########################################################################
23 | find_package(SWIG)
24 | find_package(PythonLibs)
25 | if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
26 | return()
27 | endif()
28 | include(GrSwig)
29 | include(GrPython)
30 |
31 | ########################################################################
32 | # Setup swig generation
33 | ########################################################################
34 | foreach(incdir ${GNURADIO_CORE_INCLUDE_DIRS})
35 | list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/swig)
36 | endforeach(incdir)
37 |
38 | foreach(incdir ${GRUEL_INCLUDE_DIRS})
39 | list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/gruel/swig)
40 | endforeach(incdir)
41 |
42 | set(GR_SWIG_LIBRARIES gnuradio-wmbus)
43 | set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/wmbus_swig_doc.i)
44 | set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
45 |
46 | GR_SWIG_MAKE(wmbus_swig wmbus_swig.i)
47 |
48 | ########################################################################
49 | # Install the build swig module
50 | ########################################################################
51 | GR_SWIG_INSTALL(TARGETS wmbus_swig DESTINATION ${GR_PYTHON_DIR}/wmbus)
52 |
53 | ########################################################################
54 | # Install swig .i files for development
55 | ########################################################################
56 | install(
57 | FILES
58 | wmbus_swig.i
59 | ${CMAKE_CURRENT_BINARY_DIR}/wmbus_swig_doc.i
60 | DESTINATION ${GR_INCLUDE_DIR}/wmbus/swig
61 | )
62 |
--------------------------------------------------------------------------------
/gr-wmbus/swig/wmbus_swig.i:
--------------------------------------------------------------------------------
1 | /* -*- c++ -*- */
2 |
3 | #define WMBUS_API
4 |
5 | %include "gnuradio.i" // the common stuff
6 |
7 | //load generated python docstrings
8 | %include "wmbus_swig_doc.i"
9 |
10 |
11 | %{
12 | %}
13 |
14 |
--------------------------------------------------------------------------------