aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2018-03-29 23:08:11 -0400
committerClyne Sullivan <tullivan99@gmail.com>2018-03-29 23:08:11 -0400
commit234beaee5de14a601af3eef97f291cddfe5d1b80 (patch)
tree962fd6c82670eaa6eed484f963b1065b11782678 /src
parent50233fff403da32473aa499ad45ab4770471966a (diff)
better keypad stuff
Diffstat (limited to 'src')
-rw-r--r--src/keypad.c45
-rw-r--r--src/script.c19
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)