diff --git a/scenes/эмс-тг/эмс-тг.gd b/scenes/эмс-тг/эмс-тг.gd index 791e2eba..b0b3a064 100644 --- a/scenes/эмс-тг/эмс-тг.gd +++ b/scenes/эмс-тг/эмс-тг.gd @@ -81,7 +81,7 @@ enum ClasterMode { ## Состояние кластера. Значения должны соответствовать состояниям [b]six-state-button[/b] -enum ClasterState { +enum ClasterResult { WAITING = 0, ## Ожидание даннных DONE = 1, ## Выполнено MISSMATCH = 2 ## Несоответствие @@ -166,36 +166,36 @@ func _on_scale_selected(val: bool, nm: StringName): func map_cvi_to_table(unit_cvi: Dictionary, ctable: GDTable, indexes: Dictionary): for cname in indexes: var i_row = indexes[cname] - var state_rxe: = ClasterState.WAITING - var state_txe: = ClasterState.WAITING + var result_rxe: = ClasterResult.WAITING + var result_txe: = ClasterResult.WAITING if unit_cvi.has(cname): - state_rxe = unit_cvi[cname]['state_rxe'] - state_txe = unit_cvi[cname]['state_txe'] - ctable.set_node_property(column_cmd_rx, i_row, 'state', int(state_rxe)) - ctable.set_node_property(column_cmd_tx, i_row, 'state', int(state_txe)) + result_rxe = unit_cvi[cname]['result_rxe'] + result_txe = unit_cvi[cname]['result_txe'] + ctable.set_node_property(column_cmd_rx, i_row, 'state', int(result_rxe)) + ctable.set_node_property(column_cmd_tx, i_row, 'state', int(result_txe)) func update_cmd_vs_info(nm: StringName): - if yems_info.has(nm): - return var unit_info = yems_info[nm] - if not unit_info.has('mcls'): - return - if not yems_cmd.has(nm): - return var unit_cvi = {} + var unit_cmd = yems_cmd[nm] for cls_info in unit_info.mcls: - var claster_cvi = {} - claster_cvi['state_txe'] = ClasterState.WAITING - claster_cvi['state_rxe'] = ClasterState.WAITING - var unit_cmd = yems_cmd[nm] + var result_rxe = ClasterResult.DONE + var result_txe = ClasterResult.DONE if not unit_cmd.has(cls_info.cname): + unit_cvi[cls_info.cname] = \ + { 'result_rxe': ClasterResult.DONE, + 'result_txe': ClasterResult.DONE } continue var cls_cmd = unit_cmd[cls_info.cname] - claster_cvi['state_rxe'] = ClasterState.DONE if cls_info.rxe == cls_cmd.rxe else ClasterState.MISSMATCH - claster_cvi['state_txe'] = ClasterState.DONE if cls_info.txe == cls_cmd.txe else ClasterState.MISSMATCH - unit_cvi[cls_info.cname] = claster_cvi - cmd_vs_info[nm] = unit_cvi + if cls_cmd.has('rxe'): + result_rxe = ClasterResult.DONE if (cls_info.rxe == cls_cmd.rxe) else ClasterResult.MISSMATCH + if cls_cmd.has('txe'): + result_txe = ClasterResult.DONE if (cls_info.txe == cls_cmd.txe) else ClasterResult.MISSMATCH + unit_cvi[cls_info.cname] = \ + { 'result_rxe': result_rxe, + 'result_txe': result_txe } + cmd_vs_info[nm].merge(unit_cvi, true) ## Подключает обработчики команд к таблице кластеров @@ -247,7 +247,7 @@ func on_data_received(data: Dictionary, nm: StringName): map_cvi_to_table(unit_cvi, ctable, indexes) -# Объединяет списки кластеров принятых от устройства +# Объединяет список кластеров принятых от устройства со списком сохранённым func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary): var drx: = {} for cls in data_rx.mcls: @@ -256,23 +256,30 @@ func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary): for cls in unit_info.mcls: dinfo[cls.cname] = cls dinfo.merge(drx, true) + unit_info.merge(data_rx, true) unit_info.mcls = dinfo.values() func cmd_to_unit(nm: StringName): var unit_yemstg: = network.get_unit_instance(nm) + # Проверить, что предидущие отправлены if unit_yemstg.cmd_state != unit.Unit.CmdState.DONE: return - # Команда формируется из докладов (данных принятых из сети от устройств) - var cmd = yems_info[nm] - # Переписать новыми значениями из команды заданной оператором - cmd['mtype'] = 'cmd' + # Сформировать команду из докладов (данных принятых из сети от устройств) + var unit_info_copy = yems_info[nm].duplicate(true) var unit_cmd = yems_cmd[nm] - for cls_info in cmd.mcls: + unit_info_copy['mtype'] = 'cmd' + # Выбрать только работающие кластеры (время которых ещё не истекло) + var mcls = unit_info_copy.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING) + for cls_info in mcls: + # Если для это кластера есть команда оператора if unit_cmd.has(cls_info.cname): + # Переписать новыми значениями из команды заданной оператором var cmd_cls = unit_cmd[cls_info.cname] cls_info.merge(cmd_cls, true) - unit_yemstg.cmd.merge(cmd, true) + cls_info.erase('status') + # Передать команду сетевому стеку + unit_yemstg.cmd.merge(unit_info_copy, true) unit_yemstg.cmd_state = unit.Unit.CmdState.SEND @@ -352,6 +359,8 @@ func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dic ctable.set_row_text(i_row, row_text) ctable.set_node_property(column_cmd_rx, i_row, 'pressed', cls.rxe) ctable.set_node_property(column_cmd_tx, i_row, 'pressed', cls.txe) + ctable.set_node_property(column_cmd_rx, i_row, 'state', ClasterResult.WAITING) + ctable.set_node_property(column_cmd_tx, i_row, 'state', ClasterResult.WAITING) ## Находит пересечения диапазонов @@ -363,8 +372,9 @@ func find_inters(info: Dictionary) -> Array: # nm - имя устройства var unit_data = info[nm] if not unit_data: continue - # cls - один кластер - for cls in unit_data.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING): + var clasters = unit_data.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING) + for cls in clasters: + # cls - один кластер var cfb = float(cls.cfb) var wfb = float(cls.wfb) / 2.0 # расчёт границ частотных диапазонов @@ -424,14 +434,15 @@ func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer) var scale_rx: = claster_scale.get_node('panel_rx') # Получить шкалу передатчика var scale_tx: = claster_scale.get_node('panel_tx') - # Проверить что диапазон работает - if cls.status == ClasterStatus.RUNNING: # Диапазон работает (информация обновляется) + # Диапазон работает (информация обновляется) + if cls.status == ClasterStatus.RUNNING: # Отобразить диапазон приёмника, в соответствии с разрешением var color_rxe: = color_enabled if cls.get('rxe', false) else color_disabled scale_rx.set_range(cls.cname, l, h, color_rxe) # Отобразить диапазон передатчика, в соответствии с разрешением var color_txe: = color_enabled if cls.get('txe', false) else color_disabled scale_tx.set_range(cls.cname, l, h, color_txe) - elif cls.status == ClasterStatus.DELETED: # Диапазон удалён (информация не обновляется) + # Диапазон удалён (информация не обновляется) + elif cls.status == ClasterStatus.DELETED: scale_rx.del_range(cls.cname) scale_tx.del_range(cls.cname)