summaryrefslogtreecommitdiff
path: root/components/external/lua/applications
diff options
context:
space:
mode:
author[email protected] <[email protected]>2012-11-10 07:32:39 +0000
committer[email protected] <[email protected]>2012-11-10 07:32:39 +0000
commitc77e9d5c76edada64500fa4c38dee847992f61d7 (patch)
treef145b9e1312059dab6002d46188a91238fec4079 /components/external/lua/applications
parent0d77b327a998c35e53025690415a3d355717eb95 (diff)
add lua support for rt-thead
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2399 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/external/lua/applications')
-rw-r--r--components/external/lua/applications/SConscript11
-rw-r--r--components/external/lua/applications/lua_in_finsh.c162
2 files changed, 173 insertions, 0 deletions
diff --git a/components/external/lua/applications/SConscript b/components/external/lua/applications/SConscript
new file mode 100644
index 0000000000..c891d565be
--- /dev/null
+++ b/components/external/lua/applications/SConscript
@@ -0,0 +1,11 @@
+
+import os
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd, str(Dir('#'))]
+
+group = DefineGroup('lua', src, depend = ['RT_USING_LUA'], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/components/external/lua/applications/lua_in_finsh.c b/components/external/lua/applications/lua_in_finsh.c
new file mode 100644
index 0000000000..9fe38b0981
--- /dev/null
+++ b/components/external/lua/applications/lua_in_finsh.c
@@ -0,0 +1,162 @@
+/**
+ * run lua interpreter from finsh
+ */
+
+#include "rtthread.h"
+#include "finsh.h"
+#include "shell.h"
+
+struct
+{
+ struct rt_semaphore sem;
+ rt_device_t device;
+} dev4lua;
+
+extern int lua_main(int argc, char **argv);
+
+rt_err_t lua_rx_ind(rt_device_t dev, rt_size_t size)
+{
+ rt_sem_release(&dev4lua.sem);
+
+ return RT_EOK;
+}
+
+void finsh_lua(void *parameter)
+{
+ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
+
+ rt_sem_init(&(dev4lua.sem), "luasem", 0, 0);
+
+ /* save old rx_indicate */
+ rx_indicate = dev4lua.device->rx_indicate;
+
+ /* set new rx_indicate */
+ rt_device_set_rx_indicate(dev4lua.device, lua_rx_ind);
+
+ {
+ int argc = 1;
+ char *argv[] = {"lua", NULL};
+
+ /* run lua interpreter */
+ lua_main(argc, argv);
+ }
+
+ /* recover old rx_indicate */
+ rt_device_set_rx_indicate(dev4lua.device, rx_indicate);
+}
+
+static void lua(void)
+{
+ rt_thread_t lua_thread;
+ const char* device_name = finsh_get_device();
+ rt_device_t device = rt_device_find(device_name);
+ if (device == RT_NULL)
+ {
+ rt_kprintf("%s not find\n", device_name);
+ return;
+ }
+ dev4lua.device = device;
+
+#if 0
+ /* Run lua interpreter in separate thread */
+ lua_thread = rt_thread_create("lua",
+ finsh_lua,
+ 0,
+ 2048,
+ rt_thread_self()->current_priority + 1,
+ 20);
+ if (lua_thread != RT_NULL)
+ {
+ rt_thread_startup(lua_thread);
+ }
+#else
+ /* Directly run lua interpreter in finsh */
+ finsh_lua(0);
+#endif
+}
+FINSH_FUNCTION_EXPORT(lua, lua interpreter)
+
+int readline4lua(const char *prompt, char *buffer, int buffer_size)
+{
+ char ch;
+ int line_position;
+
+start:
+ /* show prompt */
+ rt_kprintf(prompt);
+
+ line_position = 0;
+ memset(buffer, 0, buffer_size);
+ while (1)
+ {
+ if (rt_sem_take(&dev4lua.sem, RT_WAITING_FOREVER) != RT_EOK)
+ {
+ return 0;
+ }
+
+ while (rt_device_read(dev4lua.device, 0, &ch, 1) == 1)
+ {
+ /* handle CR key */
+ if (ch == '\r')
+ {
+ char next;
+ if (rt_device_read(dev4lua.device, 0, &next, 1) == 1)
+ ch = next;
+ }
+ /* backspace key */
+ else if (ch == 0x7f || ch == 0x08)
+ {
+ if (line_position > 0)
+ {
+ rt_kprintf("%c %c", ch, ch);
+ line_position--;
+ }
+ buffer[line_position] = 0;
+ continue;
+ }
+ /* EOF(ctrl+d) */
+ else if (ch == 0x04)
+ {
+ if (line_position == 0)
+ /* No input which makes lua interpreter close */
+ return 0;
+ else
+ continue;
+ }
+
+ /* end of line */
+ if (ch == '\r' || ch == '\n')
+ {
+ buffer[line_position] = 0;
+ rt_kprintf("\n");
+ if (line_position == 0)
+ {
+ /* Get a empty line, then go to get a new line */
+ goto start;
+ }
+ else
+ {
+ return line_position;
+ }
+ }
+
+ /* other control character or not an acsii character */
+ if (ch < 0x20 || ch >= 0x80)
+ {
+ continue;
+ }
+
+ /* echo */
+ rt_kprintf("%c", ch);
+ buffer[line_position] = ch;
+ ch = 0;
+ line_position++;
+
+ /* it's a large line, discard it */
+ if (line_position >= buffer_size)
+ line_position = 0;
+ }
+ }
+}
+
+