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"},
|
||||
{"btn5", L"5"}, {"btn6", L"6"}, {"btn7", L"7"},
|
||||
{"btn8", L"8"}, {"btn9", L"9"}, {"mult", L"*"},
|
||||
{"minus", L"-"}, {"plus", L"+"}, {"neg", L"!"},
|
||||
{"div", L"/"}, {"eq", L"="}
|
||||
};
|
||||
{"minus", L"-"}, {"plus", L"+"}, {"neg", L"±"},
|
||||
{"div", L"/"}, {"eq", L"="} };
|
||||
|
||||
enum class Event {
|
||||
NUMBER=0,
|
||||
OP=1,
|
||||
CLR=2,
|
||||
NOT=3,
|
||||
EQ=4
|
||||
NUMBER, ADD, SUB, MUL,
|
||||
DIV, CLR, NOT, EQ,
|
||||
};
|
||||
|
||||
enum class State {
|
||||
START=0,
|
||||
CALCULATING=1,
|
||||
CLEARED=3,
|
||||
DISPLAYED=4
|
||||
START,
|
||||
CALCULATING,
|
||||
CLEARED,
|
||||
DISPLAYED
|
||||
};
|
||||
|
||||
|
||||
|
@ -60,17 +56,39 @@ struct Calculator : DeadSimpleFSM<State, Event> {
|
|||
}
|
||||
|
||||
void CALCULATING(Event ev, wchar_t op) {
|
||||
if(ev == Event::NUMBER) {
|
||||
input += op;
|
||||
} else if(ev == Event::OP) {
|
||||
using enum Event;
|
||||
|
||||
} else if(ev == Event::NOT) {
|
||||
|
||||
} else if(ev == Event::EQ) {
|
||||
|
||||
} else if(ev == Event::CLR) {
|
||||
input = L"";
|
||||
state(State::CLEARED);
|
||||
switch(ev) {
|
||||
case NUMBER:
|
||||
input += op;
|
||||
break;
|
||||
case ADD:
|
||||
value += std::stof(input);
|
||||
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) {
|
||||
using enum Event;
|
||||
|
||||
switch(op) {
|
||||
case L'0':
|
||||
case L'1':
|
||||
|
@ -145,20 +165,28 @@ struct CalculatorUI {
|
|||
case L'7':
|
||||
case L'8':
|
||||
case L'9':
|
||||
$fsm.event(Event::NUMBER, op);
|
||||
$fsm.event(NUMBER, op);
|
||||
break;
|
||||
case L'*':
|
||||
$fsm.event(MUL, op);
|
||||
break;
|
||||
case L'-':
|
||||
$fsm.event(SUB, op);
|
||||
break;
|
||||
case L'+':
|
||||
$fsm.event(ADD, op);
|
||||
break;
|
||||
case L'/':
|
||||
case L'!':
|
||||
$fsm.event(Event::OP, op);
|
||||
$fsm.event(DIV, op);
|
||||
break;
|
||||
case L'±':
|
||||
$fsm.event(NOT, op);
|
||||
break;
|
||||
case L'=':
|
||||
$fsm.event(Event::EQ, op);
|
||||
$fsm.event(EQ, op);
|
||||
break;
|
||||
case L'C':
|
||||
$fsm.event(Event::CLR, op);
|
||||
$fsm.event(CLR, op);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue