add module fs

This commit is contained in:
2025-01-28 10:59:52 +03:00
parent fc98ed6d9c
commit 79fecc1573
13 changed files with 4516 additions and 211 deletions

224
scripts/FS.gd Normal file
View File

@@ -0,0 +1,224 @@
extends Node
const CRC32_TABLE: Array = [
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D]
## Блок управления ФС
class FGOS:
## Коды выполняемых команд
enum CmdCode {
START_SESSION = 0x0,
READ_CARRIER = 0x1F,
SET_CARRIER = 0x1E,
READ_ATT = 0x1A,
SET_ATT = 0x1B,
READ_GEN_STATUS = 0x05,
SET_GEN_STATUS = 0x06,
BASE_GET_CURRENT_TEMP = 0x36,
}
enum GROUP {
BASE = 0x00,
GENERATOR = 0x03,
RF = 0x06,
}
## Состояние автомата выполнения команды
enum CmdState {
UNCK, ## Номер команды не ининциирован
SEND, ## Буфер готов для отправки
WAIT, ## Ожидание выполнения
DONE, ## Команда выполнена
FAIL ## Команда не выполнена
}
var counter: int = 0
func crc32(data: PackedByteArray) -> int:
var crc = Constants.INIT
for byte in data:
var index = (crc ^ byte) & 0xFF
crc = (Constants.CRC32_TABLE[index] ^ (crc >> 8)) & 0xFFFFFFFF
# Возвращаем только последние 4 байта в обратном порядке
var final_crc = crc ^ Constants.FINAL_XOR_VALUE
return final_crc
func start_session():
counter = 0
var index_size = 0xC
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.START_SESSION
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
get_gen_state()
get_att_batch()
get_carrier()
func set_gen_state(button_state: bool):
var index_size = 0x1C
var GROUP = Constants.GROUP.GENERATOR
var CMD = Constants.CMD.SET_GEN_STATUS
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x0010)
prep_pack.encode_u32(0xC, button_state) ## MODE GEN STATUS
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
get_gen_state()
func set_carrier(wr_freq):
var index_size = 0x1C
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.SET_CARRIER
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x10)
prep_pack.encode_u64(0xC, wr_freq) ## uint64_t freq low dword/high dword
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func set_att_batch(att):
var index_size = 0x1C
var GROUP = Constants.GROUP.RF
var CMD = Constants.CMD.SET_ATT
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x10)
prep_pack.encode_float(0x18, att)
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func get_carrier():
var index_size = 0xC
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.READ_CARRIER
var prep_pack: PackedByteArray = []
prep_pack.resize(index_size) ## 12 в int
prep_pack.encode_u8(0x0,GROUP)
prep_pack.encode_u8(0x1,CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4) ## 16 в int
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func get_att_batch():
var index_size = 0xC
var GROUP = Constants.GROUP.RF
var CMD = Constants.CMD.READ_ATT
var prep_pack: PackedByteArray
prep_pack.resize(index_size) ## 12 в int
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4) ## 16 в int
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func get_gen_state():
var index_size = 0xC
var GROUP = Constants.GROUP.GENERATOR
var CMD = Constants.CMD.READ_GEN_STATUS
var prep_pack: PackedByteArray
prep_pack.resize(index_size) ## 12 в int
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4) ## 16 в int
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func base_get_current_temp():
var index_size = 0xC
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.BASE_GET_CURRENT_TEMP
var prep_pack: PackedByteArray
prep_pack.resize(index_size) ## 12 в int
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4) ## 16 в int
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)

View File

