From 4575d0c1d2318c2984a5e14b663d7407ff20af9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=91=D0=B0=D1=82?= =?UTF-8?q?=D1=83=D1=85=D1=82=D0=B8=D0=BD?= Date: Mon, 29 May 2023 20:09:14 +0300 Subject: [PATCH] Fixed calculator implementation --- calculator.c | 315 ++++++++++++++++++++++----------------------------- calculator.h | 29 +++++ keyboard.c | 6 +- main.c | 61 +++------- 4 files changed, 182 insertions(+), 229 deletions(-) create mode 100644 calculator.h diff --git a/calculator.c b/calculator.c index c1dee62..c2757c8 100644 --- a/calculator.c +++ b/calculator.c @@ -1,187 +1,142 @@ -#include -#include +#include "calculator.h" -enum calculator_state { - NUMBER_FIRST, - NUMBER_SECOND, - RESULT -}; -enum calculator_op { - NO_OP, - ADD, - SUB, - DIV, - MUL -}; -struct calculator { - // 1 число - int num1; - // 2 число - int num2; - // 3 операция - enum calculator_op operation; - // 4 результат - int result; - // 5 состояние атомата - enum calculator_state state; -}; - - - -int main() { - struct calculator calc; - calc.state = NUMBER_FIRST; - calc.operation = NO_OP; - calc.num1 = 0; - calc.num2 = 0; - calc.result = 0; - int input; - while (1) { - scanf("%d", &input); - switch (calc.state) { - case NUMBER_FIRST: - switch (input) { - case 0: - calc.num1 = (calc.num1 * 10) + 7; - break; - case 1: - calc.num1 = (calc.num1 * 10) + 8; - break; - case 2: - calc.num1 = (calc.num1 * 10) + 9; - break; - case 3: - calc.operation = DIV; - calc.state = NUMBER_SECOND; - break; - case 4: - calc.num1 = (calc.num1 * 10) + 4; - break; - case 5: - calc.num1 = (calc.num1 * 10) + 5; - break; - case 6: - calc.num1 = (calc.num1 * 10) + 6; - break; - case 7: - calc.operation = MUL; - calc.state = NUMBER_SECOND; - break; - case 8: - calc.num1 = (calc.num1 * 10) + 1; - break; - case 9: - calc.num1 = (calc.num1 * 10) + 2; - case 10: - calc.num1 = (calc.num1 * 10) + 3; - break; - case 11: - calc.operation = SUB; - calc.state = NUMBER_SECOND; - break; - case 12: - calc.num1 = 0; - break; - case 13: - calc.state = NUMBER_FIRST; - calc.operation = NO_OP; - calc.num1 = 0; - calc.num2 = 0; - calc.result = 0; - break; - case 14: - break; - case 15: - calc.operation = ADD; - calc.state = NUMBER_SECOND; - break; - } - printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); +void handleCalc(struct calculator *calc, int input) { + switch (calc->state) { + case NUMBER_FIRST: + switch (input) { + case 0: + calc->num1 = (calc->num1 * 10) + 7; break; - - case NUMBER_SECOND: - switch (input) { - case 0: - calc.num2 = (calc.num2 * 10) + 7; - break; - case 1: - calc.num2 = (calc.num2 * 10) + 8; - break; - case 2: - calc.num2 = (calc.num2 * 10) + 9; - break; - case 3: - break; - case 4: - calc.num2 = (calc.num2 * 10) + 4; - break; - case 5: - calc.num2 = (calc.num2 * 10) + 5; - break; - case 6: - calc.num2 = (calc.num2 * 10) + 6; - break; - case 7: - break; - case 8: - calc.num2 = (calc.num2 * 10) + 1; - break; - case 9: - calc.num2 = (calc.num2 * 10) + 2; - case 10: - calc.num2 = (calc.num2 * 10) + 3; - break; - case 11: - break; - case 12: - calc.num2 = 0; - break; - case 13: - calc.state = NUMBER_FIRST; - calc.operation = NO_OP; - calc.num1 = 0; - calc.num2 = 0; - calc.result = 0; - break; - case 14: - switch (calc.operation) { - case ADD: - calc.result = calc.num1 + calc.num2; - calc.state = RESULT; - break; - case SUB: - calc.result = calc.num1 - calc.num2; - calc.state = RESULT; - break; - case MUL: - calc.result = calc.num1 * calc.num2; - calc.state = RESULT; - break; - case DIV: - calc.result = calc.num1 / calc.num2; - calc.state = RESULT; - break; - - } - break; - case 15: - break; - } - printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); + case 1: + calc->num1 = (calc->num1 * 10) + 8; break; - case RESULT: - switch (input) { - case 14: - calc.state = NUMBER_FIRST; - calc.operation = NO_OP; - calc.num1 = 0; - calc.num2 = 0; - calc.result = 0; - printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); - break; - } + case 2: + calc->num1 = (calc->num1 * 10) + 9; + break; + case 3: + calc->operation = DIV; + calc->state = NUMBER_SECOND; + break; + case 4: + calc->num1 = (calc->num1 * 10) + 4; + break; + case 5: + calc->num1 = (calc->num1 * 10) + 5; + break; + case 6: + calc->num1 = (calc->num1 * 10) + 6; + break; + case 7: + calc->operation = MUL; + calc->state = NUMBER_SECOND; + break; + case 8: + calc->num1 = (calc->num1 * 10) + 1; + break; + case 9: + calc->num1 = (calc->num1 * 10) + 2; + break; + case 10: + calc->num1 = (calc->num1 * 10) + 3; + break; + case 11: + calc->operation = SUB; + calc->state = NUMBER_SECOND; + break; + case 12: + calc->num1 = (calc->num1 * 10); + break; + case 13: + clearCalc(calc); + break; + case 14: + break; + case 15: + calc->operation = ADD; + calc->state = NUMBER_SECOND; break; - } + break; + case NUMBER_SECOND: + switch (input) { + case 0: + calc->num2 = (calc->num2 * 10) + 7; + break; + case 1: + calc->num2 = (calc->num2 * 10) + 8; + break; + case 2: + calc->num2 = (calc->num2 * 10) + 9; + break; + case 3: + break; + case 4: + calc->num2 = (calc->num2 * 10) + 4; + break; + case 5: + calc->num2 = (calc->num2 * 10) + 5; + break; + case 6: + calc->num2 = (calc->num2 * 10) + 6; + break; + case 7: + break; + case 8: + calc->num2 = (calc->num2 * 10) + 1; + break; + case 9: + calc->num2 = (calc->num2 * 10) + 2; + break; + case 10: + calc->num2 = (calc->num2 * 10) + 3; + break; + case 11: + break; + case 12: + calc->num2 = (calc->num2 * 10); + break; + case 13: + clearCalc(calc); + break; + case 14: + switch (calc->operation) { + case ADD: + calc->result = calc->num1 + calc->num2; + calc->state = RESULT; + break; + case SUB: + calc->result = calc->num1 - calc->num2; + calc->state = RESULT; + break; + case MUL: + calc->result = calc->num1 * calc->num2; + calc->state = RESULT; + break; + case DIV: + calc->result = calc->num1 / calc->num2; + calc->state = RESULT; + break; + } + break; + case 15: + break; + } + break; + case RESULT: + switch (input) { + case 13: + clearCalc(calc); + case 14: + clearCalc(calc); + break; + } + break; } +} +void clearCalc(struct calculator* calc) { + calc->state = NUMBER_FIRST; + calc->operation = NO_OP; + calc->num1 = 0; + calc->num2 = 0; + calc->result = 0; } \ No newline at end of file diff --git a/calculator.h b/calculator.h new file mode 100644 index 0000000..0bc6b07 --- /dev/null +++ b/calculator.h @@ -0,0 +1,29 @@ + +enum calculator_state { + NUMBER_FIRST, + NUMBER_SECOND, + RESULT +}; +enum calculator_op { + NO_OP, + ADD, + SUB, + DIV, + MUL +}; +struct calculator { + // 1 число + long num1; + // 2 число + long num2; + // 3 операция + enum calculator_op operation; + // 4 результат + long result; + // 5 состояние атомата + enum calculator_state state; +}; + +void clearCalc(struct calculator *calc); + +void handleCalc(struct calculator *calc, int input); diff --git a/keyboard.c b/keyboard.c index 4ef1cdb..dce7867 100644 --- a/keyboard.c +++ b/keyboard.c @@ -36,9 +36,8 @@ void get_logical_keys(struct key *undc_keys) { undc_keys[i].logical = undc_keys[i].physical; set_key_event(&undc_keys[i]); } - } else { + } else { undc_keys[i].time = timestamp; - } } } @@ -49,9 +48,6 @@ void fill_buttons_names(struct key *buttons) { } } -/************************************************************************/ -/* */ -/************************************************************************/ static void set_key_event(struct key *button) { if (button->logical == true) { button->on_down = true; diff --git a/main.c b/main.c index a62a143..ea95c63 100644 --- a/main.c +++ b/main.c @@ -5,6 +5,7 @@ #include "timer.h" #include "keyboard.h" #include "uart.h" +#include "calculator.h" void setup_registers() { MCUCR &= ~(1 << 4); // PUD @@ -24,16 +25,17 @@ void setup() { setup_registers(); } -int up_amoumt = 0; -int down_amount = 0; -int diff = 0; -int diff_prev = 0; - int main(void) { + puts("Program started\r\n"); + setup(); - puts("Hello\r\n"); + + struct calculator calc; struct key keys[KEYS_AMOUNT]; + fill_buttons_names(keys); + clearCalc(&calc); + while(1) { get_physical_keys(keys); get_logical_keys(keys); @@ -41,46 +43,17 @@ int main(void) { for (int i = 0; i < KEYS_AMOUNT; i++) { bool up, down; get_event(&keys[i], &up, &down); - if (down) - { - printf("%d", keys[i].button); + if (down) { + handleCalc(&calc, keys[i].button); + printf("-------\r\n"); + printf("%d\r\n", keys[i].button); + printf("%li\r\n", calc.num1); + printf("%li\r\n", calc.num2); + printf("%li\r\n", calc.result); + printf("%d\r\n", calc.operation); + printf("%d\r\n", calc.state); } } - - //down_amount = 0; - //up_amoumt = 0; - // - //for (int i = 0; i < KEYS_AMOUNT; i++) { - //if (keys[i].logical == false) { - //down_amount++; - //} else { - //up_amoumt++; - //} - ////bool up; - ////bool down; - ////get_event(&keys[i], &up, &down); - ////if (down) { - ////down_amount++; - ////} - ////else { - ////up_amoumt++; - ////} - //} - //diff = up_amoumt; - ////if (diff != diff_prev) { - //for (int i = 0; i < KEYS_AMOUNT; i++) { - //bool up, down; - //get_event(&keys[i], &up, &down); - ////if (keys[i].logical == true) { - ////printf("%d", keys[i].button); - ////} - //if (down) { - ////printf("%s\r\n", i); - //printf("%d", keys[i].button); - //} - //} - ////} - //diff_prev = diff; } }