diff --git a/src/Makefile b/src/Makefile index 689392e..9afd643 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ -OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_util.o fbinit.o fbprimitive.o log.o gpio.o msg_queue.o \ - time_func.o config.o splash.o +OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_upiwin_tmp.o ep_util.o fbinit.o fbprimitive.o \ + log.o gpio.o msg_queue.o time_func.o config.o splash.o LIBS=-lpython3.7m -lcrypt -lbcm2835 -lpthread -ldl -lutil -lm CFLAGS=-I/usr/include/python3.7m -Wall -fstack-protector -fwrapv -fno-PIE -g -O3 -DDEBUG_ASSERT LDFLAGS=-L/usr/lib/python3.7/config-3.7m-arm-linux-gnueabihf -Xlinker -export-dynamic -Wl,-O1 \ diff --git a/src/ep_init.c b/src/ep_init.c index 2467a59..83f3de3 100644 --- a/src/ep_init.c +++ b/src/ep_init.c @@ -6,37 +6,16 @@ #include "ep_init.h" #include "ep_util.h" -const PCSTR Mod_UPIWIN = "upiwin"; /* name of the primary UPIWIN module */ -const PCSTR Mod_UPIWIN_tmp = "upiwin_tmp"; /* name of the temporary UPIWIN module */ - static wchar_t *python_name = NULL; /* location of the Python executable */ PyObject *UPIWIN_module = NULL; PyObject *UPIWIN_tmp_module = NULL; -static PyModuleDef DefUPIWIN_tmp = { - PyModuleDef_HEAD_INIT, /* standard garbage */ - Mod_UPIWIN, /* module name */ - NULL, /* no doc string */ - -1, /* no per-module memory */ - NULL, /* method defs will be added later */ - NULL, /* no slots for multi-phase init */ - NULL, /* no traversal proc */ - NULL, /* no clear function */ - NULL /* no free function */ -}; - -static PyObject *init_upiwin_tmp_module(void) -{ - PyObject *module = PyModule_Create(&DefUPIWIN_tmp); - return module; -} - /* used to link the two modules into Python's init table */ static struct _inittab upiwin_inittab[] = { - { Mod_UPIWIN, Epython_init_upiwin_module }, - { Mod_UPIWIN_tmp, init_upiwin_tmp_module }, - { NULL, NULL } + { MOD_NAME_UPIWIN, Epython_init_upiwin_module }, + { MOD_NAME_UPIWIN_TMP, Epython_init_upiwin_tmp_module }, + { NULL, NULL } }; static void epython_cleanup(void) @@ -82,14 +61,14 @@ HRESULT Epython_setup(void) Py_Initialize(); /* Import the modules */ - UPIWIN_module = PyImport_ImportModule(Mod_UPIWIN); + UPIWIN_module = PyImport_ImportModule(MOD_NAME_UPIWIN); if (!UPIWIN_module) { Log(LFATAL, "error importing the upiwin module"); hr = Epython_trace_exception(); goto error_1; } - UPIWIN_tmp_module = PyImport_ImportModule(Mod_UPIWIN_tmp); + UPIWIN_tmp_module = PyImport_ImportModule(MOD_NAME_UPIWIN_TMP); if (!UPIWIN_tmp_module) { Log(LFATAL, "error importing the upiwin_tmp module"); diff --git a/src/ep_init.h b/src/ep_init.h index 8d12d97..69cf48c 100644 --- a/src/ep_init.h +++ b/src/ep_init.h @@ -5,13 +5,14 @@ #include #include "wintype.h" -extern const PCSTR Mod_UPIWIN; -extern const PCSTR Mod_UPIWIN_tmp; +#define MOD_NAME_UPIWIN "upiwin" +#define MOD_NAME_UPIWIN_TMP "upiwin_tmp" extern PyObject *UPIWIN_module; extern PyObject *UPIWIN_tmp_module; extern PyObject *Epython_init_upiwin_module(void); +extern PyObject *Epython_init_upiwin_tmp_module(void); extern HRESULT Epython_setup(void); diff --git a/src/ep_upiwin.c b/src/ep_upiwin.c index c4b42d0..9c99dc3 100644 --- a/src/ep_upiwin.c +++ b/src/ep_upiwin.c @@ -20,7 +20,7 @@ static PyMethodDef UPIWINMethods[] = { static PyModuleDef DefUPIWIN = { PyModuleDef_HEAD_INIT, /* standard garbage */ - "upiwin", /* module name */ + MOD_NAME_UPIWIN, /* module name */ NULL, /* no doc string */ sizeof(UPIWIN_STATE), /* per-module memory */ UPIWINMethods, /* method defs */ diff --git a/src/ep_upiwin_tmp.c b/src/ep_upiwin_tmp.c new file mode 100644 index 0000000..5370bba --- /dev/null +++ b/src/ep_upiwin_tmp.c @@ -0,0 +1,81 @@ +#define PY_SSIZE_T_CLEAN +#include +#include "scode.h" +#include "fbprimitive.h" +#include "ep_init.h" + +static PyObject *do_setpixel(PyObject *self, PyObject *args) +{ + INT32 x, y; + UINT16 color, oldcolor; + BOOL xor; + + if (!PyArg_ParseTuple(args, "iiHi", &x, &y, &color, &xor)) + return NULL; + oldcolor = Fb_setpixel(x, y, color, xor); + return PyLong_FromLong((long)oldcolor); +} + +static PyObject *do_line(PyObject *self, PyObject *args) +{ + INT32 x1, y1, x2, y2; + UINT16 color; + BOOL xor; + + if (!PyArg_ParseTuple(args, "iiiiHi", &x1, &y1, &x2, &y2, &color, &xor)) + return NULL; + Fb_line(x1, y1, x2, y2, color, xor); + Py_RETURN_NONE; +} + +static PyObject *do_rectangle(PyObject *self, PyObject *args) +{ + INT32 x1, y1, x2, y2; + UINT16 color; + BOOL xor; + + if (!PyArg_ParseTuple(args, "iiiiHi", &x1, &y1, &x2, &y2, &color, &xor)) + return NULL; + Fb_rectangle(x1, y1, x2, y2, color, xor); + Py_RETURN_NONE; +} + +static PyObject *do_filled_rectangle(PyObject *self, PyObject *args) +{ + INT32 x1, y1, x2, y2; + UINT16 color; + BOOL xor; + + if (!PyArg_ParseTuple(args, "iiiiHi", &x1, &y1, &x2, &y2, &color, &xor)) + return NULL; + Fb_filled_rectangle(x1, y1, x2, y2, color, xor); + Py_RETURN_NONE; +} + +static PyMethodDef UPIWIN_tmpMethods[] = { + {"setpixel", do_setpixel, METH_VARARGS, "Set a single pixel on the display."}, + {"line", do_line, METH_VARARGS, "Draw a line on the display."}, + {"rectangle", do_rectangle, METH_VARARGS, "Draw a rectangle on the display."}, + {"filled_rectangle", do_filled_rectangle, METH_VARARGS, "Draw a filled rectangle on the display."}, + {NULL, NULL, 0, NULL} +}; + +static PyModuleDef DefUPIWIN_tmp = { + PyModuleDef_HEAD_INIT, /* standard garbage */ + MOD_NAME_UPIWIN_TMP, /* module name */ + NULL, /* no doc string */ + -1, /* no per-module memory */ + UPIWIN_tmpMethods, /* method defs */ + NULL, /* no slots for multi-phase init */ + NULL, /* no traversal proc */ + NULL, /* no clear function */ + NULL /* no free function */ +}; + +PyObject *Epython_init_upiwin_tmp_module(void) +{ + PyObject *module; + + module = PyModule_Create(&DefUPIWIN); + return module; +}