Making an FSM work better for the calulator.

main
Zed A. Shaw 4 days ago
parent c0c63e5b2c
commit bd0ec9e095
  1. 82
      demos/calc.cpp

@ -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) {
} else if(ev == Event::EQ) { switch(ev) {
case NUMBER:
} else if(ev == Event::CLR) { input += op;
input = L""; break;
state(State::CLEARED); 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) { 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…
Cancel
Save