@@ -14,41 +14,62 @@ var isa: Array = []
func _ready() -> void:
# Таблица УКП_1
node_select1 = $TabContainer/PRD/scroll1/table1
node_select1 = $TabContainer/PRD/table_ukp_1
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
node_select1.set_columns_min_size([120, 120])
node_select1.set_node_text(0, 0, 'Мощность')
node_select1.set_node_text(1, 0, 'Температура')
# Таблица УКП_2
node_select2 = $TabContainer/PRD/scroll2/table2
node_select2 = $TabContainer/PRD/table_ukp_2
draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size())
node_select2.set_columns_min_size([120, 120])
node_select2.set_node_text(0, 0, 'Мощность')
node_select2.set_node_text(1, 0, 'Температура')
# Выбор прибора для подключения
var node_select_device = $TabContainer/PRD/select_dev/select_dev
var node_select_device = $TabContainer/PRD/select_dev
draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size())
var get_select_device = node_select_device.get_node2(1, 0)
# Заполнение адресов
for i_addr in Constants.ADDRESSES.size():
get_select_device.add_item(Constants.ADDRESSES[i_addr][0])
get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,4))
get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,7))
get_select_device.connect('item_selected', Callable(self, 'on_btn_select'))
node_select_device.get_node2(0,0).text = 'ПРИБОР'
node_select_device.set_columns_min_size([100, 100])
$TabContainer/PRD/Zapret.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret))
$TabContainer/PRD/Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret2))
## Заполненение списка направления луча
for key in Constants.RAY_DICT:
$TabContainer/PRD/Grid/Ray_set.add_item(key)
$TabContainer/PRD/Grid/Ray_set2.add_item(key)
draw_panel_prd(Constants.ADDRESSES[0][3])
$TabContainer/PRD/Grid/Zapret.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Grid/Zapret))
$TabContainer/PRD/Grid/Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Grid/Zapret2))
$TabContainer/PRD/Grid/Ray_set.connect('item_selected', Callable(self, '_on_btn_ray'))
$TabContainer/PRD/Grid/Ray_set2.connect('item_selected', Callable(self, '_on_btn_ray2'))
Network.connect('yau_status_line', Callable(self, '_on_yau_status'))
Network.connect('yau_receive', Callable(self, '_on_data_received'))
Network.connect('yau_read_isa', Callable(self, '_on_read_isa'))
func draw_panel_prd(mode) -> void:
for node_path in Constants.NODE_MAP:
var index = Constants.NODE_MAP[node_path]
var node = get_node(node_path)
if node:
var value = node.get("text")
if value != null:
node.text = Constants.SIGNS_PRD[mode][index]
else:
node.fname = Constants.SIGNS_PRD[mode][index]
## From Network status about yau-07
func _on_yau_status(yau_status):
func _on_yau_status(yau_status: bool) -> void:
if yau_status:
$TabContainer/ControlPanel/sockets/ref_A26/light_ind.button_pressed = true
$TabContainer/ControlPanel/sockets/ref_A26/light_ind.disabled = false
@@ -61,14 +82,14 @@ func _on_yau_status(yau_status):
flag_yau_control = false
func _on_read_isa(unit_isa_ports):
func _on_read_isa(unit_isa_ports: Dictionary) -> void:
var isa_data: Dictionary = {}
for key in unit_isa_ports.keys():
isa_data[key] = unit_isa_ports[key]
if isa_data.has(290):
var tmp = isa_data[290]
isa_data.erase(290)
if isa_data.has(0x122):
var tmp = isa_data[0x122]
isa_data.erase(0x122)
var found = false
for i in range(Constants.EMS_G_PORT_DATA_HOLDER.size()):
@@ -81,10 +102,16 @@ func _on_read_isa(unit_isa_ports):
if len(Constants.EMS_G_PORT_DATA_HOLDER) == 32:
emit_signal('read_ems_g_finish')
$ISA.text = 'ISA: ' + str(len(Constants.EMS_G_PORT_DATA_HOLDER))
if isa_data.has(0x106):
$TabContainer/PRD/PSK/ray_1.material.set('shader_parameter/turn', 0.735 + 0.025 * isa_data[0x106])
if isa_data.has(0x108):
$TabContainer/PRD/PSK2/ray_2.material.set('shader_parameter/turn', 0.735 + 0.025 * isa_data[0x108])
## Рисует таблицу
func draw_tabl(tbl, row: Array, count_row: int):
func draw_tabl(tbl: Node, row: Array, count_row: int):
for i_row in count_row:
tbl.add_row(row[i_row])
@@ -101,6 +128,7 @@ func _on_data_received(data_from_yau_07):
## УГ
#node_select1.set_node_text(2, 0, '%d' % dry_contact)
#node_select1.set_node_text(3, 0, '%d' % DKM)
## SOCKETS BOARDS
for i in 4:
@@ -133,7 +161,6 @@ func _on_data_received(data_from_yau_07):
else:
node_power_ind[i].button_pressed = false
node_power_ind[i].disabled = true
#node_select1.set_node_text(3, 0, '%d' % DKM)
## УКП
for i in range(8): ## Мощность от УКП_1
@@ -172,6 +199,10 @@ func _on_emsg_select() -> void:
set_tab_and_buttons(2, 'select_ems_g')
func _on_mfs_select() -> void:
set_tab_and_buttons(3, 'select_fs')
func set_tab_and_buttons(tab_index: int, button_name: String) -> void:
$TabContainer.current_tab = tab_index
var side_panel = $Background/side_panel
@@ -181,15 +212,16 @@ func set_tab_and_buttons(tab_index: int, button_name: String) -> void:
button.button_pressed = (button.name == button_name)
func on_btn_select(intem_from_sector):
var node_select_device = $TabContainer/PRD/select_dev/select_dev
func on_btn_select(intem_from_sector: int) -> void:
var node_select_device = $TabContainer/PRD/select_dev
var get_select_device = node_select_device.get_node2(1, 0)
var meta = get_select_device.get_item_metadata(intem_from_sector)
Network.on_command_change_device(meta)
flag_mode = meta[2]
draw_panel_prd(flag_mode)
func fill_item(node, i_column: int, i_row: int, arr: Dictionary, select: int = 0):
func fill_item(node: Node, i_column: int, i_row: int, arr: Dictionary, select: int = 0) -> void:
var optionbutton = node.get_node2(i_column, i_row) as OptionButton
for key in arr.keys():
var item_text = key + " - " + str(arr[key])
@@ -206,3 +238,13 @@ func _on_zapret(toggled_on: bool, meta) -> void:
func _on_read_isa_pressed() -> void:
Network.read_port_isa([0x122, 0x124, 0x128])
## Регулировка положением луча
func _on_btn_ray(item_from_ray: int) -> void:
Network.write_port_isa(0x106, item_from_ray)
Network.read_port_isa([0x106])
func _on_btn_ray2(item_from_ray: int) -> void:
Network.write_port_isa(0x108, item_from_ray)
Network.read_port_isa([0x108])

