|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|