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 <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <getopt.h>
 | 
					#include <getopt.h>
 | 
				
			||||||
@ -75,6 +76,7 @@ static HRESULT parse_cmdline(int argc, char *argv[], GLOBAL_CONFIG *parsed)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int c;
 | 
					  int c;
 | 
				
			||||||
  PSTR pstr;
 | 
					  PSTR pstr;
 | 
				
			||||||
 | 
					  PPCSTR pargs;
 | 
				
			||||||
  BOOL help = FALSE;
 | 
					  BOOL help = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  memset(parsed, 0, sizeof(GLOBAL_CONFIG));
 | 
					  memset(parsed, 0, sizeof(GLOBAL_CONFIG));
 | 
				
			||||||
@ -123,6 +125,48 @@ static HRESULT parse_cmdline(int argc, char *argv[], GLOBAL_CONFIG *parsed)
 | 
				
			|||||||
    fputs(helptext, stdout);
 | 
					    fputs(helptext, stdout);
 | 
				
			||||||
    return S_FALSE;
 | 
					    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;
 | 
					  return S_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -132,6 +176,10 @@ static void overlay_config(GLOBAL_CONFIG *p)
 | 
				
			|||||||
    Gconfig.framebuffer_device = p->framebuffer_device;
 | 
					    Gconfig.framebuffer_device = p->framebuffer_device;
 | 
				
			||||||
  if (p->touchscreen_device)
 | 
					  if (p->touchscreen_device)
 | 
				
			||||||
    Gconfig.touchscreen_device = 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[])
 | 
					HRESULT Config_setup(int argc, char *argv[])
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,9 @@ typedef struct tagGLOBAL_CONFIG {
 | 
				
			|||||||
  PCSTR python_loc;            /* location of the Python3 executable */
 | 
					  PCSTR python_loc;            /* location of the Python3 executable */
 | 
				
			||||||
  UINT32 button_debounce;      /* minimum time between button up and next button down (ms) */
 | 
					  UINT32 button_debounce;      /* minimum time between button up and next button down (ms) */
 | 
				
			||||||
  UINT32 sys_mq_length;        /* length of system message queue */
 | 
					  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;
 | 
					} GLOBAL_CONFIG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern GLOBAL_CONFIG Gconfig;  /* one global configuration to rule them all */
 | 
					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
 | 
					#define PY_SSIZE_T_CLEAN
 | 
				
			||||||
#include <Python.h>
 | 
					#include <Python.h>
 | 
				
			||||||
#include "scode.h"
 | 
					#include "scode.h"
 | 
				
			||||||
@ -24,8 +27,7 @@ static void epython_cleanup(void)
 | 
				
			|||||||
  UPIWIN_tmp_module = NULL;
 | 
					  UPIWIN_tmp_module = NULL;
 | 
				
			||||||
  Py_DECREF(UPIWIN_module);
 | 
					  Py_DECREF(UPIWIN_module);
 | 
				
			||||||
  UPIWIN_module = NULL;
 | 
					  UPIWIN_module = NULL;
 | 
				
			||||||
  if (!Py_FinalizeEx())
 | 
					  Py_FinalizeEx();
 | 
				
			||||||
    Log(LWARN, "errors encountered when Python uninitialized itself");
 | 
					 | 
				
			||||||
  PyMem_RawFree(python_name);
 | 
					  PyMem_RawFree(python_name);
 | 
				
			||||||
  python_name = NULL;
 | 
					  python_name = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -91,3 +93,54 @@ error_0:
 | 
				
			|||||||
  python_name = NULL;
 | 
					  python_name = NULL;
 | 
				
			||||||
  return hr;
 | 
					  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 PyObject *Epython_init_upiwin_tmp_module(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern HRESULT Epython_setup(void);
 | 
					extern HRESULT Epython_setup(void);
 | 
				
			||||||
 | 
					extern HRESULT Epython_run(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __EP_INIT_H_INCLUDED */
 | 
					#endif /* __EP_INIT_H_INCLUDED */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/main.c
									
									
									
									
									
								
							@ -11,19 +11,6 @@
 | 
				
			|||||||
#include "ep_init.h"
 | 
					#include "ep_init.h"
 | 
				
			||||||
#include "sysinput.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)
 | 
					static void log_touch(const char *event, UINT_PTR x, UINT_PTR y)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Log(LINFO, "Touch %s at (%u, %u)", event, x, 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 */
 | 
					  sleep(2); /* wait to show off splash screen */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fb_clear();
 | 
					  Fb_clear();
 | 
				
			||||||
  /* temporary drawing here */
 | 
					  if (FAILED(Epython_run()))
 | 
				
			||||||
  do_draw();
 | 
					    return EXIT_FAILURE;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  Log(LINFO, "System ready.");
 | 
					  Log(LINFO, "Script returned and event loop ready.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (running)
 | 
					  while (running)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
				
			|||||||
@ -64,6 +64,7 @@
 | 
				
			|||||||
#define E_UNEXPECTED                 SCODE_CAST(0x8000FFFF)    /* unexpected error */
 | 
					#define E_UNEXPECTED                 SCODE_CAST(0x8000FFFF)    /* unexpected error */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* UPIWIN-specific errorcodes */
 | 
					/* 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 */
 | 
					#endif /* __SCODE_H_INCLUDED */
 | 
				
			||||||
 | 
				
			|||||||
@ -117,6 +117,8 @@ typedef const CHAR *PCSTR;
 | 
				
			|||||||
typedef WCHAR *PWSTR;
 | 
					typedef WCHAR *PWSTR;
 | 
				
			||||||
typedef const WCHAR *PCWSTR;
 | 
					typedef const WCHAR *PCWSTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PCSTR *PPCSTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Boolean type */
 | 
					/* Boolean type */
 | 
				
			||||||
typedef int BOOL;
 | 
					typedef int BOOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user