├── .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 | --------------------------------------------------------------------------------