View File

@@ -35,18 +35,18 @@ const ROWS_UKP2_DATA: Array = [
[TableNode, TableNode],
[TableNode, TableNode]]
const ADDRESSES: Array = [
['ПРД-Н1', '10.1.1.11', 50011, MODE.PRD_H],
['ПРД-Н2', '10.1.1.21', 50021, MODE.PRD_H],
['ПРД-Н3', '10.1.1.31', 50031, MODE.PRD_H],
['ПРД-Н4', '10.1.1.41', 50041, MODE.PRD_H],
['ПРД-В1', '10.1.1.12', 50012, MODE.PRD_B],
['ПРД-В2', '10.1.1.22', 50022, MODE.PRD_B],
['ПРД-В3', '10.1.1.32', 50032, MODE.PRD_B],
['ПРД-В4', '10.1.1.42', 50042, MODE.PRD_B],
['ПРД-К1', '10.1.1.13', 50013, MODE.PRD_K],
['ПРД-К2', '10.1.1.23', 50023, MODE.PRD_K],
['ПРД-К3', '10.1.1.33', 50033, MODE.PRD_K],
['ПРД-К4', '10.1.1.43', 50043, MODE.PRD_K]]
['ПРД-Н1', '10.1.1.11', 50011, MODE.PRD_H, '10.1.2.18', '10.1.2.19', ''],
['ПРД-Н2', '10.1.1.21', 50021, MODE.PRD_H, '10.1.2.34', '10.1.2.35', ''],
['ПРД-Н3', '10.1.1.31', 50031, MODE.PRD_H, '10.1.2.50', '10.1.2.51', ''],
['ПРД-Н4', '10.1.1.41', 50041, MODE.PRD_H, '10.1.2.66', '10.1.2.67', ''],
['ПРД-В1', '10.1.1.12', 50012, MODE.PRD_B, '10.1.2.20', '10.1.2.21', ''],
['ПРД-В2', '10.1.1.22', 50022, MODE.PRD_B, '10.1.2.36', '10.1.2.37', ''],
['ПРД-В3', '10.1.1.32', 50032, MODE.PRD_B, '10.1.2.52', '10.1.2.53', ''],
['ПРД-В4', '10.1.1.42', 50042, MODE.PRD_B, '10.1.2.68', '10.1.2.69', ''],
['ПРД-К1', '10.1.1.13', 50013, MODE.PRD_K, '10.1.2.22', '10.1.2.23', '10.1.2.17'],
['ПРД-К2', '10.1.1.23', 50023, MODE.PRD_K, '10.1.2.38', '10.1.2.39', '10.1.2.33'],
['ПРД-К3', '10.1.1.33', 50033, MODE.PRD_K, '10.1.2.54', '10.1.2.55', '10.1.2.49'],
['ПРД-К4', '10.1.1.43', 50043, MODE.PRD_K, '10.1.2.70', '10.1.2.71', '10.1.2.65']]
const INPUT_EMS_G: Array = [
'01 :34',
'02 :35',
@@ -86,8 +86,103 @@ const OUT_x128: Array = [
'К',
'0',
'1',]
const RAY_DICT: Array = [
' Контроль',
' -5°',
'',
' 15°',
' 25°',
' 35°',
' 45°',
]
const SIGNS_PRD: Array = [
## ПРК-К
[
' Запрет СИ6',
' Запрет СИ7',
' Запрет СИ1',
'ЛИТЕРА 6! ПРД-К',
'ЛИТЕРА 7! ПРД-К',
'СЗИ6 от УФ',
'СЗИ7 от УФ',
'СИ6 от ФС',
'СИ7 от ФС',
'СИ6 в УФ',
'СИ7 в УФ',
'МАА №1',
'МАА №2',
'ИП9-50 №1',
'ИП9-50 №2',
'ИП12-50 №1',
'ИП9-50 №3',
'ИП12-50 №2',
'ИП5-25',
],
## ПРК-В
[
' Запрет СИ4',
' Запрет СИ5',
'',
'ЛИТЕРА 4! ПРД-В',
'ЛИТЕРА 5! ПРД-В',
'СЗИ4 от УФ',
'СЗИ5 от УФ',
'СИ4 от ФС',
'СИ5 от ФС',
'СИ4 в УФ',
'СИ5 в УФ',
'МАА №1',
'МАА №2',
'ИП9-50 №1',
'ИП9-50 №2',
'ИП12-50 №1',
'-',
'-',
'ИП5-25',
],
## ПРК-Н
[
' Запрет СИ2',
' Запрет СИ3',
'',
'ЛИТЕРА 2! ПРД-Н',
'ЛИТЕРА 3! ПРД-Н',
'СЗИ2 от УФ',
'СЗИ3 от УФ',
'СИ2 от ФС',
'СИ3 от ФС',
'СИ2 в УФ',
'СИ3 в УФ',
'МАА №1',
'МАА №2',
'ИП9-50 №1',
'ИП9-50 №2',
'ИП12-50 №1',
'-',
'-',
'ИП5-25',
],
]
var NODE_MAP = {
'TabContainer/PRD/Grid/Zapret': 0,
'TabContainer/PRD/Grid/Zapret2': 1,
'TabContainer/PRD/Grid/LABEL': 3,
'TabContainer/PRD/Grid/LABEL2': 4,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A22': 5,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A23': 6,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A26': 7,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A27': 8,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A28': 9,
'TabContainer/ControlPanel/Signal_EMS_G/ref_A29': 10,
'TabContainer/ControlPanel/kasseta_p_1/ref_A23': 11,
'TabContainer/ControlPanel/kasseta_p_1/ref_A24': 12,
'TabContainer/ControlPanel/kasseta_p_1/ref_A25': 13,
'TabContainer/ControlPanel/kasseta_p_1/ref_A26': 14,
'TabContainer/ControlPanel/kasseta_p_1/ref_A27': 15,
'TabContainer/ControlPanel/kasseta_p_1/ref_A28': 16,
'TabContainer/ControlPanel/kasseta_p_1/ref_A29': 17,
'TabContainer/ControlPanel/kasseta_p_1/ref_A30': 18,
}
enum MODE {
PRD_K,
PRD_B,
@@ -117,6 +212,64 @@ enum STATE {
READ_ISA,
WRITE_ISA,
DONE,
IDLE,
SEND,
}
var EMS_G_PORT_DATA_HOLDER: Array = []
# Таблица CRC-32 для модуля ФС
const CRC32_TABLE: Array = [
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D]
const PORT_FS = 1201
const INIT: int = 0xFFFFFFFF
const FINAL_XOR_VALUE: int = 0x00000000
enum GROUP {
BASE = 0x00,
GENERATOR = 0x03,
RF = 0x06,
}
enum CMD {
START_SESSION = 0x0,
READ_CARRIER = 0x1F,
SET_CARRIER = 0x1E,
READ_ATT = 0x1A,
SET_ATT = 0x1B,
READ_GEN_STATUS = 0x05,
SET_GEN_STATUS = 0x06,
BASE_GET_CURRENT_TEMP = 0x36,
}

229
scripts/ems_g.gd Normal file
View File

@@ -0,0 +1,229 @@
extends Panel
var node_select1: Node
var shift: int = 2
var button_link_meta: Dictionary = {}
func _on_read_ems_g():
$load_boadr.visible = true
Constants.EMS_G_PORT_DATA_HOLDER.clear()
for i_input in 16:
Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, 1+i_input)
Network.read_port_isa([Constants.EMS_G_BASE_ADDR+0xA])
for i_output in range(46, 62):
Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, 1+i_output)
Network.read_port_isa([Constants.EMS_G_BASE_ADDR+4, Constants.EMS_G_BASE_ADDR+8])
func _on_sync():
for index in 32:
var tmp_device_mode = Constants.EMS_G_PORT_DATA_HOLDER[index][0]
if tmp_device_mode > 46:
var port0x124: int
var port0x128: int
for key in Constants.EMS_G_PORT_DATA_HOLDER[index][1].keys():
if key == 0x124:
port0x124 = Constants.EMS_G_PORT_DATA_HOLDER[index][1][key]
for row in 16:
if (port0x124 & (1 << row)) != 0:
var chk_btn = node_select1.get_node2(tmp_device_mode-45, row+3).get_child(1, false)
chk_btn.button_pressed =true
if key == 0x128:
port0x128 = Constants.EMS_G_PORT_DATA_HOLDER[index][1][key]
var list = node_select1.get_node2(tmp_device_mode-45, 0)
var select = 0 if port0x128 == 0 else 1 if port0x128 == 0x2000 else 2 if port0x128 == 0x4000 else 3
list.select(select)
$load_boadr.visible = false
func _ready() -> void:
node_select1 = $table1
var EMS_G_TABLE: Array
for i_row in Constants.INPUT_EMS_G.size() + shift + 1:
var column: Array
for out_colum in Constants.OUT_EMS_G.size()+shift:
if out_colum > 1 and i_row ==0:
column.append(Constants.TableList)
elif out_colum > 1 and i_row > 2:
column.append(Constants.Switch)
elif (out_colum == 1 and i_row > 2) or (out_colum > 1 and i_row == 2):
column.append(Constants.SocketStatus)
else:
column.append(Constants.TableNode)
EMS_G_TABLE.append(column)
draw_tabl(node_select1, EMS_G_TABLE, EMS_G_TABLE.size())
node_select1.get_node2(1, 1).text = 'x3_ВЫХ:GND'
node_select1.get_node2(0, 2).text = 'x3_ВХ :GND'
for i in Constants.INPUT_EMS_G.size():
node_select1.get_node2(0, i+shift+1).text = Constants.INPUT_EMS_G[i]
for i in Constants.OUT_EMS_G.size():
node_select1.get_node2(i+shift, 1).text = Constants.OUT_EMS_G[i][1]
for i in EMS_G_TABLE[0].size()-shift:
var list = node_select1.get_node2(i+shift, 0)
list.set_meta('device', Constants.OUT_EMS_G[i][0])
list.connect('item_selected', Callable(self, 'on_mode_link').bind(list))
for k in Constants.OUT_x128.size():
list.add_item(Constants.OUT_x128[k])
var columns_min_size: Array
for i in EMS_G_TABLE[0].size():
if i < 2:
columns_min_size.append(110)
else:
columns_min_size.append(80)
node_select1.set_columns_min_size(columns_min_size)
var parrent_NODE2 = get_parent().get_parent()
parrent_NODE2.connect('read_ems_g_start', Callable(self, '_on_read_ems_g'))
parrent_NODE2.connect('read_ems_g_finish', Callable(self, '_on_sync'))
Network.connect('yau_receive', Callable(self, '_on_data_received'))
create_link_button(node_select1, shift+1, 16+shift+1, shift, 16+shift)
func draw_tabl(tbl, row: Array, count_row: int):
for i_row in count_row:
tbl.add_row(row[i_row])
func _on_data_received(data_from_yau_07):
var in_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD)
var in_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD)
var out_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD)
var out_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD)
var parent_node2 = get_parent().get_parent()
process_sockets_vert(in_blank, in_imp, 16, 1, parent_node2)
process_sockets_horizon(out_blank, out_imp, 16, 2, parent_node2)
func process_sockets_horizon(blank: int, imp: int, count: int, col: int, parent_node2: Node):
for i in count:
var socket_status = node_select1.get_node2(col+i, shift).get_child(1, false)
var frame_type = Constants.Frame.WORK
if (blank & (1 << i)) != 0:
frame_type = Constants.Frame.CONSTANT
elif (imp & (1 << i)) != 0:
frame_type = Constants.Frame.VARIABLE
set_frame(socket_status, frame_type)
if i == 1:
set_frame(get_specific_node(parent_node2, 5), frame_type)
if i == 2:
set_frame(get_specific_node(parent_node2, 6), frame_type)
if i == 4:
set_frame(get_specific_node(parent_node2, 7), frame_type)
if i == 5:
set_frame(get_specific_node(parent_node2, 8), frame_type)
if i == 9:
set_frame(get_specific_node(parent_node2, 9), frame_type)
func process_sockets_vert(blank: int, imp: int, count: int, col: int, parent_node2: Node):
for i in count:
var socket_status = node_select1.get_node2(col, i + shift+1).get_child(1, false)
var frame_type = Constants.Frame.WORK
if (blank & (1 << i)) != 0:
frame_type = Constants.Frame.CONSTANT
elif (imp & (1 << i)) != 0:
frame_type = Constants.Frame.VARIABLE
set_frame(socket_status, frame_type)
if i == 1:
set_frame(get_specific_node(parent_node2, 1), frame_type)
if i == 2:
set_frame(get_specific_node(parent_node2, 2), frame_type)
if i == 9:
set_frame(get_specific_node(parent_node2, 3), frame_type)
if i == 10:
set_frame(get_specific_node(parent_node2, 4), frame_type)
func get_specific_node(parent_node2: Node, child_index: int)-> Node:
return parent_node2.get_child(3, false).get_child(1).get_child(5).get_child(child_index).get_child(3)
func _process(_delta: float) -> void:
pass
func set_frame(node: Node, val: int): node.set_frame(val)
func set_init():
pass
## Создает связь между кнопками
func create_link_button(node, count_rows_sart: int, count_rows_end: int, coln_start: int, coln_end: int):
## META_EMS_G[[Номер входа, Номер выхода]]
var META_EMS_G: Array = []
for i_row in 16:
var INPUT = 1
var OUTPUT = 47
for i_colum in 16:
META_EMS_G.append([INPUT+i_row, OUTPUT+i_colum])
button_link_meta[OUTPUT+i_colum] = 0
var count_register = 0
for i_row in range(count_rows_sart, count_rows_end):
for i_col in range (coln_start, coln_end):
var chk_node = node.get_node2(i_col, i_row)
var mouse_area = chk_node.get_child(0, false)
var chk_btn = chk_node.get_child(1, false)
mouse_area.connect('mouse_entered', Callable(self, 'on_mouse_entered').bind(chk_btn))
chk_btn.connect('mouse_entered', Callable(self, 'on_mouse_entered').bind(chk_btn))
chk_btn.connect('toggled', Callable(self, '_on_btn_connect').bind(chk_btn))
chk_btn.set_meta('device', META_EMS_G[count_register])
count_register += 1
func on_mouse_entered(meta_area):
var device = meta_area.get_meta('device')
var y = device[0] + 1
var x = device[1] - 45
for i_y in 18:
for i_x in 18:
if i_y <= y and i_x <= x and i_y == y:
var chest = $table1.get_node2(i_x, i_y+1).get_child(0, false)
chest.color = Color(0.45, 0.36, 0.36, 0.5)
elif i_y <= y and i_x <= x and i_x == x:
var chest = $table1.get_node2(i_x, i_y+1).get_child(0, false)
chest.color = Color(0.45, 0.36, 0.36, 0.5)
else:
var black = $table1.get_node2(i_x, i_y+1).get_child(0, false)
black.color = Color(0, 0, 0, 0.0)
func on_mode_link(mode, list):
## Формирование команды для выбора устройства
var meta = list.get_meta('device')
var address_port_wr = Constants.EMS_G_BASE_ADDR+2
Network.write_port_isa(address_port_wr, meta) # Отправка команды
## Формирование команды для отправкы команды на устройство
address_port_wr = Constants.EMS_G_BASE_ADDR+8
var set_mode = 0x0000 if mode == 0 else 0x2000 if mode == 1 else 0x4000 if mode == 2 else 0x8000
Network.write_port_isa(address_port_wr, set_mode)
func _on_btn_connect(toggled_on: bool, chk_btn: Node):
## Формирование команды для выбора устройства
var meta = chk_btn.get_meta('device')
Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, meta[1]) # Отправка команды
## Формирование команды для отправкы команды на устройство
if toggled_on:
button_link_meta[meta[1]] += 1 << meta[0]-1
else:
button_link_meta[meta[1]] -= 1 << meta[0]-1
Network.write_port_isa(Constants.EMS_G_BASE_ADDR+4, button_link_meta[meta[1]])

