Skip to content

Commit

Permalink
Added some helpful buttons to control panel
Browse files Browse the repository at this point in the history
  • Loading branch information
JustAGod1 committed Dec 7, 2021
1 parent 1edcdf6 commit df93fe7
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 44 deletions.
1 change: 1 addition & 0 deletions src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ impl Registers {

}

#[derive(Clone)]
pub struct Memory<I: CommandInfo,P: Parser<I>> {
pub parser: P,
pub data: Vec<MemoryCell>,
Expand Down
8 changes: 4 additions & 4 deletions src/parse/mc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -394,28 +394,28 @@ impl MicroCommand for OperationalCommand1 {
}

#[derive(Eq, PartialEq)]
pub enum Shift {
enum Shift {
Left,
Right,
None,
}

#[derive(Eq, PartialEq)]
pub enum Complement {
enum Complement {
Left,
Right,
None,
}

#[derive(Eq, PartialEq)]
pub enum Memory {
enum Memory {
Read,
Write,
None,
}

#[derive(Eq, PartialEq)]
pub enum Operation {
enum Operation {
LeftPlusRight,
LeftPlusRightPlusOne,
LeftAndRight,
Expand Down
17 changes: 2 additions & 15 deletions src/ui/cells.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,22 +80,9 @@ impl<I: CommandInfo, P: Parser<I>, F: Fn(&Computer) -> u16> Tool for CellsTool<I

self.draw_menu_bar(state, ui);

let jump_needed = ui.button(im_str!("Перейти к исполняемой команде"), [0.0, 0.0]);

let s_token = ui.push_style_var(StyleVar::ChildBorderSize(0.0));

let w_token = ChildWindow::new("cells_inside")
.always_vertical_scrollbar(true)
.border(true)
.begin(ui);

if w_token.is_none() {
return;
}

let w_token = w_token.unwrap();


let current_executed = (self.counter_register)(&mut state.computer);

let mut next_rev_focused = false;
Expand All @@ -109,8 +96,9 @@ impl<I: CommandInfo, P: Parser<I>, F: Fn(&Computer) -> u16> Tool for CellsTool<I
ui.text(format!("{:0>3X}", idx));
ui.same_line(0.0);
let t = if current_executed == idx as u16 {
if jump_needed {
if state.jump_requested {
ui.set_scroll_here_y();
state.jump_requested = false;
}
Some(ui.push_style_color(StyleColor::FrameBg, [1.0, 0.0, 0.0, 1.0]))
} else {
Expand Down Expand Up @@ -169,7 +157,6 @@ impl<I: CommandInfo, P: Parser<I>, F: Fn(&Computer) -> u16> Tool for CellsTool<I
state.current_command = Some(Box::new(parser.parse(data.get(current_executed as usize).unwrap().get())));
}

w_token.end(ui);
s_token.pop(ui);
}
}
Expand Down
90 changes: 66 additions & 24 deletions src/ui/controls.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
use crate::model::{Computer, Register, Registers};
use crate::model::{Computer, Memory, Register, Registers};
use imgui::{Ui, ChildWindow, TreeNode, im_str, ImString, Io, MenuItem};
use crate::parse::general::{GeneralCommandInfo, GeneralParser};
use crate::parse::mc::ExecutionResult;
use crate::ui::gui::{PopupManager, Gui, GuiState};
use crate::ui::window::Tool;
use crate::ui::popup::PopupMessage;

pub struct SmartControlsTool {
auto_run: bool
auto_run: bool,
history: Vec<HistoryEntry>
}

struct HistoryEntry {
registers: Registers
}

impl Tool for SmartControlsTool {
Expand All @@ -18,7 +24,19 @@ impl Tool for SmartControlsTool {
impl SmartControlsTool {
pub fn new() -> SmartControlsTool {
SmartControlsTool {
auto_run: false
auto_run: false,
history: vec![]
}
}

fn make_history_entry(&mut self, state: &mut GuiState) {
let entry = HistoryEntry {
registers: state.computer.registers.clone()
};

self.history.push(entry);
if self.history.len() > 15 {
self.history.remove(0usize);
}
}

Expand All @@ -30,16 +48,16 @@ impl SmartControlsTool {
}
tok.end(ui);
}
let computer = &mut state.computer;

let w = ui.content_region_avail().get(0).unwrap() / 2.0 - 4.0;
let w = ui.content_region_avail().get(0).unwrap() / 3.0 - 6.0;
let h = ui.content_region_avail().get(1).unwrap() / 2.0 - 3.0;

if ui.button(im_str!("Микро шаг"), [w, h]) {
computer.registers.set_execute_by_tick(true);
computer.registers.set_lever(false);
computer.registers.set_program_mode(false);
computer.micro_step();
self.make_history_entry(state);
state.computer.registers.set_execute_by_tick(true);
state.computer.registers.set_lever(false);
state.computer.registers.set_program_mode(false);
state.computer.micro_step();
}

if ui.is_item_hovered() {
Expand All @@ -49,45 +67,69 @@ impl SmartControlsTool {
ui.same_line(0.0);

if ui.button(im_str!("Большой шаг"), [w,h]) {
computer.registers.set_execute_by_tick(false);
computer.registers.set_lever(false);
computer.registers.set_program_mode(false);
while !matches!(computer.micro_step(), ExecutionResult::HALTED) {}
self.make_history_entry(state);
state.computer.registers.set_execute_by_tick(false);
state.computer.registers.set_lever(false);
state.computer.registers.set_program_mode(false);
while !matches!(state.computer.micro_step(), ExecutionResult::HALTED) {}
}
if ui.is_item_hovered() {
ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 0.\nУстанавливается флаг \"Программа\" в 0.\nВыполняется полный цикл микрокоманд.\nГрубо говоря выполняется одна команда.")
}

ui.same_line(0.0);

if ui.button(im_str!("Назад"), [w, h]) && !self.history.is_empty(){
let entry = self.history.pop().unwrap();
state.computer.registers = entry.registers;

self.auto_run = false
}
if ui.is_item_hovered() {
ui.tooltip_text("Возвращает регистры к состоянию в котором они были до того как вы нажали последнюю кнопку.")
}

if ui.button(im_str!("Пуск"), [w,h]) {
computer.registers.r_micro_command_counter = 0xA8;
computer.registers.set_execute_by_tick(false);
computer.registers.set_lever(true);
computer.registers.set_program_mode(true);
self.make_history_entry(state);
state.computer.registers.r_micro_command_counter = 0xA8;
state.computer.registers.set_execute_by_tick(false);
state.computer.registers.set_lever(true);
state.computer.registers.set_program_mode(true);
}
if ui.is_item_hovered() {
ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 1.\nУстанавливается флаг \"Программа\" в 1.\nУстанавливает СчМК в 0A8 то есть сбрасывает состояние регистров ЭВМ\nЭВМ начинает самостоятельно выполнять команду за командой.")
}
ui.same_line(0.0);
if ui.button(im_str!("Продолжить"), [w,h]) {
computer.registers.set_execute_by_tick(false);
computer.registers.set_lever(true);
computer.registers.set_program_mode(true);
self.make_history_entry(state);
state.computer.registers.set_execute_by_tick(false);
state.computer.registers.set_lever(true);
state.computer.registers.set_program_mode(true);
}
if ui.is_item_hovered() {
ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 1.\nУстанавливается флаг \"Программа\" в 1.\nНе изменяет состояние регистров ЭВМ\nЭВМ начинает самостоятельно выполнять команду за командой.")
}
ui.same_line(0.0);
if ui.button(im_str!("Прыжок"), [w,h]) {
self.make_history_entry(state);
state.computer.registers.set_execute_by_tick(false);
state.computer.registers.set_lever(true);
state.computer.registers.set_program_mode(true);
}
if ui.is_item_hovered() {
ui.tooltip_text("Проскроливает к текущей исполняемой команде")
}

if computer.registers.get_lever() {
if state.computer.registers.get_lever() {
self.auto_run = true;
}
if self.auto_run {
for _ in 0..100 {
if matches!(computer.micro_step(), ExecutionResult::HALTED) {
if computer.registers.get_lever() {
if matches!(state.computer.micro_step(), ExecutionResult::HALTED) {
if state.computer.registers.get_lever() {
state.popup_manager.open(PopupMessage::new("Остановочка","ЭВМ завершила свою работу"));
}
computer.registers.set_lever(false);
state.computer.registers.set_lever(false);
self.auto_run = false;
break;
}
Expand Down
4 changes: 3 additions & 1 deletion src/ui/gui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ pub struct GuiState {
pub theme_requested: Option<Theme>,
pub popup_manager: PopupManager,
pub current_command: Option<Box<dyn CommandInfo>>,
pub jump_requested: bool
}

impl GuiState {
Expand All @@ -68,6 +69,7 @@ impl GuiState {
computer,
popup_manager: PopupManager::new(),
current_command: None,
jump_requested: false
}
}
}
Expand Down Expand Up @@ -133,7 +135,7 @@ impl Gui {
0,
LayoutTool::new_horizontal("middle")
.append(
315,
335,
WindowTool::single_tool(
315, 0,
"Панель управления", LayoutTool::new_vertical("execandio")
Expand Down

0 comments on commit df93fe7

Please sign in to comment.