Making an FSM work better for the calulator.

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

@ -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) {
} else if(ev == Event::NOT) {
using enum Event;
} else if(ev == Event::EQ) {
} else if(ev == Event::CLR) {
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…
Cancel
Save