From f879a2034f3ecb1f42e502b0dea6b2b8a728dce5 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Tue, 5 Nov 2024 15:19:54 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F.=20=D0=AD=D0=9C=D0=A1,=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=91=D0=BC=20=D0=B8=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F/=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/эмс/эмс.gd | 39 +++++++---- scripts/network.gd | 2 +- scripts/tools.gd | 28 ++++++++ scripts/yau07.gd | 74 ++++++++++++++++----- scripts/yems-boards.gd | 142 +++++++++++++++++++++++++++++++++++++++-- scripts/yems-consts.gd | 104 ++++++++++++++++-------------- scripts/yems-devs.gd | 68 +++++++++++++++++--- 7 files changed, 362 insertions(+), 95 deletions(-) diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index eed94aa..e319fe6 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -19,6 +19,7 @@ const IN_SET_ROW: Array = [CellLineEdit, CellLEEmpty, CellLEEmpty, CellLEEmpty, var g_boards: Dictionary ## Словарь плат ЭМС. +var active_board = null ## Активная плата ЭМС var posx: int = 125 ## Позиция элементов по x. var posy: int = 70 ## Позиция элементов по y. @@ -29,6 +30,9 @@ func _ready() -> void: ## Инициализация основных элементов экрана ЭМС. func init_boards(): + var unit_key = settings.get_unit_key('уарэп-эмс') + var unit_ems = network.units[unit_key] + # Выставление позиций элементов ЭМС на экране $scrollin.set_position(Vector2(posx,posy)) $scrollout.set_position(Vector2(posx + 650,posy)) @@ -40,9 +44,11 @@ func init_boards(): $btn_connect.set_position(Vector2(posx + 590,posy - 25)) $btn_disconnect.set_position(Vector2(posx + 587,posy + 675)) - g_boards['КЭМС-Б'] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS) - g_boards['ЭМС-Б1'] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1) - g_boards['ЭМС-Б2'] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2) + g_boards['КЭМС-Б'] = yemsboards.EmsBoard.new(0, 0x130, yemsconsts.INPUT_KEMS, yemsconsts.OUTPUT_KEMS, unit_ems) + g_boards['ЭМС-Б1'] = yemsboards.EmsBoard.new(1, 0x110, yemsconsts.INPUT_EMS1, yemsconsts.OUTPUT_EMS1, unit_ems) + g_boards['ЭМС-Б2'] = yemsboards.EmsBoard.new(2, 0x120, yemsconsts.INPUT_EMS2, yemsconsts.OUTPUT_EMS2, unit_ems) + + active_board = g_boards['КЭМС-Б'] init_tbl_in() $scrollin/tbl_in.pin_header($scrollin, self) @@ -53,9 +59,8 @@ func init_boards(): init_tbl_files() $scrl_files/tbl_files.pin_header($scrl_files, self) - var unit_key = settings.get_unit_key('уарэп-эмс') - var unit = network.units[unit_key] - unit.connect('data_received', Callable(self, 'on_data_ems_received')) + unit_ems.connect('data_received', Callable(self, 'on_data_ems_received')) + unit_ems.connect('command_done', Callable(self, 'on_data_ems_received')) $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect')) $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) @@ -126,9 +131,8 @@ func init_tbl_in(): $scrollin/tbl_in.add_row(row_type) var row_index : int = $scrollin/tbl_in.get_rows_count() - 1 var params : Array = item[1] - var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index) + var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index, g_boards[board].base_addr_isa) in_dev.board = board - in_dev.isa_addr = g_boards[board].base_addr_isa for i in range(len(row_type)): if i < len(params): var node = $scrollin/tbl_in.get_node2(i, row_index) @@ -209,9 +213,9 @@ func init_tbl_out(): $scrollout/tbl_out.add_row([CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, CellState, CellLineEdit]) var row_index : int = $scrollout/tbl_out.get_rows_count() - 1 var params : Array = item[1] - var out_dev = yemsdevs.OutDev.new(item[0], params, row_index) + var out_dev = yemsdevs.OutDev.new(item[0], params, row_index, g_boards[board].base_addr_isa) + out_dev.set_default_mode() out_dev.board = board - out_dev.isa_addr = g_boards[board].base_addr_isa for i in range(len(header_text)): var cell = $scrollout/tbl_out.get_node2(i, row_index) if i < len(params): @@ -219,7 +223,7 @@ func init_tbl_out(): cell.editable = false $scrollout/tbl_out.set_node_user_data(i, row_index, [out_dev, board]) if i in COLUMN_OPTS_BTN: - cell.text = out_dev.mode + cell.text = OUT_MODE[out_dev.mode] $scrollout/tbl_out.set_columns_min_size([250, 100, 70, 70, 70, 100]) $scrollout/tbl_out.set_columns_alignments(yams_alligment_out) $scrollout/tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed_out')) @@ -277,9 +281,7 @@ func set_out_dev(dev): var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0) for opt in OUT_MODE: mode.add_item(opt) - var mode_index: int = OUT_MODE.find(dev.mode) - if mode_index != -1: - mode.select(mode_index) + mode.select(dev.mode) ## Выбор входного или выходного устройства.[br] @@ -375,6 +377,11 @@ func on_row_pressed(i_row: int, tbl): func on_data_ems_received(unit): for board in g_boards.values(): board.set_status(unit.status) + if active_board.state_read == active_board.WAIT: + if board.online and not board.read_done: + active_board = board + active_board.state_read = active_board.READ + active_board.start_rw_kems(true) for i_row in range($scrollin/tbl_in.get_rows_count()): var state_pic = ($scrollin/tbl_in.get_node2(4, i_row)) var dev = $scrollin/tbl_in.get_node_user_data(4, i_row)[0] @@ -383,3 +390,7 @@ func on_data_ems_received(unit): var state_pic = ($scrollout/tbl_out.get_node2(4, i_row)) var dev = $scrollout/tbl_out.get_node_user_data(4, i_row)[0] state_pic.set_frame(dev.state) + + +func on_command_done(unit_ems): + active_board.on_command_done(unit_ems) diff --git a/scripts/network.gd b/scripts/network.gd index 1179492..7ed509a 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -215,7 +215,7 @@ func _process(_delta: float) -> void: for addr in units_udp: var unit = units[addr] match unit.process(tick): - Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data) + Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data.slice(0, unit.tx_len)) Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) for key in units_serial: var unit = units_serial[key] diff --git a/scripts/tools.gd b/scripts/tools.gd index 7a3b336..3acb289 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -132,3 +132,31 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: func set_wordi(buf: PackedByteArray, index: int, val: int) -> void: buf[index] = val & 0xff buf[index + 1] = (val >> 8) & 0xff + + +func set_bit(bits, index, val, mask = 0xfffffffffffffff): + """ + :param bits: прежние значения + :param index: индекс бита + :param val: новое значение бита + :param mask: + :return: + мастер + """ + bits &= mask + if val: + bits |= 1 << index + else: + bits &= ~(1 << index) + return (bits & mask) + + +func set_bits(v, a, m): + """ + Устанавливает биты в соответствии с маской + :param v: Прежние значения бит + :param a: Новые значения бит + :param m: Маска изменяемых бит + :return: Изменённые значения бит + """ + return v & a & (~m) | (~v) & a & m | v & a & m | v & (~a) & (~m) diff --git a/scripts/yau07.gd b/scripts/yau07.gd index ed05def..8801789 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -13,10 +13,14 @@ class YaU07 extends unit.Unit: ## Коды выполняемых команд. enum CmdCode { - READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07. - WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07. - WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07. - READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07. + READ_ISA = 0, ## Код команды "читать порт ISA" ячейки ЯУ-07 + WRITE_ISA = 1, ## Код команды "записать порт ISA" ячейки ЯУ-07 + ERASE_FLASH = 49, ## Код команды "стереть данные из FLASH" ячейки ЯУ-07 + WRITE_FLASH = 50, ## Код команды "записать данные в FLASH" ячейки ЯУ-07 + READ_FLASH = 51, ## Код команды "прочитать данные из FLASH" ячейки ЯУ-07 + LOAD_FLASH = 52, ## Код команды "записать данные из FLASH в КЭМС" ячейки ЯУ-07 + WRITE_BLOCK = 60, ## Код команды "записать блок данных ISA" внешней шины ячейки ЯУ-07 + READ_BLOCK = 61, ## Код команды "читать блок данных ISA" внешней шины ячейки ЯУ-07 } ## Состояние автомата выполнения команды. @@ -28,17 +32,20 @@ class YaU07 extends unit.Unit: FAIL ## Команда не выполнена. } - var cmd_num_rx: = 0 ## Номер команды принятый. - var cmd_num_tx: = 0 ## Номер команды переданный. - var cmd_state = CmdState.UNCK ## Состояние выполнения команды. - var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07. - var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07. - var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду. - var cmd_tick_tx = 0.0 ## Время последней отправки команды. - var cmd_tick_rx = 0.0 ## Время последнего приёма команды. - var status: = PackedByteArray() ## Поле "состояние прибора". - var isa_ports = {} ## Результат выполнения команды "читать порт". - var isa_block = {} ## Результат выполнения команды "читать массив из порта". + var cmd_num_rx: = 0 ## Номер команды принятый + var cmd_num_tx: = 0 ## Номер команды переданный + var cmd_state = CmdState.UNCK ## Состояние выполнения команды + var cmd_result: = 1 ## Результат выполнения команды. Устанавливается в ЯУ-07 + var cmd_data: = PackedByteArray() ## Данные команды. Устанавливается в ЯУ-07 + var cmd_retry = 0 ## Счётчик оставшихся попыток выполнить команду + var cmd_code_rx = 0 ## Код последней выполненой команды + var cmd_tick_tx = 0.0 ## Время последней отправки команды + var cmd_tick_rx = 0.0 ## Время последнего приёма команды + var status: = PackedByteArray() ## Поле "состояние прибора" + var isa_ports = {} ## Результат выполнения команды "читать порт" + var isa_block = {} ## Результат выполнения команды "читать массив из порта" + var flash_data: = PackedByteArray() ## Данные прочитанные из Flash + var flash_len: = 0 ## Длинна данных прочитанных из Flash func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) @@ -73,6 +80,33 @@ class YaU07 extends unit.Unit: rc = Error.FAILED return rc + func send_flash(cmd_code: int, fl_data: Array, num_byte_rd: int) -> bool: + if (cmd_state == CmdState.WAIT) \ + or (cmd_state == CmdState.SEND) \ + or (cmd_state == CmdState.UNCK): + return false + if not ((cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \ + or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH)): + return false + cmd_num_tx = (cmd_num_rx + 1) % 0xffff + tx_data.encode_u16(0, cmd_retry) + tx_data.encode_u16(2, cmd_num_tx) + tx_data.encode_u8(6, cmd_code) + if cmd_code == CmdCode.ERASE_FLASH: + tx_len = 7 + elif cmd_code == CmdCode.WRITE_FLASH: + tx_data.encode_u8(7, 1) + tx_data.encode_u16(8, 0) + tx_data.encode_u16(10, len(fl_data)) + tx_len = 11 + len(fl_data) * 2 + for i in range(len(fl_data)): + tx_data.encode_u16(12 + i * 2, fl_data[i]) + elif cmd_code == CmdCode.READ_FLASH: + tx_len = 11 + tx_data.encode_u16(7, 0) + tx_data.encode_u16(9, num_byte_rd) + cmd_state = CmdState.SEND + return true func send_isa(cmd_code: int, ports_data: Array) -> bool: if (cmd_state == CmdState.WAIT) \ @@ -173,6 +207,11 @@ class YaU07 extends unit.Unit: isa_block[block_adr] = block_data return true + func parse_flash(rx_data: PackedByteArray, status_len, cmd_code) -> bool: + if cmd_code == CmdCode.READ_FLASH: + flash_len = rx_data.decode_u16(status_len + 12) + flash_data = rx_data.slice(status_len + 14) + return true ## Заполняет состояние прибора данными прочитанными из портов ЯУ-07. ## для команд "читать порты" или "записать порты".[br] @@ -230,9 +269,14 @@ class YaU07 extends unit.Unit: elif (cmd_code == CmdCode.READ_BLOCK) or (cmd_code == CmdCode.WRITE_BLOCK): rc = parse_block(rx_data, status_len) + elif (cmd_code == CmdCode.ERASE_FLASH) or (cmd_code == CmdCode.WRITE_FLASH) \ + or (cmd_code == CmdCode.READ_FLASH) or (cmd_code == CmdCode.LOAD_FLASH): + rc = parse_flash(rx_data, status_len, cmd_code) + if rc: if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx): cmd_state = CmdState.DONE + cmd_code_rx = cmd_code emit_signal('command_done', self) else: emit_signal('parse_failed', self) diff --git a/scripts/yems-boards.gd b/scripts/yems-boards.gd index 208c1cf..1219386 100644 --- a/scripts/yems-boards.gd +++ b/scripts/yems-boards.gd @@ -1,25 +1,44 @@ class_name yems_boards extends Node class EmsBoard: + enum {WAIT, WR_DEV_NUM_W, WRITE, WR_DEV_NUM_R, READ, READ_FLASH, WRITE_FLASH_BEGIN, \ +LOAD_KEMS, WRITE_FLASH_END} + var id_board: int ## id платы var in_devs: Dictionary ## Словарь с входными устройствами. var out_devs: Dictionary ## Словарь с выходными устройствами. var base_addr_isa: int ## Базовый адрес ячейки isa. + var ports_to_wr: Array ## Порты для записи var in_tbl: Array var out_tbl: Array - var online: bool - var ems_load: bool + var online: bool ## статус платы + var ems_load: bool ## флаг загрузки платы + var state = WAIT ## текущее состояние платы ЭМС + var state_read = WAIT ## текущее состояние платы ЭМС + var cur_dev ## Текущее устройство + var cur_dev_num: = 0 ## Номер текущего устройства + var cur_dev_index: = 0 ## Индекс текущего устройства в списке + var dev_num_list: = Array() ## Список всех устройств + var need_next_dev: bool = false ## Нужно ли переходить к следующему устройству + var unit_ems ## Юнит эмс + var read_done: bool = false ## Флаг, что данные из ячейки прочитанны - func _init(id, base_addr, in_table, out_table): + signal upd_delay_offset(board, cur_dev) + signal upd_o_state(board, cur_dev) + + func _init(id, base_addr, in_table, out_table, u): id_board = id in_tbl = in_table out_tbl = out_table base_addr_isa = base_addr + unit_ems = u + for i in range(4): + ports_to_wr.append(base_addr_isa + 4 + i * 2) # Заполнение списка портами для записи + dev_num_list = in_tbl + out_tbl + func set_status(status): - var offset = 0 - if id_board == 1: offset = 26 - elif id_board == 2: offset = 52 + var offset = yemsconsts.STATUS_OFFSET[id_board] var bit_online = 0 + id_board var bit_load = 3 + id_board online = (status[0] >> bit_online) & 1 @@ -53,3 +72,114 @@ class EmsBoard: out_dev.state = 2 else: out_dev.state = 0 + + # Отправка команды на запись или чтение порта + func on_wr_device(dev_number): + print_debug([id_board, dev_number]) + if (state == WR_DEV_NUM_W) or (state == WR_DEV_NUM_R): + unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, [base_addr_isa + 2, dev_number]) + elif state == WRITE: + var ports: Array = [] + if not check_dev_number(): + return + for port in cur_dev.ports_data: + if port in ports_to_wr: + var data = cur_dev.ports_data[port] + ports.append(port) + ports.append(data) + unit_ems.send_isa(unit_ems.CmdCode.WRITE_ISA, ports) + elif state == READ: + var ports: Array = [] + for port in cur_dev.ports_data: + if port in ports_to_wr: + ports.append(port) + unit_ems.send_isa(unit_ems.CmdCode.READ_ISA, ports) + + # Обработчик сообщения, о том, что команда выполнена (машина состояний) + func on_command_done(_yau_07): + if not check_dev_number(): + return + if (unit_ems.cmd_code_rx == 1) and state == WR_DEV_NUM_W: + state = WRITE + cur_dev_num = unit_ems.isa_ports[base_addr_isa + 2] + if not check_dev_number(): + return + on_wr_device(cur_dev_num) + elif (unit_ems.cmd_code_rx == 1) and state == WR_DEV_NUM_R: + state = READ + cur_dev_num = unit_ems.isa_ports[base_addr_isa + 2] + if not check_dev_number(): + return + on_wr_device(cur_dev_num) + elif (state == READ) or (state == WRITE) \ + and ((unit_ems.cmd_code_rx == 1) or (unit_ems.cmd_code_rx == 0)): + for key in unit_ems.isa_ports.keys(): + if cur_dev.ports_data.has(key): + cur_dev.ports_data[key] = unit_ems.isa_ports[key] + cur_dev.set_delay_offset() + emit_signal('upd_delay_offset', self, cur_dev) + if cur_dev is yemsdevs.OutDev: # Если это выход, заполняем комбобоксы и чекбатоны + cur_dev.set_mode() + cur_dev.set_btns_state() + emit_signal('upd_o_state', self, cur_dev) + if need_next_dev: # Если нужно вычитать все устройства, выбираем следующее + cur_dev_index += 1 + if cur_dev_index < len(dev_num_list): + cur_dev_num = dev_num_list[cur_dev_index][0] + if state == READ: + state = WR_DEV_NUM_R + on_wr_device(cur_dev_num) + else: + state = WR_DEV_NUM_W + on_wr_device(cur_dev_num) + else: # Пробег закончен, выбираем последнее устройство + state = WAIT + state_read = WAIT + read_done = true + cur_dev_index -= 1 + need_next_dev = false + else: + state = WAIT + + elif (state == READ_FLASH) and (unit_ems.cmd_code_rx == 51): + pass + #read_flash() + elif (state == WRITE_FLASH_BEGIN) and (unit_ems.cmd_code_rx == 49): + pass + #write_flash() + #emit_signal('write_msg', 'Произведено чтение из ПЗУ ячейки ЯУ-07') + elif (state == LOAD_KEMS) and (unit_ems.cmd_code_rx == 52): + pass + #start_rw_kems(true) + elif (state == WRITE_FLASH_END) and (unit_ems.cmd_code_rx == 50): + pass + #load_flash() + #emit_signal('write_msg', 'Произведена запись в ПЗУ ячейки ЯУ-07') + + # Выбор текущего устройства и проверка правильности его номера + func check_dev_number(): + cur_dev = get_dev() + if not cur_dev: + state = WAIT + return false + return true + + # Возвращает устройство по текущему номеру, если он есть в словарях + func get_dev(): + if in_devs.has(cur_dev_num): + return in_devs[cur_dev_num] + elif out_devs.has(cur_dev_num): + return out_devs[cur_dev_num] + else: + return null + + # Запуск чтения/записи данных из/в ячейки КЭМС + func start_rw_kems(read: bool): + cur_dev_index = 0 + cur_dev_num = dev_num_list[cur_dev_index][0] + need_next_dev = true + if read: + state = WR_DEV_NUM_R + else: + state = WR_DEV_NUM_W + on_wr_device(cur_dev_num) diff --git a/scripts/yems-consts.gd b/scripts/yems-consts.gd index 9645ee8..9c88b52 100644 --- a/scripts/yems-consts.gd +++ b/scripts/yems-consts.gd @@ -1,5 +1,11 @@ class_name yerms_consts extends Node +const NUM_INPUT = 38 +const NUM_OUTPUT = 38 +const STATUS_OFFSET = { # Смещение статуса, ключ id платы + 0: 0, + 1: 26, + 2: 52 } ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС. const INPUT_KEMS = [ @@ -65,40 +71,40 @@ const INPUT_EMS1 = [ ## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС. const OUTPUT_EMS1 = [ - [1 ,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']], - [18,['СЗИ1 Л6','X31 : 14', '0.00', '0.00']], - [2 ,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']], - [19,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']], - [3 ,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']], - [20,['СЗИ2 Л7','X32 : 17', '0.00', '0.00']], - [4 ,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']], - [21,['СЗИ3 Л6','X33 : 14', '0.00', '0.00']], - [5 ,['СЗИ3 Л7','X33 : 17', '0.00', '0.00']], - [22,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']], - [6 ,['СЗИ4 Л6','X34 : 14', '0.00', '0.00']], - [23,['СЗИ4 Л7','X34 : 17', '0.00', '0.00']], - [7 ,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']], - [24,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']], - [8 ,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']], - [25,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']], - [9 ,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']], - [26,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']], - [10,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']], - [27,['СЗИ4 Л3','X41 : 14', '0.00', '0.00']], - [11,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']], - [28,['СЗИ1 Л5','X42 : 14', '0.00', '0.00']], - [12,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']], - [29,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']], - [13,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']], - [30,['СЗИ3 Л5','X44 : 14', '0.00', '0.00']], - [14,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']], - [31,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']], - [33,['УИЗП_МП №1', 'X29 : 8', '0.00', '0.00']], - [34,['УИЗП_МП №2', 'X29 : 9', '0.00', '0.00']], - [35,['Выход 35', 'X29 : 10', '0.00', '0.00']], - [36,['Выход 36', 'X29 : 11', '0.00', '0.00']], - [37,['Выход 37', 'X29 : 12', '0.00', '0.00']], - [38,['Выход 38', 'X29 : 13', '0.00', '0.00']],] + [47 ,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']], + [64,['СЗИ1 Л6','X31 : 14', '0.00', '0.00']], + [48 ,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']], + [65,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']], + [49 ,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']], + [66,['СЗИ2 Л7','X32 : 17', '0.00', '0.00']], + [50 ,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']], + [67,['СЗИ3 Л6','X33 : 14', '0.00', '0.00']], + [51 ,['СЗИ3 Л7','X33 : 17', '0.00', '0.00']], + [68,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']], + [52 ,['СЗИ4 Л6','X34 : 14', '0.00', '0.00']], + [69,['СЗИ4 Л7','X34 : 17', '0.00', '0.00']], + [53 ,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']], + [70,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']], + [54 ,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']], + [71,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']], + [55 ,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']], + [72,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']], + [56,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']], + [73,['СЗИ4 Л3','X41 : 14', '0.00', '0.00']], + [57,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']], + [74,['СЗИ1 Л5','X42 : 14', '0.00', '0.00']], + [58,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']], + [76,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']], + [59,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']], + [76,['СЗИ3 Л5','X44 : 14', '0.00', '0.00']], + [60,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']], + [77,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']], + [79,['УИЗП_МП №1', 'X29 : 8', '0.00', '0.00']], + [80,['УИЗП_МП №2', 'X29 : 9', '0.00', '0.00']], + [81,['Выход 35', 'X29 : 10', '0.00', '0.00']], + [82,['Выход 36', 'X29 : 11', '0.00', '0.00']], + [83,['Выход 37', 'X29 : 12', '0.00', '0.00']], + [84,['Выход 38', 'X29 : 13', '0.00', '0.00']],] ## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС. @@ -141,18 +147,18 @@ const INPUT_EMS2 = [ ## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС. const OUTPUT_EMS2 = [ - [1,['БИ РТР №1','X47 : 2', '0.00', '0.00']], - [19,['БИ РТР №2','X47 : 5', '0.00', '0.00']], - [2,['БИ РТР №3','X47 : 8', '0.00', '0.00']], - [19,['БИ РТР №4','X47 : 11', '0.00', '0.00']], - [3,['СИ В Лб', 'Х49 : 21', '0.00', '0.00']], - [20,['СИ В ПрБ', 'Х49 : 19', '0.00', '0.00']], - [4,['СИ Г Лб', 'Х49 : 28', '0.00', '0.00']], - [21,['СИ Г ПрБ', 'Х49 : 30', '0.00', '0.00']], - [5,['СИ Д Лб', 'Х49 : 13', '0.00', '0.00']], - [22,['СИ Д ПрБ', 'Х49 : 11', '0.00', '0.00']], - [6,['СИ Е Лб', 'Х49 : 26', '0.00', '0.00']], - [23,['СИ Е ПрБ', 'Х49 : 35', '0.00', '0.00']], - [33,['УИЗП_МП №3', 'X30 : 8', '0.00', '0.00']], - [34,['УИЗП_МП №4', 'X30 : 9', '0.00', '0.00']], - [35,['УИЗП_МП №5', 'X30 : 10', '0.00', '0.00']],] + [47,['БИ РТР №1','X47 : 2', '0.00', '0.00']], + [64,['БИ РТР №2','X47 : 5', '0.00', '0.00']], + [48,['БИ РТР №3','X47 : 8', '0.00', '0.00']], + [65,['БИ РТР №4','X47 : 11', '0.00', '0.00']], + [49,['СИ В Лб', 'Х49 : 21', '0.00', '0.00']], + [66,['СИ В ПрБ', 'Х49 : 19', '0.00', '0.00']], + [50,['СИ Г Лб', 'Х49 : 28', '0.00', '0.00']], + [67,['СИ Г ПрБ', 'Х49 : 30', '0.00', '0.00']], + [51,['СИ Д Лб', 'Х49 : 13', '0.00', '0.00']], + [68,['СИ Д ПрБ', 'Х49 : 11', '0.00', '0.00']], + [52,['СИ Е Лб', 'Х49 : 26', '0.00', '0.00']], + [69,['СИ Е ПрБ', 'Х49 : 35', '0.00', '0.00']], + [79,['УИЗП_МП №3', 'X30 : 8', '0.00', '0.00']], + [80,['УИЗП_МП №4', 'X30 : 9', '0.00', '0.00']], + [81,['УИЗП_МП №5', 'X30 : 10', '0.00', '0.00']],] diff --git a/scripts/yems-devs.gd b/scripts/yems-devs.gd index 8c35feb..99f3378 100644 --- a/scripts/yems-devs.gd +++ b/scripts/yems-devs.gd @@ -16,23 +16,71 @@ class InDev: var board: String ## Плата в которой находится устройство. var isa_addr: int ## Адрес устройства на шине isa - func _init(dev_id : int, params : Array, row_id : int): + func _init(dev_id : int, params : Array, row_id : int, base_addr: int): id = dev_id dev_name = String(params[0]) connector = String(params[1]) delay = float(params[2]) offset = float(params[3]) tbl_row_id = row_id + isa_addr = base_addr + ports_data[isa_addr + 4] = 0xFFFF + ports_data[isa_addr + 6] = 0xFFFF + ports_data[isa_addr + 8] = 0xFFFF + ports_data[isa_addr + 10] = 0xFFFF + func set_delay_offset(): + delay = float(ports_data[isa_addr + 10] & 0x003F)/10 + offset = float((ports_data[isa_addr + 10] >> 6) & 0x01FF)/10 + + func set_delay(val): + delay = val + var bin_val = int(val * 10) + ports_data[isa_addr + 10] = tools.set_bits(ports_data[isa_addr + 10], bin_val, 0x003F) + + func set_offset(val): + offset = val + var bin_val = int(val * 10) + ports_data[isa_addr + 10] = tools.set_bits(ports_data[isa_addr + 10], (bin_val << 6), 0x7FC0) class OutDev extends InDev: - var mode: String ## Режим работы выхода. + var mode: int ## Режим работы выхода. + var btns_state: = Dictionary() - func _init(dev_id : int, params : Array, row_id : int): - id = dev_id - dev_name = String(params[0]) - connector = String(params[1]) - delay = float(params[2]) - offset = float(params[3]) - tbl_row_id = row_id - mode = 'Работа' + func set_default_mode(): mode = 0 + + func set_mode(): + if (ports_data[isa_addr + 8] >> 13) & 1: + mode = 1 + elif (ports_data[isa_addr + 8] >> 14) & 1: + mode = 2 + elif (ports_data[isa_addr + 8] >> 15) & 1: + mode = 3 + else: + mode = 0 + + func set_btns_state(): + var data = ports_data[isa_addr + 4] | (ports_data[isa_addr + 6] << 16) | ((ports_data[isa_addr + 8] & 0x3f) << 32) + for i in range(yemsconsts.NUM_INPUT): + btns_state[i+1] = bool((data >> i) & 1) + + func set_dot(i_dev): + if btns_state.has(i_dev): + btns_state[i_dev] = not btns_state[i_dev] + var data = 0 + for i in range(yemsconsts.NUM_INPUT): + data = data | (int(btns_state[i+1]) << i) + ports_data[isa_addr + 4] = data & 0xffff + ports_data[isa_addr + 6] = (data >> 16) & 0xffff + ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], ((data >> 32) & 0x3f), 0x003F) + + func set_sw_mode(o_state): + mode = o_state + if mode == 0: + ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x0000, 0xE000) + elif mode == 1: + ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x2000, 0xE000) + elif mode == 2: + ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x4000, 0xE000) + elif mode == 3: + ports_data[isa_addr + 8] = tools.set_bits(ports_data[isa_addr + 8], 0x8000, 0xE000) From d18dc1aa9f7484cc4a449dfcad93089466c3845f Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 6 Nov 2024 08:41:07 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F.=20=D0=9A=D0=90=D0=9F=D0=A1=20=D0=A0?= =?UTF-8?q?=D0=9F=D0=91=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=BF=D0=BE=D0=B4=20=D0=BD=D0=B0=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=20uni?= =?UTF-8?q?t.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20t?= =?UTF-8?q?x=5Flen=20=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9,=20=D0=B3=D0=B4=D0=B5=20=D0=BD=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=8B=D0=BB=D0=BE.=20=D0=AD=D0=9C=D0=A1=20=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=BE=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=8F=D1=87=D0=B5=D0=B5=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/эмс/эмс.gd | 4 +++- scripts/capsrpb.gd | 10 ++-------- scripts/sch3.gd | 3 +++ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index e319fe6..a664ff4 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -60,7 +60,7 @@ func init_boards(): $scrl_files/tbl_files.pin_header($scrl_files, self) unit_ems.connect('data_received', Callable(self, 'on_data_ems_received')) - unit_ems.connect('command_done', Callable(self, 'on_data_ems_received')) + unit_ems.connect('command_done', Callable(self, 'on_command_done')) $btn_connect.connect('pressed', Callable(self, 'on_btn_connect')) $btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect')) $btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read)) @@ -132,6 +132,7 @@ func init_tbl_in(): var row_index : int = $scrollin/tbl_in.get_rows_count() - 1 var params : Array = item[1] var in_dev: yemsdevs.InDev = yemsdevs.InDev.new(item[0], params, row_index, g_boards[board].base_addr_isa) + g_boards[board].in_devs[in_dev.id] = in_dev in_dev.board = board for i in range(len(row_type)): if i < len(params): @@ -214,6 +215,7 @@ func init_tbl_out(): var row_index : int = $scrollout/tbl_out.get_rows_count() - 1 var params : Array = item[1] var out_dev = yemsdevs.OutDev.new(item[0], params, row_index, g_boards[board].base_addr_isa) + g_boards[board].out_devs[out_dev.id] = out_dev out_dev.set_default_mode() out_dev.board = board for i in range(len(header_text)): diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 9f7b96b..daa0cd6 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -8,18 +8,11 @@ const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от К const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм. -class CapsRpb: - signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось. - signal data_received(unit: CapsRpb) ## Сигнал данные приняты. - signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды. - signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения. +class CapsRpb extends unit.Unit: static var json_conv: = JSON.new() - var online: = false ## Состояние связи с источником сообщений. - var name: String ## Имя экземпляра. var json_dic: Dictionary ## Аппарат для разбора сообщений. var tick: = 0 ## Тик время последнего обновления, мс. - var tx_data: = PackedByteArray() ## Пакет для отправки. var tx_stack: Array ## Массив пакетов для отправки. func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) @@ -44,6 +37,7 @@ class CapsRpb: emit_signal('line_changed', self) if len(tx_stack): tx_data = tx_stack[0] + tx_len = len(tx_data) tx_stack.remove_at(0) return Error.OK else: diff --git a/scripts/sch3.gd b/scripts/sch3.gd index b301015..138a880 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -98,6 +98,7 @@ class Sch3 extends unit.Unit: if cmd_state != CmdState.DONE: return false var json_dict = {'code': 'write', 'data': [addr] + data} tx_data = JSON.stringify(json_dict).to_utf8_buffer() + tx_len = len(tx_data) cmd_state = CmdState.SEND return true @@ -108,6 +109,7 @@ class Sch3 extends unit.Unit: if cmd_state != CmdState.DONE: return false var json_dict = {'code': 'read_holding', 'data': [addr, count]} tx_data = JSON.stringify(json_dict).to_utf8_buffer() + tx_len = len(tx_data) cmd_state = CmdState.SEND return true @@ -118,5 +120,6 @@ class Sch3 extends unit.Unit: if cmd_state != CmdState.DONE: return false var json_dict = {'code': 'read_input', 'data': [addr, count]} tx_data = JSON.stringify(json_dict).to_utf8_buffer() + tx_len = len(tx_data) cmd_state = CmdState.SEND return true From 0b5f25c07455f0bd35eec2f91be38583c2cdc0b9 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Wed, 6 Nov 2024 08:51:36 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/tools.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tools.gd b/scripts/tools.gd index beeee06..5c5da86 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -74,7 +74,7 @@ func get_string_slice(s_in: String, s_out: Array, i0: int, i1: int): func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float): var r = remap(freq, f0, f1, r0, r1) var aoa_rad = radians(aoa) - PI / 2.0 - + return Vector2(cos(aoa_rad), sin(aoa_rad)) * r + pos0