Making an FSM work better for the calulator.
This commit is contained in:
parent
c0c63e5b2c
commit
bd0ec9e095
1 changed files with 55 additions and 27 deletions
|
@ -19,23 +19,19 @@ const std::unordered_map<string, wstring> LABELS {
|
||||||
{"btn2", L"2"}, {"btn3", L"3"}, {"btn4", L"4"},
|
{"btn2", L"2"}, {"btn3", L"3"}, {"btn4", L"4"},
|
||||||
{"btn5", L"5"}, {"btn6", L"6"}, {"btn7", L"7"},
|
{"btn5", L"5"}, {"btn6", L"6"}, {"btn7", L"7"},
|
||||||
{"btn8", L"8"}, {"btn9", L"9"}, {"mult", L"*"},
|
{"btn8", L"8"}, {"btn9", L"9"}, {"mult", L"*"},
|
||||||
{"minus", L"-"}, {"plus", L"+"}, {"neg", L"!"},
|
{"minus", L"-"}, {"plus", L"+"}, {"neg", L"±"},
|
||||||
{"div", L"/"}, {"eq", L"="}
|
{"div", L"/"}, {"eq", L"="} };
|
||||||
};
|
|
||||||
|
|
||||||
enum class Event {
|
enum class Event {
|
||||||
NUMBER=0,
|
NUMBER, ADD, SUB, MUL,
|
||||||
OP=1,
|
DIV, CLR, NOT, EQ,
|
||||||
CLR=2,
|
|
||||||
NOT=3,
|
|
||||||
EQ=4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class State {
|
enum class State {
|
||||||
START=0,
|
START,
|
||||||
CALCULATING=1,
|
CALCULATING,
|
||||||
CLEARED=3,
|
CLEARED,
|
||||||
DISPLAYED=4
|
DISPLAYED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,17 +56,39 @@ struct Calculator : DeadSimpleFSM<State, Event> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CALCULATING(Event ev, wchar_t op) {
|
void CALCULATING(Event ev, wchar_t op) {
|
||||||
if(ev == Event::NUMBER) {
|
using enum Event;
|
||||||
input += op;
|
|
||||||
} else if(ev == Event::OP) {
|
|
||||||
|
|
||||||
} else if(ev == Event::NOT) {
|
switch(ev) {
|
||||||
|
case NUMBER:
|
||||||
} else if(ev == Event::EQ) {
|
input += op;
|
||||||
|
break;
|
||||||
} else if(ev == Event::CLR) {
|
case ADD:
|
||||||
input = L"";
|
value += std::stof(input);
|
||||||
state(State::CLEARED);
|
input = L"";
|
||||||
|
break;
|
||||||
|
case SUB:
|
||||||
|
value -= std::stof(input);
|
||||||
|
input = L"";
|
||||||
|
break;
|
||||||
|
case MUL:
|
||||||
|
value *= std::stof(input);
|
||||||
|
input = L"";
|
||||||
|
break;
|
||||||
|
case DIV:
|
||||||
|
value /= std::stof(input);
|
||||||
|
input = L"";
|
||||||
|
break;
|
||||||
|
case NOT:
|
||||||
|
value = std::stof(input) * -1;
|
||||||
|
input = L"";
|
||||||
|
break;
|
||||||
|
case EQ:
|
||||||
|
value = std::stof(input);
|
||||||
|
break;
|
||||||
|
case CLR:
|
||||||
|
input = L"";
|
||||||
|
state(State::CLEARED);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +152,8 @@ struct CalculatorUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_button(wchar_t op) {
|
void handle_button(wchar_t op) {
|
||||||
|
using enum Event;
|
||||||
|
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case L'0':
|
case L'0':
|
||||||
case L'1':
|
case L'1':
|
||||||
|
@ -145,20 +165,28 @@ struct CalculatorUI {
|
||||||
case L'7':
|
case L'7':
|
||||||
case L'8':
|
case L'8':
|
||||||
case L'9':
|
case L'9':
|
||||||
$fsm.event(Event::NUMBER, op);
|
$fsm.event(NUMBER, op);
|
||||||
break;
|
break;
|
||||||
case L'*':
|
case L'*':
|
||||||
|
$fsm.event(MUL, op);
|
||||||
|
break;
|
||||||
case L'-':
|
case L'-':
|
||||||
|
$fsm.event(SUB, op);
|
||||||
|
break;
|
||||||
case L'+':
|
case L'+':
|
||||||
|
$fsm.event(ADD, op);
|
||||||
|
break;
|
||||||
case L'/':
|
case L'/':
|
||||||
case L'!':
|
$fsm.event(DIV, op);
|
||||||
$fsm.event(Event::OP, op);
|
break;
|
||||||
|
case L'±':
|
||||||
|
$fsm.event(NOT, op);
|
||||||
break;
|
break;
|
||||||
case L'=':
|
case L'=':
|
||||||
$fsm.event(Event::EQ, op);
|
$fsm.event(EQ, op);
|
||||||
break;
|
break;
|
||||||
case L'C':
|
case L'C':
|
||||||
$fsm.event(Event::CLR, op);
|
$fsm.event(CLR, op);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue