Merge remote-tracking branch 'origin/master' into master-prd

# Conflicts:
#	scenes/pribor-prd-k/pribor-prd-k.gd
#	scenes/pribor-prd-n/pribor-prd-n.gd
This commit is contained in:
Maxim
2025-08-08 02:36:51 +03:00
14 changed files with 72 additions and 75 deletions

View File

@@ -103,7 +103,6 @@ func on_ecm_update(toggle_btn):
toggle_btn.button_pressed = ecm.modulation
func on_rto_threat_unsel(_th_id):
for item in range(len(TABLE_PARAMS)):
$table.set_node_text(1, item, '')

View File

@@ -61,5 +61,5 @@ func on_threat_update(th):
func on_rto_threat_unsel(_th_id):
for item in range(len(TABLE_PARAMS)):
for item in TABLE_PARAMS.size():
$table.set_node_text(1, item, '')

View File

@@ -14,6 +14,10 @@ const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Часто
const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок.
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
## Вызывается при нажатии указателем мыши на выбранный ряд.
func on_row_pressed(i_row: int):
row_pressed(i_row)
@@ -97,7 +101,3 @@ func on_rto_threat_sel(th_id, tbl):
if node.text.to_int() == th_id:
row_pressed(i)
break
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()

View File

@@ -1,5 +1,5 @@
@tool
extends "res://scenes/контроль/прибор.gd"
extends 'res://scenes/контроль/прибор.gd'
const Constants: Dictionary = {
'IN_BLANK_PRD': 1,

View File

@@ -1,3 +1,4 @@
@tool
extends 'res://scenes/контроль/прибор.gd'
const Constants = {

View File

@@ -1,31 +1,32 @@
extends 'res://scenes/контроль/прибор.gd'
@tool
class_name pribor_uf extends 'res://scenes/контроль/прибор.gd'
enum STATE_VAL {
NONE = 0,
GOOD = 1,
ERROR = 2 }
var timer = Timer.new()
var DEV_LIST = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0']
var USB_TRACKERBALL = '13ba:0018'
var REVFF = '(rev ff)'
enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
const DEV_LIST = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0']
const USB_TRACKERBALL = '13ba:0018'
const REVFF = '(rev ff)'
func _ready() -> void:
if Engine.is_editor_hint():
return
var unit_uf = network.get_unit_instance('уарэп-эмс')
self.add_child(timer)
timer.connect('timeout', Callable(self, 'on_timer').bind(unit_uf))
timer.start(1)
unit_uf.connect('line_changed', on_line_changed)
on_timer.bind(unit_uf)
control_vk()
func on_timer(unit_uf):
Control_VK() # проверка трекбола и pci
func on_timer(unit_uf: unit.Unit):
status_uf() # отслеживание состояния прибора
if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б
control_ems(unit_uf.status) # проверка ЭМС ячеек
func on_line_changed(unit_uf):
if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б
$ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.GOOD
$ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.GOOD
$ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.GOOD
Control_EMS(unit_uf.status) # проверка ЭМС ячеек
else:
$ref_uf/ref_kassetav13/ref_A7_YAU07.state = STATE_VAL.ERROR
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.NONE
@@ -34,20 +35,19 @@ func on_timer(unit_uf):
$ref_uf/ref_kassetav13/ref_A3_IP5B.state = STATE_VAL.NONE
$ref_uf/ref_kassetav13/ref_A9_ESW.state = STATE_VAL.NONE
$ref_uf/ref_kassetav13/ref_A12_IP27B.state = STATE_VAL.NONE
status_uf() # отслеживание состояния прибора
func Control_VK() -> void:
func control_vk() -> void:
var out_usb_str = ''
var out_pci_str = ''
var out_usb = []
var out_pci = []
OS.execute('lsusb', [], out_usb)
OS.execute('lsusb', [], out_usb) # TODO: Не переносимое, платформозависимое
for element in out_usb:
out_usb_str += element
OS.execute('lspci', [], out_pci)
OS.execute('lspci', [], out_pci) # TODO: Не переносимое, платформозависимое
for element in out_pci:
out_pci_str += element
@@ -68,13 +68,13 @@ func Control_VK() -> void:
i -= 1
break
if i == (len(DEV_LIST) + 1):
if i == (DEV_LIST.size() + 1):
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD
else:
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.ERROR
func Control_EMS(status:Array) -> void:
func control_ems(status: Array) -> void:
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.GOOD if ((status[0] >> 0) & 1) and ((status[0] >> 3) & 1) else STATE_VAL.ERROR
$ref_uf/ref_kassetav13/ref_A5_EMS.state = STATE_VAL.GOOD if ((status[0] >> 1) & 1) and ((status[0] >> 4) & 1) else STATE_VAL.ERROR
$ref_uf/ref_kassetav13/ref_A6_EMS.state = STATE_VAL.GOOD if ((status[0] >> 2) & 1) and ((status[0] >> 5) & 1) else STATE_VAL.ERROR
@@ -82,19 +82,19 @@ func Control_EMS(status:Array) -> void:
func status_uf() -> void:
var status_bu:int = $ref_uf/ref_bu1/ref_A8_BU.state
var status_yay:int = $ref_uf/ref_kassetav13/ref_A7_YAU07.state
var status_kems:int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state
var status_ems0:int = $ref_uf/ref_kassetav13/ref_A5_EMS.state
var status_ems1:int = $ref_uf/ref_kassetav13/ref_A6_EMS.state
var status_ip5:int = $ref_uf/ref_kassetav13/ref_A3_IP5B.state
var status_ip27:int = $ref_uf/ref_kassetav13/ref_A12_IP27B.state
var status_bu: int = $ref_uf/ref_bu1/ref_A8_BU.state
var status_yau: int = $ref_uf/ref_kassetav13/ref_A7_YAU07.state
var status_kyems: int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state
var status_yems0: int = $ref_uf/ref_kassetav13/ref_A5_EMS.state
var status_yems1: int = $ref_uf/ref_kassetav13/ref_A6_EMS.state
var status_ip5: int = $ref_uf/ref_kassetav13/ref_A3_IP5B.state
var status_ip27: int = $ref_uf/ref_kassetav13/ref_A12_IP27B.state
if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) \
and (status_ems0 == 1) and (status_ems1 == 1) and (status_ip5 == 1) and (status_ip27 == 1):
if (status_yau == 1) and (status_bu == 1) and (status_kyems == 1) \
and (status_yems0 == 1) and (status_yems1 == 1) and (status_ip5 == 1) and (status_ip27 == 1):
$lbl_header2.text = 'Прибор исправен'
$lbl_header2.modulate = Color(0,1,0,1)
$lbl_header2.modulate = Color.GREEN
else:
$lbl_header2.text = 'Прибор не исправен'
$lbl_header2.modulate = Color(1,0,0,1)
$lbl_header2.modulate = Color.RED
$lbl_header2.visible = true

View File

@@ -153,3 +153,5 @@ text = "Прибор не исправен
"
horizontal_alignment = 1
vertical_alignment = 1
[node name="timer" type="Timer" parent="."]

View File

@@ -12,6 +12,7 @@ class_name MercatorTileMap
base_url = v
_clean_all()
queue_redraw()
const TILE_REQUEST_NAME: = 'tile_request_%d'
@export var zoom_step: float = 0.1
@export var tile_width: float = 256.0
@@ -160,7 +161,7 @@ func _on_resize() -> void:
$canvas/spr_mask.scale = $canvas.size / default_size
## Создаёт новую отметку из координат экранаa
## Создаёт новую отметку из координат экрана
func add_mark_from_screen_pos(id: int, scr_xy: Vector2, mark: Node) -> bool:
if _marks.has(id):
return false
@@ -348,7 +349,7 @@ func _process(delta) -> void:
_req_count += 1
req.set_meta('tile', tile)
add_child(req)
req.name = NodePath(str(tile.i))
req.name = NodePath(TILE_REQUEST_NAME % tile.i)
_queue.erase(tile.i)
req.request_completed.connect(_response.bind(req, tile))
@@ -561,16 +562,15 @@ func get_tile(x: int, y: int, z: int) -> Tile:
return null
var idx = xyz_to_idx(x, y, z)
var tile = null
var req = get_node_or_null(NodePath(str(idx)))
var req: = get_node_or_null(NodePath(TILE_REQUEST_NAME % idx))
if req:
tile = req.get_meta('tile')
var tile = req.get_meta('tile')
if tile != null:
tile.t = now
return tile
tile = _cache.get(idx)
var tile = _cache.get(idx)
if tile:
tile.t = now
return tile
@@ -699,12 +699,12 @@ func blend_mask(val: bool) -> void:
func update_coordinates_label(lon: float, lat: float) -> void:
coordinates_label = "Координаты:\nNS:%f\nEW: %f" % [lat, lon]
coordinates_label = 'Координаты:\nNS:%f\nEW: %f' % [lat, lon]
signaller.emit_signal('update_coordinates_map', coordinates_label)
func update_scale_label() -> void:
scale_label = "Масштаб: " + str(round(_xyz.z))
scale_label = 'Масштаб: ' + str(round(_xyz.z))
signaller.emit_signal('update_scale_map', scale_label)

View File

@@ -1,10 +1,10 @@
extends Panel
func on_line_changed(unit, addr): log.message(Logger.INFO, '\"%s\" %s изменение состояния: %s' % [unit.name, addr, 'на связи' if unit.online else 'отключен'])
func on_command_fail(unit, addr): log.message(Logger.ERROR, '\"%s\" %s команда не выполнена' % [unit.name, addr])
func on_line_changed(unit_inst): log.message(Logger.INFO, '\"%s\" изменение состояния: %s' % [unit_inst.name, 'на связи' if unit_inst.online else 'отключен'])
func on_command_fail(unit_inst): log.message(Logger.ERROR, '\"%s\" %s команда не выполнена' % unit_inst.name)
func on_threats_changed(th: Object, msg: String): log.message(Logger.INFO, '%s: %s' % [msg, th.to_string()])
func on_parse_error(unit, msg: String): log.message(Logger.ERROR, '%s: %s' % [unit.name, msg])
func on_parse_error(unit_inst, msg: String): log.message(Logger.ERROR, '%s: %s' % [unit.name, msg])
func on_interfer_off(ecm, _ecms, _thrs,msg: String): log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()])
func on_set_program_mode(msg: String): log.message(Logger.INFO, msg)

