diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2018-03-29 23:08:11 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2018-03-29 23:08:11 -0400 |
commit | 234beaee5de14a601af3eef97f291cddfe5d1b80 (patch) | |
tree | 962fd6c82670eaa6eed484f963b1065b11782678 /src | |
parent | 50233fff403da32473aa499ad45ab4770471966a (diff) |
better keypad stuff
Diffstat (limited to 'src')
-rw-r--r-- | src/keypad.c | 45 | ||||
-rw-r--r-- | src/script.c | 19 |
2 files changed, 40 insertions, 24 deletions
diff --git a/src/keypad.c b/src/keypad.c index 5fe2537..5b04eec 100644 --- a/src/keypad.c +++ b/src/keypad.c @@ -53,18 +53,20 @@ static const port_t keypad_cols[COLS] = { { COL_3 }, { COL_4 } }; -static const int keypad_map[ROWS][COLS] = { - { '&', '|', '^', ' ', ' ' }, - { 'x', 'y', 'z', '=', ' ' }, - { '7', '8', '9', '(', ')' }, - { '4', '5', '6', '/', '%' }, - { '1', '2', '3', '*', '-' }, - { '.', '0', '\b', '\n', '+' } +static const char keypad_map[ROWS * COLS * 4] = { + "&\0\0\0" "|\0\0\0" "pi\0\0" "==\0\0" "!=\0\0" + "x\0\0\0" "y\0\0\0" "z\0\0\0" "=\0\0\0" "sin\0" + "7\0\0\0" "8\0\0\0" "9\0\0\0" "(\0\0\0" ")\0\0\0" + "4\0\0\0" "5\0\0\0" "6\0\0\0" "/\0\0\0" "%\0\0\0" + "1\0\0\0" "2\0\0\0" "3\0\0\0" "*\0\0\0" "-\0\0\0" + ".\0\0\0" "0\0\0\0" "\b\0\0\0" "\n\0\0\0" "+\0\0\0" }; +#define KEY(r, c, i) keypad_map[r * COLS * 4 + c * 4 + i] + #define BUFFER_SIZE 8 -static char keypad_buffer = 0;//[BUFFER_SIZE]; -//static int keypad_buffer_pos = -1; +static char keypad_buffer[BUFFER_SIZE]; +static int keypad_buffer_pos = -1; void keypad_task(void) { @@ -74,8 +76,10 @@ void keypad_task(void) delay(10); for (unsigned int row = 0; row < ROWS; row++) { if (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) { - //if (keypad_buffer_pos < BUFFER_SIZE) - keypad_buffer/*[++keypad_buffer_pos]*/ = keypad_map[row][col]; + if (keypad_buffer_pos < BUFFER_SIZE) { + for (unsigned int i = 0; KEY(row, col, i) != '\0'; i++) + keypad_buffer[++keypad_buffer_pos] = KEY(row, col, i); + } while (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) delay(1); break; @@ -117,15 +121,12 @@ void keypad_start(void) int keypad_get(void) { - //if (keypad_buffer_pos < 0) - // return 0; - - //int key = keypad_buffer[0]; - //for (int i = keypad_buffer_pos - 1; i > 0; i--) - // keypad_buffer[i - 1] = keypad_buffer[i]; - //keypad_buffer_pos--; - //return key; - int ret = keypad_buffer; - keypad_buffer = 0; - return ret; + if (keypad_buffer_pos < 0) + return 0; + + int key = keypad_buffer[0]; + for (int i = 0; i < BUFFER_SIZE - 1; i++) + keypad_buffer[i] = keypad_buffer[i + 1]; + keypad_buffer_pos--; + return key; } diff --git a/src/script.c b/src/script.c index 049608b..733bc4a 100644 --- a/src/script.c +++ b/src/script.c @@ -26,11 +26,12 @@ #include <display_draw.h> #include <heap.h> #include <initrd.h> +#include <it/string.h> +#include <keypad.h> +#include <math.h> #include <random.h> #include <serial.h> #include <stdlib.h> -#include <it/string.h> -#include <keypad.h> #define igetarg_integer(it, n) ((int)igetarg(it, n)->value.f) @@ -48,8 +49,12 @@ int script_pixel(instance *it); int script_menu(instance *it); int script_filemenu(instance *it); +int math_sin(instance *it); + void script_loadlib(instance *it) { + inew_number(it, "pi", 3.1415926f); + inew_cfunc(it, "print", script_puts); inew_cfunc(it, "putchar", script_putchar); inew_cfunc(it, "gets", script_gets); @@ -66,6 +71,16 @@ void script_loadlib(instance *it) inew_cfunc(it, "menu", script_menu); inew_cfunc(it, "filemenu", script_filemenu); + + inew_cfunc(it, "sin", math_sin); +} + +int math_sin(instance *it) +{ + variable *n = igetarg(it, 0); + variable *v = make_varf(0, sinf(n->value.f)); + ipush(it, (uint32_t)v); + return 0; } int script_menu(instance *it) |