diff --git a/.gitignore b/.gitignore index 71fcfdf..c9bf6cf 100644 --- a/.gitignore +++ b/.gitignore @@ -183,4 +183,5 @@ cython_debug/ #.idea/ *.png -/logs/*.log \ No newline at end of file +/logs/*.log +runtime/ diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index 9c759c1..197b849 100644 --- a/deploy/docker/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -9,6 +9,7 @@ services: - ../../.env environment: - PYTHONPATH=/app + - JAMMER_STATE_FILE=/app/runtime/jammer_active.flag working_dir: /app command: ["python3", "-m", "src.server_to_master"] restart: unless-stopped @@ -16,6 +17,7 @@ services: - "5010:5010" volumes: - ../../.env:/app/.env:ro + - ../../runtime:/app/runtime networks: - dronedetector-net diff --git a/out.iq b/out.iq new file mode 100644 index 0000000..2cdc478 Binary files /dev/null and b/out.iq differ diff --git a/src/embedded_3300.py b/src/embedded_3300.py index d1267c3..ef078a3 100644 --- a/src/embedded_3300.py +++ b/src/embedded_3300.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_433.py b/src/embedded_433.py index 3f72a6f..d890bb3 100644 --- a/src/embedded_433.py +++ b/src/embedded_433.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_4500.py b/src/embedded_4500.py index a921188..fcd6cfe 100644 --- a/src/embedded_4500.py +++ b/src/embedded_4500.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_5200.py b/src/embedded_5200.py index 91a3f04..c021cec 100644 --- a/src/embedded_5200.py +++ b/src/embedded_5200.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_5800.py b/src/embedded_5800.py index f7dd93d..e70e2c7 100644 --- a/src/embedded_5800.py +++ b/src/embedded_5800.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_750.py b/src/embedded_750.py index 38c36e7..12368dc 100644 --- a/src/embedded_750.py +++ b/src/embedded_750.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -93,7 +94,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/embedded_868.py b/src/embedded_868.py index cc7bbe8..fda0b30 100644 --- a/src/embedded_868.py +++ b/src/embedded_868.py @@ -4,6 +4,7 @@ import time from common.runtime import load_root_env, validate_env, as_bool, as_str from smb.SMBConnection import SMBConnection from utils.datas_processing import pack_elems, agregator, send_data, send_telemetry, save_data, remote_save_data +from utils.jammer_state_flag import is_jammer_active from core.sig_n_medi_collect import Signal, SignalsArray, get_signal_length from core.multichannelswitcher import MultiChannel, get_centre_freq @@ -90,7 +91,7 @@ def work(lvl): if alarm: print('----ALARM---- ', freq) multi_channel.db_alarms_zeros(circle_buffer) - else: + elif not is_jammer_active(): circle_buffer.update(sigs_array, packet_timestamps=sigs_ts_array) diff --git a/src/server_to_master.py b/src/server_to_master.py index 7793949..450b022 100644 --- a/src/server_to_master.py +++ b/src/server_to_master.py @@ -14,6 +14,7 @@ from fastapi import FastAPI from common.runtime import load_root_env, validate_env, as_bool, as_float, as_int, as_str from datetime import datetime, timedelta import logging +from src.utils.jammer_state_flag import set_jammer_active logging.basicConfig(level=logging.INFO) @@ -416,6 +417,7 @@ async def jammer_active(): freqs_alarm = {freq: 0 for freq in freqs} jammer_event = True + set_jammer_active(True) print('АКТИВИРУЕМ ПОДАВИТЕЛЬ ААААААААААААААААААААААААААААААААААААААААААААААА!!!!') print('-' * 20) @@ -438,6 +440,7 @@ async def jammer_deactive(): global sending_data_task alarm = False jammer_event = False + set_jammer_active(False) sending_data_task = asyncio.create_task(sending_data()) print('ОТКЛЮАЕМ ПОДАВИТЕЛЬ ААААААААААААААААААААААААААААААААААААААААААААААААА!!!!') @@ -496,6 +499,7 @@ async def jam_server(): await jammer_deactive() except Exception as e: jam_server_connect = None + set_jammer_active(False) if jammer_event: await jammer_deactive() @@ -508,6 +512,7 @@ async def startup_event(): """ global sending_data_task + set_jammer_active(False) asyncio.create_task(jam_server()) sending_data_task = asyncio.create_task(sending_data()) diff --git a/src/utils/jammer_state_flag.py b/src/utils/jammer_state_flag.py new file mode 100644 index 0000000..7a75655 --- /dev/null +++ b/src/utils/jammer_state_flag.py @@ -0,0 +1,47 @@ +import os +import time +from pathlib import Path + +_DEFAULT_FLAG_PATH = Path(__file__).resolve().parents[2] / "runtime" / "jammer_active.flag" +_FLAG_PATH = Path(os.getenv("JAMMER_STATE_FILE", str(_DEFAULT_FLAG_PATH))) +_CACHE_TTL_SEC = float(os.getenv("JAMMER_STATE_CACHE_TTL_SEC", "0.25")) +_STALE_SEC = float(os.getenv("JAMMER_STATE_STALE_SEC", "5.0")) + +_cached_value = False +_cached_checked_monotonic = 0.0 + + +def _read_uncached() -> bool: + try: + stat = _FLAG_PATH.stat() + if time.time() - stat.st_mtime > _STALE_SEC: + return False + return _FLAG_PATH.read_text(encoding="ascii").strip() == "1" + except OSError: + return False + + +def is_jammer_active() -> bool: + global _cached_value + global _cached_checked_monotonic + + now = time.monotonic() + if now - _cached_checked_monotonic < _CACHE_TTL_SEC: + return _cached_value + + _cached_value = _read_uncached() + _cached_checked_monotonic = now + return _cached_value + + +def set_jammer_active(active: bool) -> None: + global _cached_value + global _cached_checked_monotonic + + _FLAG_PATH.parent.mkdir(parents=True, exist_ok=True) + tmp_path = _FLAG_PATH.with_name(f"{_FLAG_PATH.name}.{os.getpid()}.tmp") + tmp_path.write_text("1" if active else "0", encoding="ascii") + os.replace(tmp_path, _FLAG_PATH) + + _cached_value = bool(active) + _cached_checked_monotonic = time.monotonic()