Merge remote-tracking branch 'sasha/master'
This commit is contained in:
@@ -13,7 +13,7 @@ horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="count_danger" type="Label" parent="."]
|
||||
modulate = Color(0.8, 0.533333, 0.27451, 1)
|
||||
modulate = Color(0.890196, 0.486275, 0.196078, 1)
|
||||
layout_mode = 0
|
||||
offset_right = 92.0
|
||||
offset_bottom = 63.0
|
||||
|
||||
@@ -1,23 +1,394 @@
|
||||
@tool
|
||||
extends "res://scenes/контроль/прибор.gd"
|
||||
|
||||
enum STATE_VAL {
|
||||
NONE = 0,
|
||||
GOOD = 1,
|
||||
ERROR = 2 }
|
||||
const Constants = {
|
||||
"IN_BLANK_PRD": 1,
|
||||
"OUT_BLANK_PRD": 13,
|
||||
"CI_1_OT_FS": 8,
|
||||
"CI_6_OT_FS": 13,
|
||||
"CI_7_OT_FS": 14,
|
||||
"CI_1_B_UF": 3,
|
||||
"CI_6_B_UF": 4,
|
||||
"CI_7_B_UF": 5,
|
||||
"CONST_MIN_TEMP": -25,
|
||||
"MAXIMUM_CODE_ADC": 3796,
|
||||
"MINIMUM_CODE_AD": 2660,
|
||||
"TEMPERATURE_UKP_1": 47,
|
||||
"TEMPERATURE_UKP_2": 79,
|
||||
"POWER_UKP_1": 31,
|
||||
"POWER_UKP_2": 63,
|
||||
"DKM_BIT_1": 0,
|
||||
"DKM_BIT_6": 5,
|
||||
"DKM_BIT_7": 6,
|
||||
"BASE_ADDR_EMS_G": 0x120,
|
||||
"ADDR_UG_LITERA_1": 0x106,
|
||||
"ADDR_UG_LITERA_2": 0x108,
|
||||
"ADDR_UG_LITERA_3": 0x10A,
|
||||
"TEMP_THRESHOLD": 70,
|
||||
"POWER_THRESHOLD": 40,
|
||||
"TIMER_DELAY": 1.5,
|
||||
"dou_ray_nuber": 0x3,
|
||||
"attenutor_um_1": 0x7,
|
||||
"attenutor_um_2": 0x7,
|
||||
"attenutor_um_3": 0x7,
|
||||
}
|
||||
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
|
||||
# Основные переменные
|
||||
var count_packet_1:int = 0
|
||||
var count_packet_2:int = 0
|
||||
var power_array_1: Array = []
|
||||
var power_array_2: Array = []
|
||||
var currecnt_unit: String
|
||||
var ug_work_1: int
|
||||
var ug_work_2: int
|
||||
var ug_work_3: int
|
||||
# Флаги и таймеры
|
||||
var control_timer: Timer = Timer.new()
|
||||
var flag_timer_started: bool = false
|
||||
# Результаты контроля
|
||||
var _control_results: Dictionary = {
|
||||
"block_ip": false, # Проверка касет П1 и ИП МА2000
|
||||
"temperature": true, # Проверка температур УМ
|
||||
"dkm_1": false, # Проверка ДКМ
|
||||
"dkm_2": false, # Проверка ДКМ
|
||||
"power_ukp": false, # Мощность от УКП
|
||||
"fs_1": false, # Проверка ФС
|
||||
"fs_2": false,
|
||||
"fs_3": false,
|
||||
}
|
||||
|
||||
|
||||
func set_default_state():
|
||||
$utm80_A9.state = STATE_VAL.NONE
|
||||
$um1535_A10.state = STATE_VAL.NONE
|
||||
$um1535_A11.state = STATE_VAL.NONE
|
||||
$um1535_A12.state = STATE_VAL.NONE
|
||||
$um1535_A13.state = STATE_VAL.NONE
|
||||
$um1535_A14.state = STATE_VAL.NONE
|
||||
$um1535_A15.state = STATE_VAL.NONE
|
||||
$um1535_A16.state = STATE_VAL.NONE
|
||||
$um1535_A17.state = STATE_VAL.NONE
|
||||
$um1535_A18.state = STATE_VAL.NONE
|
||||
$um1535_A19.state = STATE_VAL.NONE
|
||||
$um1535_A20.state = STATE_VAL.NONE
|
||||
$um1535_A21.state = STATE_VAL.NONE
|
||||
func _ready() -> void:
|
||||
initialize_connections()
|
||||
setup_timer()
|
||||
set_default_state()
|
||||
|
||||
|
||||
func initialize_connections() -> void:
|
||||
signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state'))
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
currecnt_unit = unit_prd.name
|
||||
unit_prd.connect('data_received', Callable(self, 'on_data_received'))
|
||||
unit_prd.connect('line_changed', Callable(self, 'on_line_changed'))
|
||||
|
||||
|
||||
func setup_timer() -> void:
|
||||
add_child(control_timer)
|
||||
control_timer.connect('timeout', Callable(self, 'on_stop_control'))
|
||||
control_timer.one_shot = true
|
||||
control_timer.wait_time = 10.0
|
||||
control_timer.start()
|
||||
|
||||
|
||||
func set_default_state() -> void:
|
||||
for group in get_tree().get_nodes_in_group('default_reset'):
|
||||
group.state = STATE_VAL.NONE
|
||||
|
||||
for group in get_tree().get_nodes_in_group('power_amplifier'):
|
||||
group.state = STATE_VAL.NONE
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
$control_result.text = ''
|
||||
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
|
||||
_on_control_fs(true)
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
var prd_module = prd.prd_dict[unit_prd.name]
|
||||
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]])
|
||||
|
||||
|
||||
func on_line_changed(unit_prd: Object) -> void:
|
||||
if not unit_prd.online:
|
||||
set_default_state()
|
||||
|
||||
|
||||
func on_data_received(unit_prd: Object) -> void:
|
||||
if not is_inside_tree():
|
||||
return
|
||||
|
||||
var status = unit_prd.status
|
||||
check_block_ip(status)
|
||||
check_temperature_um(status)
|
||||
# Обработка данных ЭМС
|
||||
_process_ems_data(status)
|
||||
|
||||
if flag_timer_started:
|
||||
check_dkm(status, Constants.DKM_BIT_1)
|
||||
check_dkm(status, Constants.DKM_BIT_6)
|
||||
check_dkm(status, Constants.DKM_BIT_7)
|
||||
# Обработка мощности от УКП
|
||||
_process_ukp_power(status)
|
||||
|
||||
|
||||
# Обрабатывает данные ЭМС и обновляет UI панели
|
||||
func _process_ems_data(status: PackedByteArray) -> void:
|
||||
## Контроль ЭМС
|
||||
var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD)
|
||||
var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD)
|
||||
|
||||
# Обновление фреймов для входных сигналов
|
||||
$Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1
|
||||
$Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1
|
||||
$Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1
|
||||
|
||||
# Обновление фреймов для выходных сигналов ЭМС
|
||||
$Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1
|
||||
$Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1
|
||||
$Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1
|
||||
|
||||
|
||||
## Проверка касет П1 и ИП МА2000
|
||||
func check_block_ip(status_prd: PackedByteArray) -> void :
|
||||
var ug_online: bool = (status_prd[0] >> 1) & 1
|
||||
if ug_online:
|
||||
const BYTE_DRY_CONTACT: int = 27
|
||||
const BIT_MAA2000_1: int = 0
|
||||
const BIT_MAA2000_2: int = 1
|
||||
const BIT_IP9_50_1: int = 2
|
||||
const BIT_IP9_50_2: int = 3
|
||||
const BIT_IP12_50_1: int = 4
|
||||
const BIT_IP9_50_3: int = 5
|
||||
const BIT_IP12_50_2: int = 6
|
||||
|
||||
var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1
|
||||
var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1
|
||||
var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1
|
||||
var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1
|
||||
var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1
|
||||
var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1
|
||||
var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1
|
||||
|
||||
$maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD
|
||||
$maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD
|
||||
$kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD
|
||||
$kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD
|
||||
else:
|
||||
$maa2000_A23.state = STATE_VAL.NONE
|
||||
$maa2000_A22.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A26.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A23.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A24.state = STATE_VAL.NONE
|
||||
$kasseta_p_2/ref_A26.state = STATE_VAL.NONE
|
||||
$kasseta_p_2/ref_A23.state = STATE_VAL.NONE
|
||||
|
||||
_control_results["block_ip"] = (
|
||||
$maa2000_A23.state == STATE_VAL.GOOD and
|
||||
$maa2000_A22.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_2/ref_A23.state == STATE_VAL.GOOD
|
||||
)
|
||||
|
||||
|
||||
## Проверка температур УМ от УКП
|
||||
func check_temperature_um(status_prd: PackedByteArray) -> void:
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD)
|
||||
var ukp1_online: int = (status_prd[0] >> 2) & 1
|
||||
if ukp1_online:
|
||||
var tmp_1: int
|
||||
var temperature_ukp_1: int
|
||||
for i_temp in range(6):
|
||||
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp)
|
||||
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
|
||||
power_amplifier[i_temp].value0 = tmp_1
|
||||
# Темпуратура от УМ литеры 1
|
||||
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7)
|
||||
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
|
||||
power_amplifier[6].value0 = tmp_1
|
||||
|
||||
var ukp2_online = (status_prd[0] >> 3) & 1
|
||||
if ukp2_online:
|
||||
for i_temp in range(6):
|
||||
var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp)
|
||||
var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3)
|
||||
power_amplifier[i_temp+7].value0 = tmp_2
|
||||
|
||||
|
||||
## Проверка ДКМ
|
||||
func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void:
|
||||
const DKM: int = 28
|
||||
|
||||
var status_dkm = status_prd[DKM] >> bit_dkm & 1
|
||||
if bit_dkm == 5:
|
||||
$dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
$kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_1"] = status_dkm
|
||||
elif bit_dkm == 6:
|
||||
$dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_2"] = status_dkm
|
||||
elif bit_dkm == 0:
|
||||
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_3"] = status_dkm
|
||||
|
||||
|
||||
func _process_ukp_power(status: PackedByteArray) -> void:
|
||||
## Мощность УМ от УКП 1
|
||||
var arr_power_ukp_1: Array = []
|
||||
|
||||
if (status[0] >> 2) & 1:
|
||||
var power_ukp_1: int
|
||||
for i_power in range(6):
|
||||
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power)
|
||||
arr_power_ukp_1.append(power_ukp_1)
|
||||
# Мощность от УМ (УКП) литеры 3
|
||||
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7)
|
||||
arr_power_ukp_1.append(power_ukp_1)
|
||||
|
||||
if count_packet_1 == 0:
|
||||
power_array_1 = arr_power_ukp_1
|
||||
else:
|
||||
for i in arr_power_ukp_1.size():
|
||||
if arr_power_ukp_1[i] > power_array_1[i]:
|
||||
power_array_1[i] = arr_power_ukp_1[i]
|
||||
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for i in 7:
|
||||
power_amplifier[i].value1 = '%d' % power_array_1[i]
|
||||
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR
|
||||
count_packet_1 += 1
|
||||
|
||||
## Мощность УМ от УКП 2
|
||||
var arr_power_ukp_2: Array = []
|
||||
if (status[0] >> 2) & 1:
|
||||
for i_power in range(6):
|
||||
var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power)
|
||||
arr_power_ukp_2.append(power_ukp_2)
|
||||
|
||||
if count_packet_2 == 0:
|
||||
power_array_2 = arr_power_ukp_2
|
||||
else:
|
||||
for i in arr_power_ukp_2.size():
|
||||
if arr_power_ukp_2[i] > power_array_2[i]:
|
||||
power_array_2[i] = arr_power_ukp_2[i]
|
||||
|
||||
for i in 6:
|
||||
power_amplifier[i+7].value1 = '%d' % power_array_2[i]
|
||||
power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR
|
||||
|
||||
count_packet_2 += 1
|
||||
|
||||
_control_results["power_ukp"] = true
|
||||
for amp in power_amplifier:
|
||||
if amp.state != STATE_VAL.GOOD:
|
||||
_control_results["power_ukp"] = false
|
||||
break
|
||||
|
||||
|
||||
func _on_control_fs(mode: bool) -> void:
|
||||
var interfer_name: String
|
||||
var fs_arr: Array
|
||||
if mode:
|
||||
interfer_name = 'k1'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
else:
|
||||
interfer_name = 'off'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, 50.0)
|
||||
|
||||
|
||||
func on_stop_control() -> void:
|
||||
print_debug('Отсановка контроля ПРД')
|
||||
_on_control_fs(false)
|
||||
on_control_result()
|
||||
|
||||
|
||||
func on_fs_update_state(packet_type_7: Dictionary) -> void:
|
||||
var parts = currecnt_unit.split('-')
|
||||
var last_part = parts[-1] # Прибор
|
||||
|
||||
# Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора
|
||||
var fs_mapping = {
|
||||
0: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '1к' },
|
||||
1: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '4к' },
|
||||
2: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '3к' },
|
||||
3: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '2к' },
|
||||
20: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '1к' },
|
||||
21: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '4к' },
|
||||
22: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '3к' },
|
||||
23: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '2к' },
|
||||
24: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '1к' },
|
||||
25: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '4к' },
|
||||
26: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '3к' },
|
||||
27: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '2к' },
|
||||
}
|
||||
for fs in packet_type_7:
|
||||
if fs in fs_mapping and fs_mapping[fs]["condition"]:
|
||||
var data = packet_type_7[fs]
|
||||
var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE
|
||||
fs_mapping[fs]["node"].state = state
|
||||
if fs < 4:
|
||||
_control_results["fs_1"] = (data.isg == 1)
|
||||
elif fs <24:
|
||||
_control_results["fs_2"] = (data.isg == 1)
|
||||
else:
|
||||
_control_results["fs_3"] = (data.isg == 1)
|
||||
if _control_results['fs_1'] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started:
|
||||
on_ug_setting()
|
||||
control_timer.wait_time = Constants.TIMER_DELAY
|
||||
control_timer.start()
|
||||
flag_timer_started = true
|
||||
|
||||
|
||||
func on_ug_setting() -> void:
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1):
|
||||
ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1]
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2):
|
||||
ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2]
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3):
|
||||
ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3]
|
||||
|
||||
var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07)
|
||||
var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07)
|
||||
var prd_module = prd.prd_dict[unit_prd.name]
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1,
|
||||
Constants.ADDR_UG_LITERA_2, result_2,
|
||||
Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3,
|
||||
Constants.BASE_ADDR_EMS_G, 6666]])
|
||||
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]])
|
||||
|
||||
func on_mode_changed(in_tree: bool) -> void:
|
||||
if not in_tree:
|
||||
queue_free()
|
||||
|
||||
|
||||
func on_control_result() -> void:
|
||||
var result: bool = true
|
||||
|
||||
for key in _control_results:
|
||||
if not _control_results[key]:
|
||||
if key == 'fs_1':
|
||||
$kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR
|
||||
if key == 'fs_2':
|
||||
$kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR
|
||||
if key == 'fs_3':
|
||||
$kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR
|
||||
result = false
|
||||
print_debug('%s false' % key)
|
||||
|
||||
var parts = currecnt_unit.split('-')
|
||||
var last_part = parts[-1] # Прибор
|
||||
if result:
|
||||
$control_result.text = 'Прибор ПРД-%s исправен' % last_part
|
||||
$control_result.add_theme_color_override("font_color", Color.AQUAMARINE)
|
||||
else:
|
||||
$control_result.text = 'Прибор ПРД-%s неисправен' % last_part
|
||||
$control_result.add_theme_color_override("font_color", Color.CRIMSON)
|
||||
await get_tree().create_timer(Constants.TIMER_DELAY).timeout
|
||||
flag_timer_started = false
|
||||
|
||||
@@ -1 +1 @@
|
||||
uid://dlcma54gh7fsk
|
||||
uid://cwvikiygf8b1m
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=16 format=3 uid="uid://m5s87q7m66lj"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"]
|
||||
[ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor_prd_k.gd" id="1_tpdyp"]
|
||||
[ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor-prd-k.gd" id="1_tpdyp"]
|
||||
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"]
|
||||
[ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"]
|
||||
[ext_resource type="Script" uid="uid://dow4nqi6hbak8" path="res://scenes/контроль/кассета-у-5.gd" id="3_wip3a"]
|
||||
@@ -356,6 +356,7 @@ offset_right = 649.0
|
||||
offset_bottom = 1003.0
|
||||
theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1)
|
||||
theme_override_font_sizes/font_size = 28
|
||||
text = "Прибор ПРД- неисправен"
|
||||
horizontal_alignment = 1
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
|
||||
@@ -1,394 +0,0 @@
|
||||
@tool
|
||||
extends "res://scenes/контроль/прибор.gd"
|
||||
|
||||
const Constants = {
|
||||
"IN_BLANK_PRD": 1,
|
||||
"OUT_BLANK_PRD": 13,
|
||||
"CI_1_OT_FS": 8,
|
||||
"CI_6_OT_FS": 13,
|
||||
"CI_7_OT_FS": 14,
|
||||
"CI_1_B_UF": 3,
|
||||
"CI_6_B_UF": 4,
|
||||
"CI_7_B_UF": 5,
|
||||
"CONST_MIN_TEMP": -25,
|
||||
"MAXIMUM_CODE_ADC": 3796,
|
||||
"MINIMUM_CODE_AD": 2660,
|
||||
"TEMPERATURE_UKP_1": 47,
|
||||
"TEMPERATURE_UKP_2": 79,
|
||||
"POWER_UKP_1": 31,
|
||||
"POWER_UKP_2": 63,
|
||||
"DKM_BIT_1": 0,
|
||||
"DKM_BIT_6": 5,
|
||||
"DKM_BIT_7": 6,
|
||||
"BASE_ADDR_EMS_G": 0x120,
|
||||
"ADDR_UG_LITERA_1": 0x106,
|
||||
"ADDR_UG_LITERA_2": 0x108,
|
||||
"ADDR_UG_LITERA_3": 0x10A,
|
||||
"TEMP_THRESHOLD": 70,
|
||||
"POWER_THRESHOLD": 40,
|
||||
"TIMER_DELAY": 1.5,
|
||||
"dou_ray_nuber": 0x3,
|
||||
"attenutor_um_1": 0x7,
|
||||
"attenutor_um_2": 0x7,
|
||||
"attenutor_um_3": 0x7,
|
||||
}
|
||||
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
|
||||
# Основные переменные
|
||||
var count_packet_1:int = 0
|
||||
var count_packet_2:int = 0
|
||||
var power_array_1: Array = []
|
||||
var power_array_2: Array = []
|
||||
var currecnt_unit: String
|
||||
var ug_work_1: int
|
||||
var ug_work_2: int
|
||||
var ug_work_3: int
|
||||
# Флаги и таймеры
|
||||
var control_timer: Timer = Timer.new()
|
||||
var flag_timer_started: bool = false
|
||||
# Результаты контроля
|
||||
var _control_results: Dictionary = {
|
||||
"block_ip": false, # Проверка касет П1 и ИП МА2000
|
||||
"temperature": true, # Проверка температур УМ
|
||||
"dkm_1": false, # Проверка ДКМ
|
||||
"dkm_2": false, # Проверка ДКМ
|
||||
"power_ukp": false, # Мощность от УКП
|
||||
"fs_1": false, # Проверка ФС
|
||||
"fs_2": false,
|
||||
"fs_3": false,
|
||||
}
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
initialize_connections()
|
||||
setup_timer()
|
||||
set_default_state()
|
||||
|
||||
|
||||
func initialize_connections() -> void:
|
||||
signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state'))
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
currecnt_unit = unit_prd.name
|
||||
unit_prd.connect('data_received', Callable(self, 'on_data_received'))
|
||||
unit_prd.connect('line_changed', Callable(self, 'on_line_changed'))
|
||||
|
||||
|
||||
func setup_timer() -> void:
|
||||
add_child(control_timer)
|
||||
control_timer.connect('timeout', Callable(self, 'on_stop_control'))
|
||||
control_timer.one_shot = true
|
||||
control_timer.wait_time = 10.0
|
||||
control_timer.start()
|
||||
|
||||
|
||||
func set_default_state() -> void:
|
||||
for group in get_tree().get_nodes_in_group('default_reset'):
|
||||
group.state = STATE_VAL.NONE
|
||||
|
||||
for group in get_tree().get_nodes_in_group('power_amplifier'):
|
||||
group.state = STATE_VAL.NONE
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
$control_result.text = ''
|
||||
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
|
||||
_on_control_fs(true)
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
var prd_module = prd.prd_dict[unit_prd.name]
|
||||
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]])
|
||||
|
||||
|
||||
func on_line_changed(unit_prd: Object) -> void:
|
||||
if not unit_prd.online:
|
||||
set_default_state()
|
||||
|
||||
|
||||
func on_data_received(unit_prd: Object) -> void:
|
||||
if not is_inside_tree():
|
||||
return
|
||||
|
||||
var status = unit_prd.status
|
||||
check_block_ip(status)
|
||||
check_temperature_um(status)
|
||||
# Обработка данных ЭМС
|
||||
_process_ems_data(status)
|
||||
|
||||
if flag_timer_started:
|
||||
check_dkm(status, Constants.DKM_BIT_1)
|
||||
check_dkm(status, Constants.DKM_BIT_6)
|
||||
check_dkm(status, Constants.DKM_BIT_7)
|
||||
# Обработка мощности от УКП
|
||||
_process_ukp_power(status)
|
||||
|
||||
|
||||
# Обрабатывает данные ЭМС и обновляет UI панели
|
||||
func _process_ems_data(status: PackedByteArray) -> void:
|
||||
## Контроль ЭМС
|
||||
var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD)
|
||||
var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD)
|
||||
|
||||
# Обновление фреймов для входных сигналов
|
||||
$Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1
|
||||
$Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1
|
||||
$Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1
|
||||
|
||||
# Обновление фреймов для выходных сигналов ЭМС
|
||||
$Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1
|
||||
$Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1
|
||||
$Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1
|
||||
|
||||
|
||||
## Проверка касет П1 и ИП МА2000
|
||||
func check_block_ip(status_prd: PackedByteArray) -> void :
|
||||
var ug_online: bool = (status_prd[0] >> 1) & 1
|
||||
if ug_online:
|
||||
const BYTE_DRY_CONTACT: int = 27
|
||||
const BIT_MAA2000_1: int = 0
|
||||
const BIT_MAA2000_2: int = 1
|
||||
const BIT_IP9_50_1: int = 2
|
||||
const BIT_IP9_50_2: int = 3
|
||||
const BIT_IP12_50_1: int = 4
|
||||
const BIT_IP9_50_3: int = 5
|
||||
const BIT_IP12_50_2: int = 6
|
||||
|
||||
var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1
|
||||
var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1
|
||||
var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1
|
||||
var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1
|
||||
var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1
|
||||
var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1
|
||||
var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1
|
||||
|
||||
$maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD
|
||||
$maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD
|
||||
$kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD
|
||||
$kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD
|
||||
$kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD
|
||||
else:
|
||||
$maa2000_A23.state = STATE_VAL.NONE
|
||||
$maa2000_A22.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A26.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A23.state = STATE_VAL.NONE
|
||||
$kasseta_p_1/ref_A24.state = STATE_VAL.NONE
|
||||
$kasseta_p_2/ref_A26.state = STATE_VAL.NONE
|
||||
$kasseta_p_2/ref_A23.state = STATE_VAL.NONE
|
||||
|
||||
_control_results["block_ip"] = (
|
||||
$maa2000_A23.state == STATE_VAL.GOOD and
|
||||
$maa2000_A22.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and
|
||||
$kasseta_p_2/ref_A23.state == STATE_VAL.GOOD
|
||||
)
|
||||
|
||||
|
||||
## Проверка температур УМ от УКП
|
||||
func check_temperature_um(status_prd: PackedByteArray) -> void:
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD)
|
||||
var ukp1_online: int = (status_prd[0] >> 2) & 1
|
||||
if ukp1_online:
|
||||
var tmp_1: int
|
||||
var temperature_ukp_1: int
|
||||
for i_temp in range(6):
|
||||
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp)
|
||||
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
|
||||
power_amplifier[i_temp].value0 = tmp_1
|
||||
# Темпуратура от УМ литеры 1
|
||||
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7)
|
||||
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
|
||||
power_amplifier[6].value0 = tmp_1
|
||||
|
||||
var ukp2_online = (status_prd[0] >> 3) & 1
|
||||
if ukp2_online:
|
||||
for i_temp in range(6):
|
||||
var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp)
|
||||
var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3)
|
||||
power_amplifier[i_temp+7].value0 = tmp_2
|
||||
|
||||
|
||||
## Проверка ДКМ
|
||||
func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void:
|
||||
const DKM: int = 28
|
||||
|
||||
var status_dkm = status_prd[DKM] >> bit_dkm & 1
|
||||
if bit_dkm == 5:
|
||||
$dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
$kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_1"] = status_dkm
|
||||
elif bit_dkm == 6:
|
||||
$dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_2"] = status_dkm
|
||||
elif bit_dkm == 0:
|
||||
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
|
||||
_control_results["dkm_3"] = status_dkm
|
||||
|
||||
|
||||
func _process_ukp_power(status: PackedByteArray) -> void:
|
||||
## Мощность УМ от УКП 1
|
||||
var arr_power_ukp_1: Array = []
|
||||
|
||||
if (status[0] >> 2) & 1:
|
||||
var power_ukp_1: int
|
||||
for i_power in range(6):
|
||||
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power)
|
||||
arr_power_ukp_1.append(power_ukp_1)
|
||||
# Мощность от УМ (УКП) литеры 3
|
||||
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7)
|
||||
arr_power_ukp_1.append(power_ukp_1)
|
||||
|
||||
if count_packet_1 == 0:
|
||||
power_array_1 = arr_power_ukp_1
|
||||
else:
|
||||
for i in arr_power_ukp_1.size():
|
||||
if arr_power_ukp_1[i] > power_array_1[i]:
|
||||
power_array_1[i] = arr_power_ukp_1[i]
|
||||
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for i in 7:
|
||||
power_amplifier[i].value1 = '%d' % power_array_1[i]
|
||||
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR
|
||||
count_packet_1 += 1
|
||||
|
||||
## Мощность УМ от УКП 2
|
||||
var arr_power_ukp_2: Array = []
|
||||
if (status[0] >> 2) & 1:
|
||||
for i_power in range(6):
|
||||
var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power)
|
||||
arr_power_ukp_2.append(power_ukp_2)
|
||||
|
||||
if count_packet_2 == 0:
|
||||
power_array_2 = arr_power_ukp_2
|
||||
else:
|
||||
for i in arr_power_ukp_2.size():
|
||||
if arr_power_ukp_2[i] > power_array_2[i]:
|
||||
power_array_2[i] = arr_power_ukp_2[i]
|
||||
|
||||
for i in 6:
|
||||
power_amplifier[i+7].value1 = '%d' % power_array_2[i]
|
||||
power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR
|
||||
|
||||
count_packet_2 += 1
|
||||
|
||||
_control_results["power_ukp"] = true
|
||||
for amp in power_amplifier:
|
||||
if amp.state != STATE_VAL.GOOD:
|
||||
_control_results["power_ukp"] = false
|
||||
break
|
||||
|
||||
|
||||
func _on_control_fs(mode: bool) -> void:
|
||||
var interfer_name: String
|
||||
var fs_arr: Array
|
||||
if mode:
|
||||
interfer_name = 'k1'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
else:
|
||||
interfer_name = 'off'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, 50.0)
|
||||
|
||||
|
||||
func on_stop_control() -> void:
|
||||
print_debug('Отсановка контроля ПРД')
|
||||
_on_control_fs(false)
|
||||
on_control_result()
|
||||
|
||||
|
||||
func on_fs_update_state(packet_type_7: Dictionary) -> void:
|
||||
var parts = currecnt_unit.split('-')
|
||||
var last_part = parts[-1] # Прибор
|
||||
|
||||
# Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора
|
||||
var fs_mapping = {
|
||||
0: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '1к' },
|
||||
1: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '4к' },
|
||||
2: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '3к' },
|
||||
3: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '2к' },
|
||||
20: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '1к' },
|
||||
21: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '4к' },
|
||||
22: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '3к' },
|
||||
23: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '2к' },
|
||||
24: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '1к' },
|
||||
25: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '4к' },
|
||||
26: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '3к' },
|
||||
27: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '2к' },
|
||||
}
|
||||
for fs in packet_type_7:
|
||||
if fs in fs_mapping and fs_mapping[fs]["condition"]:
|
||||
var data = packet_type_7[fs]
|
||||
var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE
|
||||
fs_mapping[fs]["node"].state = state
|
||||
if fs < 4:
|
||||
_control_results["fs_1"] = (data.isg == 1)
|
||||
elif fs <24:
|
||||
_control_results["fs_2"] = (data.isg == 1)
|
||||
else:
|
||||
_control_results["fs_3"] = (data.isg == 1)
|
||||
if _control_results['fs_1'] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started:
|
||||
on_ug_setting()
|
||||
control_timer.wait_time = Constants.TIMER_DELAY
|
||||
control_timer.start()
|
||||
flag_timer_started = true
|
||||
|
||||
|
||||
func on_ug_setting() -> void:
|
||||
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
|
||||
var unit_prd = network.units[unit_key]
|
||||
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1):
|
||||
ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1]
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2):
|
||||
ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2]
|
||||
if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3):
|
||||
ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3]
|
||||
|
||||
var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07)
|
||||
var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07)
|
||||
var prd_module = prd.prd_dict[unit_prd.name]
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1,
|
||||
Constants.ADDR_UG_LITERA_2, result_2,
|
||||
Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3,
|
||||
Constants.BASE_ADDR_EMS_G, 6666]])
|
||||
|
||||
prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]])
|
||||
|
||||
func on_mode_changed(in_tree: bool) -> void:
|
||||
if not in_tree:
|
||||
queue_free()
|
||||
|
||||
|
||||
func on_control_result() -> void:
|
||||
var result: bool = true
|
||||
|
||||
for key in _control_results:
|
||||
if not _control_results[key]:
|
||||
if key == 'fs_1':
|
||||
$kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR
|
||||
if key == 'fs_2':
|
||||
$kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR
|
||||
if key == 'fs_3':
|
||||
$kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR
|
||||
result = false
|
||||
print_debug('%s false' % key)
|
||||
|
||||
var parts = currecnt_unit.split('-')
|
||||
var last_part = parts[-1] # Прибор
|
||||
if result:
|
||||
$control_result.text = 'Прибор ПРД-%s исправен' % last_part
|
||||
$control_result.add_theme_color_override("font_color", Color.AQUAMARINE)
|
||||
else:
|
||||
$control_result.text = 'Прибор ПРД-%s неисправен' % last_part
|
||||
$control_result.add_theme_color_override("font_color", Color.CRIMSON)
|
||||
await get_tree().create_timer(Constants.TIMER_DELAY).timeout
|
||||
flag_timer_started = false
|
||||
@@ -1 +0,0 @@
|
||||
uid://cwvikiygf8b1m
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://dnuexoef2nnv5"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor_prd_n.gd" id="1_bnnv3"]
|
||||
[ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor-prd-n.gd" id="1_bnnv3"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_is25t"]
|
||||
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_meukj"]
|
||||
[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_xkifg"]
|
||||
|
||||
@@ -16,7 +16,8 @@ const Constants = {
|
||||
"ADDR_UG_LITERA_2": 0x108,
|
||||
"TEMP_THRESHOLD": 70,
|
||||
"POWER_THRESHOLD": 40,
|
||||
"TIMER_DELAY": 1.0
|
||||
"TIMER_DELAY": 1.4,
|
||||
"POWER_UM": 70,
|
||||
}
|
||||
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
|
||||
# Основные переменные
|
||||
@@ -68,7 +69,7 @@ func setup_timer() -> void:
|
||||
func _enter_tree() -> void:
|
||||
$control_result.text = ''
|
||||
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
|
||||
signaller.emit_signal('interfer_off_all')
|
||||
signaller.emit_signal('interfer_off_all')
|
||||
await get_tree().create_timer(2.0).timeout
|
||||
_on_control_fs(true)
|
||||
|
||||
@@ -170,7 +171,7 @@ func check_temperature_um(status_prd: PackedByteArray) -> void:
|
||||
var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp)
|
||||
var tmp_1: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_1) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset'])
|
||||
power_amplifier[i_temp].value0 = tmp_1
|
||||
if tmp_1 > 70:
|
||||
if tmp_1 > Constants.TEMP_THRESHOLD:
|
||||
_control_results["temperature"] = false
|
||||
|
||||
var ukp2_online = (status_prd[0] >> 3) & 1
|
||||
@@ -179,7 +180,7 @@ func check_temperature_um(status_prd: PackedByteArray) -> void:
|
||||
var temperature_ukp_2: int = status_prd.decode_u16(TEMPERATURE_UKP_2 + 2 * i_temp)
|
||||
var tmp_2: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_2) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset'])
|
||||
power_amplifier[i_temp+6].value0 = tmp_2
|
||||
if tmp_2 > 70:
|
||||
if tmp_2 > Constants.TEMP_THRESHOLD:
|
||||
_control_results["temperature"] = false
|
||||
|
||||
|
||||
@@ -231,7 +232,7 @@ func _process_ukp_power(status: PackedByteArray) -> void:
|
||||
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
|
||||
for i in 6:
|
||||
power_amplifier[i].value1 = '%d' % power_array_1[i]
|
||||
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR
|
||||
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > Constants.POWER_THRESHOLD else STATE_VAL.ERROR
|
||||
count_packet_1 += 1
|
||||
|
||||
## Мощность УМ от УКП 2
|
||||
@@ -251,7 +252,7 @@ func _process_ukp_power(status: PackedByteArray) -> void:
|
||||
|
||||
for i in 6:
|
||||
power_amplifier[i+6].value1 = '%d' % power_array_2[i]
|
||||
power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR
|
||||
power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_2[i] > Constants.POWER_THRESHOLD else STATE_VAL.ERROR
|
||||
|
||||
count_packet_2 += 1
|
||||
|
||||
@@ -263,19 +264,36 @@ func _process_ukp_power(status: PackedByteArray) -> void:
|
||||
|
||||
|
||||
func _on_control_fs(mode: bool) -> void:
|
||||
var interfer_name: String
|
||||
var fs_arr: Array
|
||||
if mode:
|
||||
interfer_name = 'k1'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
else:
|
||||
interfer_name = 'off'
|
||||
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
|
||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, 10.0)
|
||||
var parts = currecnt_unit.split('-')
|
||||
var last_part = parts[-1]
|
||||
var angle: float = 0.0 # -> ПРД-В1; 90.0 -> ПРД-В2; 180.0 -> ПРД-В3; 270.0 -> ПРД-В4
|
||||
var sector_1: float = 12 # -> ПРД-В1; 15 -> ПРД-В2; 14 -> ПРД-В3; 13 -> ПРД-В4;
|
||||
var sector_2: float = 16 # -> ПРД-В1; 19 -> ПРД-В2; 18 -> ПРД-В3; 17 -> ПРД-В4;
|
||||
if last_part == '2в':
|
||||
angle = 90.0
|
||||
sector_1 = 15
|
||||
sector_2 = 19
|
||||
elif last_part == '3в':
|
||||
angle = 180.0
|
||||
sector_1 = 14
|
||||
sector_2 = 18
|
||||
elif last_part == '4в':
|
||||
angle = 270.0
|
||||
sector_1 = 13
|
||||
sector_2 = 17
|
||||
|
||||
var interfer_name: String = 'k1' if mode else 'off'
|
||||
var freq_1: float = 1227.0 # ФС_1
|
||||
var freq_2: float = 1575.0 # ФС_2
|
||||
var hz_1: float = 340.0 # ФС_1
|
||||
var hz_2: float = 510.0 # ФС_2
|
||||
|
||||
var fs_arr: Array = [[angle, freq_1, hz_1, sector_1], [angle, freq_2, hz_2, sector_2]]
|
||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM)
|
||||
|
||||
|
||||
func on_stop_control() -> void:
|
||||
print_debug('Отсановка контроля ПРД')
|
||||
print_debug('Остановка контроля ПРД')
|
||||
_on_control_fs(false)
|
||||
on_control_result()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://cvskpe1ti3p45"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor_prd_v.gd" id="1_c20s6"]
|
||||
[ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor-prd-v.gd" id="1_c20s6"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"]
|
||||
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_wyy1b"]
|
||||
[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_gl2bl"]
|
||||
@@ -409,6 +409,5 @@ offset_right = 649.0
|
||||
offset_bottom = 1003.0
|
||||
theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1)
|
||||
theme_override_font_sizes/font_size = 28
|
||||
text = "Прибор ПРД- неисправен"
|
||||
horizontal_alignment = 1
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://dwxn2puh462nl"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://pvhb2f04v00w" path="res://scenes/pribor-uf/pribor_uf.gd" id="1_7gtpa"]
|
||||
[ext_resource type="Script" uid="uid://pvhb2f04v00w" path="res://scenes/pribor-uf/pribor-uf.gd" id="1_7gtpa"]
|
||||
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_ho0da"]
|
||||
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_dp78y"]
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ func on_line_changed_sch3(unit_sch3):
|
||||
regs_input.clear()
|
||||
switches_sync = false
|
||||
$margin/vbox/grid1/lbl_freq.text = '<нет данных>'
|
||||
$margin/vbox/grid1/lbl_freq.self_modulate = Color.CADET_BLUE
|
||||
$margin/vbox/grid1/lbl_freq.self_modulate = Color(settings.C_BLUE)
|
||||
$margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE]
|
||||
$margin/vbox/grid/state.texture = textures[STATE_VAL.NONE]
|
||||
|
||||
|
||||
@@ -28,22 +28,23 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_tidwt")
|
||||
|
||||
[node name="tab_switch" type="TabContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_top = 23.0
|
||||
offset_right = 1600.0
|
||||
offset_bottom = 1200.0
|
||||
offset_bottom = 1223.0
|
||||
tooltip_text = "Переключает режимы работы программы"
|
||||
theme_override_styles/tab_focus = SubResource("StyleBoxEmpty_41d34")
|
||||
theme_override_styles/tab_disabled = SubResource("StyleBoxEmpty_cw2ss")
|
||||
theme_override_styles/tabbar_background = SubResource("StyleBoxEmpty_nmdfd")
|
||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_vap7n")
|
||||
current_tab = 0
|
||||
current_tab = 1
|
||||
script = ExtResource("1_fg0vd")
|
||||
|
||||
[node name="Работа" parent="tab_switch" instance=ExtResource("2_u7p16")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
metadata/_tab_index = 0
|
||||
|
||||
[node name="Контроль" parent="tab_switch" instance=ExtResource("3_txp0s")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
metadata/_tab_index = 1
|
||||
|
||||
|
||||
BIN
scenes/tilemap/ship.png
Normal file
BIN
scenes/tilemap/ship.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.8 KiB |
34
scenes/tilemap/ship.png.import
Normal file
34
scenes/tilemap/ship.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bry3qqgbuvpdt"
|
||||
path="res://.godot/imported/ship.png-1e5b46229cc4c1adf618fcb5da01fb4c.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://scenes/tilemap/ship.png"
|
||||
dest_files=["res://.godot/imported/ship.png-1e5b46229cc4c1adf618fcb5da01fb4c.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
scenes/tilemap/ship1.png
Normal file
BIN
scenes/tilemap/ship1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.0 KiB |
34
scenes/tilemap/ship1.png.import
Normal file
34
scenes/tilemap/ship1.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dct2op842kyxo"
|
||||
path="res://.godot/imported/ship1.png-fb0d0fe319583fdccb34710f90651bfb.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://scenes/tilemap/ship1.png"
|
||||
dest_files=["res://.godot/imported/ship1.png-fb0d0fe319583fdccb34710f90651bfb.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
scenes/tilemap/ship2.png
Normal file
BIN
scenes/tilemap/ship2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
34
scenes/tilemap/ship2.png.import
Normal file
34
scenes/tilemap/ship2.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b3i0dm4vk3fvu"
|
||||
path="res://.godot/imported/ship2.png-dfba13504c314fdc4446dacd0ce91bc5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://scenes/tilemap/ship2.png"
|
||||
dest_files=["res://.godot/imported/ship2.png-dfba13504c314fdc4446dacd0ce91bc5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
8
scenes/tilemap/ship_mark.tscn
Normal file
8
scenes/tilemap/ship_mark.tscn
Normal file
@@ -0,0 +1,8 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://c2523fcn14gn4"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://b3i0dm4vk3fvu" path="res://scenes/tilemap/ship2.png" id="1_o15fj"]
|
||||
|
||||
[node name="Ship_mark" type="Sprite2D"]
|
||||
position = Vector2(2.38419e-07, -1.19209e-07)
|
||||
scale = Vector2(0.496428, 0.496429)
|
||||
texture = ExtResource("1_o15fj")
|
||||
BIN
scenes/tilemap/threat.png
Normal file
BIN
scenes/tilemap/threat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
34
scenes/tilemap/threat.png.import
Normal file
34
scenes/tilemap/threat.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://mobingoxskg1"
|
||||
path="res://.godot/imported/threat.png-602b9c318dc5f1342d23490e047ca526.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://scenes/tilemap/threat.png"
|
||||
dest_files=["res://.godot/imported/threat.png-602b9c318dc5f1342d23490e047ca526.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
9
scenes/tilemap/threat.tscn
Normal file
9
scenes/tilemap/threat.tscn
Normal file
@@ -0,0 +1,9 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://cv342kc1jj5hb"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://scenes/tilemap/threat.png" id="1_pvxsy"]
|
||||
|
||||
[node name="Threat" type="Node2D"]
|
||||
|
||||
[node name="Threat" type="Sprite2D" parent="."]
|
||||
scale = Vector2(0.171358, 0.171358)
|
||||
texture = ExtResource("1_pvxsy")
|
||||
@@ -22,10 +22,17 @@ class_name MercatorTileMap
|
||||
@export_range(0, 20, 1) var min_zoom_level: int = 0
|
||||
@export_range(0, 20, 1) var max_zoom_level_server: int = 20
|
||||
@export_color_no_alpha() var back_color: = Color.BLACK
|
||||
@onready var scale_label: String
|
||||
@onready var coordinates_label: String
|
||||
@onready var threat_mark: PackedScene = load("res://scenes/tilemap/threat.tscn")
|
||||
@onready var ship_mark: PackedScene = load("res://scenes/tilemap/ship_mark.tscn")
|
||||
var ship_id := 9999
|
||||
var ship_instance: Node2D = null
|
||||
const default_size: = 400.0
|
||||
var is_centered: = false
|
||||
var is_out_border1: = true
|
||||
var is_out_border2: = true
|
||||
var threat_markers := {}
|
||||
|
||||
@export var animation_time: float = 0.1:
|
||||
set(val):
|
||||
@@ -94,6 +101,7 @@ signal map_server_online()
|
||||
## Вызывается при отсутствии ответа от сервера карт
|
||||
signal map_server_offline()
|
||||
|
||||
|
||||
const image_load_proc_names = {
|
||||
'png': 'load_png_from_buffer',
|
||||
'jpg': 'load_jpg_from_buffer',
|
||||
@@ -131,6 +139,9 @@ func _ready() -> void:
|
||||
var unit_nav = network.units[key]
|
||||
unit_nav.connect('data_received', on_data_received)
|
||||
ProjectSettings.connect('settings_changed', _settings_changed)
|
||||
threats.connect('threat_new', Callable(self, '_on_threat_new'))
|
||||
threats.connect('threat_lost', Callable(self, '_on_threat_lost'))
|
||||
threats.connect('threat_update', Callable(self, '_on_threat_update'))
|
||||
|
||||
|
||||
func _settings_changed():
|
||||
@@ -150,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
|
||||
@@ -238,6 +249,7 @@ func _input(e) -> void:
|
||||
func multiply_zoom(multiplier: float, pivot: Vector2) -> void:
|
||||
var p1: = screen_to_world(_xyz, pivot)
|
||||
_xyz.z = clampf(_xyz.z * multiplier, min_zoom_level, max_zoom_level)
|
||||
update_scale_label()
|
||||
var p2: = screen_to_world(_xyz, pivot)
|
||||
_xyz.x -= p2.x - p1.x
|
||||
_xyz.y -= p2.y - p1.y
|
||||
@@ -279,6 +291,7 @@ func _draw() -> void:
|
||||
var scr_pos = world_to_screen(dot.position)
|
||||
scr_pos.x = posmod(scr_pos.x, dx)
|
||||
dot.mark.position = scr_pos
|
||||
dot.mark.visible = is_mark_visible(dot)
|
||||
dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size)
|
||||
visible_marks_count += int(dot.mark.visible)
|
||||
# Рисование границ
|
||||
@@ -349,6 +362,8 @@ func _process(delta) -> void:
|
||||
push_error('запрос \"%s\" не отправлен' % tile.url)
|
||||
if _queue.is_empty():
|
||||
emit_signal('load_completed')
|
||||
|
||||
update_scale_label()
|
||||
|
||||
|
||||
func _response(result, code, _headers: Array, body: PackedByteArray, req, tile: Tile) -> void:
|
||||
@@ -552,8 +567,9 @@ func get_tile(x: int, y: int, z: int) -> Tile:
|
||||
var req = get_node_or_null(NodePath(str(idx)))
|
||||
if req:
|
||||
tile = req.get_meta('tile')
|
||||
tile.t = now
|
||||
return tile
|
||||
if tile != null:
|
||||
tile.t = now
|
||||
return tile
|
||||
|
||||
tile = _cache.get(idx)
|
||||
if tile:
|
||||
@@ -670,8 +686,49 @@ func set_coordinates(lon: float, lat: float) -> void:
|
||||
anim.track_insert_key(0, animation_time, new_pos.x)
|
||||
anim.track_insert_key(1, animation_time, new_pos.y)
|
||||
$player.play('goto')
|
||||
update_coordinates_label(lon, lat)
|
||||
if not _marks.has(ship_id):
|
||||
ship_instance = ship_mark.instantiate()
|
||||
add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0)
|
||||
else:
|
||||
_marks[ship_id].position = lonlat_to_world(lon, lat)
|
||||
|
||||
|
||||
func blend_mask(val: bool) -> void:
|
||||
$canvas/spr_mask.visible = val
|
||||
queue_redraw()
|
||||
|
||||
|
||||
func update_coordinates_label(lon: float, lat: float) -> void:
|
||||
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))
|
||||
signaller.emit_signal('update_scale_map', scale_label)
|
||||
|
||||
|
||||
func _on_threat_new(th) -> void:
|
||||
var bip_instance = threat_mark.instantiate()
|
||||
if bip_instance:
|
||||
bip_instance.name = str(th.id)
|
||||
bip_instance.position = lonlat_to_world(th.lon, th.lat)
|
||||
add_mark_from_lon_lat(th.id, th.lon, th.lat, bip_instance, 32)
|
||||
|
||||
|
||||
func _on_threat_update(th) -> void:
|
||||
var target = get_parent().get_node(str(th.id))
|
||||
if not target:
|
||||
return
|
||||
var new_position = lonlat_to_world(th.lon, th.lat)
|
||||
if _marks.has(th.id):
|
||||
_marks[th.id].position = new_position
|
||||
if new_position != target.position:
|
||||
target.position = new_position
|
||||
|
||||
|
||||
func _on_threat_lost(th) -> void:
|
||||
var target = get_parent().get_node(str(th.id))
|
||||
if target:
|
||||
target.queue_free()
|
||||
|
||||
@@ -28,8 +28,6 @@ size = Vector2(400, 400)
|
||||
|
||||
[node name="tilemap" type="CanvasGroup" groups=["gui_items"]]
|
||||
script = ExtResource("1_l64tp")
|
||||
border_scene = "uid://bumg0moa26skt"
|
||||
zoom_step = 0.1
|
||||
|
||||
[node name="canvas" type="TextureRect" parent="." groups=["gui_items"]]
|
||||
clip_contents = true
|
||||
|
||||
@@ -165,11 +165,12 @@ func setting_tab():
|
||||
var tootip_text = tbl_row[3]
|
||||
name_to_line_index[param_name] = i
|
||||
$scroll_set/table.add_row([node_label, node_value])
|
||||
var label_instance = $scroll_set/table.get_node2(0, i)
|
||||
var label_instance = $scroll_set/table.get_node2(0, i)
|
||||
label_instance.text = param_name
|
||||
label_instance.tooltip_text = tootip_text
|
||||
$scroll_set/table.set_node_editable(0, i, false)
|
||||
var node_values = $scroll_set/table.get_node2(1, i).get_children()
|
||||
var edit_node = $scroll_set/table.get_node2(1, i)
|
||||
if node_values.size():
|
||||
var child = node_values[0]
|
||||
if child is CheckButton:
|
||||
@@ -181,15 +182,15 @@ func setting_tab():
|
||||
var val = settings_data[param_name]
|
||||
if typeof(val) == TYPE_STRING:
|
||||
$scroll_set/table.get_node2(1, i).text = settings_data[param_name]
|
||||
|
||||
if edit_node:
|
||||
if edit_node is LineEdit:
|
||||
$scroll_set/table.set_node_control(1, i, true)
|
||||
$scroll_set/table.set_node_editable(1, COMMIT, false)
|
||||
$scroll_set/table.set_columns_min_size([600, 950])
|
||||
$scroll_set/table.set_columns_alignments(ALIGNMENT)
|
||||
$scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed'))
|
||||
|
||||
var commit_instance = $scroll_set/table.get_node2(1, COMMIT)
|
||||
commit_instance.text = '%s' % commit.VCS_HEAD
|
||||
|
||||
for i in SETTING_TABLE.size():
|
||||
var param_name = SETTING_TABLE[i][0]
|
||||
if not settings.UnitProfiles.has(param_name):
|
||||
|
||||
@@ -31,6 +31,7 @@ var strob_dir_begin: float ## Направление антенны
|
||||
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
|
||||
var view_mode: MapViewMode ## Режим отображения карты
|
||||
|
||||
|
||||
signal drag_begin ## Вызывается в момент начала перетаскивания.
|
||||
signal drag_continue ## Вызывается во время продолжения перетаскивания.
|
||||
signal drag_end ## Вызывается в момент завершения перетаскивания.
|
||||
@@ -140,6 +141,8 @@ func _ready():
|
||||
signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno'))
|
||||
signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state'))
|
||||
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
|
||||
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
|
||||
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
|
||||
on_btn_center_toggled(true)
|
||||
on_btn_activate_toggled(false)
|
||||
|
||||
@@ -305,6 +308,7 @@ func on_button_pressed(btn_this, btn_others) -> void:
|
||||
var interfer_name: String = btn_this.get_meta('rfi_name')
|
||||
for key in fs_selected.keys():
|
||||
fs_arr.append(prd.get_fs_param(key))
|
||||
print(fs_arr)
|
||||
signaller.emit_signal('interfer_init', interfer_name, fs_arr, interfer.POW_DEFAULT)
|
||||
|
||||
|
||||
@@ -509,4 +513,12 @@ func on_btn_center_toggled(toggled_on: bool) -> void:
|
||||
|
||||
|
||||
func on_btn_activate_toggled(toggled_on: bool) -> void:
|
||||
$btn_activate.tooltip_text = 'Включает падавление (%s)' % ('включено' if toggled_on else 'отключено')
|
||||
$btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено')
|
||||
|
||||
|
||||
func on_update_coordinates_label(coordinates_label) -> void:
|
||||
$coordinates_map.text = str(coordinates_label)
|
||||
|
||||
|
||||
func on_update_scale_label(scale_label) -> void:
|
||||
$scale_map.text = str(scale_label)
|
||||
|
||||
@@ -284,6 +284,22 @@ button_pressed = true
|
||||
texture_normal = ExtResource("12_5ffal")
|
||||
texture_pressed = ExtResource("13_ggrwd")
|
||||
|
||||
[node name="coordinates_map" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1000.0
|
||||
offset_top = 128.0
|
||||
offset_right = 1112.0
|
||||
offset_bottom = 147.0
|
||||
text = "Координаты:"
|
||||
|
||||
[node name="scale_map" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1000.0
|
||||
offset_top = 192.0
|
||||
offset_right = 1110.0
|
||||
offset_bottom = 213.0
|
||||
text = "Масштаб:"
|
||||
|
||||
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
|
||||
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
|
||||
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
|
||||
|
||||
@@ -55,34 +55,34 @@ const PRD_NAMES: Array = [
|
||||
|
||||
## Соответствие модулей ФС их нахождению в приборе ПРД и номеру от КАПС РПБ
|
||||
const FS_PRD: Dictionary = {
|
||||
0: ['уарэп-яу07-1к', 17],
|
||||
1: ['уарэп-яу07-4к', 65],
|
||||
2: ['уарэп-яу07-3к', 49],
|
||||
3: ['уарэп-яу07-2к', 33],
|
||||
4: ['уарэп-яу07-1н', 18],
|
||||
5: ['уарэп-яу07-4н', 66],
|
||||
6: ['уарэп-яу07-3н', 50],
|
||||
7: ['уарэп-яу07-2н', 34],
|
||||
8: ['уарэп-яу07-1н', 19],
|
||||
9: ['уарэп-яу07-4н', 66],
|
||||
10: ['уарэп-яу07-3н', 51],
|
||||
11: ['уарэп-яу07-2н', 35],
|
||||
12: ['уарэп-яу07-1в', 20],
|
||||
13: ['уарэп-яу07-4в', 68],
|
||||
14: ['уарэп-яу07-3в', 52],
|
||||
15: ['уарэп-яу07-2в', 36],
|
||||
16: ['уарэп-яу07-1в', 21],
|
||||
17: ['уарэп-яу07-4в', 69],
|
||||
18: ['уарэп-яу07-3в', 53],
|
||||
19: ['уарэп-яу07-2в', 37],
|
||||
20: ['уарэп-яу07-1к', 22],
|
||||
21: ['уарэп-яу07-4к', 70],
|
||||
22: ['уарэп-яу07-3к', 54],
|
||||
23: ['уарэп-яу07-2к', 38],
|
||||
24: ['уарэп-яу07-1к', 23],
|
||||
25: ['уарэп-яу07-4к', 71],
|
||||
26: ['уарэп-яу07-3к', 55],
|
||||
27: ['уарэп-яу07-2к', 39], }
|
||||
0: ['уарэп-яу07-1к', 11],
|
||||
1: ['уарэп-яу07-4к', 41],
|
||||
2: ['уарэп-яу07-3к', 31],
|
||||
3: ['уарэп-яу07-2к', 21],
|
||||
4: ['уарэп-яу07-1н', 12],
|
||||
5: ['уарэп-яу07-4н', 42],
|
||||
6: ['уарэп-яу07-3н', 32],
|
||||
7: ['уарэп-яу07-2н', 22],
|
||||
8: ['уарэп-яу07-1н', 13],
|
||||
9: ['уарэп-яу07-4н', 43],
|
||||
10: ['уарэп-яу07-3н', 33],
|
||||
11: ['уарэп-яу07-2н', 23],
|
||||
12: ['уарэп-яу07-1в', 14],
|
||||
13: ['уарэп-яу07-4в', 44],
|
||||
14: ['уарэп-яу07-3в', 34],
|
||||
15: ['уарэп-яу07-2в', 24],
|
||||
16: ['уарэп-яу07-1в', 15],
|
||||
17: ['уарэп-яу07-4в', 45],
|
||||
18: ['уарэп-яу07-3в', 35],
|
||||
19: ['уарэп-яу07-2в', 25],
|
||||
20: ['уарэп-яу07-1к', 16],
|
||||
21: ['уарэп-яу07-4к', 46],
|
||||
22: ['уарэп-яу07-3к', 36],
|
||||
23: ['уарэп-яу07-2к', 26],
|
||||
24: ['уарэп-яу07-1к', 17],
|
||||
25: ['уарэп-яу07-4к', 47],
|
||||
26: ['уарэп-яу07-3к', 37],
|
||||
27: ['уарэп-яу07-2к', 27], }
|
||||
|
||||
var fs_dict: Dictionary ## Словарь с модулями ФС
|
||||
var prd_dict: Dictionary ## Словарь с приборами ПРД
|
||||
|
||||
@@ -179,3 +179,13 @@ signal ems2_hide_pressed(state)
|
||||
## Вызывается при нажатии на кнопку экранной клавиатуры
|
||||
## [param state] - состояние скрытия кнопки ЭМС2
|
||||
signal emit_changed(state)
|
||||
|
||||
|
||||
## Вызывается при изменении детализации карты.[br]
|
||||
## [param new_scale] - обновленное значение масштаба ([b]true[/b]
|
||||
signal update_scale_map(new_scale)
|
||||
|
||||
|
||||
## Вызывается при изменении текущих координат.[br]
|
||||
## [param new_coordinates] - обновленное значение координат ([b]true[/b]
|
||||
signal update_coordinates_map(new_coordinates)
|
||||
|
||||
@@ -599,6 +599,17 @@ func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void
|
||||
func set_node_editable(i_col: int, i_row: int, val: bool) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].editable = val
|
||||
|
||||
|
||||
## Устанавливает контекстное меню для ячейки таблицы. Ячейка должна иметь свойство [param context_menu].[br]
|
||||
## [param i_col] - Индекс колонки.[br]
|
||||
## [param i_row] - Индекс ряда.[br]
|
||||
## [param val] - Включить или отключить контекстное меню.
|
||||
func set_node_control(i_col: int, i_row: int, val: bool) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].shortcut_keys_enabled = val
|
||||
nodes[key].selecting_enabled = val
|
||||
nodes[key].deselect_on_focus_loss_enabled = val
|
||||
|
||||
|
||||
## Разрешает редактирование ряда. Ячейки ряда должны иметь свойство [param editable].[br]
|
||||
|
||||
Reference in New Issue
Block a user