213
scripts/modul_fs.gd Normal file
View File

@@ -0,0 +1,213 @@
extends Node
var counter: int = 0
const INDEX_SIZE = 0xC
func _ready() -> void:
pass
func _process(_delta: float) -> void:
pass
func _enter_tree() -> void:
# Подключаем сигналы к методам
Network.connect('data_send', _on_data_send)
Network.connect('data_received', _on_data_received)
Network.connect('port_opened', _on_port_changed.bind(Color.GREEN))
Network.connect('port_closed', _on_port_changed.bind(Color.GRAY))
Network.connect('port_error', _on_port_changed.bind(Color.RED))
func _on_port_changed(port_name: String, color: Color) -> void:
$manage_panel/con/ip_connect.text = port_name
$fs_connect.self_modulate = color
func _on_data_send():
pass
func _on_data_received(data: PackedByteArray):
var GRP = data.decode_u8(0x0)
var CMD = data.decode_u8(0x1)
match CMD:
Constants.CMD.READ_CARRIER:
if GRP == Constants.GROUP.BASE:
$manage_panel/get_freq/freq_ind.text = str(data.decode_u64(0xC)) + ' Гц'
Constants.CMD.READ_ATT:
if GRP == Constants.GROUP.RF:
$manage_panel/get_att/att_ind.text = '-' + str(data.decode_float(0x18)) + ' dB'
Constants.CMD.READ_GEN_STATUS:
if GRP == Constants.GROUP.GENERATOR:
if data.decode_u32(0xC) == 0:
$manage_panel/get_gen_status/status_ind.text = 'Включен'
$manage_panel/get_gen_status/status_ind.modulate = Color.GREEN
else:
$manage_panel/get_gen_status/status_ind.text = 'Выключен'
$manage_panel/get_gen_status/status_ind.modulate = Color.RED
Constants.CMD.BASE_GET_CURRENT_TEMP:
if GRP == Constants.GROUP.BASE:
$temp_1.text = '%.2f' % data.decode_float(0xC) + ''
$temp_2.text = str(data.decode_float(0x10)) + ''
$temp_3.text = str(data.decode_float(0x14)) + ''
$read.text = str(data.hex_encode())
func _form_packet(group, cmd, data = null):
var packet = PackedByteArray()
packet.resize(INDEX_SIZE)
packet.encode_u8(0, group)
packet.encode_u8(1, cmd)
packet.encode_u32(4, counter)
counter += 1
if data:
packet.encode_float(8, data)
var crc = crc32(packet)
packet.resize(INDEX_SIZE + 4)
packet.encode_u32(INDEX_SIZE, crc)
return packet
func start_session():
counter = 0
var index_size = 0xC
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.START_SESSION
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
get_gen_state()
get_att_batch()
get_carrier()
func set_gen_state(button_state: bool):
var index_size = 0x1C
var GROUP = Constants.GROUP.GENERATOR
var CMD = Constants.CMD.SET_GEN_STATUS
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x0010)
prep_pack.encode_u32(0xC, button_state) ## MODE GEN STATUS
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
get_gen_state()
func set_carrier(wr_freq):
var index_size = 0x1C
var GROUP = Constants.GROUP.BASE
var CMD = Constants.CMD.SET_CARRIER
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x10)
prep_pack.encode_u64(0xC, wr_freq) ## uint64_t freq low dword/high dword
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func set_att_batch(att):
var index_size = 0x1C
var GROUP = Constants.GROUP.RF
var CMD = Constants.CMD.SET_ATT
var prep_pack: PackedByteArray = PackedByteArray()
prep_pack.resize(index_size)
prep_pack.encode_u8(0x0, GROUP)
prep_pack.encode_u8(0x1, CMD)
prep_pack.encode_u32(0x4, counter)
counter += 1
prep_pack.encode_u16(0x8, 0x10)
prep_pack.encode_float(0x18, att)
var crc = crc32(prep_pack)
prep_pack.resize(index_size + 4)
prep_pack.encode_u32(index_size, crc)
Network.command_stack.append(prep_pack)
func get_carrier():
var packet = _form_packet(Constants.GROUP.BASE, Constants.CMD.READ_CARRIER)
Network.command_stack.append(packet)
func get_att_batch():
var packet = _form_packet(Constants.GROUP.RF, Constants.CMD.READ_ATT)
Network.command_stack.append(packet)
func get_gen_state():
var packet = _form_packet(Constants.GROUP.GENERATOR, Constants.CMD.READ_GEN_STATUS)
Network.command_stack.append(packet)
func base_get_current_temp():
var packet = _form_packet(Constants.GROUP.BASE, Constants.CMD.BASE_GET_CURRENT_TEMP)
Network.command_stack.append(packet)
func crc32(data: PackedByteArray) -> int:
var crc = Constants.INIT
for byte in data:
var index = (crc ^ byte) & 0xFF
crc = (Constants.CRC32_TABLE[index] ^ (crc >> 8)) & 0xFFFFFFFF
# Возвращаем только последние 4 байта в обратном порядке
var final_crc = crc ^ Constants.FINAL_XOR_VALUE
return final_crc
func _on_send_pressed() -> void:
get_carrier()
func _on_get_att() -> void:
get_att_batch()
func _on_start():
#if ServerNode.connect_fs():
start_session()
base_get_current_temp()
func _on_get_status(toggled_btn):
var inverted_state = not toggled_btn
set_gen_state(inverted_state)
get_gen_state()
func _on_set_ferq():
var freq = int($set_space/write_to_set_freq.get_text()) * 1_000_000
set_carrier(freq)
func _on_set_att():
var att = float($set_space/write_to_set_att.get_text())
set_att_batch(att)

