ready to try executing actual Python within UPIWIN
This commit is contained in:
parent
f30a27ad7c
commit
aa94d80145
19
scripts/tmp_main.py
Normal file
19
scripts/tmp_main.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Initial test script
|
||||
FBPRIMCLR_BLACK = 0x0000
|
||||
FBPRIMCLR_RED = 0xF800
|
||||
FBPRIMCLR_GREEN = 0x07E0
|
||||
FBPRIMCLR_BLUE = 0x001F
|
||||
FBPRIMCLR_YELLOW = 0xFFE0
|
||||
FBPRIMCLR_CYAN = 0x07FF
|
||||
FBPRIMCLR_MAGENTA = 0xF81F
|
||||
FBPRIMCLR_WHITE = 0xFFFF
|
||||
|
||||
upiwin_tmp.filled_rectangle(10, 10, 50, 50, FBPRIMCLR_RED, False)
|
||||
upiwin_tmp.filled_rectangle(60, 10, 100, 50, FBPRIMCLR_GREEN, False)
|
||||
upiwin_tmp.filled_rectangle(110, 10, 150, 50, FBPRIMCLR_BLUE, False)
|
||||
upiwin_tmp.filled_rectangle(10, 60, 50, 100, FBPRIMCLR_CYAN, False)
|
||||
upiwin_tmp.filled_rectangle(60, 60, 100, 100, FBPRIMCLR_MAGENTA, False)
|
||||
upiwin_tmp.filled_rectangle(110, 60, 150, 100, FBPRIMCLR_YELLOW, False)
|
||||
upiwin_tmp.rectangle(10, 110, 150, 150, FBPRIMCLR_WHITE, False)
|
||||
upiwin_tmp.line(10, 110, 150, 150, FBPRIMCLR_WHITE, False)
|
||||
upiwin_tmp.line(10, 150, 150, 110, FBPRIMCLR_WHITE, False)
|
48
src/config.c
48
src/config.c
|
@ -1,5 +1,6 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
|
@ -75,6 +76,7 @@ static HRESULT parse_cmdline(int argc, char *argv[], GLOBAL_CONFIG *parsed)
|
|||
{
|
||||
int c;
|
||||
PSTR pstr;
|
||||
PPCSTR pargs;
|
||||
BOOL help = FALSE;
|
||||
|
||||
memset(parsed, 0, sizeof(GLOBAL_CONFIG));
|
||||
|
@ -123,6 +125,48 @@ static HRESULT parse_cmdline(int argc, char *argv[], GLOBAL_CONFIG *parsed)
|
|||
fputs(helptext, stdout);
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
pstr = realpath(argv[optind], NULL); /* implicit strdup */
|
||||
if (!pstr)
|
||||
{
|
||||
Log(LERROR, "Out of memory in parse_cmdline");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
if (access(pstr, R_OK))
|
||||
{
|
||||
fprintf(stderr, "%s: script %s not found\n", argv[0], pstr);
|
||||
return UPIWIN_E_INVALIDSCRIPT;
|
||||
}
|
||||
parsed->script_name = pstr;
|
||||
if (++optind < argc)
|
||||
{
|
||||
parsed->script_arg_count = argc - optind;
|
||||
pargs = (PPCSTR)malloc(sizeof(PCSTR) * parsed->script_arg_count);
|
||||
if (!pargs)
|
||||
{
|
||||
Log(LERROR, "Out of memory in parse_cmdline");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
for (c = 0; c < parsed->script_arg_count; c++)
|
||||
{
|
||||
pargs[c] = strdup(argv[optind++]);
|
||||
if (!(pargs[c]))
|
||||
{
|
||||
Log(LERROR, "Out of memory in parse_cmdline");
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
}
|
||||
parsed->script_args = pargs;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "%s: no script specified\n", argv[0], c);
|
||||
return UPIWIN_E_NOSCRIPT;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -132,6 +176,10 @@ static void overlay_config(GLOBAL_CONFIG *p)
|
|||
Gconfig.framebuffer_device = p->framebuffer_device;
|
||||
if (p->touchscreen_device)
|
||||
Gconfig.touchscreen_device = p->touchscreen_device;
|
||||
/* always overlay the script name and arguments */
|
||||
Gconfig.script_name = p->script_name;
|
||||
Gconfig.script_arg_count = p->script_arg_count;
|
||||
Gconfig.script_args = p->script_args;
|
||||
}
|
||||
|
||||
HRESULT Config_setup(int argc, char *argv[])
|
||||
|
|
|
@ -12,6 +12,9 @@ typedef struct tagGLOBAL_CONFIG {
|
|||
PCSTR python_loc; /* location of the Python3 executable */
|
||||
UINT32 button_debounce; /* minimum time between button up and next button down (ms) */
|
||||
UINT32 sys_mq_length; /* length of system message queue */
|
||||
PCSTR script_name; /* script name to be run */
|
||||
INT32 script_arg_count; /* number of arguments to pass to the script */
|
||||
PPCSTR script_args; /* arguments to pass to the script */
|
||||
} GLOBAL_CONFIG;
|
||||
|
||||
extern GLOBAL_CONFIG Gconfig; /* one global configuration to rule them all */
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <alloca.h>
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include "scode.h"
|
||||
|
@ -24,8 +27,7 @@ static void epython_cleanup(void)
|
|||
UPIWIN_tmp_module = NULL;
|
||||
Py_DECREF(UPIWIN_module);
|
||||
UPIWIN_module = NULL;
|
||||
if (!Py_FinalizeEx())
|
||||
Log(LWARN, "errors encountered when Python uninitialized itself");
|
||||
Py_FinalizeEx();
|
||||
PyMem_RawFree(python_name);
|
||||
python_name = NULL;
|
||||
}
|
||||
|
@ -91,3 +93,54 @@ error_0:
|
|||
python_name = NULL;
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT Epython_run(void)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
int i;
|
||||
FILE *fp;
|
||||
wchar_t **args;
|
||||
|
||||
Log(LINFO, "Ready to execute %s", Gconfig.script_name);
|
||||
fp = fopen(Gconfig.script_name, "rb");
|
||||
if (fp)
|
||||
{
|
||||
args = (wchar_t **)alloca((Gconfig.script_arg_count + 1) * sizeof(wchar_t *));
|
||||
memset(args, 0, (Gconfig.script_arg_count + 1) * sizeof(wchar_t *));
|
||||
args[0] = Py_DecodeLocale(Gconfig.script_name, NULL);
|
||||
if (args[0])
|
||||
{
|
||||
for (i=0; i<Gconfig.script_arg_count; i++)
|
||||
{
|
||||
args[i + 1] = Py_DecodeLocale(Gconfig.script_args[i], NULL);
|
||||
if (!(args[i + 1]))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
PySys_SetArgvEx(Gconfig.script_arg_count + 1, args, 1);
|
||||
PyRun_SimpleFile(fp, Gconfig.script_name);
|
||||
}
|
||||
else
|
||||
Log(LERROR, "out of memory running script %s", Gconfig.script_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LERROR, "out of memory running script %s", Gconfig.script_name);
|
||||
hr = E_OUTOFMEMORY;
|
||||
}
|
||||
for (i = 0; i<(Gconfig.script_arg_count + 1); i++)
|
||||
if (args[i])
|
||||
PyMem_RawFree(args[i]);
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LERROR, "Unable to open script file %s", Gconfig.script_name);
|
||||
hr = E_ACCESSDENIED;
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
|
|
@ -15,5 +15,6 @@ extern PyObject *Epython_init_upiwin_module(void);
|
|||
extern PyObject *Epython_init_upiwin_tmp_module(void);
|
||||
|
||||
extern HRESULT Epython_setup(void);
|
||||
extern HRESULT Epython_run(void);
|
||||
|
||||
#endif /* __EP_INIT_H_INCLUDED */
|
||||
|
|
19
src/main.c
19
src/main.c
|
@ -11,19 +11,6 @@
|
|||
#include "ep_init.h"
|
||||
#include "sysinput.h"
|
||||
|
||||
static void do_draw(void)
|
||||
{
|
||||
Fb_filled_rectangle(10, 10, 50, 50, FBPRIMCLR_RED, FALSE);
|
||||
Fb_filled_rectangle(60, 10, 100, 50, FBPRIMCLR_GREEN, FALSE);
|
||||
Fb_filled_rectangle(110, 10, 150, 50, FBPRIMCLR_BLUE, FALSE);
|
||||
Fb_filled_rectangle(10, 60, 50, 100, FBPRIMCLR_CYAN, FALSE);
|
||||
Fb_filled_rectangle(60, 60, 100, 100, FBPRIMCLR_MAGENTA, FALSE);
|
||||
Fb_filled_rectangle(110, 60, 150, 100, FBPRIMCLR_YELLOW, FALSE);
|
||||
Fb_rectangle(10, 110, 150, 150, FBPRIMCLR_WHITE, FALSE);
|
||||
Fb_line(10, 110, 150, 150, FBPRIMCLR_WHITE, FALSE);
|
||||
Fb_line(10, 150, 150, 110, FBPRIMCLR_WHITE, FALSE);
|
||||
}
|
||||
|
||||
static void log_touch(const char *event, UINT_PTR x, UINT_PTR y)
|
||||
{
|
||||
Log(LINFO, "Touch %s at (%u, %u)", event, x, y);
|
||||
|
@ -54,10 +41,10 @@ int main(int argc, char *argv[])
|
|||
sleep(2); /* wait to show off splash screen */
|
||||
|
||||
Fb_clear();
|
||||
/* temporary drawing here */
|
||||
do_draw();
|
||||
if (FAILED(Epython_run()))
|
||||
return EXIT_FAILURE;
|
||||
|
||||
Log(LINFO, "System ready.");
|
||||
Log(LINFO, "Script returned and event loop ready.");
|
||||
|
||||
while (running)
|
||||
{
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#define E_UNEXPECTED SCODE_CAST(0x8000FFFF) /* unexpected error */
|
||||
|
||||
/* UPIWIN-specific errorcodes */
|
||||
#define UPIWIN_E_INVALIDSTRING SCODE_CAST(0x80060000) /* invalid string (decode error) */
|
||||
#define UPIWIN_E_INVALIDSCRIPT SCODE_CAST(0x80060000) /* invalid script file */
|
||||
#define UPIWIN_E_NOSCRIPT SCODE_CAST(0x80060001) /* no script specified */
|
||||
|
||||
#endif /* __SCODE_H_INCLUDED */
|
||||
|
|
|
@ -117,6 +117,8 @@ typedef const CHAR *PCSTR;
|
|||
typedef WCHAR *PWSTR;
|
||||
typedef const WCHAR *PCWSTR;
|
||||
|
||||
typedef PCSTR *PPCSTR;
|
||||
|
||||
/* Boolean type */
|
||||
typedef int BOOL;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user