View File

@@ -18,7 +18,7 @@ const PRIBORS_RES = \
'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'],
'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'],
'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'],
'pribor_rtr': ['res://scenes/pribor-afsp/pribor-rtr.tscn', 'Контроль исправности прибора РТР'],
'pribor_rtr': ['res://scenes/pribor-afsp/pribor-bpo.tscn', 'Контроль исправности прибора РТР'],
'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'],
'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'],
'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'],

View File

@@ -52,4 +52,4 @@ func button_connect(button_signal: String, proc: Callable):
func _on_button_mouse_entered():
emit_signal("mouse_entered")
emit_signal('mouse_entered')

View File

@@ -14,7 +14,7 @@ func fill_files_table(tbl: table, folder: String, rows_types: Array):
return
var files: = []
var exclude_names: = ['.', '..']
dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
dir.list_dir_begin() # TODO: GODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
while true:
var file: = dir.get_next()
if file == '':
@@ -32,7 +32,7 @@ func fill_files_table(tbl: table, folder: String, rows_types: Array):
var mt = Time.get_datetime_dict_from_unix_time(ut)
var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]]
tbl.add_row(rows_types)
var i_row = tbl.get_rows_count() - 1
var i_row: int = tbl.get_rows_count() - 1
tbl.set_row_text(i_row, file_row)
tbl.set_node_meta(0, i_row, 'file_path', glob_path)
dir.list_dir_end()

