From bd0ec9e0955dacde283c68fcd0924e474e8c6024 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 6 May 2025 10:43:11 -0400 Subject: [PATCH] Making an FSM work better for the calulator. --- demos/calc.cpp | 82 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/demos/calc.cpp b/demos/calc.cpp index 01c5ffc..df4c6bf 100644 --- a/demos/calc.cpp +++ b/demos/calc.cpp @@ -19,23 +19,19 @@ const std::unordered_map 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 { } 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) { - 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; }