summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kaiman.cc46
-rw-r--r--src/luascript.cc283
-rw-r--r--src/luascript.h86
-rw-r--r--src/mainwindow.cc39
-rw-r--r--src/mainwindow.h44
-rw-r--r--src/outputwindow.cc121
-rw-r--r--src/outputwindow.h62
7 files changed, 681 insertions, 0 deletions
diff --git a/src/kaiman.cc b/src/kaiman.cc
new file mode 100644
index 0000000..82dcfdd
--- /dev/null
+++ b/src/kaiman.cc
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * kaiman.cc
+ *
+ * Sat Aug 4 13:36:06 CEST 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Kaiman.
+ *
+ * Kaiman is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kaiman is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kaiman; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include <QApplication>
+
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ if(argc != 2) {
+ printf("Usage: %s script\n", argv[0]);
+ return 1;
+ }
+
+ QApplication app(argc, argv);
+
+ MainWindow wnd(argv[1]);
+ // wnd.show();
+
+ return app.exec();
+}
+
diff --git a/src/luascript.cc b/src/luascript.cc
new file mode 100644
index 0000000..1699cdf
--- /dev/null
+++ b/src/luascript.cc
@@ -0,0 +1,283 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * luascript.cc
+ *
+ * Tue Jan 10 14:43:39 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "luascript.h"
+
+// For atoi
+#include <stdlib.h>
+
+//#include "luautil.h"
+
+#define GLOBAL_POINTER "_pracroGlobalLUAObjectPointerThisShouldBeANameThatIsNotAccidentallyOverwritten"
+
+#define DEBUG(x, fmt...) printf(fmt)
+#define ERR(x, fmt...) printf(fmt)
+
+static int _debug(lua_State *L)
+{/*
+ Pracro::checkParameters(L,
+ Pracro::T_STRING,
+ Pracro::T_END);
+ */
+ std::string msg = lua_tostring(L, lua_gettop(L));
+
+ printf("%s\n", msg.c_str());
+
+ return 0;
+}
+
+static int _forward(lua_State *L)
+{/*
+ Pracro::checkParameters(L,
+ Pracro::T_STRING,
+ Pracro::T_END);
+ */
+ int x = lua_tonumber(L, lua_gettop(L));
+
+ printf("forward %d\n", x);
+
+ lua_getglobal(L, GLOBAL_POINTER);
+ LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L));
+
+ if(!lua) {
+ lua_pushstring(L, "No LUA pointer!");
+ lua_error(L);
+ return 1;
+ }
+
+ lua->out->forward(x * 5);
+
+ return 0;
+}
+
+static int _turn(lua_State *L)
+{/*
+ Pracro::checkParameters(L,
+ Pracro::T_STRING,
+ Pracro::T_END);
+ */
+ int x = lua_tonumber(L, lua_gettop(L));
+
+ printf("turn %d\n", x);
+
+ lua_getglobal(L, GLOBAL_POINTER);
+ LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L));
+
+ if(!lua) {
+ lua_pushstring(L, "No LUA pointer!");
+ lua_error(L);
+ return 1;
+ }
+
+ lua->out->turn(-x);
+
+ return 0;
+}
+
+static int _reset(lua_State *L)
+{/*
+ Pracro::checkParameters(L,
+ Pracro::T_STRING,
+ Pracro::T_END);
+ */
+
+ printf("reset\n");
+
+ lua_getglobal(L, GLOBAL_POINTER);
+ LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L));
+
+ if(!lua) {
+ lua_pushstring(L, "No LUA pointer!");
+ lua_error(L);
+ return 1;
+ }
+
+ lua->out->reset();
+
+ return 0;
+}
+
+LUAScript::LUAScript(OutputWindow *o)
+{
+ DEBUG(luascript, "LUAScript()\n");
+ L = NULL;
+ out = o;
+}
+
+LUAScript::~LUAScript()
+{
+ if(L) {
+ free(L);
+ L = NULL;
+ }
+ DEBUG(luascript, "~LUAScript()\n");
+}
+
+void LUAScript::init()
+ throw(Exception)
+{
+ if(L) return;
+
+ L = luaL_newstate();
+ if(L == NULL) {
+ ERR(luascript, "Could not create LUA state.\n");
+ throw Exception("Could not create LUA state.");
+ }
+
+ luaL_openlibs(L);
+
+ lua_pushlightuserdata(L, this); // Push the pointer to 'this' instance
+ lua_setglobal(L, GLOBAL_POINTER); // Assign it to a global lua var.
+
+ lua_register(L, "debug", _debug);
+ lua_register(L, "fremad", _forward);
+ lua_register(L, "drej", _turn);
+ lua_register(L, "reset", _reset);
+
+ connect(&watcher, SIGNAL(fileChanged(const QString &)),
+ this, SLOT(reload()));
+}
+
+void LUAScript::addFile(std::string src)
+{
+ file = src.c_str();
+ FILE *fp = fopen(src.c_str(), "r");
+ if(fp) {
+ char buf[64];
+ size_t sz;
+ std::string inc;
+ while((sz = fread(buf, 1, sizeof(buf), fp)) != 0) {
+ inc.append(buf, sz);
+ }
+ fclose(fp);
+ addCode(inc, src);
+ }
+
+ watcher.addPath(file);
+}
+
+void LUAScript::reload()
+{
+ printf("Reload\n");
+ // luaL_error(L, "Terminated due to reload.");
+ // runScript();
+}
+
+void LUAScript::addCode(std::string c, std::string name)
+{
+ scripts.push_back(std::make_pair(c, name));
+}
+
+void LUAScript::run()
+{
+ /*
+ while(true) {
+ printf("."); fflush(stdout);
+ }
+ */
+ try {
+ runScript();
+ } catch(Exception &e) {
+ printf("LUA Error: %s\n", e.msg.c_str());
+ }
+}
+
+void LUAScript::runScript()
+ throw(Exception)
+{
+ try {
+ init();
+ } catch(Exception &e) {
+ throw Exception(e.msg);
+ }
+
+ if(L == NULL) {
+ ERR(luascript, "LUA state not initialized!");
+ return;
+ }
+
+ top = lua_gettop(L);
+
+ std::vector<std::pair<std::string, std::string> >::iterator i =
+ scripts.begin();
+ while(i != scripts.end()) {
+ std::string program = i->first;
+ std::string codename = name();
+ if(i->second != "") codename += ": " + i->second;
+
+ DEBUG(luascript, "Running %s: %s\n", codename.c_str(), program.c_str());
+
+ if(luaL_loadbuffer(L, program.c_str(), program.size(), codename.c_str())) {
+ ERR(luascript, "loadbuffer: %s\n", lua_tostring(L, lua_gettop(L)));
+ throw Exception(lua_tostring(L, lua_gettop(L)));
+ }
+
+ // Run the loaded code
+ if(lua_pcall(L, 0, LUA_MULTRET, 0)) {
+ ERR(luascript, "pcall: %s\n" , lua_tostring(L, lua_gettop(L)));
+ throw Exception(lua_tostring(L, lua_gettop(L)));
+ }
+
+ i++;
+ }
+}
+
+std::string LUAScript::resultString() throw(Exception)
+{
+ if(top != lua_gettop(L) - 1) {
+ ERR(luascript, "Program did not return a single value.\n");
+ throw Exception("Program did not return a single value.");
+ }
+
+ if(lua_isstring(L, lua_gettop(L)) == false) {
+ ERR(luascript, "Program did not return a string value.\n");
+ throw Exception("Program did not return a string value.");
+ }
+
+ std::string res = lua_tostring(L, lua_gettop(L));
+ lua_pop(L, 1);
+
+ return res;
+}
+
+#ifdef TEST_LUASCRIPT
+//Additional dependency files
+//deps:
+//Required cflags (autoconf vars may be used)
+//cflags:
+//Required link options (autoconf vars may be used)
+//libs:
+#include "test.h"
+
+TEST_BEGIN;
+
+// TODO: Put some testcode here (see test.h for usable macros).
+TEST_TRUE(false, "No tests yet!");
+
+TEST_END;
+
+#endif/*TEST_LUASCRIPT*/
diff --git a/src/luascript.h b/src/luascript.h
new file mode 100644
index 0000000..448fe5e
--- /dev/null
+++ b/src/luascript.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * luascript.h
+ *
+ * Tue Jan 10 14:43:39 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __PRACRO_LUASCRIPT_H__
+#define __PRACRO_LUASCRIPT_H__
+
+#include <lua.hpp>
+#include <lauxlib.h>
+
+#include <string>
+#include <map>
+#include <vector>
+#include <QFileSystemWatcher>
+
+#include "outputwindow.h"
+
+#include <QThread>
+
+class LUAScript : public QThread {
+Q_OBJECT
+public:
+ class Exception {
+ public:
+ Exception(std::string m) : msg(m) {}
+ std::string msg;
+ };
+
+ LUAScript(OutputWindow *out);
+ ~LUAScript();
+
+ virtual const char *name() { return ""; }
+
+ void init() throw(Exception);
+
+ void addFile(std::string file);
+ void addCode(std::string code, std::string codename = "");
+
+ void run();
+ void runScript() throw(Exception);
+
+ std::string resultString() throw(Exception);
+
+ OutputWindow *out;
+
+public slots:
+ void reload();
+
+protected:
+ lua_State *L;
+
+private:
+ std::vector<std::pair<std::string, std::string> > scripts;
+ std::map<std::string, std::string> values;
+
+ int top;
+
+ QFileSystemWatcher watcher;
+ QString file;
+};
+
+
+#endif/*__PRACRO_LUASCRIPT_H__*/
diff --git a/src/mainwindow.cc b/src/mainwindow.cc
new file mode 100644
index 0000000..784bfbb
--- /dev/null
+++ b/src/mainwindow.cc
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * mainwindow.cc
+ *
+ * Sat Aug 4 13:37:18 CEST 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Kaiman.
+ *
+ * Kaiman is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kaiman is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kaiman; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "mainwindow.h"
+
+#include "outputwindow.h"
+
+MainWindow::MainWindow(QString program)
+{
+ out = new OutputWindow();
+ out->show();
+ l = new LUAScript(out);
+ l->addFile(program.toStdString());
+ l->start();
+}
diff --git a/src/mainwindow.h b/src/mainwindow.h
new file mode 100644
index 0000000..eeaaa1a
--- /dev/null
+++ b/src/mainwindow.h
@@ -0,0 +1,44 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * mainwindow.h
+ *
+ * Sat Aug 4 13:37:17 CEST 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Kaiman.
+ *
+ * Kaiman is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kaiman is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kaiman; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __KAIMAN_MAINWINDOW_H__
+#define __KAIMAN_MAINWINDOW_H__
+
+#include <QWidget>
+#include "outputwindow.h"
+#include "luascript.h"
+
+class MainWindow : public QWidget {
+public:
+ MainWindow(QString program);
+
+private:
+ OutputWindow *out;
+ LUAScript *l;
+};
+
+#endif/*__KAIMAN_MAINWINDOW_H__*/
diff --git a/src/outputwindow.cc b/src/outputwindow.cc
new file mode 100644
index 0000000..0f66a0b
--- /dev/null
+++ b/src/outputwindow.cc
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * outputwindow.cc
+ *
+ * Sat Aug 4 13:44:41 CEST 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Kaiman.
+ *
+ * Kaiman is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kaiman is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kaiman; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "outputwindow.h"
+
+#include <QPixmap>
+#include <QPainter>
+
+#include <math.h>
+
+OutputWindow::OutputWindow()
+{
+ QPixmap img("gfx/kaiman.png");
+ //QPixmap img("gfx/arrow.png");
+ kaiman = img.toImage();
+ /*
+ QTransform t;
+ t.scale(0.2, 0.2);
+ kaiman = kaiman.transformed(t, Qt::SmoothTransformation);
+ */
+ connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer.setSingleShot(true);
+ timer.start(25);
+
+ reset();
+}
+
+void OutputWindow::timeout()
+{
+ /*
+ x++;
+ y++;
+ r++;
+ */
+ repaint();
+ timer.start(25);
+}
+
+void OutputWindow::paintEvent(QPaintEvent *)
+{
+ // sem.acquire();
+ QPainter p(this);
+
+ QTransform t;
+ t.rotate(-r + 90);
+ t.scale(100.0 / kaiman.width(), 100.0 / kaiman.width());
+ QImage img = kaiman.transformed(t, Qt::SmoothTransformation);
+ p.drawImage(x - img.width()/2, y - img.height()/2, img);
+
+ QPen pen(QColor(255,0,0,100));
+ pen.setWidth(4);
+ p.setPen(pen);
+ p.drawLines(points);
+
+ sem.release();
+}
+
+void OutputWindow::reset()
+{
+ points.clear();
+ x = width() / 2;
+ y = height() / 2;
+ r = 0;
+}
+
+static inline int sign(int x)
+{
+ if(x > 0) return 1;
+ return -1;
+}
+
+void OutputWindow::forward(int x)
+{
+ sem.acquire();
+ float target_x = sin(r * (M_PI / 180.0)) * x;
+ float target_y = cos(r * (M_PI / 180.0)) * x;
+
+ float source_x = this->x;
+ float source_y = this->y;
+
+ for(int i = 0; i < abs(x); i++) {
+ float d = (float)i / (float)x * sign(x);
+ this->x = source_x + target_x * d;
+ this->y = source_y + target_y * d;
+ points.append(QPointF(this->x, this->y));
+ sem.acquire();
+ }
+}
+
+void OutputWindow::turn(int x)
+{
+ sem.acquire();
+ for(int i = 0; i < abs(x) * 2; i++) {
+ this->r += sign(x) * 0.5;
+ sem.acquire();
+ }
+}
diff --git a/src/outputwindow.h b/src/outputwindow.h
new file mode 100644
index 0000000..88b94c8
--- /dev/null
+++ b/src/outputwindow.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * outputwindow.h
+ *
+ * Sat Aug 4 13:44:40 CEST 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Kaiman.
+ *
+ * Kaiman is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kaiman is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Kaiman; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __KAIMAN_OUTPUTWINDOW_H__
+#define __KAIMAN_OUTPUTWINDOW_H__
+
+#include <QGLWidget>
+#include <QTimer>
+#include <QImage>
+#include <QVector>
+#include <QPoint>
+#include <QSemaphore>
+
+class OutputWindow : public QGLWidget {
+Q_OBJECT
+public:
+ OutputWindow();
+
+ void reset();
+
+ void forward(int x);
+ void turn(int x);
+
+public slots:
+ void timeout();
+
+protected:
+ void paintEvent(QPaintEvent * event);
+
+private:
+ QImage kaiman;
+ double x, y, r;
+ QTimer timer;
+ QSemaphore sem;
+ QVector<QPointF> points;
+};
+
+#endif/*__KAIMAN_OUTPUTWINDOW_H__*/