This commit is contained in:
RocketGod
2022-09-22 10:41:47 -07:00
parent e51463a5d1
commit 8347d2f50e
565 changed files with 165005 additions and 0 deletions

View File

@ -0,0 +1,389 @@
# Changelog
__This changelog file will not be updated anymore__.
Instead, the recent changes can be found at the releases page: https://github.com/jopohl/urh/releases
## v2.5.3 (19/12/2018)
### Bugfixes
- fix crash when using spectrum analyzer with GNU Radio backend [#588](https://github.com/jopohl/urh/pull/588)
## v2.5.2 (10/12/2018)
### Bugfixes
- certain windows (e.g. decoding) can't be closed on OSX
- prevent crash in substitution encoding
- consider alignment offset when showing selected labels
### Adjustments
- remove ```Save and Close``` of fuzzing dialog, as closing means saving here anyway
### New features
- make application __font size__ configurable in ``` Options ``` -> ``` View ```
## v2.5.1 (25/11/2018)
### Bugfixes
- improve stability when capturing with SoundCard
- fix bug making the docker container crash at startup
- stop simulation instantly after finishing
## v2.5.0 (19/11/2018)
### New features
- Add native support for PlutoSDR [#574](https://github.com/jopohl/urh/pull/574)
### Bugfixes
- do not add URH to autostart on windows [#569](https://github.com/jopohl/urh/pull/569)
- save button was not shown when change on saved signal was undone [#571](https://github.com/jopohl/urh/pull/571)
- y scale got falsely reset on save [#573](https://github.com/jopohl/urh/pull/573)
## v2.4.2 (11/11/2018)
### New features
- enhance settings for RTL-SDR [#561](https://github.com/jopohl/urh/pull/561) + [#566](https://github.com/jopohl/urh/pull/566)
- ergonomic improvements [#564](https://github.com/jopohl/urh/pull/564)
### Bugfixes
- fix problem with set reference message shortcut [#559](https://github.com/jopohl/urh/pull/559)
- fix loading decodings and centralized place for decodings [#563](https://github.com/jopohl/urh/pull/563)
## v2.4.1 (23/10/2018)
### New features
- Add an option to disable automatic detection of interpretation parameters for newly loaded signals to the ``` Edit ``` menu [#555](https://github.com/jopohl/urh/pull/555)
### Bugfixes
- fix off by one error when creating a new label in analysis
- fix crash when opening a project with saved dc correction setting
## v2.4.0 (19/10/2018)
### New features
- added __font size zoom__ to table views (analysis/generator/simulator); more details in [#546](https://github.com/jopohl/urh/pull/546)
- greatly enhance __accuracy of automatic interpretation__ [#550](https://github.com/jopohl/urh/pull/550)
- added __DC correction__ option to recording dialogs and as a new filter type in Interpretation [#552](https://github.com/jopohl/urh/pull/552)
### Improvements
- ignore case when searching for hex values in analysis [#544](https://github.com/jopohl/urh/pull/544)
- RSSI is now given in dBm [#549](https://github.com/jopohl/urh/pull/549)
### Bugfixes
- Fix display of RSSI indicator in Interpretation [#547](https://github.com/jopohl/urh/pull/547)
## v2.3.0 (28/09/2018)
### New features
- added native support for BladeRF [#524](https://github.com/jopohl/urh/pull/524)
- added backward compatibility for SDRPlay < 2.13 [#528](https://github.com/jopohl/urh/pull/528)
- improved UI for message type and label configuration in analysis [#532](https://github.com/jopohl/urh/pull/532)
- rename __close all__ action to __close all files__ for more clarity [#532](https://github.com/jopohl/urh/pull/532)
- added a __close project__ action [#532](https://github.com/jopohl/urh/pull/532)
## v2.2.4 (30/08/2018)
### Bugfixes
- fix scaling of modulated preview in modulation dialog [#523](https://github.com/jopohl/urh/pull/523)
- improve default parameters for PSK modulation in modulation dialog [#523](https://github.com/jopohl/urh/pull/523)
## v2.2.3 (28/07/2018)
### New features
- allow save and load of binary protocols (``` .bin ``` files) [#488](https://github.com/jopohl/urh/pull/488)
- improve bootstrap of simulator messages [#500](https://github.com/jopohl/urh/pull/500)
- auto assign destination when dropping messages to simulator
- show participant address in participant legend if present
- auto assign participant address when clicking analyze button in analysis based on SRC address label
- consider API changes of SDRPlay 2.13 [#508](https://github.com/jopohl/urh/pull/508) thanks [@mehdideveloper](https://github.com/mehdideveloper)
- also consider participant address (next to RSSI) when auto assigning participants in analysis [#512](https://github.com/jopohl/urh/pull/512)
- Clear button stays enabled during operation so e.g. recordings can be cleared live [#514](https://github.com/jopohl/urh/pull/514)
### Bugfixes
- antenna selection is not saved when reopening dialog [#494](https://github.com/jopohl/urh/pull/494)
- hiding multiple rows at once in analysis not working properly [#499](https://github.com/jopohl/urh/pull/499)
## v2.2.2 (01/07/2018)
This release removes the ``` config.pxi ``` requirement which caused problems on Arch Linux and Gentoo during installation. More details in PR [#484](https://github.com/jopohl/urh/pull/484).
## v2.2.1 (30/06/2018)
This is a hotfix release which targets issue [#481](https://github.com/jopohl/urh/issues/481), so if you had problems with a missing ``` config.pxi ``` make sure to use this version.
## v2.2.0 (29/06/2018)
__Import announcement if you build URH manually__: Cython is now a __required__ dependency to build URH. If you install URH from PyPi (with ``` pip ```) or use the ``` .msi ``` installer you will not notice any difference. However, if you run URH from source you need to install cython which is as easy as ``` python3 -m pip install cython ```.
- [#478](https://github.com/jopohl/urh/pull/478) - make message pause configurable in simulator
- [#476](https://github.com/jopohl/urh/pull/476) - add padding when sending very short messages with soundcard
- [#473](https://github.com/jopohl/urh/pull/473) - move ``` .desktop ``` file to ``` data ``` folder. __Important if you build a package of URH__
- [#471](https://github.com/jopohl/urh/pull/471) - make relative external programs paths relative to project path
- [#470](https://github.com/jopohl/urh/pull/470) - improve conditional compiling of native device extensions
- [#469](https://github.com/jopohl/urh/pull/469) - improve device selection in options, use a table instead of a list view
- [#468](https://github.com/jopohl/urh/pull/468) - improve python2 interpreter settings for GNU Radio backend with empty ``` urh.ini ```
- [#458](https://github.com/jopohl/urh/pull/458) - add alignment action to analysis
![alignment image](https://i.imgur.com/xQt7H7Y.png)
## v2.1.1 (17/06/2018)
This release updates the bundled SDR drivers on Windows.
__Furthermore, this release adds native device support for 32 bit windows__.
Bugfix:
- a bug was fixed where sample rate of a signal was not written correctly to wav file when exporting as wav
## v2.1.0 (01/06/2018)
The highlight of this release is a __Command Line Interface__ (CLI) for the Universal Radio Hacker.
Learn more about this new feature [in the wiki](https://github.com/jopohl/urh/wiki/Command-Line-Interface).
Moreover, these two features were added:
- Add export features #437
- make refin and refout configurable for CRC #439
These bugs were fixed:
- fix #441 (Reference signal is not kept when disabling and re-enabling "Mark diffs in protocol")
- fix #442 (consider hidden zeros for show selection in interpretation)
- fix #444 (Message Break error box popping up too early)
- fix #448 (Include pyaudio in windows package for soundcard support)
## v2.0.4 (06/05/2018)
This version fixes a bug when importing 24 bit wav files on windows.
## v2.0.3 (06/05/2018)
- Improve external program behaviour in Simulator #417
- fix #421
- Improve simulator useability #422
- Improve transcript for external programs #425
- make endianness selectable in order column #428
- UI improvements #430
- add support for soundcards as new SDR device #433
- Multi device support #432
- add support for 24bit wav #434
## v2.0.2 (22/04/2018)
- Improve external program behaviour in Simulator #417
- fix #421
- Improve simulator useability #422
- Improve transcript for external programs #425
- make endianness selectable in order column #428
- UI improvements #430
## v2.0.1 (23/03/2018)
Changes:
- improve appearance of splitters
- add adaptive noise feature for protocol sniffer and simulator (#401)
- improve native device rebuild button in options + added a new button to view the build log there (only visible after hitting the rebuild button) (#402)
- improve performance of CRC calculation (#412)
- save number of sending repeats when changed in send dialog (#415)
## v2.0.0 (28/02/2018)
URH 2.0 is here! This release adds a new tab to the main interface. This __Simulator__ tab enables you to simulate certain devices and crack even sophisticated security mechanisms like challenge response procedures. Learn more about this new feature [on this wiki page](https://github.com/jopohl/urh/wiki/Simulator).
Moreover, the overall performance and stability of URH increases with 2.0. The most notable changes are:
- improve accuracy when sending messages with short pauses
- improve accuracy of protocol sniffer
- allow setting lower frequencies for HackRF (#396)
- consider latest changes of LimeSuite API (#397)
- add timestamp to protocol sniffer output (#392)
- improve performance of modulations
- improve performance of filtering in analysis
- improve performance when starting sending
- improve send accuracy of HackRF
- improve performance when filtering messages in Analysis
## v1.9.2 (19/01/2018)
- Add BCD (Binary Coded Decimal) as new display format #386
- Make bit order configurable in analysis view table #390
- Improved loading of protocol files
## v1.9.1 (17/12/2017)
This is a hotfix release that fixes an error with HackRF receiving (#379).
## v1.9.0 (15/12/2017)
- added native support for SDRplay (#378)
- improved performance for continuous send mode
- added collapsable comboboxes to device dialog
## v1.8.17 (04/12/2017)
Changes:
- show warning at bottom if no project loaded (#374)
- if no project is opened an new project is created, add currently opnened files to new project (#374)
- add --version flag to command line script #375 (thanks to @Funcan for the initial work)
- Enable specifying a custom python 2 interpreter on Windows (#372)
## v1.8.16 (30/11/2017)
This release fixes an issue on Windows where processes ended with an error (#370).
Furthermore, the NetworkSDR can now be used in continuous send mode (#369).
## v1.8.15 (27/11/2017)
This release fixes a problem with GNU Radio backend on Windows mentioned in #366 and #368.
## v1.8.14 (26/11/2017)
This release fixes an overflow error (#364) when modulating very long messages in Generator.
The highlight of this release is an enhanced spectrum analyzer (#365) with __increased performance__ and a __waterfall plot__ to have a different, time based perspective on the spectrum.
![spectrum](https://user-images.githubusercontent.com/18219846/33239754-03bb62f6-d2a9-11e7-80aa-059df7b0b133.png)
## v1.8.13 (18/11/2017)
This release enhances the stability for sending and receiving with all SDRs. Especially, it fixes nasty bug #360 which affected HackRF users under Windows.
Furthermore, the WAV file support was greatly enhanced. Now, you can use WAV files from SDR# (fix #359).
## v1.8.12 (16/11/2017)
This release fixes the following issues:
- fix #355 - added a CSV import wizard for generic support of USB oscilloscopes
- fix #358 - MSI version of URH did not start on Windows
__So if you had trouble to install the previous version on Windows make sure you use this one.__
## v1.8.11 (13/11/2017)
The following issues were fixed in this release:
- fix #343 - crash when entering bits on empty position in Analysis / Generation
- fix #344 - bandpass filter can now also work with negative frequencies
- fix #346 - bandpass filter operations now run in a separate process and can be canceled with the ESC button
- fix #349 - added a csv import to work with USB oscilloscopes
- fix #352 - added a advanced modulation menu in Interpretation where a minimum message length for ASK can be configured
## v1.8.10 (21/10/2017)
This release fixes a crash when pressing the replay button in interpretation tab.
## (21/10/2017)
## v1.8.8 (16/10/2017)
These issues were fixed in this release:
- fix #339 - keep tree in analysis collapsed if check box toggled
- fix #338 - make pause threshold configurable in interpretation
- fix #333 - keep search string if search fails in analysis
## v1.8.7 (18/09/2017)
This release fixes the following issues:
- [#330](https://github.com/jopohl/urh/pull/330) - Improve modulation for large protocols
- [#329](https://github.com/jopohl/urh/pull/329) - Improve handling of protocol files
- [#324](https://github.com/jopohl/urh/issues/324) - LimeSDR: Failed to receive stream
- [#297](https://github.com/jopohl/urh/issues/297) - LimeSDR RX antenna always LNA_L
## v1.8.6 (06/09/2017)
This release fixes two crashes as described in #327.
## v1.8.5 (30/08/2017)
This release fixes #323 .
## v1.8.4 (28/08/2017)
This is a hotfix release that fixes native device extensions on Windows when conflicting SDR software is installed.
Furthermore, a health check button for native device extensions was added to options.
Details can be found in this PR: #321
## Version 1.8.0 (24/08/2017)
This release adds two highly demanded features to URH: __Spectrogram View__ and __Channel Separation__. Learn more about them in the [wiki](https://github.com/jopohl/urh/wiki/Spectrogram) and keep hacking like a boss!
## Version 1.7.1 (19/07/2017)
This release adds installers for Windows. If you use the new installer and should get an error about missing ``` api-ms-win-crt-runtime-l1-1-0.dll ```, run Windows Update or directly install [KB2999226](https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows).
__It is recommended to use the 64 bit version (amd64) of URH on Windows__, because 32 bit version has no native device support.
This release also fixes some bugs:
- Fix exhaustive fuzzing mode
- Fix a rare crash in Generator tab when performing undo
- fix checksum assignment to fuzzed messages when sending/generating data
- refresh estimated time in generator if pause was edited
## Version 1.7.0 (14/07/2017)
The highlight of this release is support for __generic checksums__. You can define custom CRC polynomials or use predefined ones.
Learn more about this feature [in the wiki](https://github.com/jopohl/urh/wiki/Checksums).
Other fixes/features include:
- "Edit all" action in pause menu of generator tab
- Open Project now additionally possible by opening the project file
- bootstrapping of modulation when dropping first protocol to generator table
- new icons and improved UI
- improved auto detection of carrier frequency for modulation
- improved ASK demodulation algorithm
- fix a bug with relative paths on OS X
- fix selection behavior when extending selection with shift
- fix #306
- fix #308
- fix #310
- fix #311
## Hotfix for Windows wheels (11/06/2017)
This is a hotfix release that fixes dependencies in the precompiled wheels for Windows which were introduced in the previous release.
## Version 1.6.5 (11/06/2017)
This release brings the following changes:
- fix #278: added a __repeat button__ to fuzzing dialog, next to the table with fuzzing values
- fix #284: fixed behaviour: "Your selection is empty!" sometimes pops up when creating a new signal from signal
- fix #285: fixed a rare crash when undoing a crop action
- fix #281: Optimized performance of protocol synchronization in Interpretation
- fix #286: improved context menu in Analysis
- fix #288: UI improvements: remove unneeded borders and increase visibility of splitter handle
- fix #290: fixed a crash occurring when pressing Analysis button in certain circumstances
- fix #291: created precompiled wheels for windows on PyPI, so no C++ compiler needed anymore.
- improved visual appearance of comboboxes in protocol label list view
## Add filter to Interpretation (28/05/2017)
This release brings a filter button to the Interpretation phase:
![bildschirmfoto_2017-05-28_12-29-58](https://cloud.githubusercontent.com/assets/18219846/26528462/a20c36ce-43ac-11e7-815e-0d929aa20cb8.png)
This way, you can smooth your signals right inside URH or unlock the full power of DSP fir filters by defining custom filters through the menu!

View File

@ -0,0 +1,40 @@
FROM ubuntu:18.04
LABEL maintainer="Johannes.Pohl90@gmail.com"
ENV TZ=Europe/Berlin
# Debug QT plugins by exporting QT_DEBUG_PLUGINS=1 before running URH
# To allow docker to connect to X run xhost +local:docker
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
&& apt-get -qq update \
&& apt-get -qq install software-properties-common \
&& add-apt-repository -y ppa:myriadrf/drivers && apt-get -qq update \
&& apt-get -qq install wget gcc g++ git \
python3 python3-pip python3-pyaudio python3-pyqt5 python3-numpy python3-psutil \
fonts-dejavu-core libgles2-mesa libusb-1.0-0 \
gr-osmosdr \
libhackrf-dev liblimesuite-dev libbladerf-dev librtlsdr-dev libairspy-dev libuhd-dev libiio-dev \
&& python3 -m pip install setuptools cython \
&& mkdir /tmp/sdrplay \
&& wget http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-2.13.1.run -O /tmp/sdrplay/sdrplay.run \
&& cd /tmp/sdrplay && bash sdrplay.run --tar xf \
&& cp mirsdrapi-rsp.h /usr/local/include \
&& cp x86_64/libmirsdrapi-rsp.so.2.13 /usr/lib/x86_64-linux-gnu/ \
&& ln -s /usr/lib/x86_64-linux-gnu/libmirsdrapi-rsp.so.2.13 /usr/lib/x86_64-linux-gnu/libmirsdrapi-rsp.so \
&& rm -rf /tmp/sdrplay \
\
&& cd /tmp && git clone --depth=1 https://github.com/jopohl/urh \
&& cd /tmp/urh \
&& python3 setup.py install \
&& rm -rf /tmp/urh \
\
&& apt-get -qq remove wget gcc g++ git ttf-bitstream-vera \
&& apt-get -qq autoremove \
&& dbus-uuidgen > /var/lib/dbus/machine-id \
&& apt-get -qq clean all \
&& mkdir /tmp/runtime-root \
&& chmod 0700 /tmp/runtime-root
CMD XDG_RUNTIME_DIR=/tmp/runtime-root urh

View File

@ -0,0 +1,89 @@
# Build Qt Resource File from custom Icon Theme for Windows
import os
import shutil
import xml.etree.ElementTree as ET
from subprocess import call
OXYGEN_PATH = "/usr/share/icons/oxygen/base"
def get_python_files():
python_files = []
code_dir = os.path.join(os.curdir, "..", "src")
assert os.path.isdir(code_dir)
for path, subdirs, files in os.walk(code_dir):
for name in files:
if name.endswith(".py"):
python_files.append(os.path.join(path, name))
return python_files
def get_used_icon_names():
icons = set()
for sourcefile in get_python_files():
with open(sourcefile, "r") as f:
for line in f:
if "QIcon.fromTheme" in line:
icon = line[line.find("QIcon.fromTheme"):]
icon = icon.replace('"', "'")
start = icon.find("'") + 1
end = icon.find("'", start)
icons.add(icon[start:end])
return icons
def copy_icons(icon_names: set):
target_dir = "/tmp/oxy"
sizes = [s for s in os.listdir(OXYGEN_PATH) if os.path.isdir(os.path.join(OXYGEN_PATH, s))] # 8x8, 22x22 ...
for size in sizes:
target_size_dir = os.path.join(target_dir, size)
os.makedirs(target_size_dir, exist_ok=True)
oxy_dir = os.path.join(OXYGEN_PATH, size)
for icon_name in icon_names:
for path, subdirs, files in os.walk(oxy_dir):
for f in files:
if os.path.splitext(f)[0] == icon_name:
src = os.path.join(path, f)
shutil.copyfile(src, os.path.join(target_size_dir, f))
break
# Create theme file
with open(os.path.join(target_dir, "index.theme"), "w") as f:
f.write("[Icon Theme]\n")
f.write("Name=oxy\n")
f.write("Comment=Subset of oxygen icons\n")
f.write("Inherits=default\n")
f.write("Directories=" + ",".join(sizes) + "\n")
for size in sizes:
f.write("\n")
f.write("[" + size + "]\n")
f.write("Size=" + size[:size.index("x")] + "\n")
f.write("\n")
root = ET.Element("RCC")
root.set("version", "1.0")
res = ET.SubElement(root, "qresource")
res.set("prefix", "icons/oxy")
relpath = os.path.relpath(os.path.join(target_dir, "index.theme"), "/tmp")
ET.SubElement(res, "file", alias="index.theme").text = relpath
for size in sizes:
size_dir = os.path.join(target_dir, size)
for icon in os.listdir(size_dir):
relpath = os.path.relpath(os.path.join(size_dir, icon), "/tmp")
ET.SubElement(res, "file", alias=size + "/" + icon).text = relpath
tree = ET.ElementTree(root)
tree.write("/tmp/xtra_icons.qrc")
call(["pyrcc5", "/tmp/xtra_icons.qrc", "-o", "/tmp/xtra_icons_rc.py"])
tar_path = os.path.dirname(os.path.join(os.path.dirname(__file__), "..", ".."))
tar_path = os.path.join(tar_path, "src/urh/ui")
shutil.copy("/tmp/xtra_icons_rc.py", tar_path)
if __name__ == "__main__":
icons = get_used_icon_names()
print(icons)
copy_icons(icons)

View File

@ -0,0 +1,26 @@
#!/bin/bash
DIR=$(dirname "$(readlink -f "$0")")
echo "Copy snapcraft.yaml to base directory"
cd $DIR
cp snapcraft.yaml ..
cd ..
sed -i "s/version\: git/version\: $(python3 src/urh/version.py)/" snapcraft.yaml
mkdir -p snap/gui
cp data/icons/appicon.png snap/gui/urh.png
echo "Create desktop entry for snap"
echo "[Desktop Entry]" > snap/gui/urh.desktop
echo "Type=Application" >> snap/gui/urh.desktop
echo "Name=Universal Radio Hacker" >> snap/gui/urh.desktop
echo "Comment=Investigate Wireless Protocols Like A Boss" >> snap/gui/urh.desktop
echo "Exec=urh" >> snap/gui/urh.desktop
echo "Icon=\${SNAP}/meta/gui/urh.png" >> snap/gui/urh.desktop
echo "Terminal=false" >> snap/gui/urh.desktop
SNAPCRAFT_BUILD_ENVIRONMENT_CPU=8 SNAPCRAFT_BUILD_ENVIRONMENT_MEMORY=24G snapcraft
#sudo snap install --dangerous urh*.snap
#urh

View File

@ -0,0 +1,23 @@
#!/usr/bin/env python3
import importlib
import os
import sys
rc = 0
if sys.platform == "win32":
shared_lib_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "src/urh/dev/native/lib/shared"))
print("Attempting to read", shared_lib_dir)
if os.path.isdir(shared_lib_dir):
os.environ["PATH"] = os.environ.get("PATH", "") + os.pathsep + shared_lib_dir
print("PATH updated")
for sdr in ("AirSpy", "BladeRF", "HackRF", "RTLSDR", "LimeSDR", "PlutoSDR", "SDRPlay", "USRP"):
try:
importlib.import_module('.{}'.format(sdr.lower()), 'urh.dev.native.lib')
print("{:<10} \033[92mSUCCESS\033[0m".format(sdr+":"))
except ImportError as e:
print("{:<10} \033[91mFAILURE\033[0m ({})".format(sdr+":", e))
rc = 1
sys.exit(rc)

Binary file not shown.

View File

@ -0,0 +1,54 @@
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
int i, len = strlen(argv[2]);
if (argc>2)
{
if (argv[1][0]=='d')
for(i = 0; i < len; i++)
switch(i % 12)
{
case 0:
case 1:
case 2:
case 4:
case 5:
case 6:
case 8:
case 9:
putchar(argv[2][i]);
break;
default:
break;
}
else
for(i = 0; i < len; i++)
switch(i % 8)
{
case 0:
case 1:
case 3:
case 4:
case 6:
putchar(argv[2][i]);
break;
case 2:
case 5:
putchar(argv[2][i]);
if(argv[2][i] == '0') putchar('1');
else putchar('0');
break;
case 7:
putchar(argv[2][i]);
if(i < len - 1)
printf("01");
}
}
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,102 @@
#include <stdio.h>
#include <string.h>
typedef unsigned char byte;
byte str2byte(char str[8])
{
int ret = 0, i;
for(i = 0; i < 8; i++)
if (str[i]=='1') ret |= (1<<(7-i));
return ret;
}
void print_binary(byte inpt)
{
int i;
for(i = 0; i < 8; i++)
if (inpt & (1<<(7-i))) putchar('1');
else putchar('0');
}
int main(int argc, char **argv)
{
int i, max, offset;
byte dec[256]={0}, enc[256]={0};
char string[2048]={0};
offset = 8; // Preamble + Sync
if (argc>2)
{
if (argv[1][0]=='d')
{
if (strlen(argv[2]) > 256*8 || strlen(argv[2]) < 4) return -1;
memcpy(string, argv[2], strlen(argv[2]));
for (i = 0; i < strlen(string)-3; i+=8)
enc[i/8] = str2byte(&string[i]);
max = i/8;
memcpy(&dec, &enc, 256);
/*
* byte[] Dec = new byte[Enc.Length];
* Dec[0] = Enc[0]; //Packet length
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
* int j;
* for (j = 2; j < Dec[0]; j++)
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
*/
dec[offset+0] = enc[offset+0];
dec[offset+1] = (~enc[offset+1])^0x89;
for(i = offset + 2; i < max - 3; i++)
dec[i] = (enc[i-1]+0xdc) ^ enc[i];
dec[i] = enc[i] ^ dec[offset+2];
dec[max-1]=0; // Set CRC to 0x0000
dec[max-2]=0;
for(i = 0; i < max; i++)
print_binary(dec[i]);
}
else
{
if (strlen(argv[2]) > 256*8 || strlen(argv[2]) < 4) return -1;
memcpy(string, argv[2], strlen(argv[2]));
for (i = 0; i < strlen(string)-3; i+=8)
dec[i/8] = str2byte(&string[i]);
max = i/8;
memcpy(&enc, &dec, 256);
/*
* byte[] Dec = new byte[Enc.Length];
* Dec[0] = Enc[0]; //Packet length
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
* int j;
* for (j = 2; j < Dec[0]; j++)
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
*/
enc[offset+0] = dec[offset+0];
enc[offset+1] = ~(dec[offset+1]^0x89);
for(i = offset + 2; i < max - 3; i++)
enc[i] = (enc[i-1]+0xdc) ^ dec[i];
enc[i] = dec[i] ^ dec[offset+2];
enc[max-1]=0; // Set CRC to 0x0000
enc[max-2]=0;
for(i = 0; i < max; i++)
print_binary(enc[i]);
}
}
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,239 @@
#include <stdio.h>
#include <string.h>
#define SHORTEN_PREAMBLE_TO_32 0
typedef unsigned char byte;
typedef unsigned short uint16;
uint16 crc(byte *data, int len)
{
byte i, x, crcdata;
uint16 crcReg = 0xFFFF;
for (x = 0; x < len; x++)
{
crcdata = data[x];
for (i = 0; i < 8; i++)
{
if (((crcReg & 0x8000) >> 8) ^ (crcdata & 0x80))
crcReg = (crcReg << 1) ^ 0x8005;
else
crcReg = (crcReg << 1);
crcdata <<= 1;
}
}
return crcReg;
}
byte str2byte(char str[8])
{
int ret = 0, i;
for(i = 0; i < 8; i++)
if (str[i]=='1') ret |= (1<<(7-i));
return ret;
}
void print_binary(byte inpt)
{
int i;
for(i = 0; i < 8; i++)
if (inpt & (1<<(7-i))) putchar('1');
else putchar('0');
}
void print_preamble_nibbles(int count)
{
int i;
for (i = 0; i < count; i++)
printf("1010");
}
int find_preamble_start_in_bit(char *string, int len)
{
char homematic_sync[] = "11101001110010101110100111001010";
for(int i = 0, j = 0; i < len; i++)
{
if(string[i] == homematic_sync[j])
{
j++;
if(j == 32 && i>= 63) return i-63;
}
else j = 0;
}
return -1; //not found
}
void xor_lfsr(char *string)
{
int i, j, x, len = strlen(string);
byte polynomial[9] = {0, 0, 0, 1, 0, 0, 0, 0, 1};
byte lfsr_state[9];
byte first_bit;
// Init with 8x 1 Bit
memset(lfsr_state, 1, 9);
for(j = 0; j < 8; j++)
if(string[j]=='1')
string[j]='0';
else
string[j]='1';
for(x = 8; x < len-7; x += 8)
{
for(i = 0; i < 8; i++)
{
first_bit = 255;
for(j = 8; j >= 0; j--)
if(polynomial[j] && lfsr_state[j])
{
if(first_bit == 255)
first_bit = 1;
else
first_bit = (first_bit==1) ? 0 : 1;
}
if(first_bit == 255)
first_bit = 0;
// Clock
for(j = 8; j >= 0; j--)
lfsr_state[j] = lfsr_state[j-1];
lfsr_state[0] = first_bit;
}
// Xor
for(j = 0; j < 8; j++)
if(lfsr_state[j+1] == 1)
if(string[x+j]=='1')
string[x+j]='0';
else
string[x+j]='1';
}
}
int main(int argc, char **argv)
{
int i, j, max, offset, len, preamble_additional_length;
byte dec[1024]={0}, enc[1024]={0}, crc_ok;
char string[65536]={0};
uint16 crcvalue;
offset = 8; // Preamble + Sync
// Copy data (argv[2]) to string if length is ok, shorten to multiple of 8 bit
if (strlen(argv[2]) > 8192*8 || strlen(argv[2]) < 4) return -1;
len = strlen(argv[2]);
i = find_preamble_start_in_bit(argv[2], len);
if(i < 0) return 0; // preamble+sync not found or wrong length
preamble_additional_length = i;
len = (len-i)-(len-i)%8;
memcpy(string, argv[2]+i, len);
if (argc>2)
{
if (argv[1][0]=='d')
{
// Apply datawhitening
xor_lfsr(string+64);
// Pack to bytes
for (i = 0; i < strlen(string)-3; i+=8)
enc[i/8] = str2byte(&string[i]);
max = i/8;
memcpy(&dec, &enc, 1024);
// Check CRC
crcvalue = crc(&dec[8], max-2-8);
crc_ok = 0;
if( ((crcvalue >> 8) & 0xFF) == dec[max-2] && (crcvalue & 0xFF) == dec[max-1]) crc_ok = 1;
/*
* byte[] Dec = new byte[Enc.Length];
* Dec[0] = Enc[0]; //Packet length
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
* int j;
* for (j = 2; j < Dec[0]; j++)
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
*/
// Decrypt
dec[offset+0] = enc[offset+0];
dec[offset+1] = (~enc[offset+1])^0x89;
for(i = offset + 2; i < max - 3; i++)
dec[i] = (enc[i-1]+0xdc) ^ enc[i];
dec[i] = enc[i] ^ dec[offset+2];
// Recompute CRC and overwrite with FAKE-CRC, if CRC was OK before
if(crc_ok)
{
crcvalue = crc(&dec[8], max-2-8);
dec[max-1] = crcvalue & 0xFF;
dec[max-2] = (crcvalue >> 8) & 0xFF;
}
else
{
dec[max-1] = 0x0F; // Set magic code for wrong CRC
dec[max-2] = 0xD0;
}
// Prepend preamble longer than 32 bits
if(0 == SHORTEN_PREAMBLE_TO_32 && preamble_additional_length > 0)
print_preamble_nibbles(preamble_additional_length/4);
for(i = 0; i < max; i++)
print_binary(dec[i]);
}
else
{
// Pack to bytes
for (i = 0; i < strlen(string)-3; i+=8)
dec[i/8] = str2byte(&string[i]);
max = i/8;
memcpy(&enc, &dec, 1024);
/*
* byte[] Dec = new byte[Enc.Length];
* Dec[0] = Enc[0]; //Packet length
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
* int j;
* for (j = 2; j < Dec[0]; j++)
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
*/
// Encrypt
enc[offset+0] = dec[offset+0];
enc[offset+1] = ~(dec[offset+1])^0x89;
for(i = offset + 2; i < max - 3; i++)
enc[i] = (enc[i-1]+0xdc) ^ dec[i];
enc[i] = dec[i] ^ dec[offset+2];
// Overwrite with correct CRC
crcvalue = crc(&enc[8], max-2-8);
enc[max-1] = crcvalue & 0xFF;
enc[max-2] = (crcvalue >> 8) & 0xFF;
// Convert to string
memset(string, 0, 65536);
for(i = 0; i < max; i++)
{
for(j = 0; j < 8; j++)
if(enc[i] & (1<<(7-j))) string[i*8+j]='1';
else string[i*8+j]='0';
}
// Apply datawhitening
xor_lfsr(string+64);
// Prepend preamble longer than 32 bits
if(0 == SHORTEN_PREAMBLE_TO_32 && preamble_additional_length > 0) // Add preamble longer than 32 bits
print_preamble_nibbles(preamble_additional_length/4);
// Print bits and duplicate last bit
printf("%s%c\n", string, string[strlen(string)-1]);
}
}
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,47 @@
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
int i, count, what;
if(argc>2)
{
if(argv[1][0]=='d')
{
for(i = 0; i < strlen(argv[2]); i++)
if(argv[2][i] == '0') printf("000");
else printf("11");
}
else
{
count = 0;
what = -1;
for(i = 0; i < strlen(argv[2]); i++)
{
if(argv[2][i] == '0')
{
if(what == 1) count = 0;
what = 0;
count++;
if(count == 3)
{
putchar('0');
count = 0;
}
}
else
{
if(what == 0) count = 0;
what = 1;
count++;
if(count == 2)
{
putchar('1');
count = 0;
}
}
}
}
}
return 0;
}

View File

@ -0,0 +1,2 @@
#!/bin/bash
echo "$1$1"

View File

@ -0,0 +1,72 @@
import sys
import os
from subprocess import call
import fileinput
def gen(force=False):
if sys.platform == "win32":
bindir = r"c:\Python34\Lib\site-packages\PyQt5"
else:
bindir = "/usr/bin"
if sys.platform == "win32":
uic_path = os.path.join(bindir, "pyuic5.bat")
rcc_path = os.path.join(bindir, "pyrcc5.exe")
else:
uic_path = os.path.join(bindir, "pyuic5")
rcc_path = os.path.join(bindir, "pyrcc5")
file_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui")
ui_path = file_dir
rc_path = file_dir
out_path = os.path.join(file_dir, "..", "..", "src", "urh", "ui")
ui_files = [f for f in os.listdir(ui_path) if f.endswith(".ui")]
rc_files = [f for f in os.listdir(rc_path) if f.endswith(".qrc")]
for f in ui_files:
file_path = os.path.join(ui_path, f)
outfile = "ui_" + f.replace(".ui", ".py")
out_file_path = os.path.join(out_path, outfile)
time_ui_file = os.path.getmtime(file_path)
try:
time_generated_file = os.path.getmtime(out_file_path)
except os.error:
time_generated_file = 0
if time_generated_file >= time_ui_file and not force:
# Generated file is already there and newer than ui file, no need to recompile it
continue
call([uic_path, "--from-imports", file_path, "-o", out_file_path])
# Remove Line: # Form implementation generated from reading ui file '/home/joe/GIT/urh/ui/fuzzing.ui'
# to avoid useless git updates when working on another computer
for line in fileinput.input(out_file_path, inplace=True):
if line.startswith("# Form implementation generated from reading ui file") or line.startswith(
"# Created by: "):
continue
if line.strip().startswith("QtCore.QMetaObject.connectSlotsByName("):
# disable auto slot connection, as we do not use it, and it causes crash on python 3.7
continue
print(line, end='')
for f in rc_files:
file_path = os.path.join(rc_path, f)
out_file = f.replace(".qrc", "_rc.py")
out_file_path = os.path.join(out_path, out_file)
time_rc_file = os.path.getmtime(file_path)
try:
time_generated_file = os.path.getmtime(out_file_path)
except os.error:
time_generated_file = 0
if time_generated_file < time_rc_file or force:
# Only create, when generated file is old than rc file to prevent unneeded git pushes
call([rcc_path, file_path, "-o", out_file_path])
if __name__ == "__main__":
gen()

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 516 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 523 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 521 KiB

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="collapse.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="-25.75"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<path
id="path1447"
inkscape:label="Triangle"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.0745703;stroke-opacity:1"
d="m 4,4 v 8 l 8,-4.0000001 z"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="decoding.svg"
inkscape:export-filename="/home/joe/GIT/urh/data/icons/decoding.svg.png"
inkscape:export-xdpi="94.889999"
inkscape:export-ydpi="94.889999">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="2.84375"
inkscape:cy="20.0625"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true"
showguides="false" />
<defs
id="defs33" />
<metadata
id="metadata36">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<rect
id="rect72"
width="16.1875"
height="2.125"
x="0"
y="7"
style="stroke-width:0.57454073" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Ebene 2">
<g
aria-label="101"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:8px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
id="text51">
<path
d="M 0.33433331,6.4375 H 4.6649998 V 5.1495 H 3.3956665 V 0.52016687 H 2.2196666 C 1.7529999,0.80016686 1.2863333,0.96816685 0.57699997,1.0988335 V 2.0881668 H 1.7903333 V 5.1495 H 0.33433331 Z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4542" />
<path
d="m 8.0213539,6.5495 c 1.3906666,0 2.3333331,-1.0733333 2.3333331,-3.0986666 0,-2.0253332 -0.9426665,-3.04266653 -2.3333331,-3.04266653 -1.3906666,0 -2.3333332,1.01733333 -2.3333332,3.04266653 0,2.0253333 0.9426666,3.0986666 2.3333332,3.0986666 z m 0,-1.232 c -0.4946666,0 -0.9146666,-0.3919999 -0.9146666,-1.8666666 0,-1.4746666 0.42,-1.8106666 0.9146666,-1.8106666 0.4946667,0 0.9146666,0.336 0.9146666,1.8106666 0,1.4746667 -0.4199999,1.8666666 -0.9146666,1.8666666 z m 0,-1.1199999 c 0.4293333,0 0.7466667,-0.2986667 0.7466667,-0.7466667 0,-0.4479999 -0.3173334,-0.7466666 -0.7466667,-0.7466666 -0.4293333,0 -0.7466666,0.2986667 -0.7466666,0.7466666 0,0.448 0.3173333,0.7466667 0.7466666,0.7466667 z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4544" />
<path
d="m 11.527041,6.4375 h 4.330667 V 5.1495 H 14.588375 V 0.52016687 h -1.176 C 12.945708,0.80016686 12.479041,0.96816685 11.769708,1.0988335 v 0.9893333 h 1.213333 V 5.1495 h -1.456 z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4546" />
</g>
<g
aria-label="010"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:9.33333302px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
id="text51-0">
<path
d="m 2.4780495,15.7097 c 1.3906666,0 2.3333332,-1.073333 2.3333332,-3.098666 0,-2.025334 -0.9426666,-3.042667 -2.3333332,-3.042667 -1.3906667,0 -2.33333328,1.017333 -2.33333328,3.042667 0,2.025333 0.94266658,3.098666 2.33333328,3.098666 z m 0,-1.232 c -0.4946667,0 -0.9146667,-0.392 -0.9146667,-1.866666 0,-1.474667 0.42,-1.810667 0.9146667,-1.810667 0.4946666,0 0.9146666,0.336 0.9146666,1.810667 0,1.474666 -0.42,1.866666 -0.9146666,1.866666 z m 0,-1.12 c 0.4293333,0 0.7466666,-0.298666 0.7466666,-0.746666 0,-0.448 -0.3173333,-0.746667 -0.7466666,-0.746667 -0.4293333,0 -0.7466667,0.298667 -0.7466667,0.746667 0,0.448 0.3173334,0.746666 0.7466667,0.746666 z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4549" />
<path
d="m 5.9837369,15.5977 h 4.3306661 v -1.288 H 9.0450701 V 9.680367 H 7.8690702 c -0.4666667,0.28 -0.9333334,0.448 -1.6426667,0.578667 v 0.989333 H 7.4397368 V 14.3097 H 5.9837369 Z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4551" />
<path
d="m 13.670757,15.7097 c 1.390667,0 2.333334,-1.073333 2.333334,-3.098666 0,-2.025334 -0.942667,-3.042667 -2.333334,-3.042667 -1.390666,0 -2.333333,1.017333 -2.333333,3.042667 0,2.025333 0.942667,3.098666 2.333333,3.098666 z m 0,-1.232 c -0.494666,0 -0.914666,-0.392 -0.914666,-1.866666 0,-1.474667 0.42,-1.810667 0.914666,-1.810667 0.494667,0 0.914667,0.336 0.914667,1.810667 0,1.474666 -0.42,1.866666 -0.914667,1.866666 z m 0,-1.12 c 0.429334,0 0.746667,-0.298666 0.746667,-0.746666 0,-0.448 -0.317333,-0.746667 -0.746667,-0.746667 -0.429333,0 -0.746666,0.298667 -0.746666,0.746667 0,0.448 0.317333,0.746666 0.746666,0.746666 z"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:9.33333302px;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';fill:#ff0000"
id="path4553" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
viewBox="0 0 32 32"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="equals.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="-7.8340023"
inkscape:cy="9.8125"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs4485" />
<metadata
id="metadata4488">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="8.375"
y="7.875"
id="text5091"><tspan
sodipodi:role="line"
id="tspan5089"
x="8.375"
y="14.875" /></text>
<g
transform="translate(-2.8046876,-0.0527343)"
aria-label=" ≟"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#0055d4;fill-opacity:1;stroke:none"
id="text5046" />
<path
id="path5687"
style="fill:#0055d4;fill-opacity:1;stroke:none;stroke-width:0.94488192;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 3.1054687,18.119141 H 28.144531 v 4.628906 H 3.1054687 Z m 0,-8.886719 H 28.144531 v 4.589844 H 3.1054687 Z"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
viewBox="0 0 32 32"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="equals_qm.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="20.384743"
inkscape:cy="14.953125"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs4485" />
<metadata
id="metadata4488">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<g
aria-label=" ≟"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:40px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#0055d4;fill-opacity:1;stroke:none"
id="text5046">
<path
d="M 3.9726563,17.472656 H 29.011719 V 22.0625 H 3.9726563 Z m 0,8.886719 H 29.011719 v 4.628906 H 3.9726563 Z M 17.585937,10.539063 h -3.535156 v -0.46875 q 0,-0.820313 0.3125,-1.4257817 0.332032,-0.625 1.367188,-1.5820313 l 0.625,-0.5664063 q 0.566406,-0.5078125 0.820312,-0.9570312 0.253906,-0.4492188 0.253906,-0.8984375 0,-0.6835937 -0.46875,-1.0546875 -0.46875,-0.390625 -1.308593,-0.390625 -0.800781,0 -1.71875,0.3320313 -0.917969,0.3125 -1.894531,0.9570312 V 1.4179687 Q 13.210938,1.0078125 14.1875,0.8125 q 0.976563,-0.1953125 1.875,-0.1953125 2.382812,0 3.632812,0.9765625 1.25,0.9765625 1.25,2.8320312 0,0.9570313 -0.371093,1.71875 Q 20.203125,6.90625 19.265625,7.765625 l -0.625,0.546875 q -0.664063,0.625 -0.859375,0.9960938 -0.195313,0.3515625 -0.195313,0.8007812 z m -3.535156,1.445312 h 3.535156 v 3.476563 h -3.535156 z"
style="fill:#0055d4;fill-opacity:1"
id="path5048" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="lock.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="2.438584"
inkscape:cy="8.4622059"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1440"
inkscape:window-height="844"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs10" />
<metadata
id="metadata13">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Ebene 3" />
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<rect
style="fill:#0055d4;fill-opacity:1;stroke-width:1.29552507"
id="rect26"
width="13.1875"
height="9.4109621"
x="1.53125"
y="6.1827879"
ry="1.668939" />
<path
style="fill:none;fill-opacity:1;stroke:#0055d4;stroke-width:2.37899995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path955"
sodipodi:type="arc"
sodipodi:cx="8.0946102"
sodipodi:cy="4.9240141"
sodipodi:rx="4.0718422"
sodipodi:ry="3.1146088"
sodipodi:start="3.1334605"
sodipodi:end="3.1328231"
d="M 4.0229027,4.9493423 A 4.0718422,3.1146088 0 0 1 8.0608489,1.8095124 4.0718422,3.1146088 0 0 1 12.166307,4.8976933 4.0718422,3.1146088 0 0 1 8.1296692,8.0385074 4.0718422,3.1146088 0 0 1 4.0229246,4.9513275"
sodipodi:open="true" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Ebene 2">
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.50427711;stroke-opacity:1"
id="path853"
sodipodi:type="arc"
sodipodi:cx="8.0742912"
sodipodi:cy="8.8435822"
sodipodi:rx="1.8158679"
sodipodi:ry="1.7158939"
sodipodi:start="3.1415927"
sodipodi:end="2.8204603"
d="M 6.2584233,8.8435821 A 1.8158679,1.7158939 0 0 1 7.9286644,7.1332151 1.8158679,1.7158939 0 0 1 9.8668015,8.56925 1.8158679,1.7158939 0 0 1 8.5074256,10.509948 1.8158679,1.7158939 0 0 1 6.351253,9.385189"
sodipodi:open="true" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.79365373;stroke-opacity:1"
id="rect1685"
width="1.2488354"
height="4.0842142"
x="7.4914622"
y="10.344006" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="message_type.svg">
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="4.9678955"
inkscape:cy="8.278417"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:14.66666698px;line-height:1.25;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none"
x="-0.75"
y="12.0625"
id="text1376"><tspan
sodipodi:role="line"
id="tspan1374"
x="-0.75"
y="12.0625"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:12.66666698px;line-height:1;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro Heavy';fill:#008000">MT</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
viewBox="0 0 32 32"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="plus.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="20.384743"
inkscape:cy="17.390625"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs4485" />
<metadata
id="metadata4488">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="8.375"
y="7.875"
id="text5091"><tspan
sodipodi:role="line"
id="tspan5089"
x="8.375"
y="14.875" /></text>
<g
aria-label="+"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:53.33333206px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#0055d4;fill-opacity:1;stroke:none"
id="text5707">
<path
d="m 12.755833,28.8875 h 6.613333 v -9.6 h 9.28 v -6.4 h -9.28 V 3.2875007 H 12.755833 V 12.8875 H 3.4758333 v 6.4 h 9.2799997 z"
style=""
id="path5709" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
sodipodi:docname="sniffer.svg"
inkscape:version="0.92.1 r">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="2.7848469"
inkscape:cy="9.5734649"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs5036">
<linearGradient
id="linearGradient7079"
osb:paint="solid">
<stop
style="stop-color:#aaccff;stop-opacity:1;"
offset="0"
id="stop7077" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter914">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood904" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite906" />
<feGaussianBlur
in="composite1"
stdDeviation="0.5"
result="blur"
id="feGaussianBlur908" />
<feOffset
dx="0.1"
dy="0.1"
result="offset"
id="feOffset910" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite912" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter938">
<feFlood
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood928" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite930" />
<feGaussianBlur
in="composite1"
stdDeviation="0.5"
result="blur"
id="feGaussianBlur932" />
<feOffset
dx="0.1"
dy="0.1"
result="offset"
id="feOffset934" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite936" />
</filter>
</defs>
<metadata
id="metadata5039">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Ebene 2">
<path
style="fill:none;stroke:#ff0000;stroke-width:1.88976378;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter938)"
d="m 11.303085,11.154756 3.83883,3.910488"
id="path5611"
inkscape:connector-curvature="0" />
</g>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<circle
style="fill:#afc6e9;fill-opacity:0.78417263;stroke:#ff0000;stroke-width:1.19093943;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter914)"
id="path5605"
cx="6.8475037"
cy="6.8600025"
r="6.0412431" />
<g
aria-label="10"
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:10.66666698px;line-height:1.25;font-family:'Source Code Pro';-inkscape-font-specification:'Source Code Pro Heavy';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
id="text5597"
transform="matrix(0.7643067,0,0,0.85162896,0.65422787,0.02035532)">
<path
d="M 2.4981667,11.1875 H 7.4475002 V 9.7155 H 5.9968335 V 4.4248331 H 4.6528334 c -0.5333333,0.32 -1.0666667,0.512 -1.8773334,0.6613334 V 6.2168332 H 4.1621667 V 9.7155 h -1.664 z"
id="path7117"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1" />
<path
d="m 11.283334,11.3155 c 1.589333,0 2.666666,-1.226667 2.666666,-3.5413334 0,-2.3146668 -1.077333,-3.4773335 -2.666666,-3.4773335 -1.5893338,0 -2.6666672,1.1626667 -2.6666672,3.4773335 0,2.3146664 1.0773334,3.5413334 2.6666672,3.5413334 z m 0,-1.408 C 10.718,9.9075 10.238,9.4594999 10.238,7.7741666 c 0,-1.6853334 0.48,-2.0693334 1.045334,-2.0693334 0.565333,0 1.045333,0.384 1.045333,2.0693334 0,1.6853333 -0.48,2.1333334 -1.045333,2.1333334 z m 0,-1.2800001 c 0.490666,0 0.853333,-0.3413333 0.853333,-0.8533333 0,-0.5120001 -0.362667,-0.8533334 -0.853333,-0.8533334 -0.490667,0 -0.853334,0.3413333 -0.853334,0.8533334 0,0.512 0.362667,0.8533333 0.853334,0.8533333 z"
id="path7119"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="spectrum.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="45.254834"
inkscape:cx="4.0007222"
inkscape:cy="7.9550105"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1015"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs5788" />
<metadata
id="metadata5791">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 2"
id="layer2"
inkscape:groupmode="layer" />
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<path
style="fill:#80b3ff;fill-rule:evenodd;stroke:#7d7d7d;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M -0.1767767,13.19367 C -0.15467961,13.061088 0.79549512,7.2716507 0.79549512,7.2716507 L 1.6130873,12.818019 2.9610096,8.4648934 4.0216698,13.326252 5.5021746,7.7135924 6.2755727,12.199301 8.2201163,0.50994206 10.341437,13.171573 l 1.635184,-5.1707185 0.861787,4.1542525 0.773397,-3.9995729 0.662913,4.8171649 1.038563,-5.5905629 0.795495,5.8115339"
id="path4631"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16mm"
height="8mm"
viewBox="0 0 16 8"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r"
sodipodi:docname="splitter_handle_horizontal.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="28.682636"
inkscape:cy="13.700107"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-289)">
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487"
cx="2.0135045"
cy="293.08649"
r="1.9135045" />
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487-6"
cx="7.9135046"
cy="293.08649"
r="1.9135045" />
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487-7"
cx="14.013505"
cy="293.08649"
r="1.9135045" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="8mm"
height="16mm"
viewBox="0 0 8 16"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r"
sodipodi:docname="splitter_handle_vertical.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="28.682636"
inkscape:cy="35.128679"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-281)">
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487"
cx="-294.98648"
cy="3.9135046"
r="1.9135045"
transform="rotate(-90)" />
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487-6"
cx="-289.08649"
cy="3.9135046"
r="1.9135045"
transform="rotate(-90)" />
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4487-7"
cx="-282.98648"
cy="3.9135046"
r="1.9135045"
transform="rotate(-90)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="uncollapse.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="-8.875"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1141"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs815" />
<metadata
id="metadata818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<path
id="path1447"
inkscape:label="Triangle"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.0745703;stroke-opacity:1"
d="M 12,4 H 4 l 4.000001,8 z"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16px"
height="16px"
viewBox="0 0 16 16"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.1 r"
sodipodi:docname="unlock.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="2.438584"
inkscape:cy="8.4622059"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1440"
inkscape:window-height="844"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs10" />
<metadata
id="metadata13">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Ebene 3" />
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Ebene 1">
<rect
style="fill:#0055d4;fill-opacity:1;stroke-width:1.29552507"
id="rect26"
width="13.1875"
height="9.4109621"
x="1.53125"
y="6.1827879"
ry="1.668939" />
<path
style="fill:none;fill-opacity:1;stroke:#0055d4;stroke-width:2.37899995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path955"
sodipodi:type="arc"
sodipodi:cx="8.0946102"
sodipodi:cy="4.9240141"
sodipodi:rx="4.0718422"
sodipodi:ry="3.1146088"
sodipodi:start="4.709543"
sodipodi:end="1.5424001"
d="M 8.0830218,1.8094179 A 4.0718422,3.1146088 0 0 1 12.165956,4.8753624 4.0718422,3.1146088 0 0 1 8.2102196,8.0373672"
sodipodi:open="true" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Ebene 2">
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.50427711;stroke-opacity:1"
id="path853"
sodipodi:type="arc"
sodipodi:cx="8.0742912"
sodipodi:cy="8.8435822"
sodipodi:rx="1.8158679"
sodipodi:ry="1.7158939"
sodipodi:start="3.1415927"
sodipodi:end="2.8204603"
d="M 6.2584233,8.8435821 A 1.8158679,1.7158939 0 0 1 7.9286644,7.1332151 1.8158679,1.7158939 0 0 1 9.8668015,8.56925 1.8158679,1.7158939 0 0 1 8.5074256,10.509948 1.8158679,1.7158939 0 0 1 6.351253,9.385189"
sodipodi:open="true" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.79365373;stroke-opacity:1"
id="rect1685"
width="1.2488354"
height="4.0842142"
x="7.4914622"
y="10.344006" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,38 @@
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{8A0E36A6-DE56-46B8-BCC3-C16D1BC759CC}
AppName=Universal Radio Hacker
AppVersion={#MyAppVersion}
VersionInfoVersion={#MyAppVersion}
ArchitecturesInstallIn64BitMode=x64
UninstallDisplayName=Universal Radio Hacker
AppPublisher=Johannes Pohl
AppPublisherURL=https://github.com/jopohl/urh
AppSupportURL=https://github.com/jopohl/urh
AppUpdatesURL=https://github.com/jopohl/urh
DefaultDirName={commonpf}\Universal Radio Hacker
DisableProgramGroupPage=yes
LicenseFile=..\LICENSE
OutputDir=..\dist
OutputBaseFilename=Universal.Radio.Hacker-{#MyAppVersion}-{#Arch}
Compression=lzma2/ultra
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "..\pyinstaller\urh\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{commonprograms}\Universal Radio Hacker"; Filename: "{app}\urh.exe"
Name: "{commondesktop}\Universal Radio Hacker"; Filename: "{app}\urh.exe"; Tasks: desktopicon
[Run]
Filename: "{app}\urh.exe"; Description: "{cm:LaunchProgram,Universal Radio Hacker}"; Flags: nowait postinstall skipifsilent

View File

@ -0,0 +1,22 @@
#!/bin/bash
# for adapted jopohl/urh_manylinux
touch /tmp/urh_releasing
for PYBIN in /opt/python/*$PYVER*/bin; do # for all if PYVER not set
echo -e "\033[1mInstalling requirements for $PYBIN\033[0m"
"${PYBIN}/pip" install -r /io/data/requirements.txt
cd /io || return
echo -e "\033[1mBuilding extentions for $PYBIN\033[0m"
"${PYBIN}/python3" setup.py build_ext "-j$(nproc)"
echo -e "\033[1mBuilding wheel for $PYBIN\033[0m"
"${PYBIN}/pip" wheel --no-deps /io/ -w /wheelhouse/
done
# Bundle external libs into wheels
echo -e '\033[92mRepairing wheels...\033[0m'
for whl in /wheelhouse/*.whl; do
auditwheel repair "$whl" -w /io/dist/
done

View File

@ -0,0 +1,80 @@
#!/bin/bash
# for plain quay.io/pypa/manylinux2014_x86_64
AIRSPY_VERSION="1.0.9"
BLADERF_VERSION="2018.08"
LIMESUITE_VERSION="20.01.0"
SDRPLAY_VERSION="2.13"
RTLSDR_VERSION="0.6.0"
echo -e '\033[92mInstalling dependencies...\033[0m'
yum -y -q install wget cmake3 hackrf-devel uhd-devel\
https://github.com/analogdevicesinc/libiio/releases/download/v0.19/libiio-0.19.g5f5af2e-centos-7-x86_64.rpm
build_airspy() {
&> /dev/null
tar xf /tmp/airspy.tar.gz -C /tmp
cmake3 -Wno-dev -S /tmp/airspyone_host-$AIRSPY_VERSION -B /tmp/build_airspy > /dev/null
make --silent -C /tmp/build_airspy > /dev/null
make --silent -C /tmp/build_airspy install > /dev/null
}
build_bladerf() {
wget https://github.com/Nuand/bladeRF/archive/$BLADERF_VERSION.tar.gz -O /tmp/bladeRF.tar.gz &> /dev/null
tar xf /tmp/bladeRF.tar.gz -C /tmp
cmake3 -Wno-dev -S /tmp/bladeRF-$BLADERF_VERSION/host -B /tmp/build_blade > /dev/null
make --silent -C /tmp/build_blade > /dev/null
make --silent -C /tmp/build_blade install > /dev/null
}
build_limesdr() {
wget https://github.com/myriadrf/LimeSuite/archive/v$LIMESUITE_VERSION.tar.gz -O /tmp/lime.tar.gz &> /dev/null
tar xf /tmp/lime.tar.gz -C /tmp
cmake3 -Wno-dev -S /tmp/LimeSuite-$LIMESUITE_VERSION -B /tmp/build_lime > /dev/null
make --silent -C /tmp/build_lime > /dev/null
make --silent -C /tmp/build_lime install > /dev/null
}
build_rtlsdr() {
wget https://github.com/osmocom/rtl-sdr/archive/$RTLSDR_VERSION.tar.gz -O /tmp/rtlsdr.tar.gz &> /dev/null
tar xf /tmp/rtlsdr.tar.gz -C /tmp
cmake3 -Wno-dev -DDETACH_KERNEL_DRIVER=ON -S /tmp/rtl-sdr-$RTLSDR_VERSION -B /tmp/build_rtlsdr > /dev/null
make --silent -C /tmp/build_rtlsdr > /dev/null
make --silent -C /tmp/build_rtlsdr install > /dev/null
}
build_sdrplay() {
wget http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-$SDRPLAY_VERSION.1.run -O /tmp/sdrplay.run &> /dev/null
bash /tmp/sdrplay.run --tar xf -C /tmp
mv /tmp/mirsdrapi-rsp.h /usr/include
mv /tmp/x86_64/* /usr/lib64
ln -s /usr/lib64/libmirsdrapi-rsp.so.$SDRPLAY_VERSION /usr/lib64/libmirsdrapi-rsp.so
}
echo -e '\033[92mCompiling SDR libs...\033[0m'
build_airspy &
build_bladerf &
build_limesdr &
build_rtlsdr &
build_sdrplay &
wait
touch /tmp/urh_releasing
for PYBIN in /opt/python/*/bin; do
echo -e "\033[1mInstalling requirements for $PYBIN\033[0m"
"${PYBIN}/pip" install -r /io/data/requirements.txt > /dev/null
cd /io || return
echo -e "\033[1mBuilding extentions for $PYBIN\033[0m"
"${PYBIN}/python3" setup.py build_ext "-j$(nproc)" | grep --color=always "Skipping"
echo -e "\033[1mBuilding wheel for $PYBIN\033[0m"
"${PYBIN}/pip" wheel --no-deps /io/ -w /wheelhouse/ > /dev/null
done
# Bundle external libs into wheels
echo -e '\033[92mRepairing wheels...\033[0m'
for whl in /wheelhouse/*.whl; do
auditwheel repair "$whl" -w /io/dist/
done

View File

@ -0,0 +1,48 @@
FROM quay.io/pypa/manylinux2014_x86_64
RUN export AIRSPY_VERSION="1.0.9" \
&& export BLADERF_VERSION="2018.08" \
&& export LIMESUITE_VERSION="20.01.0" \
&& export SDRPLAY_VERSION="2.13" \
&& export RTLSDR_VERSION="0.6.0" \
&& export UHD_VERSION="3.15.0.0" \
&& yum -y install wget cmake3 hackrf-devel boost169-devel https://github.com/analogdevicesinc/libiio/releases/download/v0.19/libiio-0.19.g5f5af2e-centos-7-x86_64.rpm \
# UHD
&& wget https://github.com/EttusResearch/uhd/archive/v$UHD_VERSION.tar.gz -O /tmp/uhd.tar.gz \
&& tar xf /tmp/uhd.tar.gz -C /tmp \
&& python3.9 -m pip install mako \
&& cmake3 -DBOOST_INCLUDEDIR=/usr/include/boost169/ -DBOOST_LIBRARYDIR=/usr/lib64/boost169/ -DENABLE_EXAMPLES=OFF -DENABLE_UTILS=OFF -DENABLE_C_API=ON -DENABLE_TESTS=OFF -DENABLE_MAN_PAGES=OFF -S /tmp/uhd-$UHD_VERSION/host -B /tmp/build_uhd \
&& make -j$(nproc) -C /tmp/build_uhd \
&& make -C /tmp/build_uhd install \
# AirSpy
&& wget https://github.com/airspy/airspyone_host/archive/v$AIRSPY_VERSION.tar.gz -O /tmp/airspy.tar.gz \
&& tar xf /tmp/airspy.tar.gz -C /tmp \
&& cmake3 -Wno-dev -S /tmp/airspyone_host-$AIRSPY_VERSION -B /tmp/build_airspy \
&& make -j$(nproc) -C /tmp/build_airspy \
&& make -C /tmp/build_airspy install \
# BladeRF
&& wget https://github.com/Nuand/bladeRF/archive/$BLADERF_VERSION.tar.gz -O /tmp/bladeRF.tar.gz \
&& tar xf /tmp/bladeRF.tar.gz -C /tmp \
&& cmake3 -Wno-dev -S /tmp/bladeRF-$BLADERF_VERSION/host -B /tmp/build_blade \
&& make -j$(nproc) -C /tmp/build_blade \
&& make -C /tmp/build_blade install \
&& wget https://github.com/myriadrf/LimeSuite/archive/v$LIMESUITE_VERSION.tar.gz -O /tmp/lime.tar.gz \
# Lime
&& tar xf /tmp/lime.tar.gz -C /tmp \
&& cmake3 -S /tmp/LimeSuite-$LIMESUITE_VERSION -B /tmp/build_lime \
&& make -j$(nproc) -C /tmp/build_lime \
&& make -C /tmp/build_lime install \
# RTLSDR
&& wget https://github.com/osmocom/rtl-sdr/archive/$RTLSDR_VERSION.tar.gz -O /tmp/rtlsdr.tar.gz \
&& tar xf /tmp/rtlsdr.tar.gz -C /tmp \
&& cmake3 -DDETACH_KERNEL_DRIVER=ON -S /tmp/rtl-sdr-$RTLSDR_VERSION -B /tmp/build_rtlsdr \
&& make -j$(nproc) -C /tmp/build_rtlsdr \
&& make -C /tmp/build_rtlsdr install \
# SDRPLAY
&& wget http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-$SDRPLAY_VERSION.1.run -O /tmp/sdrplay.run \
&& bash /tmp/sdrplay.run --tar xf -C /tmp \
&& mv /tmp/mirsdrapi-rsp.h /usr/include \
&& mv /tmp/x86_64/* /usr/lib64 \
&& ln -s /usr/lib64/libmirsdrapi-rsp.so.$SDRPLAY_VERSION /usr/lib64/libmirsdrapi-rsp.so \
&& rm -rf /tmp/* \
&& yum clean all

View File

@ -0,0 +1,74 @@
import os
import shutil
import sys
HIDDEN_IMPORTS = ["packaging.specifiers", "packaging.requirements", "pkg_resources.py2_warn",
"numpy.core._methods", "numpy.core._dtype_ctypes",
"numpy.random.common", "numpy.random.entropy", "numpy.random.bounded_integers"]
DATA = [("src/urh/dev/native/lib/shared", "."), ("src/urh/plugins", "urh/plugins"), ]
EXCLUDE = ["matplotlib"]
def run_pyinstaller(cmd_list: list, env: list=None):
cmd = " ".join(cmd_list)
print(cmd, flush=True)
env = [] if env is None else env
if env:
os.system(" ".join(env) + " " + cmd)
else:
os.system(cmd)
if __name__ == '__main__':
cmd = ["pyinstaller", "--clean"]
if sys.platform == "darwin":
cmd.append("--onefile")
for hidden_import in HIDDEN_IMPORTS:
cmd.append("--hidden-import={}".format(hidden_import))
for src, dst in DATA:
cmd.append("--add-data")
cmd.append('"{}{}{}"'.format(src, os.pathsep, dst))
for exclude in EXCLUDE:
cmd.append("--exclude-module={}".format(exclude))
urh_path = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
if sys.platform == "darwin":
cmd.append('--icon="{}"'.format(os.path.join(urh_path, "data/icons/appicon.icns")))
else:
cmd.append('--icon="{}"'.format(os.path.join(urh_path, "data/icons/appicon.ico")))
cmd.extend(["--distpath", "./pyinstaller"])
urh_cmd = cmd + ["--name=urh", "--windowed", "--workpath", "./urh_build",
os.path.join(urh_path, "src/urh/main.py")]
urh_debug_cmd = cmd + ["--name=urh_debug", "--workpath", "./urh_debug_build",
os.path.join(urh_path, "src/urh/main.py")]
cli_cmd = cmd + ["--workpath", "./urh_cli_build",
os.path.join(urh_path, "src/urh/cli/urh_cli.py")]
os.makedirs("./pyinstaller")
if sys.platform == "darwin":
run_pyinstaller(urh_cmd, env=["DYLD_LIBRARY_PATH=src/urh/dev/native/lib/shared"])
import plistlib
with open("pyinstaller/urh.app/Contents/Info.plist", "rb") as f:
p = plistlib.load(f)
p["NSHighResolutionCapable"] = True
p["NSRequiresAquaSystemAppearance"] = True
p["NSMicrophoneUsageDescription"] = "URH needs access to your microphone to capture signals via Soundcard."
with open("pyinstaller/urh.app/Contents/Info.plist", "wb") as f:
plistlib.dump(p, f)
else:
for cmd in [urh_cmd, cli_cmd, urh_debug_cmd]:
run_pyinstaller(cmd)
shutil.copy("./pyinstaller/urh_cli/urh_cli.exe", "./pyinstaller/urh/urh_cli.exe")
shutil.copy("./pyinstaller/urh_debug/urh_debug.exe", "./pyinstaller/urh/urh_debug.exe")

View File

@ -0,0 +1,54 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['src/urh/main.py'],
pathex=[],
binaries=[],
datas=[('src/urh/plugins', 'urh/plugins')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=['matplotlib'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None , icon='data/icons/appicon.icns')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='main')
app = BUNDLE(coll,
name='main.app',
icon='./data/icons/appicon.icns',
bundle_identifier=None,
info_plist={
'NSRequiresAquaSystemAppearance': True,
'NSMicrophoneUsageDescription': 'URH needs access to your microphone to capture signals via Soundcard.',
'CFBundleDisplayName': 'URH',
'CFBundleName': 'URH'
},)

View File

@ -0,0 +1,83 @@
import fileinput
import os
import shutil
import sys
import tempfile
from subprocess import call, check_output
def cleanup():
"""
Remove all cache directories
:return:
"""
script_dir = os.path.dirname(__file__) if not os.path.islink(__file__) else os.path.dirname(os.readlink(__file__))
script_dir = os.path.realpath(os.path.join(script_dir, ".."))
shutil.rmtree(os.path.join(script_dir, "dist"), ignore_errors=True)
shutil.rmtree(os.path.join(script_dir, "tmp"), ignore_errors=True)
shutil.rmtree(os.path.join(script_dir, "urh.egg-info"), ignore_errors=True)
shutil.rmtree(os.path.join(script_dir, "src", "urh.egg-info"), ignore_errors=True)
shutil.rmtree(os.path.join(script_dir, "src", "urh", "tmp"), ignore_errors=True)
def release():
script_dir = os.path.dirname(__file__) if not os.path.islink(__file__) else os.path.dirname(os.readlink(__file__))
script_dir = os.path.realpath(os.path.join(script_dir, ".."))
os.chdir(script_dir)
current_branch = check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).decode("UTF-8").strip()
if current_branch != "master":
print("You can only release from master!")
sys.exit(1)
open(os.path.join(tempfile.gettempdir(), "urh_releasing"), "w").close()
from src.urh import version
version_file = os.path.realpath(os.path.join(script_dir, "src", "urh", "version.py"))
cur_version = version.VERSION
numbers = cur_version.split(".")
numbers[-1] = str(int(numbers[-1]) + 1)
cur_version = ".".join(numbers)
for line in fileinput.input(version_file, inplace=True):
if line.startswith("VERSION"):
line = 'VERSION = "{0}" \n'.format(cur_version)
print(line, end='')
# Publish new version number
call(["git", "add", version_file])
call(["git", "commit", "-m", "version" + cur_version])
input("Pushing to GitHub now. Press a key to continue.")
call(["git", "push"])
os.chdir(script_dir)
# Remove local tags
call("git tag -l | xargs git tag -d", shell=True)
call(["git", "fetch", "--tags"])
# Push new tag
call(["git", "tag", "v" + cur_version, "-m", "version " + cur_version])
call(["git", "push", "origin", "--tags"]) # Creates tar package on https://github.com/jopohl/urh/tarball/va.b.c.d
os.remove(os.path.join(tempfile.gettempdir(), "urh_releasing"))
# region Build docker image and push to DockerHub
os.chdir(os.path.dirname(__file__))
call(["docker", "login"])
call(["docker", "build", "--no-cache",
"--tag", "jopohl/urh:latest",
"--tag", "jopohl/urh:{}".format(cur_version), "."])
call(["docker", "push", "jopohl/urh:latest"])
call(["docker", "push", "jopohl/urh:{}".format(cur_version)])
# endregion
if __name__ == "__main__":
cleanup()
input("Starting release. Hit a key to continue.")
release()
cleanup()

View File

@ -0,0 +1,4 @@
numpy
pyqt5
psutil
cython!=0.29.18

View File

@ -0,0 +1,280 @@
// Source: https://github.com/snapcore/snapcraft-preloads/blob/master/semaphores/preload-semaphores.c
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
/*
* $ gcc -Wall -fPIC -shared -o mylib.so ./lib.c -ldl
* $ LD_PRELOAD=./mylib.so ...
*/
#include <dlfcn.h>
#include <sys/types.h>
#include <stdio.h>
#include <semaphore.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdarg.h>
#include <limits.h>
static sem_t *(*original_sem_open) (const char *, int, ...);
static int (*original_sem_unlink) (const char *);
// Format is: 'sem.snap.SNAP_NAME.<something>'. So: 'sem.snap.' + '.' = 10
#define MAX_NAME_SIZE NAME_MAX - 10
#define SHM_DIR "/dev/shm"
void debug(char *s, ...)
{
if (secure_getenv("SEMWRAP_DEBUG")) {
va_list va;
va_start(va, s);
fprintf(stderr, "SEMWRAP: ");
vfprintf(stderr, s, va);
va_end(va);
fprintf(stderr, "\n");
}
}
const char *get_snap_name(void)
{
const char *snapname = getenv("SNAP_INSTANCE_NAME");
if (!snapname) {
snapname = getenv("SNAP_NAME");
}
if (!snapname) {
debug("SNAP_NAME and SNAP_INSTANCE_NAME not set");
}
return snapname;
}
int rewrite(const char *snapname, const char *name, char *rewritten,
size_t rmax)
{
if (strlen(snapname) + strlen(name) > MAX_NAME_SIZE) {
errno = ENAMETOOLONG;
return -1;
}
const char *tmp = name;
if (tmp[0] == '/') {
// If specified with leading '/', just strip it to avoid
// having to mkdir(), etc
tmp = &name[1];
}
int n = snprintf(rewritten, rmax, "snap.%s.%s", snapname, tmp);
if (n < 0 || n >= rmax) {
fprintf(stderr, "snprintf truncated\n");
return -1;
}
rewritten[rmax-1] = '\0';
return 0;
}
sem_t *sem_open(const char *name, int oflag, ...)
{
mode_t mode;
unsigned int value;
debug("sem_open()");
debug("requested name: %s", name);
// lookup the libc's sem_open() if we haven't already
if (!original_sem_open) {
dlerror();
original_sem_open = dlsym(RTLD_NEXT, "sem_open");
if (!original_sem_open) {
debug("could not find sem_open in libc");
return SEM_FAILED;
}
dlerror();
}
// mode and value must be set with O_CREAT
va_list argp;
va_start(argp, oflag);
if (oflag & O_CREAT) {
mode = va_arg(argp, mode_t);
value = va_arg(argp, unsigned int);
if (value > SEM_VALUE_MAX) {
errno = EINVAL;
return SEM_FAILED;
}
}
va_end(argp);
const char *snapname = get_snap_name();
// just call libc's sem_open() if snapname not set
if (!snapname) {
if (oflag & O_CREAT) {
return original_sem_open(name, oflag, mode, value);
}
return original_sem_open(name, oflag);
}
// Format the rewritten name
char rewritten[MAX_NAME_SIZE+1];
if (rewrite(snapname, name, rewritten, MAX_NAME_SIZE + 1) != 0) {
return SEM_FAILED;
}
debug("rewritten name: %s", rewritten);
if (oflag & O_CREAT) {
// glibc's sem_open with O_CREAT will create a file in /dev/shm
// by creating a tempfile, initializing it, hardlinking it and
// unlinking the tempfile. We:
// 1. create a temporary file in /dev/shm with rewritten path
// as the template and the specified mode
// 2. initializing a sem_t with sem_init
// 3. writing the initialized sem_t to the temporary file using
// sem_open()s declared value. We used '1' for pshared since
// that is how glibc sets up a named semaphore
// 4. close the temporary file
// 5. hard link the temporary file to the rewritten path. If
// O_EXCL is not specified, ignore EEXIST and just cleanup
// as per documented behavior in 'man sem_open'. If O_EXCL
// is specified and file exists, exit with error. If link is
// successful, cleanup.
// 6. call glibc's sem_open() without O_CREAT|O_EXCL
//
// See glibc's fbtl/sem_open.c for more details
// First, calculate the requested path
char path[PATH_MAX] = { 0 };
// /sem. + '/0' = 14
int max_path_size = strlen(SHM_DIR) + strlen(rewritten) + 6;
if (max_path_size >= PATH_MAX) {
// Should never happen since PATH_MAX should be much
// larger than NAME_MAX, but be defensive.
errno = ENAMETOOLONG;
return SEM_FAILED;
}
int n = snprintf(path, max_path_size, "%s/sem.%s", SHM_DIR,
rewritten);
if (n < 0 || n >= max_path_size) {
errno = ENAMETOOLONG;
return SEM_FAILED;
}
path[max_path_size-1] = '\0';
// Then calculate the template path
char tmp[PATH_MAX] = { 0 };
n = snprintf(tmp, PATH_MAX, "%s/%s.XXXXXX", SHM_DIR,
rewritten);
if (n < 0 || n >= PATH_MAX) {
errno = ENAMETOOLONG;
return SEM_FAILED;
}
tmp[PATH_MAX-1] = '\0';
// Next, create a temporary file
int fd = mkstemp(tmp);
if (fd < 0) {
return SEM_FAILED;
}
debug("tmp name: %s", tmp);
// Update the temporary file to have the requested mode
if (fchmod(fd, mode) < 0) {
close(fd);
unlink(tmp);
return SEM_FAILED;
}
// Then write out an empty semaphore and set the initial value.
// We use '1' for pshared since that is how glibc sets up the
// semaphore (see glibc's fbtl/sem_open.c)
sem_t initsem;
sem_init(&initsem, 1, value);
if (write(fd, &initsem, sizeof(sem_t)) < 0) {
close(fd);
unlink(tmp);
return SEM_FAILED;
}
close(fd);
// Then link the file into place. If the target exists and
// O_EXCL was not specified, just cleanup and proceed to open
// the existing file as per documented behavior in 'man
// sem_open'.
int existed = 0;
if (link(tmp, path) < 0) {
// Note: snapd initially didn't allow 'l' in its
// policy so we first try with link() since it is
// race-free but fallback to rename() if necessary.
if (errno == EACCES || errno == EPERM) {
fprintf(stderr, "sem_open() wrapper: hard linking tempfile denied. Falling back to rename()\n");
if (rename(tmp, path) < 0) {
unlink(tmp);
return SEM_FAILED;
}
} else if (oflag & O_EXCL || errno != EEXIST) {
unlink(tmp);
return SEM_FAILED;
}
existed = 1;
}
unlink(tmp);
// Then call sem_open() on the created file, stripping out the
// O_CREAT|O_EXCL since we just created it
sem_t *sem = original_sem_open(rewritten,
oflag & ~(O_CREAT | O_EXCL));
if (sem == SEM_FAILED) {
if (!existed) {
unlink(path);
}
return SEM_FAILED;
}
return sem;
} else {
// without O_CREAT, just call sem_open with rewritten
return original_sem_open(rewritten, oflag);
}
return SEM_FAILED;
}
// sem_unlink
int sem_unlink(const char *name)
{
debug("sem_unlink()");
debug("requested name: %s", name);
// lookup the libc's sem_unlink() if we haven't already
if (!original_sem_unlink) {
dlerror();
original_sem_unlink = dlsym(RTLD_NEXT, "sem_unlink");
if (!original_sem_unlink) {
debug("could not find sem_unlink in libc");
return -1;
}
dlerror();
}
const char *snapname = get_snap_name();
// just call libc's sem_unlink() if snapname not set
if (!snapname) {
return original_sem_unlink(name);
}
// Format the rewritten name
char rewritten[MAX_NAME_SIZE+1];
if (rewrite(snapname, name, rewritten, MAX_NAME_SIZE + 1) != 0) {
return -1;
}
debug("rewritten name: %s", rewritten);
return original_sem_unlink(rewritten);
}

View File

@ -0,0 +1,207 @@
name: urh
title: Universal Radio Hacker
version: git
summary: Investigate Wireless Protocols Like A Boss
description: |
The Universal Radio Hacker (URH) is a complete suite for wireless protocol investigation with native support for many common **Software Defined Radios**.
URH allows **easy demodulation** of signals combined with an automatic detection of modulation parameters making it a breeze to identify the bits and bytes that fly over the air.
As data often gets _encoded_ before transmission, URH offers **customizable decodings** to crack even sophisticated encodings like CC1101 data whitening.
When it comes to **protocol reverse-engineering**, URH is helpful in two ways. You can either manually assign protocol fields and message types or let URH **automatically infer protocol fields** with a rule-based intelligence.
Finally, URH entails a **fuzzing component** aimed at stateless protocols and a **simulation environment** to perform stateful attacks.
After installation, give URH access to your USB in order to access your USB based SDRs:
sudo snap connect urh:raw-usb
In order to access your SDR as non-root user, install the according **udev rules** available at https://github.com/jopohl/urh/wiki/SDR-udev-rules.
If you want to use your Soundcard as an SDR for receiving please execute:
sudo snap connect urh:audio-record
icon: data/icons/appicon.png
grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots
base: core18
plugs: # plugs for theming, font settings, cursor and to use gtk3 file chooser
gtk-3-themes:
interface: content
target: $SNAP/data-dir/themes
default-provider: gtk-common-themes:gtk-3-themes
icon-themes:
interface: content
target: $SNAP/data-dir/icons
default-provider: gtk-common-themes:icon-themes
sound-themes:
interface: content
target: $SNAP/data-dir/sounds
default-provider: gtk-common-themes:sounds-themes
apps:
urh:
adapter: full
command: snap/command-chain/alsa-launch desktop-launch $SNAP/bin/urh
plugs:
- desktop
- desktop-legacy
- wayland
- x11
- unity7
- gsettings
- home
- opengl
- raw-usb
- audio-playback
- audio-record
- network
environment:
QT_QPA_PLATFORMTHEME: gtk3
LD_PRELOAD: $SNAP/lib/semwraplib.so
BLADERF_SEARCH_DIR: $SNAP/bladefpgas
layout:
/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib:
bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib
parts:
alsa-mixin:
plugin: dump
source: https://github.com/diddlesnaps/snapcraft-alsa.git
source-subdir: snapcraft-assets
build-packages:
- libasound2-dev
semwraplib:
plugin: nil
source: data
override-build: |
snapcraftctl build
mkdir -p $SNAPCRAFT_PART_INSTALL/lib
gcc -g -O0 -Wall -Wstrict-prototypes -fPIC -shared semwraplib.c -o $SNAPCRAFT_PART_INSTALL/lib/semwraplib.so -ldl
build-packages:
- build-essential
desktop-qt5:
source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
source-subdir: qt
plugin: make
make-parameters: ["FLAVOR=qt5"]
build-packages:
- build-essential
- qtbase5-dev
- dpkg-dev
stage-packages:
- libxkbcommon0
- ttf-ubuntu-font-family
- dmz-cursor-theme
- light-themes
- libgstreamer-plugins-base1.0-0
- adwaita-icon-theme
- gnome-themes-standard
- shared-mime-info
- libgomp1
- libqt5gui5
- libgdk-pixbuf2.0-0
- libqt5svg5 # for loading icon themes which are svg
- try: [appmenu-qt5] # not available on core18
- locales-all
- xdg-user-dirs
- fcitx-frontend-qt5
- libatk1.0-0
- libgtk2.0-0
- libxcomposite1
- libxcursor1
- libxinerama1
- libxrandr2
- libasyncns0
- libatk-bridge2.0-0
- libatspi2.0-0
- libcairo-gobject2
- libepoxy0
- libflac8
- libgtk-3-0
- libogg0
- libpulse0
- libsndfile1
- libvorbis0a
- libvorbisenc2
- libwayland-cursor0
- libwayland-egl1
- libodbc1
- libpq5
- libpulse-mainloop-glib0
- libspeechd2
- python3
- python3-pyqt5
- python3-pyaudio
- dbus
- qtwayland5
- qt5-gtk-platformtheme
- libqt5x11extras5
- locales
- libcanberra-gtk3-module
- libairspy-dev
- libhackrf-dev
- libiio-dev
- liblimesuite-dev
- librtlsdr-dev
- libuhd-dev
- libc-bin
- libasound2
- libasound2-plugins
- python3-distutils
urh:
after: [desktop-qt5, sdrplay, alsa-mixin]
plugin: python
requirements: [data/requirements.txt]
source: .
override-build: |
git clone https://github.com/Nuand/bladeRF.git
cd bladeRF/host
mkdir build
cmake -DCMAKE_INSTALL_PREFIX=$SNAPCRAFT_PART_INSTALL ..
make -j$(nproc)
make install
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make install
snapcraftctl build
build-packages:
- libairspy-dev
- libhackrf-dev
- libiio-dev
- liblimesuite-dev
- librtlsdr-dev
- libuhd-dev
- wget
- execstack
- build-essential
- cmake
- pkg-config
sdrplay:
plugin: dump
source: /lib
stage: [libmirsdrapi-rsp.so.2.13]
override-build: |
wget http://www.sdrplay.com/software/SDRplay_RSP_API-Linux-2.13.1.run -O sdrplay.run
bash sdrplay.run --tar xf
cp mirsdrapi-rsp.h /usr/include
cp x86_64/* /lib
cp x86_64/* .
ln -sf /lib/libmirsdrapi-rsp.so.2.13 /lib/libmirsdrapi-rsp.so
snapcraftctl build
bladerf-fpga:
plugin: dump
source: .
override-build: |
snapcraftctl build
wget https://www.nuand.com/fpga/v0.11.0/hostedxA4.rbf -P $SNAPCRAFT_PART_INSTALL/bladefpgas
wget https://www.nuand.com/fpga/v0.11.0/hostedxA9.rbf -P $SNAPCRAFT_PART_INSTALL/bladefpgas
wget https://www.nuand.com/fpga/v0.11.0/hostedx40.rbf -P $SNAPCRAFT_PART_INSTALL/bladefpgas
wget https://www.nuand.com/fpga/v0.11.0/hostedx115.rbf -P $SNAPCRAFT_PART_INSTALL/bladefpgas

View File

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogAdvancedModSettings</class>
<widget class="QDialog" name="DialogAdvancedModSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>527</width>
<height>501</height>
</rect>
</property>
<property name="windowTitle">
<string>Advanced Modulation Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Pause Threshold</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The pause threshold gives you control &lt;span style=&quot; font-weight:600;&quot;&gt;when to insert a message break.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The pause threshold is the maximum length of consecutive zero bits represented by a pause before a new message begins.&lt;/p&gt;&lt;p&gt;Special value is 0 to disable message breaking completely.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxPauseThreshold">
<property name="specialValueText">
<string>Disable</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>8</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Message Length Divisor</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;With the message &lt;span style=&quot; font-weight:600;&quot;&gt;divisor length&lt;/span&gt; you can control the minimum message length in a flexible way. URH will try to demodulate signals in such a way, that the resulting message has a number of bits that is divisble by the configured divisor. &lt;br/&gt;&lt;br/&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;How does the zero padding work? Remaining zero bits are taken from the pause behind the message if possible.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxMessageLengthDivisor">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogAdvancedModSettings</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogAdvancedModSettings</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChecksumOptions</class>
<widget class="QWidget" name="ChecksumOptions">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>775</width>
<height>836</height>
</rect>
</property>
<property name="windowTitle">
<string>Configure Checksum</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0" colspan="2">
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>738</width>
<height>827</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Checksum category:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxCategory">
<item>
<property name="text">
<string>CRC</string>
</property>
</item>
<item>
<property name="text">
<string>Wireless Short Packet Checksum</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page_crc">
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="3" column="1">
<widget class="QLineEdit" name="lineEditFinalXOR"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>CRC polynomial (hex):</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Configure data ranges for CRC</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="tableViewDataRanges">
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QToolButton" name="btnAddRange">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>../../../</normaloff>../../../</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRemoveRange">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>../../../</normaloff>../../../</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineEditStartValue"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>CRC function:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Final XOR (hex):</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Start value (hex):</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineEditCRCPolynomial"/>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxCRCFunction"/>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_crc_info">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Order=17&lt;/p&gt;&lt;p&gt;Length of checksum=16&lt;/p&gt;&lt;p&gt;start value length =16&lt;/p&gt;&lt;p&gt;final XOR length = 16&lt;/p&gt;&lt;p&gt;Polynomial = x&lt;span style=&quot; vertical-align:super;&quot;&gt;1&lt;/span&gt; + 4&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxRefIn">
<property name="text">
<string>RefIn (Reflect input)</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxRefOut">
<property name="text">
<string>RefOut (Reflect output)</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_wsp">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The Wireless Short Packet (WSP) standard uses three different checksums. URH can automatically detect the used checksum algorithm from the message. However, you can enforce the usage of a certain checksum if you need to.&lt;/p&gt;&lt;p&gt;With &lt;span style=&quot; font-weight:600;&quot;&gt;Automatic&lt;/span&gt; setting, checksums are chosen by these rules:&lt;/p&gt;&lt;p&gt;1) 4 Bit Checksum - For Switch Telegram (RORG=5 or 6 and STATUS = 0x20 or 0x30)&lt;/p&gt;&lt;p&gt;2) 8 Bit Checksum: STATUS bit 2&lt;span style=&quot; vertical-align:super;&quot;&gt;7&lt;/span&gt; = 0&lt;/p&gt;&lt;p&gt;3) 8 Bit CRC: STATUS bit 2&lt;span style=&quot; vertical-align:super;&quot;&gt;7&lt;/span&gt; = 1&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonWSPAuto">
<property name="text">
<string>Automatic (recommended)</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonWSPChecksum4">
<property name="text">
<string>Force Checksum4</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonWSPChecksum8">
<property name="text">
<string>Force Checksum8</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonWSPCRC8">
<property name="text">
<string>Force CRC8</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>107</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>comboBoxCRCFunction</tabstop>
<tabstop>lineEditCRCPolynomial</tabstop>
<tabstop>lineEditStartValue</tabstop>
<tabstop>lineEditFinalXOR</tabstop>
<tabstop>tableViewDataRanges</tabstop>
<tabstop>btnAddRange</tabstop>
<tabstop>radioButtonWSPAuto</tabstop>
<tabstop>btnRemoveRange</tabstop>
<tabstop>radioButtonWSPChecksum4</tabstop>
<tabstop>radioButtonWSPChecksum8</tabstop>
<tabstop>radioButtonWSPCRC8</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogCosta</class>
<widget class="QDialog" name="DialogCosta">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Configure Costas Loop</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>URH uses a Costas loop for PSK demodulation. Configure the loop bandwidth below.</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="labelLoopBandwidth">
<property name="text">
<string>Loop Bandwidth:</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="doubleSpinBoxLoopBandwidth">
<property name="decimals">
<number>4</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogCosta</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogCosta</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,280 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogCSVImport</class>
<widget class="QDialog" name="DialogCSVImport">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>635</width>
<height>674</height>
</rect>
</property>
<property name="windowTitle">
<string>CSV Import</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="2">
<widget class="QLabel" name="labelFileNotFound">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;Could not open the selected file.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="3" column="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="comboBoxCSVSeparator">
<item>
<property name="text">
<string>,</string>
</property>
</item>
<item>
<property name="text">
<string>;</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnAddSeparator">
<property name="toolTip">
<string>Add a custom separator.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="2">
<widget class="QSpinBox" name="spinBoxTimestampColumn">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; If your dataset contains timestamps URH will calculate the sample rate from them. You can manually edit the sample rate after import in the signal details.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="specialValueText">
<string>Not present</string>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>I Data Column:</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QSpinBox" name="spinBoxQDataColumn">
<property name="specialValueText">
<string>Not present</string>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; If your dataset contains timestamps URH will calculate the sample rate from them. You can manually edit the sample rate after import in the signal details.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Timestamp Column:</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Q Data Column:</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Preview</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTableWidget" name="tableWidgetPreview">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Timestamp</string>
</property>
</column>
<column>
<property name="text">
<string>I</string>
</property>
</column>
<column>
<property name="text">
<string>Q</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineEditFilename"/>
</item>
<item>
<widget class="QToolButton" name="btnChooseFile">
<property name="text">
<string>...</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="2">
<widget class="QSpinBox" name="spinBoxIDataColumn">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>CSV Separator:</string>
</property>
</widget>
</item>
<item row="9" column="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QGroupBox" name="groupBoxFilePreview">
<property name="title">
<string>File Content (at most 100 rows)</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPlainTextEdit" name="plainTextEditFilePreview">
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>File to import:</string>
</property>
</widget>
</item>
<item row="10" column="2">
<widget class="QPushButton" name="btnAutoDefault">
<property name="text">
<string>Prevent Dialog From Close with Enter</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>lineEditFilename</tabstop>
<tabstop>btnChooseFile</tabstop>
<tabstop>plainTextEditFilePreview</tabstop>
<tabstop>comboBoxCSVSeparator</tabstop>
<tabstop>btnAddSeparator</tabstop>
<tabstop>spinBoxIDataColumn</tabstop>
<tabstop>spinBoxQDataColumn</tabstop>
<tabstop>spinBoxTimestampColumn</tabstop>
<tabstop>tableWidgetPreview</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogCSVImport</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>375</x>
<y>641</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogCSVImport</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>443</x>
<y>647</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,732 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Decoder</class>
<widget class="QDialog" name="Decoder">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>2200</width>
<height>1398</height>
</rect>
</property>
<property name="windowTitle">
<string>Decoding</string>
</property>
<property name="modal">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="combobox_decodings">
<item>
<property name="text">
<string>Non Return to Zero (NRZ)</string>
</property>
</item>
<item>
<property name="text">
<string>Empty</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QPushButton" name="delete_decoding">
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveas">
<property name="text">
<string>Save as...</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>Base Functions</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="basefunctions">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Additional Functions</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="additionalfunctions">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>11</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Your Decoding</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="ListWidget" name="decoderchain">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::MoveAction</enum>
</property>
<property name="textElideMode">
<enum>Qt::ElideMiddle</enum>
</property>
<property name="resizeMode">
<enum>QListView::Fixed</enum>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="gb_infoandoptions">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Information and Options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="info">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Please drag functions from the categories base and additional to the decoding process (Decoder). You can reorder functions by drag and drop and remove functions by dropping them outside the Decoder box. Click on every function for detailed information.</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="optionWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>5</number>
</property>
<widget class="QWidget" name="page_empty"/>
<widget class="QWidget" name="page_redundancy">
<widget class="QSpinBox" name="multiple">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>56</width>
<height>23</height>
</rect>
</property>
<property name="minimum">
<number>2</number>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>60</x>
<y>0</y>
<width>171</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Number of redundant bits</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="page_carrier">
<widget class="QLineEdit" name="carrier">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>120</x>
<y>0</y>
<width>171</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Carrier ('1_' -&gt; 1_1_1_...)</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="page_substitution">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QSpinBox" name="substitution_rows">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>4</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Rows</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTableWidget" name="substitution">
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_external">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_11">
<property name="text">
<string>Decoder</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="external_decoder"/>
</item>
<item>
<widget class="QToolButton" name="btnChooseDecoder">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_12">
<property name="text">
<string>Encoder</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="external_encoder"/>
</item>
<item>
<widget class="QToolButton" name="btnChooseEncoder">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>158</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_data_whitening">
<widget class="QLineEdit" name="datawhitening_sync">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>171</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_13">
<property name="geometry">
<rect>
<x>180</x>
<y>0</y>
<width>1461</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Synchronization bytes (hex coded)</string>
</property>
</widget>
<widget class="QLineEdit" name="datawhitening_polynomial">
<property name="geometry">
<rect>
<x>0</x>
<y>30</y>
<width>171</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_14">
<property name="geometry">
<rect>
<x>180</x>
<y>30</y>
<width>1461</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Data whitening polynomial (LFSR, hex, w/o first bit)</string>
</property>
</widget>
<widget class="QCheckBox" name="datawhitening_overwrite_crc">
<property name="geometry">
<rect>
<x>0</x>
<y>60</y>
<width>1641</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Overwrite CRC16 field with correct value when encoding</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="page_cut">
<widget class="QLineEdit" name="cutmark">
<property name="geometry">
<rect>
<x>0</x>
<y>30</y>
<width>181</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>1010</string>
</property>
</widget>
<widget class="QLabel" name="label_15">
<property name="geometry">
<rect>
<x>190</x>
<y>30</y>
<width>121</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Sequence</string>
</property>
</widget>
<widget class="QRadioButton" name="rB_delbefore">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>131</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&amp;Cut before</string>
</property>
</widget>
<widget class="QRadioButton" name="rB_delafter">
<property name="geometry">
<rect>
<x>150</x>
<y>0</y>
<width>111</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Cut afte&amp;r</string>
</property>
</widget>
<widget class="QRadioButton" name="rB_delbeforepos">
<property name="geometry">
<rect>
<x>0</x>
<y>70</y>
<width>111</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Cut before</string>
</property>
</widget>
<widget class="QRadioButton" name="rB_delafterpos">
<property name="geometry">
<rect>
<x>150</x>
<y>70</y>
<width>111</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Cut after</string>
</property>
</widget>
<widget class="QSpinBox" name="cutmark2">
<property name="geometry">
<rect>
<x>0</x>
<y>100</y>
<width>181</width>
<height>33</height>
</rect>
</property>
<property name="maximum">
<number>1000</number>
</property>
</widget>
<widget class="QLabel" name="label_16">
<property name="geometry">
<rect>
<x>190</x>
<y>100</y>
<width>121</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Position (in bit)</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="page_morse">
<widget class="QLabel" name="label_17">
<property name="geometry">
<rect>
<x>70</x>
<y>10</y>
<width>341</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Maximum (&lt;=) length of 1-sequence for: Low (0)</string>
</property>
</widget>
<widget class="QSpinBox" name="morse_low">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>56</width>
<height>23</height>
</rect>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
<widget class="QLabel" name="label_18">
<property name="geometry">
<rect>
<x>70</x>
<y>40</y>
<width>351</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Minimum (&gt;=) length of 1-sequence for: High (1)</string>
</property>
</widget>
<widget class="QSpinBox" name="morse_high">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>56</width>
<height>23</height>
</rect>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>3</number>
</property>
</widget>
<widget class="QLabel" name="label_19">
<property name="geometry">
<rect>
<x>70</x>
<y>70</y>
<width>371</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Number of 0s between 1-sequences (just for encoding)</string>
</property>
</widget>
<widget class="QSpinBox" name="morse_wait">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>56</width>
<height>23</height>
</rect>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</widget>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnAddtoYourDecoding">
<property name="text">
<string>Add to Your Decoding</string>
</property>
</widget>
</item>
</layout>
<zorder>optionWidget</zorder>
<zorder>info</zorder>
<zorder>btnAddtoYourDecoding</zorder>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="inpt">
<property name="inputMethodHints">
<set>Qt::ImhDigitsOnly</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="combobox_signals">
<item>
<property name="text">
<string>Test</string>
</property>
</item>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="ZoomableGraphicView" name="graphicsView_signal"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Signal {0,1}:</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="ZoomableGraphicView" name="graphicsView_decoded"/>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="output">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Decoded Bits:</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="decoding_errors_label">
<property name="text">
<string>[Decoding Errors = 0]</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ZoomableGraphicView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.ZoomableGraphicView.h</header>
</customwidget>
<customwidget>
<class>ListWidget</class>
<extends>QListWidget</extends>
<header>urh.ui.ListWidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogFilterBandwidth</class>
<widget class="QDialog" name="DialogFilterBandwidth">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>502</width>
<height>426</height>
</rect>
</property>
<property name="windowTitle">
<string>Configure Filter Bandwidth</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,3,1">
<property name="spacing">
<number>7</number>
</property>
<item>
<widget class="QLabel" name="labelExplanation">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;To separate the frequency bands from each other a &lt;b&gt;bandpass&lt;/b&gt; filter is used. You can configure the &lt;b&gt;bandwidth&lt;/b&gt; of this filter here. The bandwidth determines the &lt;b&gt;length N&lt;/b&gt; of the&lt;b&gt; filter kernel&lt;/b&gt;. Decreasing the bandwidth will increase the accuracy of the filter, at cost of higher computation time.&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="7" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBoxCustomBandwidth">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>0.000100000000000</double>
</property>
<property name="maximum">
<double>0.500000000000000</double>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QSpinBox" name="spinBoxCustomKernelLength">
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QRadioButton" name="radioButtonCustom">
<property name="text">
<string>Custom</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="labelMediumKernelLength">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QRadioButton" name="radioButtonWide">
<property name="text">
<string>Wide</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLabel" name="labelVeryWideKernelLength">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="radioButtonNarrow">
<property name="text">
<string>Narrow</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="labelWideBandwidth">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="labelVeryNarrowKernelLength">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="labelBandwidthCaption">
<property name="text">
<string>&lt;b&gt;Bandwidth (Hz)&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labelNarrowBandwidth">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="labelNarrowKernelLength">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="labelVeryNarrowBandwidth">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labelKernelLengthCaption">
<property name="text">
<string>&lt;b &gt;Kernel Length N&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="labelWideKernelLength">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QRadioButton" name="radioButtonVery_Wide">
<property name="text">
<string>Very Wide</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="radioButtonVery_Narrow">
<property name="text">
<string>Very Narrow</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;b&gt;Choose &lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="labelVeryWideBandwidth">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="radioButtonMedium">
<property name="text">
<string>Medium</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="labelMediumBandwidth">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogFilterBandwidth</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogFilterBandwidth</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,175 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FilterDialog</class>
<widget class="QDialog" name="FilterDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>528</width>
<height>485</height>
</rect>
</property>
<property name="windowTitle">
<string>Configure filter</string>
</property>
<property name="windowIcon">
<iconset theme="view-filter">
<normaloff>.</normaloff>.</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="9" column="0">
<widget class="QRadioButton" name="radioButtonCustomTaps">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Custom taps:</string>
</property>
</widget>
</item>
<item row="15" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
<item row="16" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="7" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QRadioButton" name="radioButtonMovingAverage">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Moving average</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QSpinBox" name="spinBoxNumTaps">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>A DC correction filter will remove the DC component (mean value) of the signal and center it around zero.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="lineEditCustomTaps">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can configure custom filter taps here either explicit using [0.1, 0.2, 0.3] or with &lt;span style=&quot; font-weight:600;&quot;&gt;python programming shortcuts&lt;/span&gt; like [0.1] * 3 + [0.2] * 4 will result in [0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2]&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>[0.1]*10</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Number of taps:</string>
</property>
</widget>
</item>
<item row="13" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>You can imagine taps as weighting factors applied to n samples of the signal whereby n is the number of taps. By default we use 10 taps with each tap set to 0.1 producing a moving average filter.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="14" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>These n weighted samples get summed up to produce the output of the filter. In DSP terms you configure the impulse response of the filter here.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="radioButtonDCcorrection">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>DC correction</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,678 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FuzzingDialog</class>
<widget class="QDialog" name="FuzzingDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>523</width>
<height>632</height>
</rect>
</property>
<property name="windowTitle">
<string>Fuzzing</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="2" column="1">
<widget class="QSpinBox" name="spinBoxFuzzMessage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="comboBoxStrategy">
<item>
<property name="text">
<string>Add Range of Values</string>
</property>
</item>
<item>
<property name="text">
<string>Add Boundaries</string>
</property>
</item>
<item>
<property name="text">
<string>Add Random Values from Range</string>
</property>
</item>
<item>
<property name="text">
<string>Add De Bruijn Sequence</string>
</property>
</item>
</widget>
</item>
<item row="9" column="1">
<widget class="QPushButton" name="btnAddFuzzingValues">
<property name="text">
<string>Add to Fuzzed Values</string>
</property>
</widget>
</item>
<item row="7" column="0" rowspan="2">
<widget class="QStackedWidget" name="stackedWidgetLabels">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageAddRangeLabel">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lStart">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Start (Decimal):</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lEnd">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>End (Decimal):</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lStep">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Step (Decimal):</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageAddBoundariesLabel">
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="checkBoxLowerBound">
<property name="text">
<string>Lower Bound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxUpperBound">
<property name="text">
<string>Upper Bound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lNumberBoundaries">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Values per Boundary:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageAddRandomLabel">
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lRandomMin">
<property name="text">
<string>Range Minimum:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lRandomMax">
<property name="text">
<string>Range Maximum:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lNumRandom">
<property name="text">
<string>Number Values:</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="lPreBits">
<property name="text">
<string>1111</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lFuzzedBits">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>1010</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lPostBits">
<property name="text">
<string>010101</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="5" column="0" colspan="2">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lFuzzedValues">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Fuzzed Values</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkBRemoveDuplicates">
<property name="text">
<string>Remove Duplicates</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="1">
<widget class="QToolButton" name="btnDelRow">
<property name="toolTip">
<string>Remove selected values or last value if nothing is selected.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="4">
<widget class="FuzzingTableView" name="tblFuzzingValues">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="3" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QToolButton" name="btnAddRow">
<property name="toolTip">
<string>Add a new value.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QToolButton" name="btnRepeatValues">
<property name="toolTip">
<string>Repeat selected values or all values if nothing is selected.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="media-playlist-repeat">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="7" column="1" rowspan="2">
<widget class="QStackedWidget" name="stackedWidgetSpinboxes">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageAddRange">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSpinBox" name="sBAddRangeStart"/>
</item>
<item>
<widget class="QSpinBox" name="sBAddRangeEnd"/>
</item>
<item>
<widget class="QSpinBox" name="sBAddRangeStep">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageAddBoundaries">
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSpinBox" name="spinBoxLowerBound"/>
</item>
<item>
<widget class="QSpinBox" name="spinBoxUpperBound">
<property name="value">
<number>13</number>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxBoundaryNumber">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageAddRandom">
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QSpinBox" name="spinBoxRandomMinimum"/>
</item>
<item>
<widget class="QSpinBox" name="spinBoxRandomMaximum">
<property name="value">
<number>42</number>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxNumberRandom">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lSourceBlock">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Source Message:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lFuzzingReferenceBlock">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Message to fuzz:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="lFuzzingEnd">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Fuzzing Label End Index:</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="lStrategy">
<property name="text">
<string>Strategy:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxFuzzingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="spinBoxFuzzingEnd">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="spinBoxFuzzingStart">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lFuzzingStart">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Fuzzing Label Start Index:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lFuzzingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Fuzzing Label:</string>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>FuzzingTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.FuzzingTableView.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>comboBoxStrategy</sender>
<signal>currentIndexChanged(int)</signal>
<receiver>stackedWidgetLabels</receiver>
<slot>setCurrentIndex(int)</slot>
<hints>
<hint type="sourcelabel">
<x>201</x>
<y>593</y>
</hint>
<hint type="destinationlabel">
<x>100</x>
<y>614</y>
</hint>
</hints>
</connection>
<connection>
<sender>comboBoxStrategy</sender>
<signal>currentIndexChanged(int)</signal>
<receiver>stackedWidgetSpinboxes</receiver>
<slot>setCurrentIndex(int)</slot>
<hints>
<hint type="sourcelabel">
<x>444</x>
<y>591</y>
</hint>
<hint type="destinationlabel">
<x>809</x>
<y>616</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,769 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GeneratorTab</class>
<widget class="QWidget" name="GeneratorTab">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1287</width>
<height>774</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1287</width>
<height>774</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:horizontal {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_vertical.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<widget class="QWidget" name="layoutWidget_2">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QTabWidget::pane { border: 0; }</string>
</property>
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_proto">
<attribute name="title">
<string>Protocols</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="GeneratorTreeView" name="treeProtocols">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Drag&amp;amp;Drop Protocols to the table on the right to fill the generation table.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<attribute name="headerDefaultSectionSize">
<number>57</number>
</attribute>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_pauses">
<attribute name="title">
<string>Pauses</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="GeneratorListWidget" name="lWPauses">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The pauses will be added automatically when you drag a protocol from the tree above to the table on the right.&lt;br/&gt;&lt;/p&gt;&lt;p&gt;You can see the &lt;span style=&quot; font-weight:600;&quot;&gt;position&lt;/span&gt; of each pause by &lt;span style=&quot; font-weight:600;&quot;&gt;selecting it&lt;/span&gt;. There will be drawn a line in the table indicating the position of the pause.&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Use context menu or double click to &lt;span style=&quot; font-weight:600;&quot;&gt;edit a pauses' length&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::NoDragDrop</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_fuzzing">
<attribute name="title">
<string>Fuzzing</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="GeneratorListView" name="listViewProtoLabels">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed</set>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Add fuzzing values to generated data</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QStackedWidget" name="stackedWidgetFuzzing">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="pageFuzzingUI">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="btnFuzz">
<property name="text">
<string>Fuzz</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rBSuccessive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For multiple labels per message the fuzzed values are inserted &lt;span style=&quot; font-weight:600;&quot;&gt;one-by-one&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>S&amp;uccessive</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbConcurrent">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For multiple labels per message the labels are fuzzed &lt;span style=&quot; font-weight:600;&quot;&gt;at the same time&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&amp;Concurrent</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rBExhaustive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For multiple labels per message the fuzzed values are inserted in &lt;span style=&quot; font-weight:600;&quot;&gt;all possible combinations&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>E&amp;xhaustive</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="pageFuzzingProgressBar">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QProgressBar" name="progressBarFuzzing">
<property name="value">
<number>24</number>
</property>
<property name="format">
<string>%v/%m</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_6">
<property name="leftMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<item row="0" column="0" colspan="3">
<layout class="QGridLayout" name="modulationLayout_2">
<item row="1" column="1">
<widget class="QLabel" name="lCarrierFreqValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="lModType">
<property name="text">
<string>Modulation Type:</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="lModTypeValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_carrier_phase">
<property name="text">
<string>Carrier Phase:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="lCarrierPhaseValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lBitLength">
<property name="text">
<string>Symbol Length:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="lBitLenValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lEncoding">
<property name="text">
<string>Encoding:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lEncodingValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="lSampleRate">
<property name="text">
<string>Sample Rate:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="lSampleRateValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lCarrierFrequency">
<property name="text">
<string>Carrier Frequency:</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="ElidedLabel" name="labelParameterValues">
<property name="text">
<string>0/100</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="lParamCaption">
<property name="text">
<string>Amplitudes:</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Bits per Symbol:</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="labelBitsPerSymbol">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="3">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="cBoxModulations">
<item>
<property name="text">
<string>MyModulation</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QProgressBar" name="prBarGeneration">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="value">
<number>0</number>
</property>
<property name="format">
<string>Modulating %p%</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="btnSend">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Send data...</string>
</property>
<property name="icon">
<iconset theme="media-playback-start">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="btnEditModulation">
<property name="text">
<string>Edit ...</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lModulation">
<property name="text">
<string>Modulation:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="btnGenerate">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Generate the complex file of the modulated signal, after tuning all parameters above.</string>
</property>
<property name="text">
<string>Generate file...</string>
</property>
<property name="icon">
<iconset theme="document-new">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item row="2" column="6">
<widget class="QComboBox" name="cbViewType">
<item>
<property name="text">
<string>Bit</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>ASCII</string>
</property>
</item>
</widget>
</item>
<item row="2" column="5">
<widget class="QLabel" name="lViewType">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Viewtype:</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="7">
<widget class="GeneratorTableView" name="tableMessages">
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="dragEnabled">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::CopyAction</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="0" column="0" colspan="7">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="labelGeneratedData">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Generated Data</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSave">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Save current fuzz profile.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnOpen">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Load a fuzz profile.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-open">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="btnNetworkSDRSend">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Send encoded data to your external application via TCP.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Send via Network</string>
</property>
<property name="icon">
<iconset theme="network-wired">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="btnRfCatSend">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Send encoded data via RfCat. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;Hit again for stopping the sending process. Note that you can set the number of repetitions (from 1 to infinite) in:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;Edit-&amp;gt;Options-&amp;gt;Device-&amp;gt;'Device sending repetitions'&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Send via RfCat</string>
</property>
<property name="icon">
<iconset theme="network-wireless">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="lEstimatedTime">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The estimated average time is based on the average number of bits per message and average sample rate, you set for the modulations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Estimated Time: </string>
</property>
</widget>
</item>
<item row="2" column="3" colspan="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>38</width>
<height>22</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ElidedLabel</class>
<extends>QLabel</extends>
<header>urh.ui.ElidedLabel.h</header>
</customwidget>
<customwidget>
<class>GeneratorTreeView</class>
<extends>QTreeView</extends>
<header>urh.ui.views.GeneratorTreeView.h</header>
</customwidget>
<customwidget>
<class>GeneratorTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.GeneratorTableView.h</header>
</customwidget>
<customwidget>
<class>GeneratorListWidget</class>
<extends>QListWidget</extends>
<header>urh.ui.GeneratorListWidget.h</header>
</customwidget>
<customwidget>
<class>GeneratorListView</class>
<extends>QListView</extends>
<header>urh.ui.views.GeneratorListView.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,837 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>798</width>
<height>469</height>
</rect>
</property>
<property name="windowTitle">
<string>Universal Radio Hacker</string>
</property>
<property name="windowIcon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/appicon.png</normaloff>:/icons/icons/appicon.png</iconset>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="dockNestingEnabled">
<bool>false</bool>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_4" stretch="100,1">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:horizontal {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_vertical.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>7</number>
</property>
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLineEdit" name="lnEdtTreeFilter">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="inputMethodHints">
<set>Qt::ImhDialableCharactersOnly</set>
</property>
<property name="placeholderText">
<string>Filter</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnFileTreeGoUp">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="go-up">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="DirectoryTreeView" name="fileTree">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>10</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="autoScroll">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="sortingEnabled">
<bool>false</bool>
</property>
<attribute name="headerCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget_Project">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QTabWidget::pane { border: 0; }</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tabParticipants">
<attribute name="title">
<string>Participants</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListView" name="listViewParticipants">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabDescription">
<attribute name="title">
<string>Description</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTextEdit" name="textEditProjectDescription"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_interpretation">
<attribute name="title">
<string>Interpretation</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<widget class="QWidget" name="tab_protocol">
<attribute name="title">
<string>Analysis</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<widget class="QWidget" name="tab_generator">
<attribute name="title">
<string>Generator</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<widget class="QWidget" name="tab_simulator">
<attribute name="title">
<string>Simulator</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</widget>
</widget>
</item>
<item>
<widget class="QLabel" name="labelNonProjectMode">
<property name="styleSheet">
<string notr="true">background: rgba(255,255,0,64)</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Warning: You are running URH in non project mode. All your settings will be lost after closing the program. If you want to keep your settings create a project via File -&amp;gt; &lt;a href=&quot;open_new_project_dialog&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;New Project&lt;/span&gt;&lt;/a&gt;. &lt;a href=&quot;dont_show_non_project_again&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Don't show this hint&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>798</width>
<height>27</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>Fi&amp;le</string>
</property>
<widget class="QMenu" name="menuImport">
<property name="title">
<string>Import</string>
</property>
<property name="icon">
<iconset theme="document-import">
<normaloff>.</normaloff>.</iconset>
</property>
<addaction name="actionSamples_from_csv"/>
</widget>
<addaction name="actionNew_Project"/>
<addaction name="actionProject_settings"/>
<addaction name="actionSave_project"/>
<addaction name="actionClose_project"/>
<addaction name="separator"/>
<addaction name="actionOpen"/>
<addaction name="actionOpen_directory"/>
<addaction name="menuImport"/>
<addaction name="separator"/>
<addaction name="actionSpectrum_Analyzer"/>
<addaction name="actionRecord"/>
<addaction name="actionSniff_protocol"/>
<addaction name="separator"/>
<addaction name="actionSaveAllSignals"/>
<addaction name="actionCloseAllFiles"/>
<addaction name="separator"/>
<addaction name="actionConvert_Folder_to_Project"/>
</widget>
<widget class="QMenu" name="menuEdit">
<property name="title">
<string>Edi&amp;t</string>
</property>
<widget class="QMenu" name="menuDefault_noise_threshold">
<property name="title">
<string>Default noise threshold</string>
</property>
<addaction name="actionAutomaticNoiseThreshold"/>
<addaction name="action1NoiseThreshold"/>
<addaction name="action5NoiseThreshold"/>
<addaction name="action10NoiseThreshold"/>
<addaction name="action100NoiseThreshold"/>
</widget>
<addaction name="actionDecoding"/>
<addaction name="actionOptions"/>
<addaction name="separator"/>
<addaction name="actionShowFileTree"/>
<addaction name="actionFullscreen_mode"/>
<addaction name="separator"/>
<addaction name="actionAuto_detect_new_signals"/>
<addaction name="menuDefault_noise_threshold"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Hel&amp;p</string>
</property>
<addaction name="actionAbout_AutomaticHacker"/>
<addaction name="actionAbout_Qt"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
<addaction name="menuHelp"/>
</widget>
<action name="actionFSK">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Undo</string>
</property>
</action>
<action name="actionOOK">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Redo</string>
</property>
</action>
<action name="actionPSK">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>PSK</string>
</property>
</action>
<action name="actionNone">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>None (bei .bin)</string>
</property>
</action>
<action name="actionAuto_Fit_Y">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Auto Fit Y</string>
</property>
</action>
<action name="actionUndo">
<property name="icon">
<iconset theme="edit-undo">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Undo</string>
</property>
</action>
<action name="actionRedo">
<property name="icon">
<iconset theme="edit-redo">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Redo</string>
</property>
</action>
<action name="actionShow_Confirm_Close_Dialog">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Show Confirm Close Dialog</string>
</property>
</action>
<action name="actionTest">
<property name="text">
<string>test</string>
</property>
</action>
<action name="actionHold_Shift_to_Drag">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Hold Shift to Drag</string>
</property>
</action>
<action name="actionDocumentation">
<property name="icon">
<iconset theme="help-contents">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Documentation</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionAbout_AutomaticHacker">
<property name="icon">
<iconset theme="help-about">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;About Universal Radio Hacker...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionOpenSignal">
<property name="text">
<string>&amp;Signal</string>
</property>
</action>
<action name="actionOpenProtocol">
<property name="text">
<string>&amp;Protocol</string>
</property>
</action>
<action name="actionShow_Compare_Frame">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Show &amp;Compare Frame</string>
</property>
</action>
<action name="actionCloseAllFiles">
<property name="icon">
<iconset theme="window-close">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Close all files</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionSaveAllSignals">
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Save all signals</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionSeperate_Protocols_in_Compare_Frame">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Separate &amp;Protocols in Compare Frame</string>
</property>
</action>
<action name="actionOpenArchive">
<property name="text">
<string>&amp;Archive</string>
</property>
</action>
<action name="actionOpen">
<property name="icon">
<iconset theme="document-open">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Open...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionOpen_Folder">
<property name="icon">
<iconset theme="folder-open">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Open &amp;Folder..</string>
</property>
</action>
<action name="actionShow_only_Compare_Frame">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Show Compare Frame only</string>
</property>
</action>
<action name="actionConfigurePlugins">
<property name="text">
<string>Configure...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionSort_Frames_by_Name">
<property name="text">
<string>Sort &amp;Frames by Name</string>
</property>
</action>
<action name="actionConvert_Folder_to_Project">
<property name="text">
<string>Conv&amp;ert Folder to Project</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionDecoding">
<property name="icon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/decoding.svg</normaloff>:/icons/icons/decoding.svg</iconset>
</property>
<property name="text">
<string>&amp;Decoding...</string>
</property>
</action>
<action name="actionRecord">
<property name="icon">
<iconset theme="media-record">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Record signal...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionSpectrum_Analyzer">
<property name="icon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/spectrum.svg</normaloff>:/icons/icons/spectrum.svg</iconset>
</property>
<property name="text">
<string>Spectrum &amp;Analyzer...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionOptions">
<property name="icon">
<iconset theme="configure">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Options...</string>
</property>
<property name="iconVisibleInMenu">
<bool>true</bool>
</property>
</action>
<action name="actionNew_Project">
<property name="icon">
<iconset theme="folder-new">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;New Project..</string>
</property>
</action>
<action name="actionSniff_protocol">
<property name="icon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/sniffer.svg</normaloff>:/icons/icons/sniffer.svg</iconset>
</property>
<property name="text">
<string>Sn&amp;iff protocol...</string>
</property>
</action>
<action name="actionProject_settings">
<property name="icon">
<iconset theme="configure">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Project settings...</string>
</property>
</action>
<action name="actionSave_project">
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Sa&amp;ve project</string>
</property>
</action>
<action name="actionFullscreen_mode">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Fullscreen mode</string>
</property>
</action>
<action name="actionOpen_directory">
<property name="icon">
<iconset theme="folder-open">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Open &amp;folder...</string>
</property>
</action>
<action name="actionAbout_Qt">
<property name="text">
<string>About &amp;Qt</string>
</property>
</action>
<action name="actionShowFileTree">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Show file tree</string>
</property>
</action>
<action name="actionSamples_from_csv">
<property name="icon">
<iconset theme="text-csv">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>IQ samples from csv</string>
</property>
</action>
<action name="actionClose_project">
<property name="icon">
<iconset theme="document-close">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>Close project</string>
</property>
</action>
<action name="actionAuto_detect_new_signals">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Auto detect signals on loading</string>
</property>
</action>
<action name="actionAutomaticNoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="text">
<string>Automatic</string>
</property>
</action>
<action name="action1NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>1%</string>
</property>
</action>
<action name="action5NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>5%</string>
</property>
</action>
<action name="action10NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>10%</string>
</property>
</action>
<action name="action100NoiseThreshold">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>100% (disables demodulation)</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>DirectoryTreeView</class>
<extends>QTreeView</extends>
<header>urh.ui.views.DirectoryTreeView.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogMessageType</class>
<widget class="QDialog" name="DialogMessageType">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>471</width>
<height>359</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0" colspan="2">
<widget class="QComboBox" name="cbRulesetMode">
<item>
<property name="text">
<string>All rules must apply (AND)</string>
</property>
</item>
<item>
<property name="text">
<string>At least one rule must apply (OR)</string>
</property>
</item>
<item>
<property name="text">
<string>No rule must apply (NOR)</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0" rowspan="3" colspan="2">
<widget class="QTableView" name="tblViewRuleset">
<property name="showGrid">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QToolButton" name="btnRemoveRule">
<property name="toolTip">
<string>Remove ruleset</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rbAssignManually">
<property name="text">
<string>Assi&amp;gn manually</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="rbAssignAutomatically">
<property name="text">
<string>Assign a&amp;utomatically</string>
</property>
</widget>
</item>
<item row="4" column="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>145</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="QToolButton" name="btnAddRule">
<property name="toolTip">
<string>Add ruleset</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogModulationParameters</class>
<widget class="QDialog" name="DialogModulationParameters">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>303</width>
<height>286</height>
</rect>
</property>
<property name="windowTitle">
<string>Modulation Parameters</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableWidget" name="tblSymbolParameters">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="rowCount">
<number>2</number>
</property>
<attribute name="horizontalHeaderVisible">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<row/>
<row/>
<column>
<property name="text">
<string>Symbol</string>
</property>
</column>
<column>
<property name="text">
<string>Amplitude</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModulationSettings</class>
<widget class="QWidget" name="ModulationSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>821</width>
<height>635</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBoxSniffSettings">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}
QGroupBox::title {
subcontrol-origin: margin;
}
QGroupBox::indicator:unchecked {
image: url(:/icons/icons/collapse.svg)
}
QGroupBox::indicator:checked {
image: url(:/icons/icons/uncollapse.svg)
}</string>
</property>
<property name="title">
<string>Modulation settings</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>15</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="labelModulationProfile">
<property name="text">
<string>Choose profile:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxModulationProfiles"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QLabel" name="labelCarrierFrequencyValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="labelSampleRate">
<property name="text">
<string>Sample Rate:</string>
</property>
</widget>
</item>
<item row="0" column="5" rowspan="2">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelCarrierFrequency">
<property name="text">
<string>Carrier Frequency:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="labelSamplesPerSymbol">
<property name="text">
<string>Samples per Symbol:</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="labelSampleRateValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelModulationType">
<property name="text">
<string>Modulation type:</string>
</property>
</widget>
</item>
<item row="0" column="2" rowspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="labelSamplesPerSymbolValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="labelModulationTypeValue">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QLabel" name="labelParameters">
<property name="text">
<string>Amplitudes in %:</string>
</property>
</widget>
</item>
<item row="1" column="7">
<widget class="ElidedLabel" name="labelParameterValues">
<property name="text">
<string>0/100</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label">
<property name="text">
<string>Bits per Symbol:</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLabel" name="labelBitsPerSymbol">
<property name="text">
<string>1</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="btnConfigurationDialog">
<property name="text">
<string>Open modulation configuration dialog...</string>
</property>
<property name="icon">
<iconset theme="configure">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ElidedLabel</class>
<extends>QLabel</extends>
<header>urh.ui.ElidedLabel.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>groupBoxSniffSettings</tabstop>
<tabstop>comboBoxModulationProfiles</tabstop>
<tabstop>btnConfigurationDialog</tabstop>
</tabstops>
<resources>
<include location="urh.qrc"/>
</resources>
<connections>
<connection>
<sender>groupBoxSniffSettings</sender>
<signal>toggled(bool)</signal>
<receiver>frame</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>33</x>
<y>10</y>
</hint>
<hint type="destinationlabel">
<x>18</x>
<y>53</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,630 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogOptions</class>
<widget class="QDialog" name="DialogOptions">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>814</width>
<height>822</height>
</rect>
</property>
<property name="windowTitle">
<string>Options</string>
</property>
<property name="windowIcon">
<iconset theme="configure">
<normaloff>.</normaloff>.</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>4</number>
</property>
<widget class="QWidget" name="tabGeneration">
<attribute name="title">
<string>Generation</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="1">
<widget class="QLabel" name="labelFuzzingSamples">
<property name="text">
<string>Samples</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxDefaultFuzzingPause">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If you disable the default pause, the pause of the fuzzed message will be used.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Use a default pause for fuzzed messages</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="KillerDoubleSpinBox" name="doubleSpinBoxFuzzingPause">
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxMultipleModulations">
<property name="text">
<string>Enable modulation profiles</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBoxModulationAccuracy">
<property name="title">
<string>Modulation Accuracy</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QRadioButton" name="radioButtonLowModulationAccuracy">
<property name="text">
<string>Low (2x8 bit) - Recommended for HackRF and RTL-SDR</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonMediumModulationAccuracy">
<property name="text">
<string>Medium (2x16 bit) - Recommended for BladeRF, PlutoSDR and SDRPlay</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonHighModulationAccuracy">
<property name="text">
<string>High (2x32 bit) - Recommended if you are not sure what to choose</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>500</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabView">
<attribute name="title">
<string>View</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Default View:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxDefaultView">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Bit</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>ASCII</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="checkBoxShowConfirmCloseDialog">
<property name="text">
<string>Show &quot;confirm close&quot; dialog</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxHoldShiftToDrag">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If checked, you need to &lt;span style=&quot; font-weight:600;&quot;&gt;hold the Shift key to drag&lt;/span&gt; with the mouse inside graphic views like the drawn signal in Interpretation tab, while making a selection with the mouse does not require holding any buttons.&lt;/p&gt;&lt;p&gt;If unchecked, this is inverted: Hold shift to make a selection, and drag by default.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Hold shift to drag</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxPauseTime">
<property name="text">
<string>Show pauses as time</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxAlignLabels">
<property name="text">
<string>Align on labels</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="labelFontSize">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Application font size (&lt;span style=&quot; font-weight:600;&quot;&gt;restart&lt;/span&gt; for full effect):&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinBoxFontSize">
<property name="suffix">
<string>pt</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>120</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Choose application theme (requires restart):</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxTheme">
<item>
<property name="text">
<string>native look (default)</string>
</property>
</item>
<item>
<property name="text">
<string>fallback theme</string>
</property>
</item>
<item>
<property name="text">
<string>fallback theme (dark)</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="labelIconTheme">
<property name="text">
<string>Choose icon theme (requires restart):</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBoxIconTheme">
<item>
<property name="text">
<string>bundled icons (default)</string>
</property>
</item>
<item>
<property name="text">
<string>native icon theme</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBoxSpectrogramColormap">
<property name="title">
<string>Spectrogram Colormap</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QScrollArea" name="scrollAreaSpectrogramColormap">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetSpectrogramColormapContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>762</width>
<height>397</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4"/>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabFieldtypes">
<attribute name="title">
<string>Fieldtypes</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTableView" name="tblLabeltypes">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QToolButton" name="btnAddLabelType">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRemoveLabeltype">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>203</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_plugins">
<attribute name="title">
<string>Plugins</string>
</attribute>
</widget>
<widget class="QWidget" name="tabDevices">
<attribute name="title">
<string>Device</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QLabel" name="labelInfoDeviceTable">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use the checkboxes in the table below to choose device backends and enable or disable devices. Disabled devices will not show up in device related dialogs such as send or receive.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tblDevices">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>200</number>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<widget class="QLabel" name="labelDeviceMissingInfo">
<property name="font">
<font>
<italic>false</italic>
</font>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Missing a native backend? Perform a &lt;a href=&quot;health_check&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;health check&lt;/span&gt;&lt;/a&gt;! If GNU Radio backend is not available double check the GNU Radio settings below.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxNativeOptions">
<property name="title">
<string>Native options</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="2" column="0">
<widget class="QLabel" name="labelLibDirs">
<property name="text">
<string>Library directories:</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLineEdit" name="lineEditIncludeDirs">
<property name="placeholderText">
<string>Comma separated list of additional include directories</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="labelNativeRebuildInfo">
<property name="text">
<string>You can rebuild the native device extensions here. This is useful, when you installed a device driver afterwards or your drivers are stored in an unusual location.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="lineEditLibDirs">
<property name="placeholderText">
<string>Comma separated list of additional library directories</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelIncludeDirs">
<property name="text">
<string>Include directories:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="btnViewBuildLog">
<property name="text">
<string>View log</string>
</property>
<property name="icon">
<iconset theme="utilities-log-viewer">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QPushButton" name="btnRebuildNative">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Rebuild the native device extensions. You need to restart URH after this, to use new extensions.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Rebuild</string>
</property>
<property name="icon">
<iconset theme="view-refresh">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="labelRebuildNativeStatus">
<property name="text">
<string>Rebuild &lt;x&gt; new device extensions. Please restart URH to use them.</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>GNU Radio options (optional)</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Choose a python interpreter which has access to your GNU Radio installation, that is, you can do &lt;span style=&quot; font-weight:600;&quot;&gt;python -c &amp;quot;import gnuradio&amp;quot;&lt;/span&gt; with it on the command line.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Python Interpreter:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEditGRPythonInterpreter">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Choose a python interpreter which has access to your GNU Radio installation, that is, you can do &lt;span style=&quot; font-weight:600;&quot;&gt;python -c &amp;quot;import gnuradio&amp;quot;&lt;/span&gt; with it on the command line.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="placeholderText">
<string>Enter python interpreter path e.g. /usr/bin/python</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QToolButton" name="btnChooseGRPythonInterpreter">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Default sending repititions:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxNumSendingRepeats">
<property name="specialValueText">
<string>Infinite</string>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="displayIntegerBase">
<number>10</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Use this percentage of available RAM for buffer allocation:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBoxRAMThreshold">
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KillerDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>urh.ui.KillerDoubleSpinBox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FramePlugins</class>
<widget class="QFrame" name="FramePlugins">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>806</width>
<height>683</height>
</rect>
</property>
<property name="windowTitle">
<string>Plugins</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Available Plugins</string>
</property>
</widget>
</item>
<item>
<widget class="QListView" name="listViewPlugins">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Description</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="txtEditPluginDescription">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBoxSettings">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Settings</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,412 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ProjectDialog</class>
<widget class="QDialog" name="ProjectDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>803</width>
<height>936</height>
</rect>
</property>
<property name="windowTitle">
<string>Create a new project</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lNewProject">
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>New Project</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblName">
<property name="text">
<string>&lt;Name&gt;</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>17</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="4" colspan="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Sps</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="lineEdit_Path">
<property name="statusTip">
<string/>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="lblNewPath">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;Note: A new directory will be created.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="15" column="4" colspan="2">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>57</height>
</size>
</property>
</spacer>
</item>
<item row="10" column="3">
<widget class="QPlainTextEdit" name="txtEdDescription"/>
</item>
<item row="11" column="3" rowspan="5">
<widget class="ParticipantTableView" name="tblParticipants">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="5" column="3">
<widget class="KillerDoubleSpinBox" name="spinBoxBandwidth">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>999999999999.000000000000000</double>
</property>
<property name="singleStep">
<double>0.001000000000000</double>
</property>
<property name="value">
<double>1000000.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Default frequency:</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="KillerDoubleSpinBox" name="spinBoxFreq">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>1000000000000.000000000000000</double>
</property>
<property name="singleStep">
<double>0.001000000000000</double>
</property>
<property name="value">
<double>433920000.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="KillerDoubleSpinBox" name="spinBoxSampleRate">
<property name="decimals">
<number>3</number>
</property>
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>1000000000000.000000000000000</double>
</property>
<property name="singleStep">
<double>0.001000000000000</double>
</property>
<property name="value">
<double>1000000.000000000000000</double>
</property>
</widget>
</item>
<item row="16" column="3">
<widget class="QLineEdit" name="lineEditBroadcastAddress">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the broadcast address of your protocol in &lt;span style=&quot; font-weight:600;&quot;&gt;hex&lt;/span&gt;. If you do not know what to enter here, just leave the default.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="inputMask">
<string/>
</property>
<property name="text">
<string>ffff</string>
</property>
</widget>
</item>
<item row="9" column="0" colspan="6">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Default bandwidth:</string>
</property>
</widget>
</item>
<item row="11" column="4" colspan="2">
<widget class="QToolButton" name="btnAddParticipant">
<property name="toolTip">
<string>Add participant</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="0" column="4" colspan="2">
<widget class="QToolButton" name="btnSelectPath">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="6">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="4" colspan="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Hz</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Default sample rate:</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Choose a path:</string>
</property>
</widget>
</item>
<item row="12" column="4" colspan="2">
<widget class="QToolButton" name="btnRemoveParticipant">
<property name="toolTip">
<string>Remove participant</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QSpinBox" name="spinBoxGain">
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item row="16" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Broadcast address (hex):</string>
</property>
</widget>
</item>
<item row="10" column="0" colspan="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Description:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="4" colspan="2">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Hz</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Default gain:</string>
</property>
</widget>
</item>
<item row="13" column="4">
<widget class="QToolButton" name="btnUp">
<property name="toolTip">
<string>Move selected participants up</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="go-up">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="8" column="0" colspan="4">
<widget class="QLabel" name="lOpenSpectrumAnalyzer">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tip: Open &lt;a href=&quot;open_spectrum_analyzer&quot;&gt;spectrum analyzer&lt;/a&gt; to find these values.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="openExternalLinks">
<bool>false</bool>
</property>
</widget>
</item>
<item row="11" column="0" rowspan="5" colspan="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Participants:</string>
</property>
</widget>
</item>
<item row="14" column="4">
<widget class="QToolButton" name="btnDown">
<property name="toolTip">
<string>Move selected participants down</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="go-down">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="17" column="3">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ParticipantTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.ParticipantTableView.h</header>
</customwidget>
<customwidget>
<class>KillerDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>urh.ui.KillerDoubleSpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>lineEdit_Path</tabstop>
<tabstop>btnSelectPath</tabstop>
<tabstop>spinBoxSampleRate</tabstop>
<tabstop>spinBoxFreq</tabstop>
<tabstop>spinBoxBandwidth</tabstop>
<tabstop>spinBoxGain</tabstop>
<tabstop>txtEdDescription</tabstop>
<tabstop>tblParticipants</tabstop>
<tabstop>btnAddParticipant</tabstop>
<tabstop>btnRemoveParticipant</tabstop>
<tabstop>lineEditBroadcastAddress</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogLabels</class>
<widget class="QDialog" name="DialogLabels">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>714</width>
<height>463</height>
</rect>
</property>
<property name="windowTitle">
<string>Manage Protocol Labels</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:vertical {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_horizontal.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<property name="childrenCollapsible">
<bool>false</bool>
</property>
<widget class="QGroupBox" name="groupBoxSettings">
<property name="title">
<string>Protocol Label Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="ProtocolLabelTableView" name="tblViewProtoLabels">
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<underline>false</underline>
</font>
</property>
<property name="text">
<string>Start/End values refer to view type:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbProtoView">
<item>
<property name="text">
<string>Bits</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>ASCII</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBoxAdvancedSettings">
<property name="title">
<string>Advanced Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTabWidget" name="tabWidgetAdvancedSettings"/>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnConfirm">
<property name="text">
<string>Confirm</string>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ProtocolLabelTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.ProtocolLabelTableView.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,610 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SendRecvDialog</class>
<widget class="QDialog" name="SendRecvDialog">
<property name="windowModality">
<enum>Qt::NonModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1246</width>
<height>1123</height>
</rect>
</property>
<property name="mouseTracking">
<bool>false</bool>
</property>
<property name="windowTitle">
<string>Record Signal</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:horizontal {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_vertical.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>621</width>
<height>1101</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}</string>
</property>
<property name="title">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="topMargin">
<number>0</number>
</property>
<item row="19" column="0">
<widget class="QProgressBar" name="progressBarMessage">
<property name="value">
<number>0</number>
</property>
<property name="format">
<string>%v/%m</string>
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel" name="labelCurrentMessage">
<property name="text">
<string>Current message:</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="lReceiveBufferFullText">
<property name="text">
<string>Receive buffer full:</string>
</property>
</widget>
</item>
<item row="21" column="0">
<widget class="QProgressBar" name="progressBarSample">
<property name="value">
<number>0</number>
</property>
<property name="format">
<string>%v/%m</string>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="lSamplesSentText">
<property name="text">
<string>Current sample:</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="lTimeText">
<property name="text">
<string>Time (in seconds):</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="lSamplesCapturedText">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Samples captured:</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="lSignalSizeText">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Signal size (in MiB):</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="lSamplesCaptured">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="15" column="0" colspan="2">
<widget class="QLabel" name="lTime">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="11" column="0" colspan="2">
<widget class="QLabel" name="lSignalSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="lblRepeatText">
<property name="text">
<string>Current iteration:</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="lblCurrentRepeatValue">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelReceiveBufferFull">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0%</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnStart">
<property name="minimumSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="toolTip">
<string>Record signal</string>
</property>
<property name="text">
<string>Start</string>
</property>
<property name="icon">
<iconset theme="media-record">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnStop">
<property name="minimumSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="toolTip">
<string>Stop recording</string>
</property>
<property name="text">
<string>Stop</string>
</property>
<property name="icon">
<iconset theme="media-playback-stop">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSave">
<property name="minimumSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="text">
<string>Save...</string>
</property>
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnClear">
<property name="minimumSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="toolTip">
<string>Clear</string>
</property>
<property name="text">
<string>Clear</string>
</property>
<property name="icon">
<iconset theme="view-refresh">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTextEdit" name="txtEditErrors">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>4</number>
</property>
<widget class="QWidget" name="page_receive">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="LiveGraphicView" name="graphicsViewReceive">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_send">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="EditableGraphicView" name="graphicsViewSend">
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="renderHints">
<set>QPainter::Antialiasing|QPainter::TextAntialiasing</set>
</property>
<property name="transformationAnchor">
<enum>QGraphicsView::NoAnchor</enum>
</property>
<property name="resizeAnchor">
<enum>QGraphicsView::NoAnchor</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Hint: You can edit the raw signal before sending.</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_continuous_send">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="LiveGraphicView" name="graphicsViewContinuousSend">
<property name="renderHints">
<set>QPainter::Antialiasing|QPainter::TextAntialiasing</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_spectrum">
<layout class="QVBoxLayout" name="verticalLayout_7" stretch="1,1">
<item>
<widget class="LiveGraphicView" name="graphicsViewFFT"/>
</item>
<item>
<widget class="QGraphicsView" name="graphicsViewSpectrogram">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="renderHints">
<set>QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing</set>
</property>
<property name="cacheMode">
<set>QGraphicsView::CacheNone</set>
</property>
<property name="viewportUpdateMode">
<enum>QGraphicsView::MinimalViewportUpdate</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_sniff">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="LiveGraphicView" name="graphicsView_sniff_Preview"/>
</item>
<item>
<widget class="QPlainTextEdit" name="txtEd_sniff_Preview">
<property name="lineWrapMode">
<enum>QPlainTextEdit::NoWrap</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="maximumBlockCount">
<number>100</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnAccept">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accept the sniffed data and load it into &lt;span style=&quot; font-weight:600;&quot;&gt;Analysis&lt;/span&gt; tab.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Accept data (Open in Analysis)</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QLabel" name="label_y_scale">
<property name="text">
<string>Y-Scale</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="sliderYscale">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="tickInterval">
<number>1</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>LiveGraphicView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.LiveGraphicView.h</header>
</customwidget>
<customwidget>
<class>EditableGraphicView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.EditableGraphicView.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>btnStart</tabstop>
<tabstop>btnStop</tabstop>
<tabstop>btnSave</tabstop>
<tabstop>btnClear</tabstop>
<tabstop>txtEd_sniff_Preview</tabstop>
<tabstop>sliderYscale</tabstop>
<tabstop>txtEditErrors</tabstop>
<tabstop>graphicsViewSend</tabstop>
<tabstop>graphicsViewReceive</tabstop>
<tabstop>btnAccept</tabstop>
</tabstops>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,619 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FormDeviceSettings</class>
<widget class="QWidget" name="FormDeviceSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>859</width>
<height>741</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBoxDeviceSettings">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}
QGroupBox::title {
subcontrol-origin: margin;
}
QGroupBox::indicator:unchecked {
image: url(:/icons/icons/collapse.svg)
}
QGroupBox::indicator:checked {
image: url(:/icons/icons/uncollapse.svg)
}</string>
</property>
<property name="title">
<string>Device settings</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<property name="topMargin">
<number>15</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="frame_2">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QLabel" name="labelAntenna">
<property name="text">
<string>Antenna:</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelBasebandGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The baseband gain is applied to the baseband signal in your software defined radio. The baseband signal is at low frequency and gathered from the RF signal by &lt;span style=&quot; font-weight:600;&quot;&gt;complex downsampling&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Baseband gain:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineEditSubdevice">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Configure the subdevice of your USRP. For example, &lt;span style=&quot; font-weight:600;&quot;&gt;B:0 &lt;/span&gt;to select a WBX on slot B. You can learn more at &lt;a href=&quot;http://files.ettus.com/manual/page_configuration.html#config_subdev&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;http://files.ettus.com/manual/page_configuration.html#config_subdev.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="KillerDoubleSpinBox" name="spinBoxBandwidth">
<property name="decimals">
<number>10</number>
</property>
<property name="minimum">
<double>0.001000000000000</double>
</property>
<property name="maximum">
<double>1000000000000.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelSubdevice">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Configure the subdevice of your USRP. For example, &lt;span style=&quot; font-weight:600;&quot;&gt;B:0 &lt;/span&gt;to select a WBX on slot B. You can learn more at &lt;a href=&quot;http://files.ettus.com/manual/page_configuration.html#config_subdev&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#2980b9;&quot;&gt;http://files.ettus.com/manual/page_configuration.html#config_subdev.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Subdevice:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="KillerDoubleSpinBox" name="spinBoxFreq">
<property name="decimals">
<number>10</number>
</property>
<property name="minimum">
<double>0.001000000000000</double>
</property>
<property name="maximum">
<double>1000000000000.000000000000000</double>
</property>
<property name="value">
<double>433920000.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="lineEditIP">
<property name="text">
<string>127.0.0.1</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QToolButton" name="btnRefreshDeviceIdentifier">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Automatically detect connected SDRs of the above configured type. There is &lt;span style=&quot; font-weight:600;&quot;&gt;no need&lt;/span&gt; to press this button if you have only one SDR of a certain type attached. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="view-refresh">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="labelDirectSampling">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the direct sampling mode. If you do not know what to choose here, just set it to disabled. The&lt;span style=&quot; font-weight:600;&quot;&gt; native backend&lt;/span&gt; is recommended, when using this setting.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Direct sampling:</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="labelBandwidth">
<property name="text">
<string>Bandwidth (Hz):</string>
</property>
</widget>
</item>
<item row="10" column="1">
<layout class="QGridLayout" name="gridLayout_5">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item row="0" column="0">
<widget class="QSlider" name="sliderGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The gain (more exactly RF gain) is the gain applied to the RF signal. This amplifies the high frequent signal arriving at the antenna of your Software Defined Radio.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxGain">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The gain (more exactly RF gain) is the gain applied to the RF signal. This amplifies the high frequent signal arriving at the antenna of your Software Defined Radio.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>99</number>
</property>
<property name="value">
<number>40</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="8" column="0">
<widget class="QLabel" name="labelSampleRate">
<property name="text">
<string>Sample rate (Sps):</string>
</property>
</widget>
</item>
<item row="11" column="1">
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<widget class="QSlider" name="sliderIFGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IF Gain is applied to the Intermediate Frequency signal in your Software Defined Radio. An IF signal has a lower frequency than the high frequent RF signal, so signal processing can be applied more efficiently.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxIFGain">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IF Gain is applied to the Intermediate Frequency signal in your Software Defined Radio. An IF signal has a lower frequency than the high frequent RF signal, so signal processing can be applied more efficiently.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="13" column="0">
<widget class="QLabel" name="labelFreqCorrection">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the frequency correction in &lt;span style=&quot; font-weight:600;&quot;&gt;ppm&lt;/span&gt;. If you do not know what to enter here, just leave it to one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Frequency correction:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBoxDeviceIdentifier">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can enter a device identifier here if you have multiple SDRs of the same type attached to separate them. There is no need to configure this value otherwise. URH will &lt;span style=&quot; font-weight:600;&quot;&gt;automatically&lt;/span&gt; select an attached SDR of the configured type if you leave this value empty.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="editable">
<bool>true</bool>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cbDevice">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>USRP</string>
</property>
</item>
<item>
<property name="text">
<string>HackRF</string>
</property>
</item>
</widget>
</item>
<item row="16" column="1">
<widget class="QSpinBox" name="spinBoxNRepeat">
<property name="specialValueText">
<string>Infinite</string>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="12" column="1">
<layout class="QGridLayout" name="gridLayout_8">
<item row="0" column="0">
<widget class="QSlider" name="sliderBasebandGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The baseband gain is applied to the baseband signal in your software defined radio. The baseband signal is at low frequency and gathered from the RF signal by &lt;span style=&quot; font-weight:600;&quot;&gt;complex downsampling&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="sliderPosition">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="invertedAppearance">
<bool>false</bool>
</property>
<property name="invertedControls">
<bool>false</bool>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
<property name="tickInterval">
<number>0</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxBasebandGain">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The baseband gain is applied to the baseband signal in your software defined radio. The baseband signal is at low frequency and gathered from the RF signal by &lt;span style=&quot; font-weight:600;&quot;&gt;complex downsampling&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<widget class="QLabel" name="labelPort">
<property name="text">
<string>Port number:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="KillerDoubleSpinBox" name="spinBoxSampleRate">
<property name="decimals">
<number>10</number>
</property>
<property name="minimum">
<double>0.001000000000000</double>
</property>
<property name="maximum">
<double>1000000000000.000000000000000</double>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="labelGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The gain (more exactly RF gain) is the gain applied to the RF signal. This amplifies the high frequent signal arriving at the antenna of your Software Defined Radio.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Gain:</string>
</property>
</widget>
</item>
<item row="17" column="1">
<widget class="QCheckBox" name="checkBoxDCCorrection">
<property name="toolTip">
<string>Apply DC correction during recording, that is, ensure the captured signal has a mean value of zero.</string>
</property>
<property name="text">
<string>Apply DC correction</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelDeviceIdentifier">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can enter a device identifier here if you have multiple SDRs of the same type attached to separate them. There is no need to configure this value otherwise. URH will &lt;span style=&quot; font-weight:600;&quot;&gt;automatically&lt;/span&gt; select an attached SDR of the configured type if you leave this value empty.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Device Identifier:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="comboBoxAntenna"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelFreq">
<property name="text">
<string>Frequency (Hz):</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="spinBoxPort">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>1234</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelIP">
<property name="text">
<string>IP address:</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QSpinBox" name="spinBoxFreqCorrection">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the frequency correction in &lt;span style=&quot; font-weight:600;&quot;&gt;ppm&lt;/span&gt;. If you do not know what to enter here, just leave it to one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>-1000</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="labelNRepeat">
<property name="text">
<string>Repeat:</string>
</property>
</widget>
</item>
<item row="15" column="1">
<widget class="QComboBox" name="comboBoxDirectSampling">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the direct sampling mode. If you do not know what to choose here, just set it to disabled. The&lt;span style=&quot; font-weight:600;&quot;&gt; native backend&lt;/span&gt; is recommended, when using this setting.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="labelDCCorrection">
<property name="toolTip">
<string>Apply DC correction during recording, that is, ensure the captured signal has a mean value of zero.</string>
</property>
<property name="text">
<string>DC correction:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="comboBoxChannel"/>
</item>
<item row="11" column="0">
<widget class="QLabel" name="labelIFGain">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The IF Gain is applied to the Intermediate Frequency signal in your Software Defined Radio. An IF signal has a lower frequency than the high frequent RF signal, so signal processing can be applied more efficiently.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>IF Gain:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelChannel">
<property name="text">
<string>Channel:</string>
</property>
</widget>
</item>
<item row="8" column="2" rowspan="2">
<widget class="QToolButton" name="btnLockBWSR">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/lock.svg</normaloff>:/icons/icons/lock.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>16</width>
<height>16</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Device:</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="labelBiasTee">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable the bias tee of your SDR, if you have an external LNA connected. Leave this disabled if you have no external LNA attached.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Bias Tee:</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QCheckBox" name="checkBoxBiasTee">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable the bias tee of your SDR, if you have an external LNA connected. Leave this disabled if you have no external LNA attached.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Enable Bias Tee</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KillerDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>urh.ui.KillerDoubleSpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>groupBoxDeviceSettings</tabstop>
<tabstop>cbDevice</tabstop>
<tabstop>comboBoxDeviceIdentifier</tabstop>
<tabstop>btnRefreshDeviceIdentifier</tabstop>
<tabstop>lineEditSubdevice</tabstop>
<tabstop>comboBoxChannel</tabstop>
<tabstop>comboBoxAntenna</tabstop>
<tabstop>lineEditIP</tabstop>
<tabstop>spinBoxPort</tabstop>
<tabstop>spinBoxFreq</tabstop>
<tabstop>spinBoxSampleRate</tabstop>
<tabstop>btnLockBWSR</tabstop>
<tabstop>spinBoxBandwidth</tabstop>
<tabstop>sliderGain</tabstop>
<tabstop>spinBoxGain</tabstop>
<tabstop>sliderIFGain</tabstop>
<tabstop>spinBoxIFGain</tabstop>
<tabstop>sliderBasebandGain</tabstop>
<tabstop>spinBoxBasebandGain</tabstop>
<tabstop>spinBoxFreqCorrection</tabstop>
<tabstop>comboBoxDirectSampling</tabstop>
<tabstop>spinBoxNRepeat</tabstop>
<tabstop>checkBoxDCCorrection</tabstop>
</tabstops>
<resources>
<include location="urh.qrc"/>
</resources>
<connections>
<connection>
<sender>groupBoxDeviceSettings</sender>
<signal>toggled(bool)</signal>
<receiver>frame_2</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>115</x>
<y>17</y>
</hint>
<hint type="destinationlabel">
<x>140</x>
<y>31</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,397 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SniffSettings</class>
<widget class="QWidget" name="SniffSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>482</width>
<height>510</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBoxSniffSettings">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}
QGroupBox::title {
subcontrol-origin: margin;
}
QGroupBox::indicator:unchecked {
image: url(:/icons/icons/collapse.svg)
}
QGroupBox::indicator:checked {
image: url(:/icons/icons/uncollapse.svg)
}</string>
</property>
<property name="title">
<string>Sniff settings</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>15</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QLabel" name="label_sniff_Center">
<property name="text">
<string>Center:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QDoubleSpinBox" name="spinbox_sniff_Noise">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxAdaptiveNoise">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;With adaptive noise URH will update the noise level automatically during RX. This is helpful in a dynamic environment where noise differs in time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Adaptive</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_sniff_Modulation">
<property name="text">
<string>Modulation:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_sniff_Signal">
<property name="text">
<string>Use values from:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="spinbox_sniff_ErrorTolerance">
<property name="maximum">
<number>999999</number>
</property>
<property name="value">
<number>5</number>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="combox_sniff_Modulation">
<item>
<property name="text">
<string>ASK</string>
</property>
</item>
<item>
<property name="text">
<string>FSK</string>
</property>
</item>
<item>
<property name="text">
<string>PSK</string>
</property>
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_sniff_Tolerance">
<property name="text">
<string>Error Tolerance:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="spinbox_sniff_SamplesPerSymbol">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_sniff_viewtype">
<property name="text">
<string>View:</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QLineEdit" name="lineEdit_sniff_OutputFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="placeholderText">
<string>None</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_sniff_BitLength">
<property name="text">
<string>Samples per Symbol:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="spinBoxCenterSpacing">
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="comboBox_sniff_signal">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_sniff_use_signal">
<property name="text">
<string>Use</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_sniff_OutputFile">
<property name="text">
<string>Write bitstream to file:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QDoubleSpinBox" name="spinbox_sniff_Center">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-3.140000000000000</double>
</property>
<property name="maximum">
<double>3.140000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxAutoCenter">
<property name="text">
<string>Automatic</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_sniff_encoding">
<property name="text">
<string>Encoding:</string>
</property>
</widget>
</item>
<item row="9" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QComboBox" name="comboBox_sniff_viewtype">
<item>
<property name="text">
<string>Bit</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>ASCII</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_sniff_Timestamp">
<property name="text">
<string>Show Timestamp</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_sniff_Noise">
<property name="text">
<string>Noise:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QComboBox" name="comboBox_sniff_encoding">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelCenterSpacing">
<property name="text">
<string>Center Spacing:</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="labelBitsPerSymbol">
<property name="text">
<string>Bits per Symbol:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QSpinBox" name="spinBoxBitsPerSymbol">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>groupBoxSniffSettings</tabstop>
<tabstop>spinbox_sniff_Noise</tabstop>
<tabstop>spinbox_sniff_SamplesPerSymbol</tabstop>
<tabstop>spinbox_sniff_ErrorTolerance</tabstop>
<tabstop>combox_sniff_Modulation</tabstop>
<tabstop>comboBox_sniff_encoding</tabstop>
<tabstop>comboBox_sniff_viewtype</tabstop>
<tabstop>checkBox_sniff_Timestamp</tabstop>
<tabstop>lineEdit_sniff_OutputFile</tabstop>
</tabstops>
<resources>
<include location="urh.qrc"/>
</resources>
<connections>
<connection>
<sender>groupBoxSniffSettings</sender>
<signal>toggled(bool)</signal>
<receiver>frame</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>93</x>
<y>17</y>
</hint>
<hint type="destinationlabel">
<x>113</x>
<y>35</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SignalDetails</class>
<widget class="QDialog" name="SignalDetails">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>469</width>
<height>200</height>
</rect>
</property>
<property name="windowTitle">
<string>Signal details</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="1">
<widget class="KillerDoubleSpinBox" name="dsb_sample_rate">
<property name="wrapping">
<bool>false</bool>
</property>
<property name="showGroupSeparator" stdset="0">
<bool>false</bool>
</property>
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>999999999999999945575230987042816.000000000000000</double>
</property>
<property name="value">
<double>1000000.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lblFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>File:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Samples:</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Sample Rate (Sps):</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="lblSamplesTotal">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>File size:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lblName">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="lblFileSize">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>File created:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="lFileCreated">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Duration:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="lDuration">
<property name="text">
<string>42s</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>135</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KillerDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>urh.ui.KillerDoubleSpinBox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,912 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulatorTab</class>
<widget class="QWidget" name="SimulatorTab">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>842</width>
<height>689</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>842</width>
<height>689</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QSplitter" name="splitterLeftRight">
<property name="styleSheet">
<string notr="true">QSplitter::handle:horizontal {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_vertical.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Protocols (Drag&amp;Drop to Flow Graph):</string>
</property>
</widget>
</item>
<item>
<widget class="GeneratorTreeView" name="treeProtocols"/>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Simulate these participants:</string>
</property>
</widget>
</item>
<item>
<widget class="QListView" name="listViewSimulate">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Repeat simulation this often:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxNRepeat">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="specialValueText">
<string>Infinite</string>
</property>
<property name="maximum">
<number>9999999</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Timeout:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBoxTimeout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="suffix">
<string>ms</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999999</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>In case of an overdue response:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="comboBoxError">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Resend last message</string>
</property>
</item>
<item>
<property name="text">
<string>Stop simulation</string>
</property>
</item>
<item>
<property name="text">
<string>Restart simulation</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Maximum retries:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="spinBoxRetries">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999999</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="btnStartSim">
<property name="text">
<string>Simulate...</string>
</property>
<property name="icon">
<iconset theme="media-playback-start">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:vertical {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_horizontal.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<widget class="QWidget" name="layoutWidget_2">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QTabWidget::pane { border: 0; }</string>
</property>
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Flow Graph</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>7</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="SimulatorGraphicsView" name="gvSimulator">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Messages</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="SimulatorMessageTableView" name="tblViewMessage">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderHighlightSections">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderHighlightSections">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="lNumSelectedColumns">
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lColumnsSelectedText">
<property name="text">
<string>column(s) selected</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>138</width>
<height>33</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Viewtype:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbViewType">
<item>
<property name="text">
<string>Bit</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>ASCII</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabParticipants">
<attribute name="title">
<string>Participants</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="ParticipantTableView" name="tableViewParticipants"/>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QToolButton" name="btnAddParticipant">
<property name="toolTip">
<string>Add participant</string>
</property>
<property name="text">
<string>Add</string>
</property>
<property name="icon">
<iconset theme="list-add">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRemoveParticipant">
<property name="toolTip">
<string>Remove participant</string>
</property>
<property name="text">
<string>Remove</string>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnUp">
<property name="toolTip">
<string>Move selected participants up</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="go-up">
<normaloff>../../../../</normaloff>../../../../</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnDown">
<property name="toolTip">
<string>Move selected participants down</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="go-down">
<normaloff>../../../../</normaloff>../../../../</iconset>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget_3">
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<item>
<widget class="QLabel" name="lblMsgFieldsValues">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Detail view for item</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="detail_view_widget">
<property name="currentIndex">
<number>2</number>
</property>
<widget class="QWidget" name="page_empty"/>
<widget class="QWidget" name="page_goto_action">
<layout class="QGridLayout" name="verticalLayout_7">
<item row="0" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Goto:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="goto_combobox"/>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="3">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_message">
<layout class="QGridLayout" name="gridLayout_6">
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Copies:</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="SimulatorLabelTableView" name="tblViewFieldValues">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>150</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_11">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Labels:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QSpinBox" name="spinBoxRepeat">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Coding:</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="lblEncodingDecoding">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_rule">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Condition:</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="ExpressionLineEdit" name="ruleCondLineEdit">
<property name="placeholderText">
<string>not (item1.crc == 0b1010 and item2.length &gt;=3)</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_ext_prog_action">
<layout class="QGridLayout" name="gridLayout_9">
<item row="2" column="0" colspan="4">
<widget class="QCheckBox" name="checkBoxPassTranscriptSTDIN">
<property name="text">
<string>Pass transcript to STDIN</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Command:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineEditTriggerCommand">
<property name="readOnly">
<bool>false</bool>
</property>
<property name="placeholderText">
<string>Path [+arguments] to external command e.g. mail or sendsms</string>
</property>
</widget>
</item>
<item row="1" column="2" colspan="2">
<widget class="QToolButton" name="btnChooseCommand">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="4">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="4">
<widget class="QLabel" name="label_18">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can access the return code of this item in formulas and rules using the item identifier followed by &lt;span style=&quot; font-style:italic;&quot;&gt;.rc&lt;/span&gt; e.g.&lt;span style=&quot; font-style:italic;&quot;&gt; item5.rc&lt;/span&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_sleep">
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_13">
<property name="text">
<string>Sleep for:</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="doubleSpinBoxSleep">
<property name="suffix">
<string>s</string>
</property>
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>10000.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>231</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="page">
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="1">
<widget class="QSpinBox" name="spinBoxCounterStep">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Start:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_16">
<property name="text">
<string>Step:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBoxCounterStart">
<property name="maximum">
<number>999999</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_17">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This counter will increase by &lt;span style=&quot; font-weight:600;&quot;&gt;step&lt;/span&gt; each time it gets hit during simulation. It will preserve it's value during simulation repeats and retries. To reset all counters stop the simulation and start it again.&lt;/p&gt;&lt;p&gt;Access the value of this counter using item&amp;lt;Number&amp;gt;.counter_value in &lt;span style=&quot; font-weight:600;&quot;&gt;Formulas&lt;/span&gt; or as parameter in &lt;span style=&quot; font-weight:600;&quot;&gt;external programs&lt;/span&gt; e.g. &lt;span style=&quot; font-style:italic;&quot;&gt;external_py -c item5.counter_value&lt;/span&gt;. The value of this counter will be inserted during simulation time.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>36</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ParticipantTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.ParticipantTableView.h</header>
</customwidget>
<customwidget>
<class>GeneratorTreeView</class>
<extends>QTreeView</extends>
<header>urh.ui.views.GeneratorTreeView.h</header>
</customwidget>
<customwidget>
<class>SimulatorGraphicsView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.SimulatorGraphicsView.h</header>
</customwidget>
<customwidget>
<class>SimulatorMessageTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.SimulatorMessageTableView.h</header>
</customwidget>
<customwidget>
<class>ExpressionLineEdit</class>
<extends>QLineEdit</extends>
<header>urh.ui.ExpressionLineEdit.h</header>
</customwidget>
<customwidget>
<class>SimulatorLabelTableView</class>
<extends>QTableView</extends>
<header>urh.ui.views.SimulatorLabelTableView.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,603 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogSimulator</class>
<widget class="QDialog" name="DialogSimulator">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1088</width>
<height>823</height>
</rect>
</property>
<property name="windowTitle">
<string>Simulation</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTabWidget" name="tabWidgetSimulatorSettings">
<property name="styleSheet">
<string notr="true">QTabWidget::pane { border: 0; }</string>
</property>
<property name="currentIndex">
<number>3</number>
</property>
<widget class="QWidget" name="tabLog">
<attribute name="title">
<string>Log settings</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="LoggingGraphicsView" name="gvSimulator">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="btnLogAll">
<property name="text">
<string>Log all</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnLogNone">
<property name="text">
<string>Log none</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnToggleLog">
<property name="text">
<string>Toggle selected</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabRX">
<attribute name="title">
<string>RX settings</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollAreaRX">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContentsRX">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1066</width>
<height>766</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="btnTestSniffSettings">
<property name="text">
<string>Test sniffer settings</string>
</property>
<property name="icon">
<iconset resource="urh.qrc">
<normaloff>:/icons/icons/sniffer.svg</normaloff>:/icons/icons/sniffer.svg</iconset>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabTX">
<attribute name="title">
<string>TX settings</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollAreaTX">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContentsTX">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1066</width>
<height>766</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabSimulation">
<attribute name="title">
<string>Simulation</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="styleSheet">
<string notr="true">QTabWidget::pane { border: 0; }</string>
</property>
<property name="tabPosition">
<enum>QTabWidget::West</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Triangular</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_simulation">
<attribute name="title">
<string>Status</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_15">
<item>
<widget class="QGroupBox" name="groupBoxSimulationStatus">
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}
QGroupBox::title {
subcontrol-origin: margin;
}
QGroupBox::indicator:unchecked {
image: url(:/icons/icons/collapse.svg)
}
QGroupBox::indicator:checked {
image: url(:/icons/icons/uncollapse.svg)
}</string>
</property>
<property name="title">
<string>Simulation Status</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<property name="topMargin">
<number>15</number>
</property>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QTextEdit" name="textEditSimulation">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Current iteration:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblCurrentRepeatValue">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Current item:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblCurrentItemValue">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSaveLog">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBoxRXStatus">
<property name="styleSheet">
<string notr="true">QGroupBox
{
border: none;
}
QGroupBox::title {
subcontrol-origin: margin;
}
QGroupBox::indicator:unchecked {
image: url(:/icons/icons/collapse.svg)
}
QGroupBox::indicator:checked {
image: url(:/icons/icons/uncollapse.svg)
}</string>
</property>
<property name="title">
<string>RX Status</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_14">
<property name="topMargin">
<number>15</number>
</property>
<item>
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QCheckBox" name="checkBoxCaptureFullRX">
<property name="text">
<string>Capture complete RX</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnSaveRX">
<property name="toolTip">
<string>Save current capture</string>
</property>
<property name="text">
<string>Save</string>
</property>
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="LiveGraphicView" name="graphicsViewPreview"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Messages</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="textEditTranscript">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>Here you will find all messages that were sent and received during simulation.</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QRadioButton" name="radioButtonTranscriptBit">
<property name="text">
<string>Bit &amp;view</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButtonTranscriptHex">
<property name="text">
<string>Hex view</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnOpenInAnalysis">
<property name="text">
<string>Open in Analysis</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSaveTranscript">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset theme="document-save">
<normaloff>.</normaloff>.</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_device">
<attribute name="title">
<string>Devices</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QTextEdit" name="textEditDevices">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>After simulation start you will see the log messages of your configured SDRs here.</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnStartStop">
<property name="text">
<string>Start</string>
</property>
<property name="icon">
<iconset theme="media-playback-start">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>LiveGraphicView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.LiveGraphicView.h</header>
</customwidget>
<customwidget>
<class>LoggingGraphicsView</class>
<extends>QGraphicsView</extends>
<header>urh.ui.views.LoggingGraphicsView.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections>
<connection>
<sender>groupBoxSimulationStatus</sender>
<signal>toggled(bool)</signal>
<receiver>frame</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>167</x>
<y>99</y>
</hint>
<hint type="destinationlabel">
<x>164</x>
<y>108</y>
</hint>
</hints>
</connection>
<connection>
<sender>groupBoxRXStatus</sender>
<signal>toggled(bool)</signal>
<receiver>frame_2</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>616</x>
<y>478</y>
</hint>
<hint type="destinationlabel">
<x>629</x>
<y>544</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Interpretation</class>
<widget class="QWidget" name="Interpretation">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>631</width>
<height>561</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="ScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrlAreaSignals">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>631</width>
<height>561</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QSplitter" name="splitter">
<property name="styleSheet">
<string notr="true">QSplitter::handle:vertical {
margin: 4px 0px;
background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,
stop:0 rgba(255, 255, 255, 0),
stop:0.5 rgba(100, 100, 100, 100),
stop:1 rgba(255, 255, 255, 0));
image: url(:/icons/icons/splitter_handle_horizontal.svg);
}</string>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="handleWidth">
<number>6</number>
</property>
<widget class="QLabel" name="labelGettingStarted">
<property name="font">
<font>
<pointsize>32</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open a file or record a new signal using the &lt;b&gt;File menu&lt;/b&gt; to get started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::NoTextInteraction</set>
</property>
</widget>
<widget class="QLabel" name="placeholderLabel">
<property name="text">
<string/>
</property>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ScrollArea</class>
<extends>QScrollArea</extends>
<header>urh.ui.ScrollArea.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="urh.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,20 @@
<RCC>
<qresource prefix="icons">
<file>../icons/appicon.ico</file>
<file>../icons/decoding.svg</file>
<file>../icons/equals_qm.svg</file>
<file>../icons/appicon.png</file>
<file>../icons/collapse.svg</file>
<file>../icons/uncollapse.svg</file>
<file>../icons/equals.svg</file>
<file>../icons/lock.svg</file>
<file>../icons/modulation.svg</file>
<file>../icons/plus.svg</file>
<file>../icons/sniffer.svg</file>
<file>../icons/spectrum.svg</file>
<file>../icons/splitter_handle_horizontal.svg</file>
<file>../icons/splitter_handle_vertical.svg</file>
<file>../icons/unlock.svg</file>
<file>../icons/message_type.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Universal Radio Hacker
Comment=investigate wireless protocols like a boss
Exec=/usr/bin/urh
Icon=urh
Terminal=false
Categories=HamRadio