View File

@@ -1,26 +1,41 @@
extends Node
# ЯУ-07 Блок
var unit = Yau07.YaU07.new('ЯУ07')
var soc_unicast: Socket
var soc_brodcast: Socket
var ip_address: String = Constants.ADDRESSES[0][1]
var ip_port: int = Constants.ADDRESSES[0][2]
var ip_address_yau: String = Constants.ADDRESSES[0][1]
var ip_port_yau: int = Constants.ADDRESSES[0][2]
var timeout: float = Yau07.ONLINE_TIMEOUT
var last_update_time: float = 0.0
var broadcast_packet: PackedByteArray
var state = Constants.STATE.WAIT
var send_array: Array = []
# ФС Блок
var ip_fs_1: String = Constants.ADDRESSES[0][4]
var command_stack: Array
var state_fs = Constants.STATE.IDLE
var client_fs_1: StreamPeer
var peerstream: PacketPeer
signal yau_status_line(_status) ## Вызывается когда меняется состояние связи с ячейкой
signal yau_receive(_data_from_yau) ##
signal yau_receive(_data_from_yau)
signal yau_read_isa(_unit_isa_ports)
signal data_send()
signal data_received(data:PackedByteArray)
signal port_opened(port_name: String)
signal port_closed(port_name: String)
signal port_error(error_str: String)
## Класс для отправки данных в сокет
class Socket extends PacketPeerUDP:
func send_to(addr: String, port: int, data: PackedByteArray):
self.set_dest_address(addr, port)
self.put_packet(data)
func poll_receive(sock: Socket) -> bool: ## Приёмник
if timeout - last_update_time > 0:
@@ -29,7 +44,7 @@ func poll_receive(sock: Socket) -> bool: ## Приёмник
var addr_receive = sock.get_packet_ip()
var port_receive = sock.get_packet_port()
if (ip_address == addr_receive) and (ip_port == port_receive):
if (ip_address_yau == addr_receive) and (ip_port_yau == port_receive):
last_update_time = 0.0
unit.parse(broadcast_packet)
var data_from_yau_07 = unit.status
@@ -40,6 +55,19 @@ func poll_receive(sock: Socket) -> bool: ## Приёмник
return false
func work_proc():
client_fs_1.poll()
var peer = peerstream.get_stream_peer()
if not peer:
return
var peer_len_data = peer.get_available_bytes()
if peer_len_data > 0:
emit_signal("port_opened", ip_fs_1) # Эмитируем сигнал об открытии порта
get_data_fs(peer)
else:
pass
func _ready() -> void:
# Привязка для принятия широковещательного канала
soc_brodcast = Socket.new()
@@ -50,23 +78,33 @@ func _ready() -> void:
soc_unicast = Socket.new()
rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print_debug('Ошибка: неудачная привязка адреса: ', ip_address)
print_debug('Ошибка: неудачная привязка адреса: ', ip_address_yau)
unit.connect('line_changed', Callable(self, 'on_line_changed'))
unit.connect('command_fail', Callable(self, 'on_command_fail'))
connect_fs()
func _process(delta: float) -> void:
if client_fs_1:
## State fs machine
if (state_fs == Constants.STATE.IDLE) or (state_fs == Constants.STATE.DONE):
if command_stack:
var pack = command_stack.pop_front()
send_data(pack)
state_fs = Constants.STATE.SEND
work_proc()
last_update_time += delta
poll_receive(soc_brodcast)
poll_receive(soc_unicast)
state_machine()
state_machine_yau07()
match unit.process(delta):
Error.OK: soc_unicast.send_to(ip_address, ip_port, unit.tx_data.slice(0, unit.tx_len))
Error.OK: soc_unicast.send_to(ip_address_yau, ip_port_yau, unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: print_debug('Ошибка отправки данных')
func state_machine():
func state_machine_yau07():
var fl_done = (unit.cmd_state == unit.CmdState.DONE or unit.cmd_state == unit.CmdState.FAIL)
## Режим ожидания
match state:
@@ -90,22 +128,19 @@ func state_machine():
if fl_done:
emit_signal('yau_read_isa', unit.isa_ports)
state = Constants.STATE.WAIT
# Записать команду в ИСА
func read_port_isa(read_ports: Array) -> void:
send_array.append(['rd', read_ports])
# Прочитать данные из порта от ИСА
func write_port_isa(port_isa: int, data_isa: int) -> void:
var write_data: Dictionary = {port_isa: data_isa}
send_array.append(['wr', write_data])
func on_command_change_device(meta_device):
ip_address = meta_device[0]
ip_port = meta_device[1]
func on_line_changed(_unit) -> void:
emit_signal('yau_status_line', unit.online)
@@ -113,3 +148,50 @@ func on_line_changed(_unit) -> void:
## Ессли отсутствует подключение к ячейке ЯУ-07
func on_command_fail(_unit) -> void:
print_debug('Command send fail')
func on_command_change_device(meta_device):
ip_address_yau = meta_device[0]
ip_port_yau = meta_device[1]
ip_fs_1 = meta_device[3]
#ip_fs_2 = meta_device[4]
#ip_fs_3 = meta_device[5]
connect_fs()
# Подключится к модулю ФС
func connect_fs():
client_fs_1 = StreamPeerTCP.new()
peerstream = PacketPeerStream.new()
var rc = client_fs_1.connect_to_host(ip_fs_1, Constants.PORT_FS)
if rc!= Error.OK:
emit_signal("port_error", ip_fs_1)
else:
peerstream.set_stream_peer(client_fs_1)
# Получить данные от ФС
func get_data_fs(peer):
var rx_data: PackedByteArray
var len_data_in_buf = peer.get_available_bytes()
if len_data_in_buf > 0:
rx_data.append_array(peer.get_data(len_data_in_buf)[1])
emit_signal("data_received", rx_data)
if state_fs == Constants.STATE.SEND:
state_fs = Constants.STATE.DONE
# Отправить команду для ФС
func send_data(data_to_sand):
if client_fs_1.get_status() == 2:
var peer = peerstream.get_stream_peer()
if peer:
peer.put_data(data_to_sand)
emit_signal("data_send")
# Разорвать соединение с ФС
#func disconnect_fs():
#client_fs_1.disconnect_from_host()
#state_fs = Constants.STATE.IDLE
#peerstream = PacketPeerStream.new()