├── .gitignore
├── LICENSE
├── README.md
├── flowgraphs
├── fmRX.grc
├── fmTX.grc
├── hackSiren.grc
└── hackWav.grc
├── hrt.py
├── intro.mp4
└── lib
├── control.py
├── fmRX.py
└── fmTX.py
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 |
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 2, June 1991
3 |
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6 | Everyone is permitted to copy and distribute verbatim copies
7 | of this license document, but changing it is not allowed.
8 |
9 | Preamble
10 |
11 | The licenses for most software are designed to take away your
12 | freedom to share and change it. By contrast, the GNU General Public
13 | License is intended to guarantee your freedom to share and change free
14 | software--to make sure the software is free for all its users. This
15 | General Public License applies to most of the Free Software
16 | Foundation's software and to any other program whose authors commit to
17 | using it. (Some other Free Software Foundation software is covered by
18 | the GNU Lesser General Public License instead.) You can apply it to
19 | your programs, too.
20 |
21 | When we speak of free software, we are referring to freedom, not
22 | price. Our General Public Licenses are designed to make sure that you
23 | have the freedom to distribute copies of free software (and charge for
24 | this service if you wish), that you receive source code or can get it
25 | if you want it, that you can change the software or use pieces of it
26 | in new free programs; and that you know you can do these things.
27 |
28 | To protect your rights, we need to make restrictions that forbid
29 | anyone to deny you these rights or to ask you to surrender the rights.
30 | These restrictions translate to certain responsibilities for you if you
31 | distribute copies of the software, or if you modify it.
32 |
33 | For example, if you distribute copies of such a program, whether
34 | gratis or for a fee, you must give the recipients all the rights that
35 | you have. You must make sure that they, too, receive or can get the
36 | source code. And you must show them these terms so they know their
37 | rights.
38 |
39 | We protect your rights with two steps: (1) copyright the software, and
40 | (2) offer you this license which gives you legal permission to copy,
41 | distribute and/or modify the software.
42 |
43 | Also, for each author's protection and ours, we want to make certain
44 | that everyone understands that there is no warranty for this free
45 | software. If the software is modified by someone else and passed on, we
46 | want its recipients to know that what they have is not the original, so
47 | that any problems introduced by others will not reflect on the original
48 | authors' reputations.
49 |
50 | Finally, any free program is threatened constantly by software
51 | patents. We wish to avoid the danger that redistributors of a free
52 | program will individually obtain patent licenses, in effect making the
53 | program proprietary. To prevent this, we have made it clear that any
54 | patent must be licensed for everyone's free use or not licensed at all.
55 |
56 | The precise terms and conditions for copying, distribution and
57 | modification follow.
58 |
59 | GNU GENERAL PUBLIC LICENSE
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61 |
62 | 0. This License applies to any program or other work which contains
63 | a notice placed by the copyright holder saying it may be distributed
64 | under the terms of this General Public License. The "Program", below,
65 | refers to any such program or work, and a "work based on the Program"
66 | means either the Program or any derivative work under copyright law:
67 | that is to say, a work containing the Program or a portion of it,
68 | either verbatim or with modifications and/or translated into another
69 | language. (Hereinafter, translation is included without limitation in
70 | the term "modification".) Each licensee is addressed as "you".
71 |
72 | Activities other than copying, distribution and modification are not
73 | covered by this License; they are outside its scope. The act of
74 | running the Program is not restricted, and the output from the Program
75 | is covered only if its contents constitute a work based on the
76 | Program (independent of having been made by running the Program).
77 | Whether that is true depends on what the Program does.
78 |
79 | 1. You may copy and distribute verbatim copies of the Program's
80 | source code as you receive it, in any medium, provided that you
81 | conspicuously and appropriately publish on each copy an appropriate
82 | copyright notice and disclaimer of warranty; keep intact all the
83 | notices that refer to this License and to the absence of any warranty;
84 | and give any other recipients of the Program a copy of this License
85 | along with the Program.
86 |
87 | You may charge a fee for the physical act of transferring a copy, and
88 | you may at your option offer warranty protection in exchange for a fee.
89 |
90 | 2. You may modify your copy or copies of the Program or any portion
91 | of it, thus forming a work based on the Program, and copy and
92 | distribute such modifications or work under the terms of Section 1
93 | above, provided that you also meet all of these conditions:
94 |
95 | a) You must cause the modified files to carry prominent notices
96 | stating that you changed the files and the date of any change.
97 |
98 | b) You must cause any work that you distribute or publish, that in
99 | whole or in part contains or is derived from the Program or any
100 | part thereof, to be licensed as a whole at no charge to all third
101 | parties under the terms of this License.
102 |
103 | c) If the modified program normally reads commands interactively
104 | when run, you must cause it, when started running for such
105 | interactive use in the most ordinary way, to print or display an
106 | announcement including an appropriate copyright notice and a
107 | notice that there is no warranty (or else, saying that you provide
108 | a warranty) and that users may redistribute the program under
109 | these conditions, and telling the user how to view a copy of this
110 | License. (Exception: if the Program itself is interactive but
111 | does not normally print such an announcement, your work based on
112 | the Program is not required to print an announcement.)
113 |
114 | These requirements apply to the modified work as a whole. If
115 | identifiable sections of that work are not derived from the Program,
116 | and can be reasonably considered independent and separate works in
117 | themselves, then this License, and its terms, do not apply to those
118 | sections when you distribute them as separate works. But when you
119 | distribute the same sections as part of a whole which is a work based
120 | on the Program, the distribution of the whole must be on the terms of
121 | this License, whose permissions for other licensees extend to the
122 | entire whole, and thus to each and every part regardless of who wrote it.
123 |
124 | Thus, it is not the intent of this section to claim rights or contest
125 | your rights to work written entirely by you; rather, the intent is to
126 | exercise the right to control the distribution of derivative or
127 | collective works based on the Program.
128 |
129 | In addition, mere aggregation of another work not based on the Program
130 | with the Program (or with a work based on the Program) on a volume of
131 | a storage or distribution medium does not bring the other work under
132 | the scope of this License.
133 |
134 | 3. You may copy and distribute the Program (or a work based on it,
135 | under Section 2) in object code or executable form under the terms of
136 | Sections 1 and 2 above provided that you also do one of the following:
137 |
138 | a) Accompany it with the complete corresponding machine-readable
139 | source code, which must be distributed under the terms of Sections
140 | 1 and 2 above on a medium customarily used for software interchange; or,
141 |
142 | b) Accompany it with a written offer, valid for at least three
143 | years, to give any third party, for a charge no more than your
144 | cost of physically performing source distribution, a complete
145 | machine-readable copy of the corresponding source code, to be
146 | distributed under the terms of Sections 1 and 2 above on a medium
147 | customarily used for software interchange; or,
148 |
149 | c) Accompany it with the information you received as to the offer
150 | to distribute corresponding source code. (This alternative is
151 | allowed only for noncommercial distribution and only if you
152 | received the program in object code or executable form with such
153 | an offer, in accord with Subsection b above.)
154 |
155 | The source code for a work means the preferred form of the work for
156 | making modifications to it. For an executable work, complete source
157 | code means all the source code for all modules it contains, plus any
158 | associated interface definition files, plus the scripts used to
159 | control compilation and installation of the executable. However, as a
160 | special exception, the source code distributed need not include
161 | anything that is normally distributed (in either source or binary
162 | form) with the major components (compiler, kernel, and so on) of the
163 | operating system on which the executable runs, unless that component
164 | itself accompanies the executable.
165 |
166 | If distribution of executable or object code is made by offering
167 | access to copy from a designated place, then offering equivalent
168 | access to copy the source code from the same place counts as
169 | distribution of the source code, even though third parties are not
170 | compelled to copy the source along with the object code.
171 |
172 | 4. You may not copy, modify, sublicense, or distribute the Program
173 | except as expressly provided under this License. Any attempt
174 | otherwise to copy, modify, sublicense or distribute the Program is
175 | void, and will automatically terminate your rights under this License.
176 | However, parties who have received copies, or rights, from you under
177 | this License will not have their licenses terminated so long as such
178 | parties remain in full compliance.
179 |
180 | 5. You are not required to accept this License, since you have not
181 | signed it. However, nothing else grants you permission to modify or
182 | distribute the Program or its derivative works. These actions are
183 | prohibited by law if you do not accept this License. Therefore, by
184 | modifying or distributing the Program (or any work based on the
185 | Program), you indicate your acceptance of this License to do so, and
186 | all its terms and conditions for copying, distributing or modifying
187 | the Program or works based on it.
188 |
189 | 6. Each time you redistribute the Program (or any work based on the
190 | Program), the recipient automatically receives a license from the
191 | original licensor to copy, distribute or modify the Program subject to
192 | these terms and conditions. You may not impose any further
193 | restrictions on the recipients' exercise of the rights granted herein.
194 | You are not responsible for enforcing compliance by third parties to
195 | this License.
196 |
197 | 7. If, as a consequence of a court judgment or allegation of patent
198 | infringement or for any other reason (not limited to patent issues),
199 | conditions are imposed on you (whether by court order, agreement or
200 | otherwise) that contradict the conditions of this License, they do not
201 | excuse you from the conditions of this License. If you cannot
202 | distribute so as to satisfy simultaneously your obligations under this
203 | License and any other pertinent obligations, then as a consequence you
204 | may not distribute the Program at all. For example, if a patent
205 | license would not permit royalty-free redistribution of the Program by
206 | all those who receive copies directly or indirectly through you, then
207 | the only way you could satisfy both it and this License would be to
208 | refrain entirely from distribution of the Program.
209 |
210 | If any portion of this section is held invalid or unenforceable under
211 | any particular circumstance, the balance of the section is intended to
212 | apply and the section as a whole is intended to apply in other
213 | circumstances.
214 |
215 | It is not the purpose of this section to induce you to infringe any
216 | patents or other property right claims or to contest validity of any
217 | such claims; this section has the sole purpose of protecting the
218 | integrity of the free software distribution system, which is
219 | implemented by public license practices. Many people have made
220 | generous contributions to the wide range of software distributed
221 | through that system in reliance on consistent application of that
222 | system; it is up to the author/donor to decide if he or she is willing
223 | to distribute software through any other system and a licensee cannot
224 | impose that choice.
225 |
226 | This section is intended to make thoroughly clear what is believed to
227 | be a consequence of the rest of this License.
228 |
229 | 8. If the distribution and/or use of the Program is restricted in
230 | certain countries either by patents or by copyrighted interfaces, the
231 | original copyright holder who places the Program under this License
232 | may add an explicit geographical distribution limitation excluding
233 | those countries, so that distribution is permitted only in or among
234 | countries not thus excluded. In such case, this License incorporates
235 | the limitation as if written in the body of this License.
236 |
237 | 9. The Free Software Foundation may publish revised and/or new versions
238 | of the General Public License from time to time. Such new versions will
239 | be similar in spirit to the present version, but may differ in detail to
240 | address new problems or concerns.
241 |
242 | Each version is given a distinguishing version number. If the Program
243 | specifies a version number of this License which applies to it and "any
244 | later version", you have the option of following the terms and conditions
245 | either of that version or of any later version published by the Free
246 | Software Foundation. If the Program does not specify a version number of
247 | this License, you may choose any version ever published by the Free Software
248 | Foundation.
249 |
250 | 10. If you wish to incorporate parts of the Program into other free
251 | programs whose distribution conditions are different, write to the author
252 | to ask for permission. For software which is copyrighted by the Free
253 | Software Foundation, write to the Free Software Foundation; we sometimes
254 | make exceptions for this. Our decision will be guided by the two goals
255 | of preserving the free status of all derivatives of our free software and
256 | of promoting the sharing and reuse of software generally.
257 |
258 | NO WARRANTY
259 |
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268 | REPAIR OR CORRECTION.
269 |
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278 | POSSIBILITY OF SUCH DAMAGES.
279 |
280 | END OF TERMS AND CONDITIONS
281 |
282 | How to Apply These Terms to Your New Programs
283 |
284 | If you develop a new program, and you want it to be of the greatest
285 | possible use to the public, the best way to achieve this is to make it
286 | free software which everyone can redistribute and change under these terms.
287 |
288 | To do so, attach the following notices to the program. It is safest
289 | to attach them to the start of each source file to most effectively
290 | convey the exclusion of warranty; and each file should have at least
291 | the "copyright" line and a pointer to where the full notice is found.
292 |
293 | {description}
294 | Copyright (C) {year} {fullname}
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | {signature of Ty Coon}, 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | HackRF Toolkit
2 | ==============================================================
3 |
4 |
5 | Overview:
6 | ---
7 |
8 | * An attempt to modularize some of the features from GNU-Radio Companion for the HackRF
9 |
10 | Goals:
11 | ---
12 | * Give the user an easy way to switch between receiving and transmission without closing out the session
13 | * Make the HackRF a life-saving 2-way communications tool in the event of disaster
14 |
15 | To Do List:
16 | ---
17 |
18 | * Add software amplification boost options for tx/rx modes
19 | * Add the WAV and Siren flows to hrt
20 | * Allow the user to change pitch and tone for the Siren flow
21 | * Design a low-cost easy-to-build amplifier solution to increase the reception and transmission range
22 | * Design a low-cost easy-to-build antenna solution for usage with different frequencies
23 |
24 | How to use:
25 | ---
26 | * git clone https://github.com/stryngs/hrt.git && cd hrt && python ./hrt
27 | * Yes, that simple!
28 | * The menu is fairly self-explanatory
29 |
--------------------------------------------------------------------------------
/flowgraphs/fmRX.grc:
--------------------------------------------------------------------------------
1 | options:
2 | parameters:
3 | author: ''
4 | catch_exceptions: 'True'
5 | category: Custom
6 | cmake_opt: ''
7 | comment: ''
8 | copyright: ''
9 | description: ''
10 | gen_cmake: 'On'
11 | gen_linking: dynamic
12 | generate_options: qt_gui
13 | hier_block_src_path: '.:'
14 | id: fmRX
15 | max_nouts: '0'
16 | output_language: python
17 | placement: (0,0)
18 | qt_qss_theme: ''
19 | realtime_scheduling: ''
20 | run: 'True'
21 | run_command: '{python} -u {filename}'
22 | run_options: prompt
23 | sizing_mode: fixed
24 | thread_safe_setters: ''
25 | title: ''
26 | window_size: 1280, 1024
27 | states:
28 | bus_sink: false
29 | bus_source: false
30 | bus_structure: null
31 | coordinate: [0, 0]
32 | rotation: 0
33 | state: enabled
34 |
35 | blocks:
36 | - name: chan_width
37 | id: variable
38 | parameters:
39 | comment: ''
40 | value: 200e3
41 | states:
42 | bus_sink: false
43 | bus_source: false
44 | bus_structure: null
45 | coordinate: [765, 3]
46 | rotation: 0
47 | state: enabled
48 | - name: die__
49 | id: variable_qtgui_push_button
50 | parameters:
51 | comment: ''
52 | gui_hint: ''
53 | label: GUI Kill
54 | pressed: '1'
55 | released: '0'
56 | type: int
57 | value: '0'
58 | states:
59 | bus_sink: false
60 | bus_source: false
61 | bus_structure: null
62 | coordinate: [277, 471]
63 | rotation: 0
64 | state: enabled
65 | - name: freq
66 | id: variable_qtgui_range
67 | parameters:
68 | comment: ''
69 | gui_hint: ''
70 | label: Frequency Slider
71 | min_len: '200'
72 | orient: QtCore.Qt.Horizontal
73 | rangeType: float
74 | start: 88e6
75 | step: 100e3
76 | stop: 108e6
77 | value: 103.7e6
78 | widget: counter_slider
79 | states:
80 | bus_sink: false
81 | bus_source: false
82 | bus_structure: null
83 | coordinate: [364, 0]
84 | rotation: 0
85 | state: enabled
86 | - name: ptl
87 | id: variable_qtgui_check_box
88 | parameters:
89 | comment: ''
90 | 'false': '1'
91 | gui_hint: ''
92 | label: Mute
93 | 'true': '0'
94 | type: real
95 | value: '1'
96 | states:
97 | bus_sink: false
98 | bus_source: false
99 | bus_structure: null
100 | coordinate: [893, 36]
101 | rotation: 0
102 | state: enabled
103 | - name: samp_in
104 | id: variable
105 | parameters:
106 | comment: ''
107 | value: 10e6
108 | states:
109 | bus_sink: false
110 | bus_source: false
111 | bus_structure: null
112 | coordinate: [202, 2]
113 | rotation: 0
114 | state: enabled
115 | - name: swap__
116 | id: variable_qtgui_push_button
117 | parameters:
118 | comment: ''
119 | gui_hint: ''
120 | label: Switch to TX
121 | pressed: '1'
122 | released: '0'
123 | type: int
124 | value: '0'
125 | states:
126 | bus_sink: false
127 | bus_source: false
128 | bus_structure: null
129 | coordinate: [562, 475]
130 | rotation: 0
131 | state: enabled
132 | - name: volume
133 | id: variable_qtgui_range
134 | parameters:
135 | comment: ''
136 | gui_hint: ''
137 | label: volume
138 | min_len: '200'
139 | orient: QtCore.Qt.Horizontal
140 | rangeType: float
141 | start: '0'
142 | step: '1'
143 | stop: '100'
144 | value: '1'
145 | widget: counter_slider
146 | states:
147 | bus_sink: false
148 | bus_source: false
149 | bus_structure: null
150 | coordinate: [644, 0]
151 | rotation: 0
152 | state: enabled
153 | - name: analog_sig_source_x_0
154 | id: analog_sig_source_x
155 | parameters:
156 | affinity: ''
157 | alias: ''
158 | amp: '1'
159 | comment: ''
160 | freq: '1000'
161 | maxoutbuf: '0'
162 | minoutbuf: '0'
163 | offset: '0'
164 | phase: '0'
165 | samp_rate: samp_in
166 | type: complex
167 | waveform: analog.GR_COS_WAVE
168 | states:
169 | bus_sink: false
170 | bus_source: false
171 | bus_structure: null
172 | coordinate: [0, 308]
173 | rotation: 0
174 | state: enabled
175 | - name: analog_wfm_rcv_0
176 | id: analog_wfm_rcv
177 | parameters:
178 | affinity: ''
179 | alias: ''
180 | audio_decimation: '10'
181 | comment: ''
182 | maxoutbuf: '0'
183 | minoutbuf: '0'
184 | quad_rate: 480e3
185 | states:
186 | bus_sink: false
187 | bus_source: false
188 | bus_structure: null
189 | coordinate: [707, 152]
190 | rotation: 0
191 | state: enabled
192 | - name: audio_sink_0
193 | id: audio_sink
194 | parameters:
195 | affinity: ''
196 | alias: ''
197 | comment: ''
198 | device_name: ''
199 | num_inputs: '1'
200 | ok_to_block: 'True'
201 | samp_rate: '48000'
202 | states:
203 | bus_sink: false
204 | bus_source: false
205 | bus_structure: null
206 | coordinate: [896, 259]
207 | rotation: 0
208 | state: enabled
209 | - name: audio_stop
210 | id: blocks_multiply_const_vxx
211 | parameters:
212 | affinity: ''
213 | alias: ''
214 | comment: ''
215 | const: ptl
216 | maxoutbuf: '0'
217 | minoutbuf: '0'
218 | type: float
219 | vlen: '1'
220 | states:
221 | bus_sink: false
222 | bus_source: false
223 | bus_structure: null
224 | coordinate: [914, 159]
225 | rotation: 0
226 | state: enabled
227 | - name: blocks_multiply_const_vxx_0
228 | id: blocks_multiply_const_vxx
229 | parameters:
230 | affinity: ''
231 | alias: ''
232 | comment: ''
233 | const: volume
234 | maxoutbuf: '0'
235 | minoutbuf: '0'
236 | type: float
237 | vlen: '1'
238 | states:
239 | bus_sink: false
240 | bus_source: false
241 | bus_structure: null
242 | coordinate: [908, 209]
243 | rotation: 0
244 | state: enabled
245 | - name: blocks_multiply_xx_0
246 | id: blocks_multiply_xx
247 | parameters:
248 | affinity: ''
249 | alias: ''
250 | comment: ''
251 | maxoutbuf: '0'
252 | minoutbuf: '0'
253 | num_inputs: '2'
254 | type: complex
255 | vlen: '1'
256 | states:
257 | bus_sink: false
258 | bus_source: false
259 | bus_structure: null
260 | coordinate: [257, 244]
261 | rotation: 0
262 | state: enabled
263 | - name: low_pass_filter_0
264 | id: low_pass_filter
265 | parameters:
266 | affinity: ''
267 | alias: ''
268 | beta: '6.76'
269 | comment: ''
270 | cutoff_freq: 75e3
271 | decim: int(10e6/chan_width)
272 | gain: '1'
273 | interp: '1'
274 | maxoutbuf: '0'
275 | minoutbuf: '0'
276 | samp_rate: 10e6
277 | type: fir_filter_ccf
278 | width: 25e3
279 | win: window.WIN_HAMMING
280 | states:
281 | bus_sink: false
282 | bus_source: false
283 | bus_structure: null
284 | coordinate: [464, 292.0]
285 | rotation: 0
286 | state: enabled
287 | - name: osmosdr_source_0
288 | id: osmosdr_source
289 | parameters:
290 | affinity: ''
291 | alias: ''
292 | ant0: ''
293 | ant1: ''
294 | ant10: ''
295 | ant11: ''
296 | ant12: ''
297 | ant13: ''
298 | ant14: ''
299 | ant15: ''
300 | ant16: ''
301 | ant17: ''
302 | ant18: ''
303 | ant19: ''
304 | ant2: ''
305 | ant20: ''
306 | ant21: ''
307 | ant22: ''
308 | ant23: ''
309 | ant24: ''
310 | ant25: ''
311 | ant26: ''
312 | ant27: ''
313 | ant28: ''
314 | ant29: ''
315 | ant3: ''
316 | ant30: ''
317 | ant31: ''
318 | ant4: ''
319 | ant5: ''
320 | ant6: ''
321 | ant7: ''
322 | ant8: ''
323 | ant9: ''
324 | args: ''
325 | bb_gain0: '20'
326 | bb_gain1: '20'
327 | bb_gain10: '20'
328 | bb_gain11: '20'
329 | bb_gain12: '20'
330 | bb_gain13: '20'
331 | bb_gain14: '20'
332 | bb_gain15: '20'
333 | bb_gain16: '20'
334 | bb_gain17: '20'
335 | bb_gain18: '20'
336 | bb_gain19: '20'
337 | bb_gain2: '20'
338 | bb_gain20: '20'
339 | bb_gain21: '20'
340 | bb_gain22: '20'
341 | bb_gain23: '20'
342 | bb_gain24: '20'
343 | bb_gain25: '20'
344 | bb_gain26: '20'
345 | bb_gain27: '20'
346 | bb_gain28: '20'
347 | bb_gain29: '20'
348 | bb_gain3: '20'
349 | bb_gain30: '20'
350 | bb_gain31: '20'
351 | bb_gain4: '20'
352 | bb_gain5: '20'
353 | bb_gain6: '20'
354 | bb_gain7: '20'
355 | bb_gain8: '20'
356 | bb_gain9: '20'
357 | bw0: '0'
358 | bw1: '0'
359 | bw10: '0'
360 | bw11: '0'
361 | bw12: '0'
362 | bw13: '0'
363 | bw14: '0'
364 | bw15: '0'
365 | bw16: '0'
366 | bw17: '0'
367 | bw18: '0'
368 | bw19: '0'
369 | bw2: '0'
370 | bw20: '0'
371 | bw21: '0'
372 | bw22: '0'
373 | bw23: '0'
374 | bw24: '0'
375 | bw25: '0'
376 | bw26: '0'
377 | bw27: '0'
378 | bw28: '0'
379 | bw29: '0'
380 | bw3: '0'
381 | bw30: '0'
382 | bw31: '0'
383 | bw4: '0'
384 | bw5: '0'
385 | bw6: '0'
386 | bw7: '0'
387 | bw8: '0'
388 | bw9: '0'
389 | clock_source0: ''
390 | clock_source1: ''
391 | clock_source2: ''
392 | clock_source3: ''
393 | clock_source4: ''
394 | clock_source5: ''
395 | clock_source6: ''
396 | clock_source7: ''
397 | comment: ''
398 | corr0: '0'
399 | corr1: '0'
400 | corr10: '0'
401 | corr11: '0'
402 | corr12: '0'
403 | corr13: '0'
404 | corr14: '0'
405 | corr15: '0'
406 | corr16: '0'
407 | corr17: '0'
408 | corr18: '0'
409 | corr19: '0'
410 | corr2: '0'
411 | corr20: '0'
412 | corr21: '0'
413 | corr22: '0'
414 | corr23: '0'
415 | corr24: '0'
416 | corr25: '0'
417 | corr26: '0'
418 | corr27: '0'
419 | corr28: '0'
420 | corr29: '0'
421 | corr3: '0'
422 | corr30: '0'
423 | corr31: '0'
424 | corr4: '0'
425 | corr5: '0'
426 | corr6: '0'
427 | corr7: '0'
428 | corr8: '0'
429 | corr9: '0'
430 | dc_offset_mode0: '0'
431 | dc_offset_mode1: '0'
432 | dc_offset_mode10: '0'
433 | dc_offset_mode11: '0'
434 | dc_offset_mode12: '0'
435 | dc_offset_mode13: '0'
436 | dc_offset_mode14: '0'
437 | dc_offset_mode15: '0'
438 | dc_offset_mode16: '0'
439 | dc_offset_mode17: '0'
440 | dc_offset_mode18: '0'
441 | dc_offset_mode19: '0'
442 | dc_offset_mode2: '0'
443 | dc_offset_mode20: '0'
444 | dc_offset_mode21: '0'
445 | dc_offset_mode22: '0'
446 | dc_offset_mode23: '0'
447 | dc_offset_mode24: '0'
448 | dc_offset_mode25: '0'
449 | dc_offset_mode26: '0'
450 | dc_offset_mode27: '0'
451 | dc_offset_mode28: '0'
452 | dc_offset_mode29: '0'
453 | dc_offset_mode3: '0'
454 | dc_offset_mode30: '0'
455 | dc_offset_mode31: '0'
456 | dc_offset_mode4: '0'
457 | dc_offset_mode5: '0'
458 | dc_offset_mode6: '0'
459 | dc_offset_mode7: '0'
460 | dc_offset_mode8: '0'
461 | dc_offset_mode9: '0'
462 | freq0: freq
463 | freq1: 100e6
464 | freq10: 100e6
465 | freq11: 100e6
466 | freq12: 100e6
467 | freq13: 100e6
468 | freq14: 100e6
469 | freq15: 100e6
470 | freq16: 100e6
471 | freq17: 100e6
472 | freq18: 100e6
473 | freq19: 100e6
474 | freq2: 100e6
475 | freq20: 100e6
476 | freq21: 100e6
477 | freq22: 100e6
478 | freq23: 100e6
479 | freq24: 100e6
480 | freq25: 100e6
481 | freq26: 100e6
482 | freq27: 100e6
483 | freq28: 100e6
484 | freq29: 100e6
485 | freq3: 100e6
486 | freq30: 100e6
487 | freq31: 100e6
488 | freq4: 100e6
489 | freq5: 100e6
490 | freq6: 100e6
491 | freq7: 100e6
492 | freq8: 100e6
493 | freq9: 100e6
494 | gain0: '0'
495 | gain1: '10'
496 | gain10: '10'
497 | gain11: '10'
498 | gain12: '10'
499 | gain13: '10'
500 | gain14: '10'
501 | gain15: '10'
502 | gain16: '10'
503 | gain17: '10'
504 | gain18: '10'
505 | gain19: '10'
506 | gain2: '10'
507 | gain20: '10'
508 | gain21: '10'
509 | gain22: '10'
510 | gain23: '10'
511 | gain24: '10'
512 | gain25: '10'
513 | gain26: '10'
514 | gain27: '10'
515 | gain28: '10'
516 | gain29: '10'
517 | gain3: '10'
518 | gain30: '10'
519 | gain31: '10'
520 | gain4: '10'
521 | gain5: '10'
522 | gain6: '10'
523 | gain7: '10'
524 | gain8: '10'
525 | gain9: '10'
526 | gain_mode0: 'False'
527 | gain_mode1: 'False'
528 | gain_mode10: 'False'
529 | gain_mode11: 'False'
530 | gain_mode12: 'False'
531 | gain_mode13: 'False'
532 | gain_mode14: 'False'
533 | gain_mode15: 'False'
534 | gain_mode16: 'False'
535 | gain_mode17: 'False'
536 | gain_mode18: 'False'
537 | gain_mode19: 'False'
538 | gain_mode2: 'False'
539 | gain_mode20: 'False'
540 | gain_mode21: 'False'
541 | gain_mode22: 'False'
542 | gain_mode23: 'False'
543 | gain_mode24: 'False'
544 | gain_mode25: 'False'
545 | gain_mode26: 'False'
546 | gain_mode27: 'False'
547 | gain_mode28: 'False'
548 | gain_mode29: 'False'
549 | gain_mode3: 'False'
550 | gain_mode30: 'False'
551 | gain_mode31: 'False'
552 | gain_mode4: 'False'
553 | gain_mode5: 'False'
554 | gain_mode6: 'False'
555 | gain_mode7: 'False'
556 | gain_mode8: 'False'
557 | gain_mode9: 'False'
558 | if_gain0: '20'
559 | if_gain1: '20'
560 | if_gain10: '20'
561 | if_gain11: '20'
562 | if_gain12: '20'
563 | if_gain13: '20'
564 | if_gain14: '20'
565 | if_gain15: '20'
566 | if_gain16: '20'
567 | if_gain17: '20'
568 | if_gain18: '20'
569 | if_gain19: '20'
570 | if_gain2: '20'
571 | if_gain20: '20'
572 | if_gain21: '20'
573 | if_gain22: '20'
574 | if_gain23: '20'
575 | if_gain24: '20'
576 | if_gain25: '20'
577 | if_gain26: '20'
578 | if_gain27: '20'
579 | if_gain28: '20'
580 | if_gain29: '20'
581 | if_gain3: '20'
582 | if_gain30: '20'
583 | if_gain31: '20'
584 | if_gain4: '20'
585 | if_gain5: '20'
586 | if_gain6: '20'
587 | if_gain7: '20'
588 | if_gain8: '20'
589 | if_gain9: '20'
590 | iq_balance_mode0: '0'
591 | iq_balance_mode1: '0'
592 | iq_balance_mode10: '0'
593 | iq_balance_mode11: '0'
594 | iq_balance_mode12: '0'
595 | iq_balance_mode13: '0'
596 | iq_balance_mode14: '0'
597 | iq_balance_mode15: '0'
598 | iq_balance_mode16: '0'
599 | iq_balance_mode17: '0'
600 | iq_balance_mode18: '0'
601 | iq_balance_mode19: '0'
602 | iq_balance_mode2: '0'
603 | iq_balance_mode20: '0'
604 | iq_balance_mode21: '0'
605 | iq_balance_mode22: '0'
606 | iq_balance_mode23: '0'
607 | iq_balance_mode24: '0'
608 | iq_balance_mode25: '0'
609 | iq_balance_mode26: '0'
610 | iq_balance_mode27: '0'
611 | iq_balance_mode28: '0'
612 | iq_balance_mode29: '0'
613 | iq_balance_mode3: '0'
614 | iq_balance_mode30: '0'
615 | iq_balance_mode31: '0'
616 | iq_balance_mode4: '0'
617 | iq_balance_mode5: '0'
618 | iq_balance_mode6: '0'
619 | iq_balance_mode7: '0'
620 | iq_balance_mode8: '0'
621 | iq_balance_mode9: '0'
622 | maxoutbuf: '0'
623 | minoutbuf: '0'
624 | nchan: '1'
625 | num_mboards: '1'
626 | sample_rate: samp_in
627 | sync: sync
628 | time_source0: ''
629 | time_source1: ''
630 | time_source2: ''
631 | time_source3: ''
632 | time_source4: ''
633 | time_source5: ''
634 | time_source6: ''
635 | time_source7: ''
636 | type: fc32
637 | states:
638 | bus_sink: false
639 | bus_source: false
640 | bus_structure: null
641 | coordinate: [0, 151]
642 | rotation: 0
643 | state: enabled
644 | - name: qtgui_sink_x_1
645 | id: qtgui_sink_x
646 | parameters:
647 | affinity: ''
648 | alias: ''
649 | bw: samp_in
650 | comment: ''
651 | fc: freq
652 | fftsize: '1024'
653 | gui_hint: ''
654 | maxoutbuf: '0'
655 | minoutbuf: '0'
656 | name: '""'
657 | plotconst: 'True'
658 | plotfreq: 'True'
659 | plottime: 'True'
660 | plotwaterfall: 'True'
661 | rate: '10'
662 | showports: 'True'
663 | showrf: 'True'
664 | type: complex
665 | wintype: window.WIN_BLACKMAN_hARRIS
666 | states:
667 | bus_sink: false
668 | bus_source: false
669 | bus_structure: null
670 | coordinate: [259, 154]
671 | rotation: 0
672 | state: enabled
673 | - name: rational_resampler_xxx_1
674 | id: rational_resampler_xxx
675 | parameters:
676 | affinity: ''
677 | alias: ''
678 | comment: ''
679 | decim: '5'
680 | fbw: '0'
681 | interp: '12'
682 | maxoutbuf: '0'
683 | minoutbuf: '0'
684 | taps: ''
685 | type: ccc
686 | states:
687 | bus_sink: false
688 | bus_source: false
689 | bus_structure: null
690 | coordinate: [494, 136]
691 | rotation: 0
692 | state: enabled
693 |
694 | connections:
695 | - [analog_sig_source_x_0, '0', blocks_multiply_xx_0, '1']
696 | - [analog_wfm_rcv_0, '0', audio_stop, '0']
697 | - [audio_stop, '0', blocks_multiply_const_vxx_0, '0']
698 | - [blocks_multiply_const_vxx_0, '0', audio_sink_0, '0']
699 | - [blocks_multiply_xx_0, '0', low_pass_filter_0, '0']
700 | - [low_pass_filter_0, '0', rational_resampler_xxx_1, '0']
701 | - [osmosdr_source_0, '0', blocks_multiply_xx_0, '0']
702 | - [osmosdr_source_0, '0', qtgui_sink_x_1, '0']
703 | - [rational_resampler_xxx_1, '0', analog_wfm_rcv_0, '0']
704 |
705 | metadata:
706 | file_format: 1
707 |
--------------------------------------------------------------------------------
/flowgraphs/fmTX.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Mon Feb 9 16:34:26 2015
5 |
6 | options
7 |
8 | author
9 |
10 |
11 |
12 | window_size
13 | 1280, 1024
14 |
15 |
16 | category
17 | Custom
18 |
19 |
20 | comment
21 |
22 |
23 |
24 | description
25 |
26 |
27 |
28 | _enabled
29 | True
30 |
31 |
32 | _coordinate
33 | (0, 0)
34 |
35 |
36 | _rotation
37 | 0
38 |
39 |
40 | generate_options
41 | qt_gui
42 |
43 |
44 | hier_block_src_path
45 | .:
46 |
47 |
48 | id
49 | fmTX
50 |
51 |
52 | max_nouts
53 | 0
54 |
55 |
56 | qt_qss_theme
57 |
58 |
59 |
60 | realtime_scheduling
61 |
62 |
63 |
64 | run_command
65 | {python} -u {filename}
66 |
67 |
68 | run_options
69 | prompt
70 |
71 |
72 | run
73 | True
74 |
75 |
76 | thread_safe_setters
77 |
78 |
79 |
80 | title
81 |
82 |
83 |
84 |
85 | variable
86 |
87 | comment
88 |
89 |
90 |
91 | _enabled
92 | True
93 |
94 |
95 | _coordinate
96 | (578, 7)
97 |
98 |
99 | _rotation
100 | 0
101 |
102 |
103 | id
104 | audio_samp_in
105 |
106 |
107 | value
108 | 44100
109 |
110 |
111 |
112 | variable_qtgui_push_button
113 |
114 | comment
115 |
116 |
117 |
118 | value
119 | 0
120 |
121 |
122 | _enabled
123 | True
124 |
125 |
126 | _coordinate
127 | (446, 317)
128 |
129 |
130 | gui_hint
131 |
132 |
133 |
134 | _rotation
135 | 0
136 |
137 |
138 | id
139 | die__
140 |
141 |
142 | label
143 | GUI Kill
144 |
145 |
146 | pressed
147 | 1
148 |
149 |
150 | released
151 | 0
152 |
153 |
154 | type
155 | int
156 |
157 |
158 |
159 | variable_qtgui_range
160 |
161 | comment
162 |
163 |
164 |
165 | value
166 | 103.7e6
167 |
168 |
169 | _enabled
170 | True
171 |
172 |
173 | _coordinate
174 | (363, 0)
175 |
176 |
177 | gui_hint
178 |
179 |
180 |
181 | _rotation
182 | 0
183 |
184 |
185 | id
186 | freq
187 |
188 |
189 | label
190 | Frequency Slider
191 |
192 |
193 | min_len
194 | 200
195 |
196 |
197 | orient
198 | Qt.Horizontal
199 |
200 |
201 | start
202 | 88e6
203 |
204 |
205 | step
206 | 100e3
207 |
208 |
209 | stop
210 | 108e6
211 |
212 |
213 | rangeType
214 | float
215 |
216 |
217 | widget
218 | counter_slider
219 |
220 |
221 |
222 | variable_qtgui_push_button
223 |
224 | comment
225 |
226 |
227 |
228 | value
229 | 0
230 |
231 |
232 | _enabled
233 | True
234 |
235 |
236 | _coordinate
237 | (738, 4)
238 |
239 |
240 | gui_hint
241 |
242 |
243 |
244 | _rotation
245 | 0
246 |
247 |
248 | id
249 | ptt
250 |
251 |
252 | label
253 |
254 |
255 |
256 | pressed
257 | 1
258 |
259 |
260 | released
261 | 0
262 |
263 |
264 | type
265 | int
266 |
267 |
268 |
269 | variable_qtgui_range
270 |
271 | comment
272 | hackRF: 1.03M
273 |
274 |
275 | value
276 | 1.323e6
277 |
278 |
279 | _enabled
280 | True
281 |
282 |
283 | _coordinate
284 | (188, 0)
285 |
286 |
287 | gui_hint
288 |
289 |
290 |
291 | _rotation
292 | 0
293 |
294 |
295 | id
296 | samp_rate
297 |
298 |
299 | label
300 | Sample Rate Slider
301 |
302 |
303 | min_len
304 | 200
305 |
306 |
307 | orient
308 | Qt.Horizontal
309 |
310 |
311 | start
312 | 0
313 |
314 |
315 | step
316 | 1
317 |
318 |
319 | stop
320 | 6.00e6
321 |
322 |
323 | rangeType
324 | float
325 |
326 |
327 | widget
328 | counter_slider
329 |
330 |
331 |
332 | variable_qtgui_push_button
333 |
334 | comment
335 |
336 |
337 |
338 | value
339 | 0
340 |
341 |
342 | _enabled
343 | True
344 |
345 |
346 | _coordinate
347 | (273, 371)
348 |
349 |
350 | gui_hint
351 |
352 |
353 |
354 | _rotation
355 | 0
356 |
357 |
358 | id
359 | swap__
360 |
361 |
362 | label
363 | Switch to RX
364 |
365 |
366 | pressed
367 | 1
368 |
369 |
370 | released
371 | 0
372 |
373 |
374 | type
375 | int
376 |
377 |
378 |
379 | analog_wfm_tx
380 |
381 | audio_rate
382 | audio_samp_in
383 |
384 |
385 | alias
386 |
387 |
388 |
389 | comment
390 |
391 |
392 |
393 | affinity
394 |
395 |
396 |
397 | _enabled
398 | 1
399 |
400 |
401 | _coordinate
402 | (179, 165)
403 |
404 |
405 | _rotation
406 | 0
407 |
408 |
409 | id
410 | analog_wfm_tx_0
411 |
412 |
413 | max_dev
414 | 75e3
415 |
416 |
417 | maxoutbuf
418 | 0
419 |
420 |
421 | minoutbuf
422 | 0
423 |
424 |
425 | quad_rate
426 | audio_samp_in * 3
427 |
428 |
429 | tau
430 | 75e-6
431 |
432 |
433 |
434 | audio_source
435 |
436 | alias
437 |
438 |
439 |
440 | comment
441 |
442 |
443 |
444 | affinity
445 |
446 |
447 |
448 | device_name
449 |
450 |
451 |
452 | _enabled
453 | 1
454 |
455 |
456 | _coordinate
457 | (0, 186)
458 |
459 |
460 | _rotation
461 | 0
462 |
463 |
464 | id
465 | audio_source_0
466 |
467 |
468 | maxoutbuf
469 | 0
470 |
471 |
472 | minoutbuf
473 | 0
474 |
475 |
476 | num_outputs
477 | 1
478 |
479 |
480 | ok_to_block
481 | True
482 |
483 |
484 | samp_rate
485 | 44100
486 |
487 |
488 |
489 | blocks_multiply_const_vxx
490 |
491 | alias
492 |
493 |
494 |
495 | comment
496 |
497 |
498 |
499 | const
500 | ptt
501 |
502 |
503 | affinity
504 |
505 |
506 |
507 | _enabled
508 | True
509 |
510 |
511 | _coordinate
512 | (612, 186)
513 |
514 |
515 | _rotation
516 | 0
517 |
518 |
519 | id
520 | blocks_multiply_const_vxx_0
521 |
522 |
523 | type
524 | complex
525 |
526 |
527 | maxoutbuf
528 | 0
529 |
530 |
531 | minoutbuf
532 | 0
533 |
534 |
535 | vlen
536 | 1
537 |
538 |
539 |
540 | osmosdr_sink
541 |
542 | alias
543 |
544 |
545 |
546 | ant0
547 |
548 |
549 |
550 | bb_gain0
551 | 0
552 |
553 |
554 | bw0
555 | 0
556 |
557 |
558 | corr0
559 | 0
560 |
561 |
562 | freq0
563 | freq
564 |
565 |
566 | if_gain0
567 | 47
568 |
569 |
570 | gain0
571 | 14
572 |
573 |
574 | ant10
575 |
576 |
577 |
578 | bb_gain10
579 | 20
580 |
581 |
582 | bw10
583 | 0
584 |
585 |
586 | corr10
587 | 0
588 |
589 |
590 | freq10
591 | 100e6
592 |
593 |
594 | if_gain10
595 | 20
596 |
597 |
598 | gain10
599 | 10
600 |
601 |
602 | ant11
603 |
604 |
605 |
606 | bb_gain11
607 | 20
608 |
609 |
610 | bw11
611 | 0
612 |
613 |
614 | corr11
615 | 0
616 |
617 |
618 | freq11
619 | 100e6
620 |
621 |
622 | if_gain11
623 | 20
624 |
625 |
626 | gain11
627 | 10
628 |
629 |
630 | ant12
631 |
632 |
633 |
634 | bb_gain12
635 | 20
636 |
637 |
638 | bw12
639 | 0
640 |
641 |
642 | corr12
643 | 0
644 |
645 |
646 | freq12
647 | 100e6
648 |
649 |
650 | if_gain12
651 | 20
652 |
653 |
654 | gain12
655 | 10
656 |
657 |
658 | ant13
659 |
660 |
661 |
662 | bb_gain13
663 | 20
664 |
665 |
666 | bw13
667 | 0
668 |
669 |
670 | corr13
671 | 0
672 |
673 |
674 | freq13
675 | 100e6
676 |
677 |
678 | if_gain13
679 | 20
680 |
681 |
682 | gain13
683 | 10
684 |
685 |
686 | ant14
687 |
688 |
689 |
690 | bb_gain14
691 | 20
692 |
693 |
694 | bw14
695 | 0
696 |
697 |
698 | corr14
699 | 0
700 |
701 |
702 | freq14
703 | 100e6
704 |
705 |
706 | if_gain14
707 | 20
708 |
709 |
710 | gain14
711 | 10
712 |
713 |
714 | ant15
715 |
716 |
717 |
718 | bb_gain15
719 | 20
720 |
721 |
722 | bw15
723 | 0
724 |
725 |
726 | corr15
727 | 0
728 |
729 |
730 | freq15
731 | 100e6
732 |
733 |
734 | if_gain15
735 | 20
736 |
737 |
738 | gain15
739 | 10
740 |
741 |
742 | ant16
743 |
744 |
745 |
746 | bb_gain16
747 | 20
748 |
749 |
750 | bw16
751 | 0
752 |
753 |
754 | corr16
755 | 0
756 |
757 |
758 | freq16
759 | 100e6
760 |
761 |
762 | if_gain16
763 | 20
764 |
765 |
766 | gain16
767 | 10
768 |
769 |
770 | ant17
771 |
772 |
773 |
774 | bb_gain17
775 | 20
776 |
777 |
778 | bw17
779 | 0
780 |
781 |
782 | corr17
783 | 0
784 |
785 |
786 | freq17
787 | 100e6
788 |
789 |
790 | if_gain17
791 | 20
792 |
793 |
794 | gain17
795 | 10
796 |
797 |
798 | ant18
799 |
800 |
801 |
802 | bb_gain18
803 | 20
804 |
805 |
806 | bw18
807 | 0
808 |
809 |
810 | corr18
811 | 0
812 |
813 |
814 | freq18
815 | 100e6
816 |
817 |
818 | if_gain18
819 | 20
820 |
821 |
822 | gain18
823 | 10
824 |
825 |
826 | ant19
827 |
828 |
829 |
830 | bb_gain19
831 | 20
832 |
833 |
834 | bw19
835 | 0
836 |
837 |
838 | corr19
839 | 0
840 |
841 |
842 | freq19
843 | 100e6
844 |
845 |
846 | if_gain19
847 | 20
848 |
849 |
850 | gain19
851 | 10
852 |
853 |
854 | ant1
855 |
856 |
857 |
858 | bb_gain1
859 | 20
860 |
861 |
862 | bw1
863 | 0
864 |
865 |
866 | corr1
867 | 0
868 |
869 |
870 | freq1
871 | 100e6
872 |
873 |
874 | if_gain1
875 | 20
876 |
877 |
878 | gain1
879 | 10
880 |
881 |
882 | ant20
883 |
884 |
885 |
886 | bb_gain20
887 | 20
888 |
889 |
890 | bw20
891 | 0
892 |
893 |
894 | corr20
895 | 0
896 |
897 |
898 | freq20
899 | 100e6
900 |
901 |
902 | if_gain20
903 | 20
904 |
905 |
906 | gain20
907 | 10
908 |
909 |
910 | ant21
911 |
912 |
913 |
914 | bb_gain21
915 | 20
916 |
917 |
918 | bw21
919 | 0
920 |
921 |
922 | corr21
923 | 0
924 |
925 |
926 | freq21
927 | 100e6
928 |
929 |
930 | if_gain21
931 | 20
932 |
933 |
934 | gain21
935 | 10
936 |
937 |
938 | ant22
939 |
940 |
941 |
942 | bb_gain22
943 | 20
944 |
945 |
946 | bw22
947 | 0
948 |
949 |
950 | corr22
951 | 0
952 |
953 |
954 | freq22
955 | 100e6
956 |
957 |
958 | if_gain22
959 | 20
960 |
961 |
962 | gain22
963 | 10
964 |
965 |
966 | ant23
967 |
968 |
969 |
970 | bb_gain23
971 | 20
972 |
973 |
974 | bw23
975 | 0
976 |
977 |
978 | corr23
979 | 0
980 |
981 |
982 | freq23
983 | 100e6
984 |
985 |
986 | if_gain23
987 | 20
988 |
989 |
990 | gain23
991 | 10
992 |
993 |
994 | ant24
995 |
996 |
997 |
998 | bb_gain24
999 | 20
1000 |
1001 |
1002 | bw24
1003 | 0
1004 |
1005 |
1006 | corr24
1007 | 0
1008 |
1009 |
1010 | freq24
1011 | 100e6
1012 |
1013 |
1014 | if_gain24
1015 | 20
1016 |
1017 |
1018 | gain24
1019 | 10
1020 |
1021 |
1022 | ant25
1023 |
1024 |
1025 |
1026 | bb_gain25
1027 | 20
1028 |
1029 |
1030 | bw25
1031 | 0
1032 |
1033 |
1034 | corr25
1035 | 0
1036 |
1037 |
1038 | freq25
1039 | 100e6
1040 |
1041 |
1042 | if_gain25
1043 | 20
1044 |
1045 |
1046 | gain25
1047 | 10
1048 |
1049 |
1050 | ant26
1051 |
1052 |
1053 |
1054 | bb_gain26
1055 | 20
1056 |
1057 |
1058 | bw26
1059 | 0
1060 |
1061 |
1062 | corr26
1063 | 0
1064 |
1065 |
1066 | freq26
1067 | 100e6
1068 |
1069 |
1070 | if_gain26
1071 | 20
1072 |
1073 |
1074 | gain26
1075 | 10
1076 |
1077 |
1078 | ant27
1079 |
1080 |
1081 |
1082 | bb_gain27
1083 | 20
1084 |
1085 |
1086 | bw27
1087 | 0
1088 |
1089 |
1090 | corr27
1091 | 0
1092 |
1093 |
1094 | freq27
1095 | 100e6
1096 |
1097 |
1098 | if_gain27
1099 | 20
1100 |
1101 |
1102 | gain27
1103 | 10
1104 |
1105 |
1106 | ant28
1107 |
1108 |
1109 |
1110 | bb_gain28
1111 | 20
1112 |
1113 |
1114 | bw28
1115 | 0
1116 |
1117 |
1118 | corr28
1119 | 0
1120 |
1121 |
1122 | freq28
1123 | 100e6
1124 |
1125 |
1126 | if_gain28
1127 | 20
1128 |
1129 |
1130 | gain28
1131 | 10
1132 |
1133 |
1134 | ant29
1135 |
1136 |
1137 |
1138 | bb_gain29
1139 | 20
1140 |
1141 |
1142 | bw29
1143 | 0
1144 |
1145 |
1146 | corr29
1147 | 0
1148 |
1149 |
1150 | freq29
1151 | 100e6
1152 |
1153 |
1154 | if_gain29
1155 | 20
1156 |
1157 |
1158 | gain29
1159 | 10
1160 |
1161 |
1162 | ant2
1163 |
1164 |
1165 |
1166 | bb_gain2
1167 | 20
1168 |
1169 |
1170 | bw2
1171 | 0
1172 |
1173 |
1174 | corr2
1175 | 0
1176 |
1177 |
1178 | freq2
1179 | 100e6
1180 |
1181 |
1182 | if_gain2
1183 | 20
1184 |
1185 |
1186 | gain2
1187 | 10
1188 |
1189 |
1190 | ant30
1191 |
1192 |
1193 |
1194 | bb_gain30
1195 | 20
1196 |
1197 |
1198 | bw30
1199 | 0
1200 |
1201 |
1202 | corr30
1203 | 0
1204 |
1205 |
1206 | freq30
1207 | 100e6
1208 |
1209 |
1210 | if_gain30
1211 | 20
1212 |
1213 |
1214 | gain30
1215 | 10
1216 |
1217 |
1218 | ant31
1219 |
1220 |
1221 |
1222 | bb_gain31
1223 | 20
1224 |
1225 |
1226 | bw31
1227 | 0
1228 |
1229 |
1230 | corr31
1231 | 0
1232 |
1233 |
1234 | freq31
1235 | 100e6
1236 |
1237 |
1238 | if_gain31
1239 | 20
1240 |
1241 |
1242 | gain31
1243 | 10
1244 |
1245 |
1246 | ant3
1247 |
1248 |
1249 |
1250 | bb_gain3
1251 | 20
1252 |
1253 |
1254 | bw3
1255 | 0
1256 |
1257 |
1258 | corr3
1259 | 0
1260 |
1261 |
1262 | freq3
1263 | 100e6
1264 |
1265 |
1266 | if_gain3
1267 | 20
1268 |
1269 |
1270 | gain3
1271 | 10
1272 |
1273 |
1274 | ant4
1275 |
1276 |
1277 |
1278 | bb_gain4
1279 | 20
1280 |
1281 |
1282 | bw4
1283 | 0
1284 |
1285 |
1286 | corr4
1287 | 0
1288 |
1289 |
1290 | freq4
1291 | 100e6
1292 |
1293 |
1294 | if_gain4
1295 | 20
1296 |
1297 |
1298 | gain4
1299 | 10
1300 |
1301 |
1302 | ant5
1303 |
1304 |
1305 |
1306 | bb_gain5
1307 | 20
1308 |
1309 |
1310 | bw5
1311 | 0
1312 |
1313 |
1314 | corr5
1315 | 0
1316 |
1317 |
1318 | freq5
1319 | 100e6
1320 |
1321 |
1322 | if_gain5
1323 | 20
1324 |
1325 |
1326 | gain5
1327 | 10
1328 |
1329 |
1330 | ant6
1331 |
1332 |
1333 |
1334 | bb_gain6
1335 | 20
1336 |
1337 |
1338 | bw6
1339 | 0
1340 |
1341 |
1342 | corr6
1343 | 0
1344 |
1345 |
1346 | freq6
1347 | 100e6
1348 |
1349 |
1350 | if_gain6
1351 | 20
1352 |
1353 |
1354 | gain6
1355 | 10
1356 |
1357 |
1358 | ant7
1359 |
1360 |
1361 |
1362 | bb_gain7
1363 | 20
1364 |
1365 |
1366 | bw7
1367 | 0
1368 |
1369 |
1370 | corr7
1371 | 0
1372 |
1373 |
1374 | freq7
1375 | 100e6
1376 |
1377 |
1378 | if_gain7
1379 | 20
1380 |
1381 |
1382 | gain7
1383 | 10
1384 |
1385 |
1386 | ant8
1387 |
1388 |
1389 |
1390 | bb_gain8
1391 | 20
1392 |
1393 |
1394 | bw8
1395 | 0
1396 |
1397 |
1398 | corr8
1399 | 0
1400 |
1401 |
1402 | freq8
1403 | 100e6
1404 |
1405 |
1406 | if_gain8
1407 | 20
1408 |
1409 |
1410 | gain8
1411 | 10
1412 |
1413 |
1414 | ant9
1415 |
1416 |
1417 |
1418 | bb_gain9
1419 | 20
1420 |
1421 |
1422 | bw9
1423 | 0
1424 |
1425 |
1426 | corr9
1427 | 0
1428 |
1429 |
1430 | freq9
1431 | 100e6
1432 |
1433 |
1434 | if_gain9
1435 | 20
1436 |
1437 |
1438 | gain9
1439 | 10
1440 |
1441 |
1442 | comment
1443 |
1444 |
1445 |
1446 | affinity
1447 |
1448 |
1449 |
1450 | args
1451 |
1452 |
1453 |
1454 | _enabled
1455 | 1
1456 |
1457 |
1458 | _coordinate
1459 | (797, 102)
1460 |
1461 |
1462 | _rotation
1463 | 0
1464 |
1465 |
1466 | id
1467 | osmosdr_sink_0
1468 |
1469 |
1470 | type
1471 | fc32
1472 |
1473 |
1474 | clock_source0
1475 |
1476 |
1477 |
1478 | time_source0
1479 |
1480 |
1481 |
1482 | clock_source1
1483 |
1484 |
1485 |
1486 | time_source1
1487 |
1488 |
1489 |
1490 | clock_source2
1491 |
1492 |
1493 |
1494 | time_source2
1495 |
1496 |
1497 |
1498 | clock_source3
1499 |
1500 |
1501 |
1502 | time_source3
1503 |
1504 |
1505 |
1506 | clock_source4
1507 |
1508 |
1509 |
1510 | time_source4
1511 |
1512 |
1513 |
1514 | clock_source5
1515 |
1516 |
1517 |
1518 | time_source5
1519 |
1520 |
1521 |
1522 | clock_source6
1523 |
1524 |
1525 |
1526 | time_source6
1527 |
1528 |
1529 |
1530 | clock_source7
1531 |
1532 |
1533 |
1534 | time_source7
1535 |
1536 |
1537 |
1538 | nchan
1539 | 1
1540 |
1541 |
1542 | num_mboards
1543 | 1
1544 |
1545 |
1546 | sample_rate
1547 | samp_rate
1548 |
1549 |
1550 | sync
1551 |
1552 |
1553 |
1554 |
1555 | qtgui_sink_x
1556 |
1557 | bw
1558 | samp_rate
1559 |
1560 |
1561 | alias
1562 |
1563 |
1564 |
1565 | fc
1566 | freq
1567 |
1568 |
1569 | freqchangevar
1570 | None
1571 |
1572 |
1573 | comment
1574 |
1575 |
1576 |
1577 | affinity
1578 |
1579 |
1580 |
1581 | _enabled
1582 | 1
1583 |
1584 |
1585 | fftsize
1586 | 1024
1587 |
1588 |
1589 | _coordinate
1590 | (796, 266)
1591 |
1592 |
1593 | gui_hint
1594 |
1595 |
1596 |
1597 | _rotation
1598 | 0
1599 |
1600 |
1601 | id
1602 | qtgui_sink_x_0
1603 |
1604 |
1605 | maxoutbuf
1606 | 0
1607 |
1608 |
1609 | minoutbuf
1610 | 0
1611 |
1612 |
1613 | name
1614 | ""
1615 |
1616 |
1617 | plotconst
1618 | True
1619 |
1620 |
1621 | plotfreq
1622 | True
1623 |
1624 |
1625 | plottime
1626 | True
1627 |
1628 |
1629 | plotwaterfall
1630 | True
1631 |
1632 |
1633 | showports
1634 | True
1635 |
1636 |
1637 | showrf
1638 | True
1639 |
1640 |
1641 | type
1642 | complex
1643 |
1644 |
1645 | rate
1646 | 10
1647 |
1648 |
1649 | wintype
1650 | firdes.WIN_BLACKMAN_hARRIS
1651 |
1652 |
1653 |
1654 | rational_resampler_xxx
1655 |
1656 | alias
1657 |
1658 |
1659 |
1660 | comment
1661 |
1662 |
1663 |
1664 | affinity
1665 |
1666 |
1667 |
1668 | decim
1669 | 1
1670 |
1671 |
1672 | _enabled
1673 | 1
1674 |
1675 |
1676 | fbw
1677 | 0
1678 |
1679 |
1680 | _coordinate
1681 | (405, 165)
1682 |
1683 |
1684 | _rotation
1685 | 0
1686 |
1687 |
1688 | id
1689 | rational_resampler_xxx_0
1690 |
1691 |
1692 | interp
1693 | 10
1694 |
1695 |
1696 | maxoutbuf
1697 | 0
1698 |
1699 |
1700 | minoutbuf
1701 | 0
1702 |
1703 |
1704 | taps
1705 |
1706 |
1707 |
1708 | type
1709 | ccc
1710 |
1711 |
1712 |
1713 | analog_wfm_tx_0
1714 | rational_resampler_xxx_0
1715 | 0
1716 | 0
1717 |
1718 |
1719 | audio_source_0
1720 | analog_wfm_tx_0
1721 | 0
1722 | 0
1723 |
1724 |
1725 | blocks_multiply_const_vxx_0
1726 | osmosdr_sink_0
1727 | 0
1728 | 0
1729 |
1730 |
1731 | blocks_multiply_const_vxx_0
1732 | qtgui_sink_x_0
1733 | 0
1734 | 0
1735 |
1736 |
1737 | rational_resampler_xxx_0
1738 | blocks_multiply_const_vxx_0
1739 | 0
1740 | 0
1741 |
1742 |
1743 |
--------------------------------------------------------------------------------
/flowgraphs/hackSiren.grc:
--------------------------------------------------------------------------------
1 | options:
2 | parameters:
3 | author: ''
4 | catch_exceptions: 'True'
5 | category: Custom
6 | cmake_opt: ''
7 | comment: ''
8 | copyright: ''
9 | description: ''
10 | gen_cmake: 'On'
11 | gen_linking: dynamic
12 | generate_options: qt_gui
13 | hier_block_src_path: '.:'
14 | id: hackrfTransmit
15 | max_nouts: '0'
16 | output_language: python
17 | placement: (0,0)
18 | qt_qss_theme: ''
19 | realtime_scheduling: '1'
20 | run: 'True'
21 | run_command: '{python} -u {filename}'
22 | run_options: prompt
23 | sizing_mode: fixed
24 | thread_safe_setters: ''
25 | title: ''
26 | window_size: 1280, 1024
27 | states:
28 | bus_sink: false
29 | bus_source: false
30 | bus_structure: null
31 | coordinate: [10, 10]
32 | rotation: 0
33 | state: enabled
34 |
35 | blocks:
36 | - name: Audio_Rate
37 | id: variable_qtgui_range
38 | parameters:
39 | comment: ''
40 | gui_hint: ''
41 | label: Audio Rate
42 | min_len: '200'
43 | orient: QtCore.Qt.Horizontal
44 | rangeType: int
45 | start: '0'
46 | step: '1'
47 | stop: '10000000'
48 | value: '44100'
49 | widget: counter_slider
50 | states:
51 | bus_sink: false
52 | bus_source: false
53 | bus_structure: null
54 | coordinate: [1240, 4.0]
55 | rotation: 0
56 | state: enabled
57 | - name: audio_samp
58 | id: variable
59 | parameters:
60 | comment: ''
61 | value: Audio_Rate
62 | states:
63 | bus_sink: false
64 | bus_source: false
65 | bus_structure: null
66 | coordinate: [392, 5]
67 | rotation: 0
68 | state: enabled
69 | - name: decimation
70 | id: variable_qtgui_range
71 | parameters:
72 | comment: ''
73 | gui_hint: ''
74 | label: decimation
75 | min_len: '200'
76 | orient: QtCore.Qt.Horizontal
77 | rangeType: int
78 | start: '0'
79 | step: '1'
80 | stop: '100'
81 | value: '1'
82 | widget: counter_slider
83 | states:
84 | bus_sink: false
85 | bus_source: false
86 | bus_structure: null
87 | coordinate: [1046, 0]
88 | rotation: 0
89 | state: enabled
90 | - name: freq
91 | id: variable
92 | parameters:
93 | comment: ''
94 | value: freq_sldr
95 | states:
96 | bus_sink: false
97 | bus_source: false
98 | bus_structure: null
99 | coordinate: [288, 5]
100 | rotation: 0
101 | state: enabled
102 | - name: freq_sldr
103 | id: variable_qtgui_range
104 | parameters:
105 | comment: ''
106 | gui_hint: ''
107 | label: Frequency Slider
108 | min_len: '200'
109 | orient: QtCore.Qt.Horizontal
110 | rangeType: float
111 | start: '0'
112 | step: '1'
113 | stop: 4000.0e6
114 | value: 91.5e6
115 | widget: counter_slider
116 | states:
117 | bus_sink: false
118 | bus_source: false
119 | bus_structure: null
120 | coordinate: [745, 0]
121 | rotation: 0
122 | state: enabled
123 | - name: interpolation
124 | id: variable_qtgui_range
125 | parameters:
126 | comment: ''
127 | gui_hint: ''
128 | label: Rational Resampler
129 | min_len: '200'
130 | orient: QtCore.Qt.Horizontal
131 | rangeType: int
132 | start: '0'
133 | step: '1'
134 | stop: '100'
135 | value: '10'
136 | widget: counter_slider
137 | states:
138 | bus_sink: false
139 | bus_source: false
140 | bus_structure: null
141 | coordinate: [890, 0]
142 | rotation: 0
143 | state: enabled
144 | - name: quad_rate
145 | id: variable
146 | parameters:
147 | comment: ''
148 | value: audio_samp*3
149 | states:
150 | bus_sink: false
151 | bus_source: false
152 | bus_structure: null
153 | coordinate: [496, 5]
154 | rotation: 0
155 | state: enabled
156 | - name: samp_rate
157 | id: variable
158 | parameters:
159 | comment: '1.323M
160 |
161 | 1.03M is lowest'
162 | value: samp_rate_sldr
163 | states:
164 | bus_sink: false
165 | bus_source: false
166 | bus_structure: null
167 | coordinate: [192, 5]
168 | rotation: 0
169 | state: enabled
170 | - name: samp_rate_sldr
171 | id: variable_qtgui_range
172 | parameters:
173 | comment: ''
174 | gui_hint: ''
175 | label: Sample Rate Slider
176 | min_len: '200'
177 | orient: QtCore.Qt.Horizontal
178 | rangeType: float
179 | start: '0'
180 | step: '1'
181 | stop: 6.00e6
182 | value: 1.323e6
183 | widget: counter_slider
184 | states:
185 | bus_sink: false
186 | bus_source: false
187 | bus_structure: null
188 | coordinate: [591, 0]
189 | rotation: 0
190 | state: enabled
191 | - name: analog_sig_source_x_0_0
192 | id: analog_sig_source_x
193 | parameters:
194 | affinity: ''
195 | alias: ''
196 | amp: '.8'
197 | comment: ''
198 | freq: '600'
199 | maxoutbuf: '0'
200 | minoutbuf: '0'
201 | offset: '0'
202 | phase: '0'
203 | samp_rate: '48000'
204 | type: float
205 | waveform: analog.GR_SIN_WAVE
206 | states:
207 | bus_sink: false
208 | bus_source: false
209 | bus_structure: null
210 | coordinate: [208, 211]
211 | rotation: 0
212 | state: enabled
213 | - name: analog_sig_source_x_0_0_0
214 | id: analog_sig_source_x
215 | parameters:
216 | affinity: ''
217 | alias: ''
218 | amp: '.8'
219 | comment: ''
220 | freq: '1000'
221 | maxoutbuf: '0'
222 | minoutbuf: '0'
223 | offset: '0'
224 | phase: '0'
225 | samp_rate: '48000'
226 | type: float
227 | waveform: analog.GR_SIN_WAVE
228 | states:
229 | bus_sink: false
230 | bus_source: false
231 | bus_structure: null
232 | coordinate: [424, 404.0]
233 | rotation: 0
234 | state: enabled
235 | - name: analog_sig_source_x_1
236 | id: analog_sig_source_x
237 | parameters:
238 | affinity: ''
239 | alias: ''
240 | amp: '1'
241 | comment: ''
242 | freq: '1'
243 | maxoutbuf: '0'
244 | minoutbuf: '0'
245 | offset: '0'
246 | phase: '0'
247 | samp_rate: '48000'
248 | type: float
249 | waveform: analog.GR_SQR_WAVE
250 | states:
251 | bus_sink: false
252 | bus_source: false
253 | bus_structure: null
254 | coordinate: [128, 347]
255 | rotation: 0
256 | state: enabled
257 | - name: analog_wfm_tx_0
258 | id: analog_wfm_tx
259 | parameters:
260 | affinity: ''
261 | alias: ''
262 | audio_rate: audio_samp
263 | comment: ''
264 | fh: '-1.0'
265 | max_dev: 75e3
266 | maxoutbuf: '0'
267 | minoutbuf: '0'
268 | quad_rate: quad_rate
269 | tau: 75e-6
270 | states:
271 | bus_sink: false
272 | bus_source: false
273 | bus_structure: null
274 | coordinate: [640, 148.0]
275 | rotation: 0
276 | state: enabled
277 | - name: blocks_abs_xx_0
278 | id: blocks_abs_xx
279 | parameters:
280 | affinity: ''
281 | alias: ''
282 | comment: ''
283 | maxoutbuf: '0'
284 | minoutbuf: '0'
285 | type: float
286 | vlen: '1'
287 | states:
288 | bus_sink: false
289 | bus_source: false
290 | bus_structure: null
291 | coordinate: [344, 536]
292 | rotation: 0
293 | state: enabled
294 | - name: blocks_add_const_vxx_0
295 | id: blocks_add_const_vxx
296 | parameters:
297 | affinity: ''
298 | alias: ''
299 | comment: ''
300 | const: '-1'
301 | maxoutbuf: '0'
302 | minoutbuf: '0'
303 | type: float
304 | vlen: '1'
305 | states:
306 | bus_sink: false
307 | bus_source: false
308 | bus_structure: null
309 | coordinate: [160, 612.0]
310 | rotation: 0
311 | state: enabled
312 | - name: blocks_add_xx_0
313 | id: blocks_add_xx
314 | parameters:
315 | affinity: ''
316 | alias: ''
317 | comment: ''
318 | maxoutbuf: '0'
319 | minoutbuf: '0'
320 | num_inputs: '2'
321 | type: float
322 | vlen: '1'
323 | states:
324 | bus_sink: false
325 | bus_source: false
326 | bus_structure: null
327 | coordinate: [624, 344.0]
328 | rotation: 0
329 | state: enabled
330 | - name: blocks_multiply_xx_0
331 | id: blocks_multiply_xx
332 | parameters:
333 | affinity: ''
334 | alias: ''
335 | comment: ''
336 | maxoutbuf: '0'
337 | minoutbuf: '0'
338 | num_inputs: '2'
339 | type: float
340 | vlen: '1'
341 | states:
342 | bus_sink: false
343 | bus_source: false
344 | bus_structure: null
345 | coordinate: [512, 280]
346 | rotation: 0
347 | state: enabled
348 | - name: blocks_multiply_xx_0_0
349 | id: blocks_multiply_xx
350 | parameters:
351 | affinity: ''
352 | alias: ''
353 | comment: ''
354 | maxoutbuf: '0'
355 | minoutbuf: '0'
356 | num_inputs: '2'
357 | type: float
358 | vlen: '1'
359 | states:
360 | bus_sink: false
361 | bus_source: false
362 | bus_structure: null
363 | coordinate: [728, 664.0]
364 | rotation: 0
365 | state: enabled
366 | - name: osmosdr_sink_0
367 | id: osmosdr_sink
368 | parameters:
369 | affinity: ''
370 | alias: ''
371 | ant0: ''
372 | ant1: ''
373 | ant10: ''
374 | ant11: ''
375 | ant12: ''
376 | ant13: ''
377 | ant14: ''
378 | ant15: ''
379 | ant16: ''
380 | ant17: ''
381 | ant18: ''
382 | ant19: ''
383 | ant2: ''
384 | ant20: ''
385 | ant21: ''
386 | ant22: ''
387 | ant23: ''
388 | ant24: ''
389 | ant25: ''
390 | ant26: ''
391 | ant27: ''
392 | ant28: ''
393 | ant29: ''
394 | ant3: ''
395 | ant30: ''
396 | ant31: ''
397 | ant4: ''
398 | ant5: ''
399 | ant6: ''
400 | ant7: ''
401 | ant8: ''
402 | ant9: ''
403 | args: ''
404 | bb_gain0: '0'
405 | bb_gain1: '20'
406 | bb_gain10: '20'
407 | bb_gain11: '20'
408 | bb_gain12: '20'
409 | bb_gain13: '20'
410 | bb_gain14: '20'
411 | bb_gain15: '20'
412 | bb_gain16: '20'
413 | bb_gain17: '20'
414 | bb_gain18: '20'
415 | bb_gain19: '20'
416 | bb_gain2: '20'
417 | bb_gain20: '20'
418 | bb_gain21: '20'
419 | bb_gain22: '20'
420 | bb_gain23: '20'
421 | bb_gain24: '20'
422 | bb_gain25: '20'
423 | bb_gain26: '20'
424 | bb_gain27: '20'
425 | bb_gain28: '20'
426 | bb_gain29: '20'
427 | bb_gain3: '20'
428 | bb_gain30: '20'
429 | bb_gain31: '20'
430 | bb_gain4: '20'
431 | bb_gain5: '20'
432 | bb_gain6: '20'
433 | bb_gain7: '20'
434 | bb_gain8: '20'
435 | bb_gain9: '20'
436 | bw0: '0'
437 | bw1: '0'
438 | bw10: '0'
439 | bw11: '0'
440 | bw12: '0'
441 | bw13: '0'
442 | bw14: '0'
443 | bw15: '0'
444 | bw16: '0'
445 | bw17: '0'
446 | bw18: '0'
447 | bw19: '0'
448 | bw2: '0'
449 | bw20: '0'
450 | bw21: '0'
451 | bw22: '0'
452 | bw23: '0'
453 | bw24: '0'
454 | bw25: '0'
455 | bw26: '0'
456 | bw27: '0'
457 | bw28: '0'
458 | bw29: '0'
459 | bw3: '0'
460 | bw30: '0'
461 | bw31: '0'
462 | bw4: '0'
463 | bw5: '0'
464 | bw6: '0'
465 | bw7: '0'
466 | bw8: '0'
467 | bw9: '0'
468 | clock_source0: ''
469 | clock_source1: ''
470 | clock_source2: ''
471 | clock_source3: ''
472 | clock_source4: ''
473 | clock_source5: ''
474 | clock_source6: ''
475 | clock_source7: ''
476 | comment: ''
477 | corr0: '0'
478 | corr1: '0'
479 | corr10: '0'
480 | corr11: '0'
481 | corr12: '0'
482 | corr13: '0'
483 | corr14: '0'
484 | corr15: '0'
485 | corr16: '0'
486 | corr17: '0'
487 | corr18: '0'
488 | corr19: '0'
489 | corr2: '0'
490 | corr20: '0'
491 | corr21: '0'
492 | corr22: '0'
493 | corr23: '0'
494 | corr24: '0'
495 | corr25: '0'
496 | corr26: '0'
497 | corr27: '0'
498 | corr28: '0'
499 | corr29: '0'
500 | corr3: '0'
501 | corr30: '0'
502 | corr31: '0'
503 | corr4: '0'
504 | corr5: '0'
505 | corr6: '0'
506 | corr7: '0'
507 | corr8: '0'
508 | corr9: '0'
509 | freq0: freq
510 | freq1: 100e6
511 | freq10: 100e6
512 | freq11: 100e6
513 | freq12: 100e6
514 | freq13: 100e6
515 | freq14: 100e6
516 | freq15: 100e6
517 | freq16: 100e6
518 | freq17: 100e6
519 | freq18: 100e6
520 | freq19: 100e6
521 | freq2: 100e6
522 | freq20: 100e6
523 | freq21: 100e6
524 | freq22: 100e6
525 | freq23: 100e6
526 | freq24: 100e6
527 | freq25: 100e6
528 | freq26: 100e6
529 | freq27: 100e6
530 | freq28: 100e6
531 | freq29: 100e6
532 | freq3: 100e6
533 | freq30: 100e6
534 | freq31: 100e6
535 | freq4: 100e6
536 | freq5: 100e6
537 | freq6: 100e6
538 | freq7: 100e6
539 | freq8: 100e6
540 | freq9: 100e6
541 | gain0: '14'
542 | gain1: '10'
543 | gain10: '10'
544 | gain11: '10'
545 | gain12: '10'
546 | gain13: '10'
547 | gain14: '10'
548 | gain15: '10'
549 | gain16: '10'
550 | gain17: '10'
551 | gain18: '10'
552 | gain19: '10'
553 | gain2: '10'
554 | gain20: '10'
555 | gain21: '10'
556 | gain22: '10'
557 | gain23: '10'
558 | gain24: '10'
559 | gain25: '10'
560 | gain26: '10'
561 | gain27: '10'
562 | gain28: '10'
563 | gain29: '10'
564 | gain3: '10'
565 | gain30: '10'
566 | gain31: '10'
567 | gain4: '10'
568 | gain5: '10'
569 | gain6: '10'
570 | gain7: '10'
571 | gain8: '10'
572 | gain9: '10'
573 | if_gain0: '47'
574 | if_gain1: '20'
575 | if_gain10: '20'
576 | if_gain11: '20'
577 | if_gain12: '20'
578 | if_gain13: '20'
579 | if_gain14: '20'
580 | if_gain15: '20'
581 | if_gain16: '20'
582 | if_gain17: '20'
583 | if_gain18: '20'
584 | if_gain19: '20'
585 | if_gain2: '20'
586 | if_gain20: '20'
587 | if_gain21: '20'
588 | if_gain22: '20'
589 | if_gain23: '20'
590 | if_gain24: '20'
591 | if_gain25: '20'
592 | if_gain26: '20'
593 | if_gain27: '20'
594 | if_gain28: '20'
595 | if_gain29: '20'
596 | if_gain3: '20'
597 | if_gain30: '20'
598 | if_gain31: '20'
599 | if_gain4: '20'
600 | if_gain5: '20'
601 | if_gain6: '20'
602 | if_gain7: '20'
603 | if_gain8: '20'
604 | if_gain9: '20'
605 | maxoutbuf: '0'
606 | minoutbuf: '0'
607 | nchan: '1'
608 | num_mboards: '1'
609 | sample_rate: samp_rate
610 | sync: sync
611 | time_source0: ''
612 | time_source1: ''
613 | time_source2: ''
614 | time_source3: ''
615 | time_source4: ''
616 | time_source5: ''
617 | time_source6: ''
618 | time_source7: ''
619 | type: fc32
620 | states:
621 | bus_sink: false
622 | bus_source: false
623 | bus_structure: null
624 | coordinate: [1048, 153]
625 | rotation: 0
626 | state: enabled
627 | - name: qtgui_sink_x_0
628 | id: qtgui_sink_x
629 | parameters:
630 | affinity: ''
631 | alias: ''
632 | bw: samp_rate
633 | comment: ''
634 | fc: freq
635 | fftsize: '1024'
636 | gui_hint: ''
637 | maxoutbuf: '0'
638 | minoutbuf: '0'
639 | name: '""'
640 | plotconst: 'True'
641 | plotfreq: 'True'
642 | plottime: 'True'
643 | plotwaterfall: 'True'
644 | rate: '10'
645 | showports: 'True'
646 | showrf: 'False'
647 | type: complex
648 | wintype: window.WIN_BLACKMAN_hARRIS
649 | states:
650 | bus_sink: false
651 | bus_source: false
652 | bus_structure: null
653 | coordinate: [1102, 488]
654 | rotation: 0
655 | state: disabled
656 | - name: rational_resampler_xxx_0
657 | id: rational_resampler_xxx
658 | parameters:
659 | affinity: ''
660 | alias: ''
661 | comment: 'Interpolation 10
662 |
663 | 8 Is our current with 1.03M'
664 | decim: decimation
665 | fbw: '0'
666 | interp: interpolation
667 | maxoutbuf: '0'
668 | minoutbuf: '0'
669 | taps: ''
670 | type: ccc
671 | states:
672 | bus_sink: false
673 | bus_source: false
674 | bus_structure: null
675 | coordinate: [856, 364.0]
676 | rotation: 0
677 | state: enabled
678 |
679 | connections:
680 | - [analog_sig_source_x_0_0, '0', blocks_multiply_xx_0, '0']
681 | - [analog_sig_source_x_0_0_0, '0', blocks_multiply_xx_0_0, '0']
682 | - [analog_sig_source_x_1, '0', blocks_add_const_vxx_0, '0']
683 | - [analog_sig_source_x_1, '0', blocks_multiply_xx_0, '1']
684 | - [analog_wfm_tx_0, '0', rational_resampler_xxx_0, '0']
685 | - [blocks_abs_xx_0, '0', blocks_multiply_xx_0_0, '1']
686 | - [blocks_add_const_vxx_0, '0', blocks_abs_xx_0, '0']
687 | - [blocks_add_xx_0, '0', analog_wfm_tx_0, '0']
688 | - [blocks_multiply_xx_0, '0', blocks_add_xx_0, '0']
689 | - [blocks_multiply_xx_0_0, '0', blocks_add_xx_0, '1']
690 | - [rational_resampler_xxx_0, '0', osmosdr_sink_0, '0']
691 | - [rational_resampler_xxx_0, '0', qtgui_sink_x_0, '0']
692 |
693 | metadata:
694 | file_format: 1
695 |
--------------------------------------------------------------------------------
/flowgraphs/hackWav.grc:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Mon Feb 9 16:34:26 2015
5 |
6 | options
7 |
8 | author
9 |
10 |
11 |
12 | window_size
13 | 1280, 1024
14 |
15 |
16 | category
17 | Custom
18 |
19 |
20 | comment
21 |
22 |
23 |
24 | description
25 |
26 |
27 |
28 | _enabled
29 | True
30 |
31 |
32 | _coordinate
33 | (10, 10)
34 |
35 |
36 | _rotation
37 | 0
38 |
39 |
40 | generate_options
41 | qt_gui
42 |
43 |
44 | hier_block_src_path
45 | .:
46 |
47 |
48 | id
49 | hackrfTransmit
50 |
51 |
52 | max_nouts
53 | 0
54 |
55 |
56 | qt_qss_theme
57 |
58 |
59 |
60 | realtime_scheduling
61 | 1
62 |
63 |
64 | run_command
65 | {python} -u {filename}
66 |
67 |
68 | run_options
69 | prompt
70 |
71 |
72 | run
73 | True
74 |
75 |
76 | thread_safe_setters
77 |
78 |
79 |
80 | title
81 |
82 |
83 |
84 |
85 | variable_qtgui_range
86 |
87 | comment
88 |
89 |
90 |
91 | value
92 | 44100
93 |
94 |
95 | _enabled
96 | True
97 |
98 |
99 | _coordinate
100 | (1154, 0)
101 |
102 |
103 | gui_hint
104 |
105 |
106 |
107 | _rotation
108 | 0
109 |
110 |
111 | id
112 | Audio_Rate
113 |
114 |
115 | label
116 | Audio Rate
117 |
118 |
119 | min_len
120 | 200
121 |
122 |
123 | orient
124 | Qt.Horizontal
125 |
126 |
127 | start
128 | 0
129 |
130 |
131 | step
132 | 1
133 |
134 |
135 | stop
136 | 10000000
137 |
138 |
139 | rangeType
140 | int
141 |
142 |
143 | widget
144 | counter_slider
145 |
146 |
147 |
148 | variable
149 |
150 | comment
151 |
152 |
153 |
154 | _enabled
155 | True
156 |
157 |
158 | _coordinate
159 | (392, 5)
160 |
161 |
162 | _rotation
163 | 0
164 |
165 |
166 | id
167 | audio_samp
168 |
169 |
170 | value
171 | Audio_Rate
172 |
173 |
174 |
175 | variable_qtgui_range
176 |
177 | comment
178 |
179 |
180 |
181 | value
182 | 1
183 |
184 |
185 | _enabled
186 | True
187 |
188 |
189 | _coordinate
190 | (1046, 0)
191 |
192 |
193 | gui_hint
194 |
195 |
196 |
197 | _rotation
198 | 0
199 |
200 |
201 | id
202 | decimation
203 |
204 |
205 | label
206 | decimation
207 |
208 |
209 | min_len
210 | 200
211 |
212 |
213 | orient
214 | Qt.Horizontal
215 |
216 |
217 | start
218 | 0
219 |
220 |
221 | step
222 | 1
223 |
224 |
225 | stop
226 | 100
227 |
228 |
229 | rangeType
230 | int
231 |
232 |
233 | widget
234 | counter_slider
235 |
236 |
237 |
238 | variable
239 |
240 | comment
241 |
242 |
243 |
244 | _enabled
245 | True
246 |
247 |
248 | _coordinate
249 | (288, 5)
250 |
251 |
252 | _rotation
253 | 0
254 |
255 |
256 | id
257 | freq
258 |
259 |
260 | value
261 | freq_sldr
262 |
263 |
264 |
265 | variable_qtgui_range
266 |
267 | comment
268 |
269 |
270 |
271 | value
272 | 91.5e6
273 |
274 |
275 | _enabled
276 | True
277 |
278 |
279 | _coordinate
280 | (745, 0)
281 |
282 |
283 | gui_hint
284 |
285 |
286 |
287 | _rotation
288 | 0
289 |
290 |
291 | id
292 | freq_sldr
293 |
294 |
295 | label
296 | Frequency Slider
297 |
298 |
299 | min_len
300 | 200
301 |
302 |
303 | orient
304 | Qt.Horizontal
305 |
306 |
307 | start
308 | 0
309 |
310 |
311 | step
312 | 1
313 |
314 |
315 | stop
316 | 6000.0e6
317 |
318 |
319 | rangeType
320 | float
321 |
322 |
323 | widget
324 | counter_slider
325 |
326 |
327 |
328 | variable_qtgui_range
329 |
330 | comment
331 |
332 |
333 |
334 | value
335 | 10
336 |
337 |
338 | _enabled
339 | True
340 |
341 |
342 | _coordinate
343 | (890, 0)
344 |
345 |
346 | gui_hint
347 |
348 |
349 |
350 | _rotation
351 | 0
352 |
353 |
354 | id
355 | interpolation
356 |
357 |
358 | label
359 | Rational Resampler
360 |
361 |
362 | min_len
363 | 200
364 |
365 |
366 | orient
367 | Qt.Horizontal
368 |
369 |
370 | start
371 | 0
372 |
373 |
374 | step
375 | 1
376 |
377 |
378 | stop
379 | 100
380 |
381 |
382 | rangeType
383 | int
384 |
385 |
386 | widget
387 | counter_slider
388 |
389 |
390 |
391 | variable
392 |
393 | comment
394 |
395 |
396 |
397 | _enabled
398 | True
399 |
400 |
401 | _coordinate
402 | (496, 5)
403 |
404 |
405 | _rotation
406 | 0
407 |
408 |
409 | id
410 | quad_rate
411 |
412 |
413 | value
414 | audio_samp*3
415 |
416 |
417 |
418 | variable
419 |
420 | comment
421 | 1.323M
422 | 1.03M is lowest
423 |
424 |
425 | _enabled
426 | True
427 |
428 |
429 | _coordinate
430 | (192, 5)
431 |
432 |
433 | _rotation
434 | 0
435 |
436 |
437 | id
438 | samp_rate
439 |
440 |
441 | value
442 | samp_rate_sldr
443 |
444 |
445 |
446 | variable_qtgui_range
447 |
448 | comment
449 |
450 |
451 |
452 | value
453 | 1.323e6
454 |
455 |
456 | _enabled
457 | True
458 |
459 |
460 | _coordinate
461 | (591, 0)
462 |
463 |
464 | gui_hint
465 |
466 |
467 |
468 | _rotation
469 | 0
470 |
471 |
472 | id
473 | samp_rate_sldr
474 |
475 |
476 | label
477 | Sample Rate Slider
478 |
479 |
480 | min_len
481 | 200
482 |
483 |
484 | orient
485 | Qt.Horizontal
486 |
487 |
488 | start
489 | 0
490 |
491 |
492 | step
493 | 1
494 |
495 |
496 | stop
497 | 6.00e6
498 |
499 |
500 | rangeType
501 | float
502 |
503 |
504 | widget
505 | counter_slider
506 |
507 |
508 |
509 | analog_wfm_tx
510 |
511 | audio_rate
512 | audio_samp
513 |
514 |
515 | alias
516 |
517 |
518 |
519 | comment
520 |
521 |
522 |
523 | affinity
524 |
525 |
526 |
527 | _enabled
528 | True
529 |
530 |
531 | _coordinate
532 | (768, 155)
533 |
534 |
535 | _rotation
536 | 0
537 |
538 |
539 | id
540 | analog_wfm_tx_0
541 |
542 |
543 | max_dev
544 | 75e3
545 |
546 |
547 | maxoutbuf
548 | 0
549 |
550 |
551 | minoutbuf
552 | 0
553 |
554 |
555 | quad_rate
556 | quad_rate
557 |
558 |
559 | tau
560 | 75e-6
561 |
562 |
563 |
564 | blocks_wavfile_source
565 |
566 | alias
567 |
568 |
569 |
570 | comment
571 |
572 |
573 |
574 | affinity
575 |
576 |
577 |
578 | _enabled
579 | 1
580 |
581 |
582 | file
583 | YOUR.wav
584 |
585 |
586 | _coordinate
587 | (360, 125)
588 |
589 |
590 | _rotation
591 | 0
592 |
593 |
594 | id
595 | blocks_wavfile_source_0
596 |
597 |
598 | maxoutbuf
599 | 0
600 |
601 |
602 | minoutbuf
603 | 0
604 |
605 |
606 | nchan
607 | 1
608 |
609 |
610 | repeat
611 | True
612 |
613 |
614 |
615 | osmosdr_sink
616 |
617 | alias
618 |
619 |
620 |
621 | ant0
622 |
623 |
624 |
625 | bb_gain0
626 | 0
627 |
628 |
629 | bw0
630 | 0
631 |
632 |
633 | corr0
634 | 0
635 |
636 |
637 | freq0
638 | freq
639 |
640 |
641 | if_gain0
642 | 47
643 |
644 |
645 | gain0
646 | 14
647 |
648 |
649 | ant10
650 |
651 |
652 |
653 | bb_gain10
654 | 20
655 |
656 |
657 | bw10
658 | 0
659 |
660 |
661 | corr10
662 | 0
663 |
664 |
665 | freq10
666 | 100e6
667 |
668 |
669 | if_gain10
670 | 20
671 |
672 |
673 | gain10
674 | 10
675 |
676 |
677 | ant11
678 |
679 |
680 |
681 | bb_gain11
682 | 20
683 |
684 |
685 | bw11
686 | 0
687 |
688 |
689 | corr11
690 | 0
691 |
692 |
693 | freq11
694 | 100e6
695 |
696 |
697 | if_gain11
698 | 20
699 |
700 |
701 | gain11
702 | 10
703 |
704 |
705 | ant12
706 |
707 |
708 |
709 | bb_gain12
710 | 20
711 |
712 |
713 | bw12
714 | 0
715 |
716 |
717 | corr12
718 | 0
719 |
720 |
721 | freq12
722 | 100e6
723 |
724 |
725 | if_gain12
726 | 20
727 |
728 |
729 | gain12
730 | 10
731 |
732 |
733 | ant13
734 |
735 |
736 |
737 | bb_gain13
738 | 20
739 |
740 |
741 | bw13
742 | 0
743 |
744 |
745 | corr13
746 | 0
747 |
748 |
749 | freq13
750 | 100e6
751 |
752 |
753 | if_gain13
754 | 20
755 |
756 |
757 | gain13
758 | 10
759 |
760 |
761 | ant14
762 |
763 |
764 |
765 | bb_gain14
766 | 20
767 |
768 |
769 | bw14
770 | 0
771 |
772 |
773 | corr14
774 | 0
775 |
776 |
777 | freq14
778 | 100e6
779 |
780 |
781 | if_gain14
782 | 20
783 |
784 |
785 | gain14
786 | 10
787 |
788 |
789 | ant15
790 |
791 |
792 |
793 | bb_gain15
794 | 20
795 |
796 |
797 | bw15
798 | 0
799 |
800 |
801 | corr15
802 | 0
803 |
804 |
805 | freq15
806 | 100e6
807 |
808 |
809 | if_gain15
810 | 20
811 |
812 |
813 | gain15
814 | 10
815 |
816 |
817 | ant16
818 |
819 |
820 |
821 | bb_gain16
822 | 20
823 |
824 |
825 | bw16
826 | 0
827 |
828 |
829 | corr16
830 | 0
831 |
832 |
833 | freq16
834 | 100e6
835 |
836 |
837 | if_gain16
838 | 20
839 |
840 |
841 | gain16
842 | 10
843 |
844 |
845 | ant17
846 |
847 |
848 |
849 | bb_gain17
850 | 20
851 |
852 |
853 | bw17
854 | 0
855 |
856 |
857 | corr17
858 | 0
859 |
860 |
861 | freq17
862 | 100e6
863 |
864 |
865 | if_gain17
866 | 20
867 |
868 |
869 | gain17
870 | 10
871 |
872 |
873 | ant18
874 |
875 |
876 |
877 | bb_gain18
878 | 20
879 |
880 |
881 | bw18
882 | 0
883 |
884 |
885 | corr18
886 | 0
887 |
888 |
889 | freq18
890 | 100e6
891 |
892 |
893 | if_gain18
894 | 20
895 |
896 |
897 | gain18
898 | 10
899 |
900 |
901 | ant19
902 |
903 |
904 |
905 | bb_gain19
906 | 20
907 |
908 |
909 | bw19
910 | 0
911 |
912 |
913 | corr19
914 | 0
915 |
916 |
917 | freq19
918 | 100e6
919 |
920 |
921 | if_gain19
922 | 20
923 |
924 |
925 | gain19
926 | 10
927 |
928 |
929 | ant1
930 |
931 |
932 |
933 | bb_gain1
934 | 20
935 |
936 |
937 | bw1
938 | 0
939 |
940 |
941 | corr1
942 | 0
943 |
944 |
945 | freq1
946 | 100e6
947 |
948 |
949 | if_gain1
950 | 20
951 |
952 |
953 | gain1
954 | 10
955 |
956 |
957 | ant20
958 |
959 |
960 |
961 | bb_gain20
962 | 20
963 |
964 |
965 | bw20
966 | 0
967 |
968 |
969 | corr20
970 | 0
971 |
972 |
973 | freq20
974 | 100e6
975 |
976 |
977 | if_gain20
978 | 20
979 |
980 |
981 | gain20
982 | 10
983 |
984 |
985 | ant21
986 |
987 |
988 |
989 | bb_gain21
990 | 20
991 |
992 |
993 | bw21
994 | 0
995 |
996 |
997 | corr21
998 | 0
999 |
1000 |
1001 | freq21
1002 | 100e6
1003 |
1004 |
1005 | if_gain21
1006 | 20
1007 |
1008 |
1009 | gain21
1010 | 10
1011 |
1012 |
1013 | ant22
1014 |
1015 |
1016 |
1017 | bb_gain22
1018 | 20
1019 |
1020 |
1021 | bw22
1022 | 0
1023 |
1024 |
1025 | corr22
1026 | 0
1027 |
1028 |
1029 | freq22
1030 | 100e6
1031 |
1032 |
1033 | if_gain22
1034 | 20
1035 |
1036 |
1037 | gain22
1038 | 10
1039 |
1040 |
1041 | ant23
1042 |
1043 |
1044 |
1045 | bb_gain23
1046 | 20
1047 |
1048 |
1049 | bw23
1050 | 0
1051 |
1052 |
1053 | corr23
1054 | 0
1055 |
1056 |
1057 | freq23
1058 | 100e6
1059 |
1060 |
1061 | if_gain23
1062 | 20
1063 |
1064 |
1065 | gain23
1066 | 10
1067 |
1068 |
1069 | ant24
1070 |
1071 |
1072 |
1073 | bb_gain24
1074 | 20
1075 |
1076 |
1077 | bw24
1078 | 0
1079 |
1080 |
1081 | corr24
1082 | 0
1083 |
1084 |
1085 | freq24
1086 | 100e6
1087 |
1088 |
1089 | if_gain24
1090 | 20
1091 |
1092 |
1093 | gain24
1094 | 10
1095 |
1096 |
1097 | ant25
1098 |
1099 |
1100 |
1101 | bb_gain25
1102 | 20
1103 |
1104 |
1105 | bw25
1106 | 0
1107 |
1108 |
1109 | corr25
1110 | 0
1111 |
1112 |
1113 | freq25
1114 | 100e6
1115 |
1116 |
1117 | if_gain25
1118 | 20
1119 |
1120 |
1121 | gain25
1122 | 10
1123 |
1124 |
1125 | ant26
1126 |
1127 |
1128 |
1129 | bb_gain26
1130 | 20
1131 |
1132 |
1133 | bw26
1134 | 0
1135 |
1136 |
1137 | corr26
1138 | 0
1139 |
1140 |
1141 | freq26
1142 | 100e6
1143 |
1144 |
1145 | if_gain26
1146 | 20
1147 |
1148 |
1149 | gain26
1150 | 10
1151 |
1152 |
1153 | ant27
1154 |
1155 |
1156 |
1157 | bb_gain27
1158 | 20
1159 |
1160 |
1161 | bw27
1162 | 0
1163 |
1164 |
1165 | corr27
1166 | 0
1167 |
1168 |
1169 | freq27
1170 | 100e6
1171 |
1172 |
1173 | if_gain27
1174 | 20
1175 |
1176 |
1177 | gain27
1178 | 10
1179 |
1180 |
1181 | ant28
1182 |
1183 |
1184 |
1185 | bb_gain28
1186 | 20
1187 |
1188 |
1189 | bw28
1190 | 0
1191 |
1192 |
1193 | corr28
1194 | 0
1195 |
1196 |
1197 | freq28
1198 | 100e6
1199 |
1200 |
1201 | if_gain28
1202 | 20
1203 |
1204 |
1205 | gain28
1206 | 10
1207 |
1208 |
1209 | ant29
1210 |
1211 |
1212 |
1213 | bb_gain29
1214 | 20
1215 |
1216 |
1217 | bw29
1218 | 0
1219 |
1220 |
1221 | corr29
1222 | 0
1223 |
1224 |
1225 | freq29
1226 | 100e6
1227 |
1228 |
1229 | if_gain29
1230 | 20
1231 |
1232 |
1233 | gain29
1234 | 10
1235 |
1236 |
1237 | ant2
1238 |
1239 |
1240 |
1241 | bb_gain2
1242 | 20
1243 |
1244 |
1245 | bw2
1246 | 0
1247 |
1248 |
1249 | corr2
1250 | 0
1251 |
1252 |
1253 | freq2
1254 | 100e6
1255 |
1256 |
1257 | if_gain2
1258 | 20
1259 |
1260 |
1261 | gain2
1262 | 10
1263 |
1264 |
1265 | ant30
1266 |
1267 |
1268 |
1269 | bb_gain30
1270 | 20
1271 |
1272 |
1273 | bw30
1274 | 0
1275 |
1276 |
1277 | corr30
1278 | 0
1279 |
1280 |
1281 | freq30
1282 | 100e6
1283 |
1284 |
1285 | if_gain30
1286 | 20
1287 |
1288 |
1289 | gain30
1290 | 10
1291 |
1292 |
1293 | ant31
1294 |
1295 |
1296 |
1297 | bb_gain31
1298 | 20
1299 |
1300 |
1301 | bw31
1302 | 0
1303 |
1304 |
1305 | corr31
1306 | 0
1307 |
1308 |
1309 | freq31
1310 | 100e6
1311 |
1312 |
1313 | if_gain31
1314 | 20
1315 |
1316 |
1317 | gain31
1318 | 10
1319 |
1320 |
1321 | ant3
1322 |
1323 |
1324 |
1325 | bb_gain3
1326 | 20
1327 |
1328 |
1329 | bw3
1330 | 0
1331 |
1332 |
1333 | corr3
1334 | 0
1335 |
1336 |
1337 | freq3
1338 | 100e6
1339 |
1340 |
1341 | if_gain3
1342 | 20
1343 |
1344 |
1345 | gain3
1346 | 10
1347 |
1348 |
1349 | ant4
1350 |
1351 |
1352 |
1353 | bb_gain4
1354 | 20
1355 |
1356 |
1357 | bw4
1358 | 0
1359 |
1360 |
1361 | corr4
1362 | 0
1363 |
1364 |
1365 | freq4
1366 | 100e6
1367 |
1368 |
1369 | if_gain4
1370 | 20
1371 |
1372 |
1373 | gain4
1374 | 10
1375 |
1376 |
1377 | ant5
1378 |
1379 |
1380 |
1381 | bb_gain5
1382 | 20
1383 |
1384 |
1385 | bw5
1386 | 0
1387 |
1388 |
1389 | corr5
1390 | 0
1391 |
1392 |
1393 | freq5
1394 | 100e6
1395 |
1396 |
1397 | if_gain5
1398 | 20
1399 |
1400 |
1401 | gain5
1402 | 10
1403 |
1404 |
1405 | ant6
1406 |
1407 |
1408 |
1409 | bb_gain6
1410 | 20
1411 |
1412 |
1413 | bw6
1414 | 0
1415 |
1416 |
1417 | corr6
1418 | 0
1419 |
1420 |
1421 | freq6
1422 | 100e6
1423 |
1424 |
1425 | if_gain6
1426 | 20
1427 |
1428 |
1429 | gain6
1430 | 10
1431 |
1432 |
1433 | ant7
1434 |
1435 |
1436 |
1437 | bb_gain7
1438 | 20
1439 |
1440 |
1441 | bw7
1442 | 0
1443 |
1444 |
1445 | corr7
1446 | 0
1447 |
1448 |
1449 | freq7
1450 | 100e6
1451 |
1452 |
1453 | if_gain7
1454 | 20
1455 |
1456 |
1457 | gain7
1458 | 10
1459 |
1460 |
1461 | ant8
1462 |
1463 |
1464 |
1465 | bb_gain8
1466 | 20
1467 |
1468 |
1469 | bw8
1470 | 0
1471 |
1472 |
1473 | corr8
1474 | 0
1475 |
1476 |
1477 | freq8
1478 | 100e6
1479 |
1480 |
1481 | if_gain8
1482 | 20
1483 |
1484 |
1485 | gain8
1486 | 10
1487 |
1488 |
1489 | ant9
1490 |
1491 |
1492 |
1493 | bb_gain9
1494 | 20
1495 |
1496 |
1497 | bw9
1498 | 0
1499 |
1500 |
1501 | corr9
1502 | 0
1503 |
1504 |
1505 | freq9
1506 | 100e6
1507 |
1508 |
1509 | if_gain9
1510 | 20
1511 |
1512 |
1513 | gain9
1514 | 10
1515 |
1516 |
1517 | comment
1518 |
1519 |
1520 |
1521 | affinity
1522 |
1523 |
1524 |
1525 | args
1526 |
1527 |
1528 |
1529 | _enabled
1530 | True
1531 |
1532 |
1533 | _coordinate
1534 | (1048, 153)
1535 |
1536 |
1537 | _rotation
1538 | 0
1539 |
1540 |
1541 | id
1542 | osmosdr_sink_0
1543 |
1544 |
1545 | type
1546 | fc32
1547 |
1548 |
1549 | clock_source0
1550 |
1551 |
1552 |
1553 | time_source0
1554 |
1555 |
1556 |
1557 | clock_source1
1558 |
1559 |
1560 |
1561 | time_source1
1562 |
1563 |
1564 |
1565 | clock_source2
1566 |
1567 |
1568 |
1569 | time_source2
1570 |
1571 |
1572 |
1573 | clock_source3
1574 |
1575 |
1576 |
1577 | time_source3
1578 |
1579 |
1580 |
1581 | clock_source4
1582 |
1583 |
1584 |
1585 | time_source4
1586 |
1587 |
1588 |
1589 | clock_source5
1590 |
1591 |
1592 |
1593 | time_source5
1594 |
1595 |
1596 |
1597 | clock_source6
1598 |
1599 |
1600 |
1601 | time_source6
1602 |
1603 |
1604 |
1605 | clock_source7
1606 |
1607 |
1608 |
1609 | time_source7
1610 |
1611 |
1612 |
1613 | nchan
1614 | 1
1615 |
1616 |
1617 | num_mboards
1618 | 1
1619 |
1620 |
1621 | sample_rate
1622 | samp_rate
1623 |
1624 |
1625 | sync
1626 |
1627 |
1628 |
1629 |
1630 | qtgui_sink_x
1631 |
1632 | bw
1633 | samp_rate
1634 |
1635 |
1636 | alias
1637 |
1638 |
1639 |
1640 | fc
1641 | freq
1642 |
1643 |
1644 | freqchangevar
1645 | None
1646 |
1647 |
1648 | comment
1649 |
1650 |
1651 |
1652 | affinity
1653 |
1654 |
1655 |
1656 | _enabled
1657 | 0
1658 |
1659 |
1660 | fftsize
1661 | 1024
1662 |
1663 |
1664 | _coordinate
1665 | (1064, 402)
1666 |
1667 |
1668 | gui_hint
1669 |
1670 |
1671 |
1672 | _rotation
1673 | 0
1674 |
1675 |
1676 | id
1677 | qtgui_sink_x_0
1678 |
1679 |
1680 | maxoutbuf
1681 | 0
1682 |
1683 |
1684 | minoutbuf
1685 | 0
1686 |
1687 |
1688 | name
1689 | ""
1690 |
1691 |
1692 | plotconst
1693 | True
1694 |
1695 |
1696 | plotfreq
1697 | True
1698 |
1699 |
1700 | plottime
1701 | True
1702 |
1703 |
1704 | plotwaterfall
1705 | True
1706 |
1707 |
1708 | showports
1709 | True
1710 |
1711 |
1712 | showrf
1713 | False
1714 |
1715 |
1716 | type
1717 | complex
1718 |
1719 |
1720 | rate
1721 | 10
1722 |
1723 |
1724 | wintype
1725 | firdes.WIN_BLACKMAN_hARRIS
1726 |
1727 |
1728 |
1729 | rational_resampler_xxx
1730 |
1731 | alias
1732 |
1733 |
1734 |
1735 | comment
1736 | Interpolation 10
1737 | 8 Is our current with 1.03M
1738 |
1739 |
1740 | affinity
1741 |
1742 |
1743 |
1744 | decim
1745 | decimation
1746 |
1747 |
1748 | _enabled
1749 | True
1750 |
1751 |
1752 | fbw
1753 | 0
1754 |
1755 |
1756 | _coordinate
1757 | (800, 343)
1758 |
1759 |
1760 | _rotation
1761 | 0
1762 |
1763 |
1764 | id
1765 | rational_resampler_xxx_0
1766 |
1767 |
1768 | interp
1769 | interpolation
1770 |
1771 |
1772 | maxoutbuf
1773 | 0
1774 |
1775 |
1776 | minoutbuf
1777 | 0
1778 |
1779 |
1780 | taps
1781 |
1782 |
1783 |
1784 | type
1785 | ccc
1786 |
1787 |
1788 |
1789 | analog_wfm_tx_0
1790 | rational_resampler_xxx_0
1791 | 0
1792 | 0
1793 |
1794 |
1795 | blocks_wavfile_source_0
1796 | analog_wfm_tx_0
1797 | 0
1798 | 0
1799 |
1800 |
1801 | rational_resampler_xxx_0
1802 | osmosdr_sink_0
1803 | 0
1804 | 0
1805 |
1806 |
1807 | rational_resampler_xxx_0
1808 | qtgui_sink_x_0
1809 | 0
1810 | 0
1811 |
1812 |
1813 |
--------------------------------------------------------------------------------
/hrt.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import ctypes
5 | import sys
6 | from PyQt5 import Qt
7 | from distutils.version import StrictVersion
8 | from gnuradio import analog, audio, blocks, eng_notation, filter, gr, qtgui
9 | from gnuradio.eng_option import eng_option
10 | from gnuradio.filter import firdes
11 | from gnuradio.qtgui import Range, RangeWidget
12 | from optparse import OptionParser
13 | from shlex import split
14 | import fcntl, os, osmosdr, sip, subprocess, sys, time
15 |
16 | ## USER DEFINED LIBS, here for clarity purposes
17 | from lib import control, fmRX, fmTX
18 |
19 |
20 | def choose(choice):
21 | """Actions taken by user input"""
22 | global initLaunch
23 | global PROC
24 |
25 | if (choice == '1' or choice == '2') and initLaunch == 1:
26 | ctl.kill(PROC)
27 | if initLaunch == 0 and (choice == '1' or choice == '2'):
28 | initLaunch = 1
29 |
30 | if choice == '1':
31 | PROC = ctl.startTX()
32 | elif choice == '2':
33 | PROC = ctl.startRX()
34 | elif choice == '3':
35 | ctl.kill(PROC)
36 |
37 |
38 | def menu():
39 | """stdout for the menu"""
40 | print('\n1 - Send')
41 | print('2 - Receive')
42 | print('3 - Reset')
43 | print('4 - Quit\n')
44 | return ''
45 |
46 |
47 | if __name__ == '__main__':
48 |
49 | ## Bring in the pre-built GRC flow pre-reqs
50 | x11 = ctypes.cdll.LoadLibrary('libX11.so')
51 | x11.XInitThreads()
52 | if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
53 | style = gr.prefs().get_string('qtgui', 'style', 'raster')
54 | # Qt.QApplication.setGraphicsSystem(style)
55 | qapp = Qt.QApplication(sys.argv)
56 |
57 | ## Keep track of user actions
58 | initLaunch = 0
59 | PROC = ''
60 |
61 | ## Load our control module
62 | ctl = control.Control(rx = fmRX, tx = fmTX)
63 |
64 | ## Launcher
65 | while True:
66 | uChoice = input(menu())
67 | if uChoice == '4':
68 | ctl.kill(PROC)
69 | break
70 | sys.exit(0)
71 | else:
72 | choose(uChoice)
73 | sys.exit(0)
74 |
--------------------------------------------------------------------------------
/intro.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stryngs/hrt/88442b0117a5b6cec26a2aee02a9b2ccaeb3bffe/intro.mp4
--------------------------------------------------------------------------------
/lib/control.py:
--------------------------------------------------------------------------------
1 | import fcntl
2 | import os
3 | import subprocess
4 | import time
5 | from shlex import split
6 |
7 | class Control(object):
8 |
9 | def __init__(self, **kwargs):
10 | self.rx = kwargs.get('rx')
11 | self.tx = kwargs.get('tx')
12 |
13 |
14 | def kill(self, proc):
15 | """Reset the hackRF connection"""
16 | time.sleep(.3)
17 | try:
18 | proc.hide()
19 | proc.stop()
20 | except Exception as E:
21 | print(E)
22 |
23 | s1 = subprocess.Popen(split('lsusb'), stdout = subprocess.PIPE)
24 | s2 = subprocess.Popen(split('grep OpenMoko'), stdin = s1.stdout, stdout = subprocess.PIPE)
25 | oPut = s2.communicate()[0].split()
26 | bus = oPut[1].decode()
27 | dev = oPut[3].decode().split(':')[0]
28 | # hackRF = '/dev/bus/usb/{0}/{1}'.format(bus, dev)
29 | hackRF = '{0}/{1}'.format(bus, dev)
30 | os.system(f'bash ./bind.sh {hackRF}')
31 | # USBDEVFS_RESET = ord('U') << (4*2) | 20
32 | # with open(hackRF, 'w') as kOption:
33 | # fcntl.ioctl(kOption, USBDEVFS_RESET, 0)
34 |
35 |
36 | def startTX(self):
37 | """Launch tx capabilities"""
38 | action = self.tx.fmTX(self)
39 | action.start()
40 | action.show()
41 | return action
42 |
43 |
44 | def startRX(self):
45 | """Launch rx capabilities"""
46 | action = self.rx.fmRX(self)
47 | action.start()
48 | action.show()
49 | return action
50 |
--------------------------------------------------------------------------------
/lib/fmRX.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | #
5 | # SPDX-License-Identifier: GPL-3.0
6 | #
7 | # GNU Radio Python Flow Graph
8 | # Title: Fmrx
9 | # GNU Radio version: 3.10.1.1
10 | import time
11 |
12 | from packaging.version import Version as StrictVersion
13 |
14 | if __name__ == '__main__':
15 | import ctypes
16 | import sys
17 | if sys.platform.startswith('linux'):
18 | try:
19 | x11 = ctypes.cdll.LoadLibrary('libX11.so')
20 | x11.XInitThreads()
21 | except:
22 | print("Warning: failed to XInitThreads()")
23 |
24 | from PyQt5 import Qt
25 | from gnuradio import qtgui
26 | from gnuradio.filter import firdes
27 | import sip
28 | from gnuradio import analog
29 | from gnuradio import audio
30 | from gnuradio import blocks
31 | from gnuradio import filter
32 | from gnuradio import gr
33 | from gnuradio.fft import window
34 | import sys
35 | import signal
36 | from argparse import ArgumentParser
37 | from gnuradio.eng_arg import eng_float, intx
38 | from gnuradio import eng_notation
39 | from gnuradio.qtgui import Range, RangeWidget
40 | from PyQt5 import QtCore
41 | import osmosdr
42 | import time
43 |
44 | from lib import control
45 | ctl = control.Control()
46 |
47 |
48 | from gnuradio import qtgui
49 |
50 | class fmRX(gr.top_block, Qt.QWidget):
51 |
52 | def __init__(self, control):
53 | self.ctl = control
54 | gr.top_block.__init__(self, "Fmrx", catch_exceptions=True)
55 | Qt.QWidget.__init__(self)
56 | self.setWindowTitle("Fmrx")
57 | qtgui.util.check_set_qss()
58 | try:
59 | self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
60 | except:
61 | pass
62 | self.top_scroll_layout = Qt.QVBoxLayout()
63 | self.setLayout(self.top_scroll_layout)
64 | self.top_scroll = Qt.QScrollArea()
65 | self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
66 | self.top_scroll_layout.addWidget(self.top_scroll)
67 | self.top_scroll.setWidgetResizable(True)
68 | self.top_widget = Qt.QWidget()
69 | self.top_scroll.setWidget(self.top_widget)
70 | self.top_layout = Qt.QVBoxLayout(self.top_widget)
71 | self.top_grid_layout = Qt.QGridLayout()
72 | self.top_layout.addLayout(self.top_grid_layout)
73 |
74 | self.settings = Qt.QSettings("GNU Radio", "fmRX")
75 |
76 | try:
77 | if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
78 | self.restoreGeometry(self.settings.value("geometry").toByteArray())
79 | else:
80 | self.restoreGeometry(self.settings.value("geometry"))
81 | except:
82 | pass
83 |
84 | ##################################################
85 | # Variables
86 | ##################################################
87 | self.volume = volume = 1
88 | self.swap__ = swap__ = 0
89 | self.samp_in = samp_in = 10e6
90 | self.ptl = ptl = 1
91 | self.freq = freq = 103.7e6
92 | self.die__ = die__ = 0
93 | self.chan_width = chan_width = 200e3
94 |
95 | ##################################################
96 | # Blocks
97 | ##################################################
98 | self._volume_range = Range(0, 100, 1, 1, 200)
99 | self._volume_win = RangeWidget(self._volume_range, self.set_volume, "volume", "counter_slider", float, QtCore.Qt.Horizontal)
100 | self.top_layout.addWidget(self._volume_win)
101 | _ptl_check_box = Qt.QCheckBox("Mute")
102 | self._ptl_choices = {True: 0, False: 1}
103 | self._ptl_choices_inv = dict((v,k) for k,v in self._ptl_choices.items())
104 | self._ptl_callback = lambda i: Qt.QMetaObject.invokeMethod(_ptl_check_box, "setChecked", Qt.Q_ARG("bool", self._ptl_choices_inv[i]))
105 | self._ptl_callback(self.ptl)
106 | _ptl_check_box.stateChanged.connect(lambda i: self.set_ptl(self._ptl_choices[bool(i)]))
107 | self.top_layout.addWidget(_ptl_check_box)
108 | self._freq_range = Range(88e6, 108e6, 100e3, 103.7e6, 200)
109 | self._freq_win = RangeWidget(self._freq_range, self.set_freq, "Frequency Slider", "counter_slider", float, QtCore.Qt.Horizontal)
110 | self.top_layout.addWidget(self._freq_win)
111 | _swap___push_button = Qt.QPushButton('Switch to TX')
112 | _swap___push_button = Qt.QPushButton('Switch to TX')
113 | self._swap___choices = {'Pressed': 1, 'Released': 0}
114 | _swap___push_button.pressed.connect(lambda: self.set_swap__(self._swap___choices['Pressed']))
115 | _swap___push_button.released.connect(lambda: self.set_swap__(self._swap___choices['Released']))
116 | self.top_layout.addWidget(_swap___push_button)
117 | self.rational_resampler_xxx_1 = filter.rational_resampler_ccc(
118 | interpolation=12,
119 | decimation=5,
120 | taps=[],
121 | fractional_bw=0)
122 | self.qtgui_sink_x_1 = qtgui.sink_c(
123 | 1024, #fftsize
124 | window.WIN_BLACKMAN_hARRIS, #wintype
125 | freq, #fc
126 | samp_in, #bw
127 | "", #name
128 | True, #plotfreq
129 | True, #plotwaterfall
130 | True, #plottime
131 | True, #plotconst
132 | None # parent
133 | )
134 | self.qtgui_sink_x_1.set_update_time(1.0/10)
135 | self._qtgui_sink_x_1_win = sip.wrapinstance(self.qtgui_sink_x_1.qwidget(), Qt.QWidget)
136 |
137 | self.qtgui_sink_x_1.enable_rf_freq(True)
138 |
139 | self.top_layout.addWidget(self._qtgui_sink_x_1_win)
140 | self.osmosdr_source_0 = osmosdr.source(
141 | args="numchan=" + str(1) + " " + ''
142 | )
143 | self.osmosdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t())
144 | self.osmosdr_source_0.set_sample_rate(samp_in)
145 | self.osmosdr_source_0.set_center_freq(freq, 0)
146 | self.osmosdr_source_0.set_freq_corr(0, 0)
147 | self.osmosdr_source_0.set_dc_offset_mode(0, 0)
148 | self.osmosdr_source_0.set_iq_balance_mode(0, 0)
149 | self.osmosdr_source_0.set_gain_mode(False, 0)
150 | self.osmosdr_source_0.set_gain(0, 0)
151 | self.osmosdr_source_0.set_if_gain(20, 0)
152 | self.osmosdr_source_0.set_bb_gain(20, 0)
153 | self.osmosdr_source_0.set_antenna('', 0)
154 | self.osmosdr_source_0.set_bandwidth(0, 0)
155 | self.low_pass_filter_0 = filter.fir_filter_ccf(
156 | int(10e6/chan_width),
157 | firdes.low_pass(
158 | 1,
159 | 10e6,
160 | 75e3,
161 | 25e3,
162 | window.WIN_HAMMING,
163 | 6.76))
164 | _die___push_button = Qt.QPushButton('GUI Kill')
165 | _die___push_button = Qt.QPushButton('GUI Kill')
166 | self._die___choices = {'Pressed': 1, 'Released': 0}
167 | _die___push_button.pressed.connect(lambda: self.set_die__(self._die___choices['Pressed']))
168 | _die___push_button.released.connect(lambda: self.set_die__(self._die___choices['Released']))
169 | self.top_layout.addWidget(_die___push_button)
170 | self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
171 | self.blocks_multiply_const_vxx_0 = blocks.multiply_const_ff(volume)
172 | self.audio_stop = blocks.multiply_const_ff(ptl)
173 | self.audio_sink_0 = audio.sink(48000, '', True)
174 | self.analog_wfm_rcv_0 = analog.wfm_rcv(
175 | quad_rate=480e3,
176 | audio_decimation=10,
177 | )
178 | self.analog_sig_source_x_0 = analog.sig_source_c(samp_in, analog.GR_COS_WAVE, 1000, 1, 0, 0)
179 |
180 |
181 | ##################################################
182 | # Connections
183 | ##################################################
184 | self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1))
185 | self.connect((self.analog_wfm_rcv_0, 0), (self.audio_stop, 0))
186 | self.connect((self.audio_stop, 0), (self.blocks_multiply_const_vxx_0, 0))
187 | self.connect((self.blocks_multiply_const_vxx_0, 0), (self.audio_sink_0, 0))
188 | self.connect((self.blocks_multiply_xx_0, 0), (self.low_pass_filter_0, 0))
189 | self.connect((self.low_pass_filter_0, 0), (self.rational_resampler_xxx_1, 0))
190 | self.connect((self.osmosdr_source_0, 0), (self.blocks_multiply_xx_0, 0))
191 | self.connect((self.osmosdr_source_0, 0), (self.qtgui_sink_x_1, 0))
192 | self.connect((self.rational_resampler_xxx_1, 0), (self.analog_wfm_rcv_0, 0))
193 |
194 |
195 | def closeEvent(self, event):
196 | self.settings = Qt.QSettings("GNU Radio", "fmRX")
197 | self.settings.setValue("geometry", self.saveGeometry())
198 | self.stop()
199 | self.wait()
200 |
201 | event.accept()
202 |
203 | def get_volume(self):
204 | return self.volume
205 |
206 | def set_volume(self, volume):
207 | self.volume = volume
208 | self.blocks_multiply_const_vxx_0.set_k(self.volume)
209 |
210 | def get_swap__(self):
211 | return self.swap__
212 |
213 | def set_swap__(self, swap__):
214 | self.ctl.kill(self)
215 | time.sleep(2)
216 | self.ctl.startTX()
217 | self.swap__ = swap__
218 |
219 | def get_samp_in(self):
220 | return self.samp_in
221 |
222 | def set_samp_in(self, samp_in):
223 | self.samp_in = samp_in
224 | self.analog_sig_source_x_0.set_sampling_freq(self.samp_in)
225 | self.osmosdr_source_0.set_sample_rate(self.samp_in)
226 | self.qtgui_sink_x_1.set_frequency_range(self.freq, self.samp_in)
227 |
228 | def get_ptl(self):
229 | return self.ptl
230 |
231 | def set_ptl(self, ptl):
232 | self.ptl = ptl
233 | self._ptl_callback(self.ptl)
234 | self.audio_stop.set_k(self.ptl)
235 |
236 | def get_freq(self):
237 | return self.freq
238 |
239 | def set_freq(self, freq):
240 | self.freq = freq
241 | self.osmosdr_source_0.set_center_freq(self.freq, 0)
242 | self.qtgui_sink_x_1.set_frequency_range(self.freq, self.samp_in)
243 |
244 | def get_die__(self):
245 | return self.die__
246 |
247 | def set_die__(self, die__):
248 | self.die__ = die__
249 |
250 | def get_chan_width(self):
251 | return self.chan_width
252 |
253 | def set_chan_width(self, chan_width):
254 | self.chan_width = chan_width
255 |
256 |
257 |
258 |
259 | def main(top_block_cls=fmRX, options=None):
260 |
261 | if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
262 | style = gr.prefs().get_string('qtgui', 'style', 'raster')
263 | Qt.QApplication.setGraphicsSystem(style)
264 | qapp = Qt.QApplication(sys.argv)
265 |
266 | tb = top_block_cls()
267 |
268 | tb.start()
269 |
270 | tb.show()
271 |
272 | def sig_handler(sig=None, frame=None):
273 | tb.stop()
274 | tb.wait()
275 |
276 | Qt.QApplication.quit()
277 |
278 | signal.signal(signal.SIGINT, sig_handler)
279 | signal.signal(signal.SIGTERM, sig_handler)
280 |
281 | timer = Qt.QTimer()
282 | timer.start(500)
283 | timer.timeout.connect(lambda: None)
284 |
285 | qapp.exec_()
286 |
287 | if __name__ == '__main__':
288 | main()
289 |
--------------------------------------------------------------------------------
/lib/fmTX.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | #
5 | # SPDX-License-Identifier: GPL-3.0
6 | #
7 | # GNU Radio Python Flow Graph
8 | # Title: Fmtx
9 | # GNU Radio version: 3.10.1.1
10 |
11 | from packaging.version import Version as StrictVersion
12 |
13 | if __name__ == '__main__':
14 | import ctypes
15 | import sys
16 | if sys.platform.startswith('linux'):
17 | try:
18 | x11 = ctypes.cdll.LoadLibrary('libX11.so')
19 | x11.XInitThreads()
20 | except:
21 | print("Warning: failed to XInitThreads()")
22 |
23 | from PyQt5 import Qt
24 | from gnuradio import qtgui
25 | from gnuradio.filter import firdes
26 | import sip
27 | from gnuradio import analog
28 | from gnuradio import audio
29 | from gnuradio import blocks
30 | from gnuradio import filter
31 | from gnuradio import gr
32 | from gnuradio.fft import window
33 | import sys
34 | import signal
35 | from argparse import ArgumentParser
36 | from gnuradio.eng_arg import eng_float, intx
37 | from gnuradio import eng_notation
38 | from gnuradio.qtgui import Range, RangeWidget
39 | from PyQt5 import QtCore
40 | import osmosdr
41 | import time
42 |
43 | from lib import control
44 | ctl = control.Control()
45 |
46 |
47 |
48 | from gnuradio import qtgui
49 |
50 | class fmTX(gr.top_block, Qt.QWidget):
51 |
52 | def __init__(self, control):
53 | self.ctl = control
54 | gr.top_block.__init__(self, "Fmtx", catch_exceptions=True)
55 | Qt.QWidget.__init__(self)
56 | self.setWindowTitle("Fmtx")
57 | qtgui.util.check_set_qss()
58 | try:
59 | self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
60 | except:
61 | pass
62 | self.top_scroll_layout = Qt.QVBoxLayout()
63 | self.setLayout(self.top_scroll_layout)
64 | self.top_scroll = Qt.QScrollArea()
65 | self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
66 | self.top_scroll_layout.addWidget(self.top_scroll)
67 | self.top_scroll.setWidgetResizable(True)
68 | self.top_widget = Qt.QWidget()
69 | self.top_scroll.setWidget(self.top_widget)
70 | self.top_layout = Qt.QVBoxLayout(self.top_widget)
71 | self.top_grid_layout = Qt.QGridLayout()
72 | self.top_layout.addLayout(self.top_grid_layout)
73 |
74 | self.settings = Qt.QSettings("GNU Radio", "fmTX")
75 |
76 | try:
77 | if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
78 | self.restoreGeometry(self.settings.value("geometry").toByteArray())
79 | else:
80 | self.restoreGeometry(self.settings.value("geometry"))
81 | except:
82 | pass
83 |
84 | ##################################################
85 | # Variables
86 | ##################################################
87 | self.swap__ = swap__ = 0
88 | self.samp_rate = samp_rate = 1.323e6
89 | self.ptt = ptt = 0
90 | self.freq = freq = 103.7e6
91 | self.die__ = die__ = 0
92 | self.audio_samp_in = audio_samp_in = 44100
93 |
94 | ##################################################
95 | # Blocks
96 | ##################################################
97 | self._samp_rate_range = Range(0, 6.00e6, 1, 1.323e6, 200)
98 | self._samp_rate_win = RangeWidget(self._samp_rate_range, self.set_samp_rate, "Sample Rate Slider", "counter_slider", float, QtCore.Qt.Horizontal)
99 | self.top_layout.addWidget(self._samp_rate_win)
100 | _ptt_push_button = Qt.QPushButton('')
101 | _ptt_push_button = Qt.QPushButton('ptt')
102 | self._ptt_choices = {'Pressed': 1, 'Released': 0}
103 | _ptt_push_button.pressed.connect(lambda: self.set_ptt(self._ptt_choices['Pressed']))
104 | _ptt_push_button.released.connect(lambda: self.set_ptt(self._ptt_choices['Released']))
105 | self.top_layout.addWidget(_ptt_push_button)
106 | self._freq_range = Range(88e6, 108e6, 100e3, 103.7e6, 200)
107 | self._freq_win = RangeWidget(self._freq_range, self.set_freq, "Frequency Slider", "counter_slider", float, QtCore.Qt.Horizontal)
108 | self.top_layout.addWidget(self._freq_win)
109 | _swap___push_button = Qt.QPushButton('Switch to RX')
110 | _swap___push_button = Qt.QPushButton('Switch to RX')
111 | self._swap___choices = {'Pressed': 1, 'Released': 0}
112 | _swap___push_button.pressed.connect(lambda: self.set_swap__(self._swap___choices['Pressed']))
113 | _swap___push_button.released.connect(lambda: self.set_swap__(self._swap___choices['Released']))
114 | self.top_layout.addWidget(_swap___push_button)
115 | self.rational_resampler_xxx_0 = filter.rational_resampler_ccc(
116 | interpolation=10,
117 | decimation=1,
118 | taps=[],
119 | fractional_bw=0)
120 | self.qtgui_sink_x_0 = qtgui.sink_c(
121 | 1024, #fftsize
122 | window.WIN_BLACKMAN_hARRIS, #wintype
123 | freq, #fc
124 | samp_rate, #bw
125 | "", #name
126 | True, #plotfreq
127 | True, #plotwaterfall
128 | True, #plottime
129 | True, #plotconst
130 | None # parent
131 | )
132 | self.qtgui_sink_x_0.set_update_time(1.0/10)
133 | self._qtgui_sink_x_0_win = sip.wrapinstance(self.qtgui_sink_x_0.qwidget(), Qt.QWidget)
134 |
135 | self.qtgui_sink_x_0.enable_rf_freq(True)
136 |
137 | self.top_layout.addWidget(self._qtgui_sink_x_0_win)
138 | self.osmosdr_sink_0 = osmosdr.sink(
139 | args="numchan=" + str(1) + " " + ''
140 | )
141 | self.osmosdr_sink_0.set_time_unknown_pps(osmosdr.time_spec_t())
142 | self.osmosdr_sink_0.set_sample_rate(samp_rate)
143 | self.osmosdr_sink_0.set_center_freq(freq, 0)
144 | self.osmosdr_sink_0.set_freq_corr(0, 0)
145 | self.osmosdr_sink_0.set_gain(14, 0)
146 | self.osmosdr_sink_0.set_if_gain(47, 0)
147 | self.osmosdr_sink_0.set_bb_gain(0, 0)
148 | self.osmosdr_sink_0.set_antenna('', 0)
149 | self.osmosdr_sink_0.set_bandwidth(0, 0)
150 | _die___push_button = Qt.QPushButton('GUI Kill')
151 | _die___push_button = Qt.QPushButton('GUI Kill')
152 | self._die___choices = {'Pressed': 1, 'Released': 0}
153 | _die___push_button.pressed.connect(lambda: self.set_die__(self._die___choices['Pressed']))
154 | _die___push_button.released.connect(lambda: self.set_die__(self._die___choices['Released']))
155 | self.top_layout.addWidget(_die___push_button)
156 | self.blocks_multiply_const_vxx_0 = blocks.multiply_const_cc(ptt)
157 | self.audio_source_0 = audio.source(44100, '', True)
158 | self.analog_wfm_tx_0 = analog.wfm_tx(
159 | audio_rate=audio_samp_in,
160 | quad_rate=audio_samp_in * 3,
161 | tau=75e-6,
162 | max_dev=75e3,
163 | fh=-1.0,
164 | )
165 |
166 |
167 | ##################################################
168 | # Connections
169 | ##################################################
170 | self.connect((self.analog_wfm_tx_0, 0), (self.rational_resampler_xxx_0, 0))
171 | self.connect((self.audio_source_0, 0), (self.analog_wfm_tx_0, 0))
172 | self.connect((self.blocks_multiply_const_vxx_0, 0), (self.osmosdr_sink_0, 0))
173 | self.connect((self.blocks_multiply_const_vxx_0, 0), (self.qtgui_sink_x_0, 0))
174 | self.connect((self.rational_resampler_xxx_0, 0), (self.blocks_multiply_const_vxx_0, 0))
175 |
176 |
177 | def closeEvent(self, event):
178 | self.settings = Qt.QSettings("GNU Radio", "fmTX")
179 | self.settings.setValue("geometry", self.saveGeometry())
180 | self.stop()
181 | self.wait()
182 |
183 | event.accept()
184 |
185 | def get_swap__(self):
186 | return self.swap__
187 |
188 | def set_swap__(self, swap__):
189 | self.ctl.kill(self)
190 | self.ctl.startRX()
191 | self.swap__ = swap__
192 |
193 | def get_samp_rate(self):
194 | return self.samp_rate
195 |
196 | def set_samp_rate(self, samp_rate):
197 | self.samp_rate = samp_rate
198 | self.osmosdr_sink_0.set_sample_rate(self.samp_rate)
199 | self.qtgui_sink_x_0.set_frequency_range(self.freq, self.samp_rate)
200 |
201 | def get_ptt(self):
202 | return self.ptt
203 |
204 | def set_ptt(self, ptt):
205 | self.ptt = ptt
206 | self.blocks_multiply_const_vxx_0.set_k(self.ptt)
207 |
208 | def get_freq(self):
209 | return self.freq
210 |
211 | def set_freq(self, freq):
212 | self.freq = freq
213 | self.osmosdr_sink_0.set_center_freq(self.freq, 0)
214 | self.qtgui_sink_x_0.set_frequency_range(self.freq, self.samp_rate)
215 |
216 | def get_die__(self):
217 | return self.die__
218 |
219 | def set_die__(self, die__):
220 | self.die__ = die__
221 |
222 | def get_audio_samp_in(self):
223 | return self.audio_samp_in
224 |
225 | def set_audio_samp_in(self, audio_samp_in):
226 | self.audio_samp_in = audio_samp_in
227 |
228 |
229 |
230 |
231 | def main(top_block_cls=fmTX, options=None):
232 |
233 | if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
234 | style = gr.prefs().get_string('qtgui', 'style', 'raster')
235 | Qt.QApplication.setGraphicsSystem(style)
236 | qapp = Qt.QApplication(sys.argv)
237 |
238 | tb = top_block_cls()
239 |
240 | tb.start()
241 |
242 | tb.show()
243 |
244 | def sig_handler(sig=None, frame=None):
245 | tb.stop()
246 | tb.wait()
247 |
248 | Qt.QApplication.quit()
249 |
250 | signal.signal(signal.SIGINT, sig_handler)
251 | signal.signal(signal.SIGTERM, sig_handler)
252 |
253 | timer = Qt.QTimer()
254 | timer.start(500)
255 | timer.timeout.connect(lambda: None)
256 |
257 | qapp.exec_()
258 |
259 | if __name__ == '__main__':
260 | main()
261 |
--------------------------------------------------------------------------------