1# QT5 = True
2import os
3import sys
4
5import psutil
6from PyQt5.QtCore import Qt, QSettings
7from PyQt5.QtGui import QColor
8
9from urh.util.Formatter import Formatter
10from urh.util.Logger import logger
11
12
13global __qt_settings
14def __get_qt_settings():
15    global __qt_settings
16
17    try:
18        __qt_settings.fileName()
19    except:
20        __qt_settings = QSettings(QSettings.IniFormat, QSettings.UserScope, 'urh', 'urh')
21
22    return __qt_settings
23
24
25def get_qt_settings_filename():
26    return __get_qt_settings().fileName()
27
28
29MAX_RECENT_FILE_NR = 10
30ZOOM_TICKS = 10
31
32PIXELS_PER_PATH = 5000
33
34SPECTRUM_BUFFER_SIZE = 2 ** 15
35SNIFF_BUFFER_SIZE = 5 * 10 ** 7
36CONTINUOUS_BUFFER_SIZE_MB = 50
37
38PAUSE_TRESHOLD = 10
39RECT_BIT_WIDTH = 10
40BIT_SCENE_HEIGHT = 100
41
42TRANSPARENT_COLOR = QColor(Qt.transparent)
43
44LINECOLOR = QColor.fromRgb(225, 225, 225)
45BGCOLOR = QColor.fromRgb(55, 53, 53)
46AXISCOLOR = QColor.fromRgb(200, 200, 200, 100)
47ARROWCOLOR = QColor.fromRgb(204, 120, 50)
48
49ERROR_BG_COLOR = QColor.fromRgb(255, 0, 0, 150)
50
51SEND_INDICATOR_COLOR = QColor("darkblue")  # overwritten by system color (bin/urh)
52
53# ROI-SELECTION COLORS
54SELECTION_COLOR = QColor("darkblue")  # overwritten by system color (bin/urh)
55NOISE_COLOR = QColor("red")
56SELECTION_OPACITY = 1
57NOISE_OPACITY = 0.33
58
59# SEPARATION COLORS
60ONES_AREA_COLOR = Qt.green
61ZEROS_AREA_COLOR = Qt.magenta
62SEPARATION_OPACITY = 0.15
63SEPARATION_PADDING = .05  # percent
64
65# PROTOCOL TABLE COLORS
66SELECTED_ROW_COLOR = QColor.fromRgb(0, 0, 255)
67DIFFERENCE_CELL_COLOR = QColor.fromRgb(255, 0, 0)
68
69PROPERTY_FOUND_COLOR = QColor.fromRgb(0, 124, 0, 100)
70PROPERTY_NOT_FOUND_COLOR = QColor.fromRgb(124, 0, 0, 100)
71
72SEPARATION_ROW_HEIGHT = 30
73
74PROJECT_FILE = "URHProject.xml"
75DECODINGS_FILE = "decodings.txt"
76FIELD_TYPE_SETTINGS = os.path.realpath(os.path.join(get_qt_settings_filename(), "..", "fieldtypes.xml"))
77
78# DEVICE SETTINGS
79DEFAULT_IP_USRP = "192.168.10.2"
80DEFAULT_IP_RTLSDRTCP = "127.0.0.1"
81
82# DECODING NAMES
83DECODING_INVERT = "Invert"
84DECODING_DIFFERENTIAL = "Differential Encoding"
85DECODING_REDUNDANCY = "Remove Redundancy"
86DECODING_DATAWHITENING = "Remove Data Whitening (CC1101)"
87DECODING_CARRIER = "Remove Carrier"
88DECODING_BITORDER = "Change Bitorder"
89DECODING_EDGE = "Edge Trigger"
90DECODING_SUBSTITUTION = "Substitution"
91DECODING_EXTERNAL = "External Program"
92DECODING_ENOCEAN = "Wireless Short Packet (WSP)"
93DECODING_CUT = "Cut before/after"
94DECODING_MORSE = "Morse Code"
95DECODING_DISABLED_PREFIX = "[Disabled] "
96
97LABEL_COLORS = [QColor.fromRgb(217, 240, 27, 125),  # yellow
98                QColor.fromRgb(41, 172, 81, 125),  # green
99                QColor.fromRgb(245, 12, 12, 125),  # red
100                QColor.fromRgb(12, 12, 242, 125),  # blue
101                QColor.fromRgb(67, 44, 14, 125),  # brown
102                QColor.fromRgb(146, 49, 49, 125),  # dark red
103                QColor.fromRgb(9, 9, 54, 125),  # dark blue
104                QColor.fromRgb(17, 49, 27, 125),  # dark green
105                QColor.fromRgb(244, 246, 36, 125),  # strong yellow
106                QColor.fromRgb(61, 67, 67, 125),  # gray 3
107                QColor.fromRgb(58, 60, 100, 125),  # halfdark blue
108                QColor.fromRgb(139, 148, 148, 125),  # gray 2
109                QColor.fromRgb(153, 207, 206, 125),  # light blue green
110                QColor.fromRgb(207, 223, 223, 125),  # gray 1
111                QColor.fromRgb(106, 10, 10, 125),  # darker red
112                QColor.fromRgb(12, 142, 242, 125),  # light blue
113                QColor.fromRgb(213, 212, 134, 125),  # light yellow
114                QColor.fromRgb(240, 238, 244, 125),  # gray 0
115                QColor.fromRgb(201, 121, 18, 125),  # orange
116                QColor.fromRgb(155, 170, 224, 125),  # lighter blue
117                QColor.fromRgb(12, 242, 201, 125),  # blue green
118                QColor.fromRgb(7, 237, 78, 125),  # light green
119                QColor.fromRgb(154, 37, 111, 125),  # pink
120                QColor.fromRgb(159, 237, 7, 125),  # yellow green
121                QColor.fromRgb(231, 136, 242, 125),  # light pink
122                ]
123
124# full alpha for participant colors, since its used in text html view (signal frame)
125PARTICIPANT_COLORS = [QColor.fromRgb(lc.red(), lc.green(), lc.blue()) for lc in LABEL_COLORS]
126
127BG_COLOR_CORRECT = QColor(0, 255, 0, 150)
128BG_COLOR_WRONG = QColor(255, 0, 0, 150)
129
130HIGHLIGHT_TEXT_BACKGROUND_COLOR = QColor("orange")
131HIGHLIGHT_TEXT_FOREGROUND_COLOR = QColor("white")
132
133PEAK_COLOR = QColor("darkRed")
134
135NUM_CENTERS = 16
136
137SHORTEST_PREAMBLE_IN_BITS = 8
138SHORTEST_CONSTANT_IN_BITS = 8
139
140# used for displaying indented logs e.g. in simulation dialog
141INDENT = 8
142
143# Pause separator in message files
144PAUSE_SEP = "/"
145
146
147def read(key: str, default_value=None, type=str):
148    val = __get_qt_settings().value(key, default_value)
149    if val is None:
150        val = type()
151
152    if type is bool:
153        val = str(val).lower()
154        try:
155            return bool(int(val))
156        except ValueError:
157            return str(val).lower() == "true"
158    else:
159        return type(val)
160
161
162def write(key: str, value):
163    __get_qt_settings().setValue(key, value)
164
165
166def all_keys():
167    return __get_qt_settings().allKeys()
168
169
170def sync():
171    __get_qt_settings().sync()
172
173
174OVERWRITE_RECEIVE_BUFFER_SIZE = None  # for unit tests
175
176
177def get_receive_buffer_size(resume_on_full_receive_buffer: bool, spectrum_mode: bool) -> int:
178    if OVERWRITE_RECEIVE_BUFFER_SIZE:
179        return OVERWRITE_RECEIVE_BUFFER_SIZE
180
181    if resume_on_full_receive_buffer:
182        if spectrum_mode:
183            num_samples = SPECTRUM_BUFFER_SIZE
184        else:
185            num_samples = SNIFF_BUFFER_SIZE
186    else:
187        # Take 60% of avail memory
188        threshold = read('ram_threshold', 0.6, float)
189        num_samples = threshold * (psutil.virtual_memory().available / 8)
190
191    # Do not let it allocate too much memory on 32 bit
192    if 8 * 2 * num_samples > sys.maxsize:
193        num_samples = sys.maxsize // (8 * 2 * 1.5)
194        logger.info("Correcting buffer size to {}".format(num_samples))
195
196    logger.info("Allocate receive buffer with {0}B".format(Formatter.big_value_with_suffix(num_samples * 8)))
197    return int(num_samples)
198