From 027e3bb42ed0f0e0f6c2bacbc0c896d721e7cd63 Mon Sep 17 00:00:00 2001 From: Christian Chapman <1360262+enthdegree@users.noreply.github.com> Date: Fri, 20 Jan 2023 20:15:28 -0500 Subject: Morse-code based RPN calculator (#164) * Added Morse code based RPN calculator * added manual and memory register * fixed morsecalc negative indicator, edited header comment * adjusted stack display controls * Fixed warnings. Added calculator token aliasing ability. Added binary shorthand for numeral entry. Extended morse code binary tree. * ui tweaks * Update movement_config.h * silence warning Co-authored-by: Christian Chapman Co-authored-by: joeycastillo --- movement/lib/morsecalc/calc.c | 113 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 movement/lib/morsecalc/calc.c (limited to 'movement/lib/morsecalc/calc.c') diff --git a/movement/lib/morsecalc/calc.c b/movement/lib/morsecalc/calc.c new file mode 100644 index 00000000..49b19a00 --- /dev/null +++ b/movement/lib/morsecalc/calc.c @@ -0,0 +1,113 @@ +/* + * MIT License + * + * Copyright (c) 2023 Christian Chapman + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include + +#include "calc.h" +#include "calc_fns.h" + +#define CALC_NAN (0.0/0.0) + +/* calc_init + * Initialize calculator + */ +int calc_init(calc_state_t *cs) { + memset(cs->stack, CALC_NAN, N_STACK*sizeof(cs->stack[0])); + cs->s = 0; + cs->mem = 0.0; + return 0; +} + +/* calc_input_function + * Try to execut the token as a calculator function + * TODO: Maybe replace this loop with binary search for token in a sorted calc_dict + */ +int calc_input_function(calc_state_t *cs, char *token) { + for(uint8_t idx=0; idxs >= N_STACK) return -2; // Stack full + cs->stack[cs->s++] = d; + return 0; +} + +/* calc_input + * Manipulate the stack using the entered token. + * If the token isn't a calculator function, try to convert it to a number and + * add it to the stack. + * + * Return values: + * 0 if function completed successfully. + * -1 if token isn't a calculator function and couldn't convert to float. + * -2 if stack is too full or too empty + * -3 for something else + */ +int calc_input(calc_state_t *cs, char *token) { + int retval = calc_input_function(cs, token); + if(retval == -1) retval = calc_input_float(cs, token); + return retval; +} -- cgit v1.2.3