Example #1
0
void CPlugins::startPlugin(int number)
{
	dprintf(DEBUG_NORMAL, "CPlugins::startPlugin: %s type:%d\n", plugin_list[number].pluginfile.c_str(), plugin_list[number].type);
	
	// export neutrino settings to the environment
	char tmp[32];
	sprintf(tmp, "%d", g_settings.screen_StartX);
	setenv("SCREEN_OFF_X", tmp, 1);
	sprintf(tmp, "%d", g_settings.screen_StartY);
	setenv("SCREEN_OFF_Y", tmp, 1);
	sprintf(tmp, "%d", g_settings.screen_EndX);
	setenv("SCREEN_END_X", tmp, 1);
	sprintf(tmp, "%d", g_settings.screen_EndY);
	setenv("SCREEN_END_Y", tmp, 1);
	
	// script type
	if (plugin_list[number].type == CPlugins::P_TYPE_SCRIPT)
	{
		g_RCInput->clearRCMsg();
		
		g_RCInput->stopInput();

		startScriptPlugin(number);
		
		frameBuffer->paintBackground();

		frameBuffer->blit();	
		
		g_RCInput->restartInput();
		g_RCInput->clearRCMsg();

		return;
	}

	// neutrinoHD plugins (standalone)
	if ( (plugin_list[number].type == CPlugins::P_TYPE_TOOL) || (plugin_list[number].type == CPlugins::P_TYPE_GAME) )
	{
		/* stop rc input */
		g_RCInput->stopInput();
		
		safe_system((char *) plugin_list[number].pluginfile.c_str());
		
		frameBuffer->paintBackground();

		frameBuffer->blit();
	
		g_RCInput->restartInput();
		g_RCInput->clearRCMsg();
		
		return;
	}
	else if (plugin_list[number].type == CPlugins::P_TYPE_NEUTRINO)
	{
		PluginExec execPlugin;
		void *handle;
		char * error;

		g_RCInput->clearRCMsg();
	
		// load
		handle = dlopen ( plugin_list[number].pluginfile.c_str(), RTLD_NOW);
		if (!handle)
		{
			fputs (dlerror(), stderr);
		} 
		else 
		{
			execPlugin = (PluginExec) dlsym(handle, "plugin_exec");
			if ((error = dlerror()) != NULL)
			{
				fputs(error, stderr);
				dlclose(handle);
			} 
			else 
			{
				dprintf(DEBUG_NORMAL, "[CPlugins] try exec...\n");
				
				frameBuffer->paintBackground();

				frameBuffer->blit();				
					
				execPlugin();
				dlclose(handle);
				dprintf(DEBUG_NORMAL, "[CPlugins] exec done...\n");
			}
		}
			
		g_RCInput->clearRCMsg();
	}
}
Example #2
0
void CPlugins::startPlugin(int number,int param)
{
	printf("CPlugins::startPlugin: %s\n", plugin_list[number].pluginfile.c_str());
	
	// script type
	if (plugin_list[number].type == CPlugins::P_TYPE_SCRIPT)
	{
		startScriptPlugin(number);
		return;
	}
	
	// .so plugins
	if (!pluginfile_exists(plugin_list[number].pluginfile))
	{
		printf("[CPlugins] could not find %s,\nperhaps wrong plugin type in %s\n", plugin_list[number].pluginfile.c_str(), plugin_list[number].cfgfile.c_str());
		return;
	}

	PluginExec execPlugin;
	char depstring[129];
	char			*argv[20];
	void			*libhandle[20];
	int			argc = 0, i = 0, lcd_fd=-1;
	char			*p;
	char			*np;
	void			*handle;
	char *        		error;
	int           		vtpid      =  0;
	PluginParam * 		startparam =  0;

	g_RCInput->clearRCMsg();
	
	// fb
	if (plugin_list[number].fb)
	{
		// filehandle pointer
		startparam = makeParam(P_ID_FBUFFER, frameBuffer->getFileHandle(), startparam);
	}
	
	// rc
	if (plugin_list[number].rc)
	{
		startparam = makeParam(P_ID_RCINPUT  , g_RCInput->getFileHandle()      , startparam);
		startparam = makeParam(P_ID_RCBLK_ANF, g_settings.repeat_genericblocker, startparam);
		startparam = makeParam(P_ID_RCBLK_REP, g_settings.repeat_blocker       , startparam);
	}
	else
	{
		g_RCInput->stopInput();
	}
	
	// lcd	
	if (plugin_list[number].lcd)
	{
		CVFD::getInstance()->pause();

#if defined (PLATFORM_CUBEREVO) || defined (PLATFORM_CUBEREVO_MINI) || defined (PLATFORM_CUBEREVO_MINI2) || defined (PLATFORM_CUBEREVO_MINI_FTA) || defined (PLATFORM_CUBEREVO_250HD) || defined (PLATFORM_CUBEREVO_2000HD) || defined (PLATFORM_CUBEREVO_9500HD)
		lcd_fd = open("/dev/dbox/fp0", O_RDWR);
#else
		lcd_fd = open("/dev/vfd", O_RDWR);
#endif		

		startparam = makeParam(P_ID_LCD, lcd_fd, startparam);
	}	
	
	// vtxtpid	
	if (plugin_list[number].vtxtpid)
	{
		vtpid = g_RemoteControl->current_PIDs.PIDs.vtxtpid;

		if (param>0)
			vtpid=param;
		
		startparam = makeParam(P_ID_VTXTPID, vtpid, startparam);
	}	
	
	// offset
	if (plugin_list[number].needoffset)
	{
		startparam = makeParam(P_ID_VFORMAT  , g_settings.video_Format         , startparam);
		startparam = makeParam(P_ID_OFF_X    , g_settings.screen_StartX        , startparam);
		startparam = makeParam(P_ID_OFF_Y    , g_settings.screen_StartY        , startparam);
		startparam = makeParam(P_ID_END_X    , g_settings.screen_EndX          , startparam);
		startparam = makeParam(P_ID_END_Y    , g_settings.screen_EndY          , startparam);
	}

	PluginParam *par = startparam;
	for ( ; par; par=par->next )
	{
		printf("[CPlugins] (id, val):(%s,%s)\n", par->id, par->val);
	}
	std::string pluginname = plugin_list[number].filename;

	strcpy(depstring, plugin_list[number].depend.c_str());

	argc=0;
	if ( depstring[0] )
	{
		p=depstring;
		while ( 1 )
		{
			argv[ argc ] = p;
			argc++;
			np = strchr(p,',');
			if ( !np )
				break;

			*np=0;
			p=np+1;
			if ( argc == 20 )	// mehr nicht !
				break;
		}
	}
	
	for ( i=0; i<argc; i++ )
	{
		std::string libname = argv[i];
		printf("[CPlugins] try load shared lib : %s\n",argv[i]);
		libhandle[i] = dlopen ( *argv[i] == '/' ?
					argv[i] : (PLUGINDIR "/"+libname).c_str(),
					RTLD_NOW | RTLD_GLOBAL );
		if ( !libhandle[i] )
		{
			fputs (dlerror(), stderr);
			break;
		}
	}
	
	if ( i == argc )		// alles geladen
	{
		handle = dlopen ( plugin_list[number].pluginfile.c_str(), RTLD_NOW);
		if (!handle)
		{
			fputs (dlerror(), stderr);
		} 
		else 
		{
			execPlugin = (PluginExec) dlsym(handle, "plugin_exec");
			if ((error = dlerror()) != NULL)
			{
				fputs(error, stderr);
				dlclose(handle);
			} 
			else 
			{
				printf("[CPlugins] try exec...\n");
				
				
				if (plugin_list[number].fb) 
				{			  
					//frameBuffer->setMode(720, 576, 8);
					//frameBuffer->paletteSet();
				}
				

				execPlugin(startparam);
				dlclose(handle);
				printf("[CPlugins] exec done...\n");
			}
		}

		// restart rc
		if (!plugin_list[number].rc)
			g_RCInput->restartInput();
		
		g_RCInput->clearRCMsg();

		// resume lcd
		if (plugin_list[number].lcd)
		{
			if (lcd_fd != -1)
				close(lcd_fd);
			CVFD::getInstance()->resume();
		}

		// restore fb
		if (plugin_list[number].fb)
		{
			// restore FB mode 
			//if (sizeof(fb_pixel_t) != 1)
			//	frameBuffer->setMode(720, 576, 8 * sizeof(fb_pixel_t));
			
			//frameBuffer->paletteSet();
			//frameBuffer->paintBackgroundBox(0, 0, 720, 576);
			
#ifdef FB_BLIT
			frameBuffer->blit();
#endif			
		}
	}

	/* unload shared libs */
	for ( i=0; i<argc; i++ )
	{
		if ( libhandle[i] )
			dlclose(libhandle[i]);
		else
			break;
	}

	for (par = startparam ; par; )
	{
		/* we must not free par->id, since it is the original */
		free(par->val);
		PluginParam * tmp = par;
		par = par->next;
		delete tmp;
	}
}