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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user