View File

@@ -61,22 +61,22 @@ class SocketTCP extends TCPServer:
var poll_sockets: Array[Socket]
var tcp_sockets: Array
var tcp_sockets: Array[Array]
var units: Dictionary[StringName, unit.Unit]
var units_udp: Dictionary[StringName, unit.Unit]
var units_udprx: Dictionary[StringName, unit.Unit]
var units_tcp: Dictionary[StringName, unit.Unit]
var units_serial: Dictionary[StringName, unit.Unit]
var units_modbus: Dictionary[StringName, unit.Unit]
var serials: Dictionary # Последовательные порты
var mbcs: Dictionary # Клиенты modbus.
var serials: Dictionary[StringName, Serial] # Последовательные порты
var mbcs: Dictionary[StringName, unit.Unit] # Клиенты modbus
var dst_ports: Dictionary[StringName, int]
var dst_addrs: Dictionary[StringName, StringName]
var unit_keys: Dictionary
var unit_keys: Dictionary[int, StringName]
var sock_unicast: Socket
var sock_capsrpb: Socket
var logger_page: Node
var send_sockets: Dictionary # Таблица <имяустройста>: <сокет> для отправки сообщений
var send_sockets: Dictionary[StringName, Socket] # Таблица <имяустройста>: <сокет> для отправки сообщений
var addr_port_to_unit_name: Dictionary[StringName, StringName]
@@ -197,8 +197,8 @@ func _ready() -> void:
if logger_page:
for key in units:
var u = units[key]
u.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(key))
u.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(key))
u.connect('line_changed', Callable(logger_page, 'on_line_changed'))
u.connect('command_fail', Callable(logger_page, 'on_command_fail'))
for key in settings.UnitProfiles:
var item = settings.UnitProfiles[key]
@@ -239,14 +239,14 @@ func poll_receive_udp(sock: Socket) -> bool:
units[unit_name].parse(data, tick)
continue
if unit_keys.has(port):
var key1 = unit_keys[port]
if units.has(key1):
units[key1].parse(data, tick)
var unit_key = unit_keys[port]
if units.has(unit_key):
units[unit_key].parse(data, tick)
continue
port = sock.get_local_port()
var key = StringName('%s:%d' % ['*', port])
if units.has(key):
var unit_udprx = units[key]
var local_port: = sock.get_local_port()
if unit_keys.has(local_port):
var unit_name = unit_keys[local_port]
var unit_udprx = units[unit_name]
unit_udprx.source_addr = [addr, port]
unit_udprx.parse(data, tick)
continue

View File

@@ -107,8 +107,3 @@ func get_settings_file_path():
return ProjectSettings.get_setting(
'application/config/settings_path',
'user://settings.json')
## Возвращает ключ устройства.
func get_unit_key(unit_name: String) -> StringName:
return StringName(unit_name)