Exemplo n.º 1
0
int main(int argc,char **argv)
{
	char manufacturer[256],product[256];
	const char *map_filename = 0,*map_mouse_filename = 0;
	int mode = MODE_MAP;
	int lookup_mode = LOOKUP_MODE_NAME;
	int wait = -1;
	bool disable_repetition = false;
	
	// Check we are root
	uid_t uid;
	uid = geteuid();
	if(uid!=0)
	{
		error("hid_mapper must be run as root\n");
		return EXIT_FAILURE;
	}
	
	// Init hid_device
	init_hid_device(&hid_device);
	
	// Setup signal handler
	signal(SIGTERM,sigterm_handler);
	signal(SIGINT,sigterm_handler);
	
	if(argc==1)
	{
		print_usage();
		return -1;
	}
	
	if(argc==2 && strcmp(argv[1],"--list-devices")==0)
		return lookup_hid_product(LOOKUP_MODE_NAME,0,0,0);
	
	if(argc==3 && strcmp(argv[1],"--list-devices")==0 && strcmp(argv[2],"--lookup-id")==0)
		return lookup_hid_product(LOOKUP_MODE_ID,0,0,0);
	
	manufacturer[0] = '\0';
	product[0] = '\0';
	if(argc>=5)
	{
		for(int i=1;i<argc;i++)
		{
			if(strcmp(argv[i],"--learn")==0)
				mode = MODE_LEARN;
			else if(strcmp(argv[i],"--lookup-id")==0)
				lookup_mode = LOOKUP_MODE_ID;
			else if(strcmp(argv[i],"--disable-repetition")==0)
				disable_repetition = true;
		}
		
		for(int i=1;i<argc-1;i++)
		{
			if(strcmp(argv[i],"--manufacturer")==0)
			{
				strcpy(manufacturer,argv[i+1]);
				i++;
			}
			else if(strcmp(argv[i],"--product")==0)
			{
				strcpy(product,argv[i+1]);
				i++;
			}
			else if(strcmp(argv[i],"--map")==0)
			{
				map_filename = argv[i+1];
				i++;
			}
			else if(strcmp(argv[i],"--map-mouse")==0)
			{
				map_mouse_filename = argv[i+1];
				i++;
			}
			else if(strcmp(argv[i],"--wait-device")==0)
			{
				wait = atoi(argv[i+1]);
				i++;
			}
		}
	}
	
	if(manufacturer[0]=='\0' && product[0]=='\0')
	{
		print_usage();
		return -1;
	}
	
	if(mode==MODE_MAP && map_filename==0 && map_mouse_filename==0)
	{
		print_usage();
		return -1;
	}
	
	if(wait==0)
	{
		print_usage();
		return -1;
	}
	
	// Load map file
	EventMapping *map = new EventMapping();
	
	if((mode==MODE_MAP)||(mode==MODE_LEARN))
	{
		if(map_filename!=0)
		{
			try
			{
				MapReader::LoadMap(map_filename,map);
			}
			catch(Exception e)
			{
				error("Error loading map file %s", map_filename);
				e.Print();
				return EXIT_FAILURE;
			}
			
			info("Loaded map file %s",map_filename);
		}
		
		if(map_mouse_filename!=0)
		{
			try
			{
				MapReaderMouse::LoadMap(map_mouse_filename,map);
			}
			catch(Exception e)
			{
				error("Error loading mouse map file %s", map_mouse_filename);
				e.Print();
				return EXIT_FAILURE;
			}
			
			info("Loaded mouse map file %s",map_mouse_filename);
		}
	}
	
	// Lookup for specified HID device
	int re,max_hid_fd;
	
	if(wait>0)
		fprintf(stderr,"Waiting device for %d second(s)\n",wait);
	
	while(true)
	{
		re = lookup_hid_product(lookup_mode,manufacturer,product,&hid_device);
		
		if(re>=0 || wait<=0)
			break;
		
		wait--;
		sleep(1);
	}
	
	if(re<0)
	{
		error("Unable to find specified HID device (%s; %s)", manufacturer,product);
		return EXIT_FAILURE;
	}
		
	if(wait!=-1)
	{
		re = lookup_hid_product(lookup_mode,manufacturer,product,&hid_device);
	}
	else
	{
		re = lookup_hid_product(lookup_mode,manufacturer,product,&hid_device);
		
	}
	
	info("Found HID device");
	
	// HID
	re = open_hid_device(&hid_device);
	if(re<0)
	{
		error("Unable to open HID device");
		return EXIT_FAILURE;
	}
	
	// Setup event device
	if(mode==MODE_MAP)
	{
		uinput_fd = setup_device(Keys::GetMaxKey());
		if(uinput_fd==-1)
		{
			error("Unable to setup event device");
			return EXIT_FAILURE;
		}
		
		info("Generic USB mapper driver setup");
	}
	
	
	LinkedList<event_mapping> *event_map_list;
	const event_mapping *event_map = NULL;
	unsigned int event_length;
	char event[EVENT_MAXLENGTH];
	int last_key_down = 0, last_key_code = 0;
	unsigned int count = 0;

	// otput "standard" header when learning new map
	if((mode==MODE_LEARN) && (map_filename))
	{
		printf("#\n");
		printf("# manufacturer : %s\n", manufacturer);
		printf("# product : %s\n", product);
		printf("#\n");
	}
	
	while(1)
	{
		// assume two events per key pressed (down & up)
		if((mode==MODE_LEARN) && (map_filename) && (!(count&1)))
		{
			event_map = map->EnumEvent();
			if (!event_map)
				break;
			if ((event_map->length ==1))//&&(event_map->event[0]==0))
				fprintf(stderr, "%d, Press %s(%d)\n",event_map->length,Keys::ReverseLookup(event_map->value),event_map->value);
		}
		event_length = EVENT_MAXLENGTH;
		re = read_hid_event(&hid_device,event,&event_length);
		if(re<0)
		{
			warn("Error reading HID event");
			continue;
		}
		++count;
		
		if(mode==MODE_LEARN)
		{
			if (event_map)
			{
				if ((count&1))
				{
					for(int i=0;i<event_length;i++)
						printf("%02x",(unsigned char)event[i]);
					printf(":%s\n", Keys::ReverseLookup(event_map->value));
				}
			}
			else 
			{
				for(int i=0;i<event_length;i++)
					printf("%02x ",(unsigned char)event[i]);
				printf("\n");
			}
		}
		else
		{
			if(last_key_down!=0)
			{
				send_key_up_event(uinput_fd,last_key_down);
				last_key_down = 0;
			}
			else
			{
				event_map_list = map->LookupEvent(event,event_length);
				event_map_list->StartEnum();
				while(event_map = event_map_list->Enum())
				{
					switch(event_map->type)
					{
						case EVENT_TYPE_KEYBOARD:
							send_key_down_event(uinput_fd,event_map->value);
							last_key_code = event_map->value;
							if(disable_repetition)
								send_key_up_event(uinput_fd,last_key_code);
							else
								last_key_down = last_key_code;
							break;
						
						case EVENT_TYPE_MOUSE_X:
							send_mouse_X_event(uinput_fd,event_map->value);
							break;
						
						case EVENT_TYPE_MOUSE_Y:
							send_mouse_Y_event(uinput_fd,event_map->value);
							break;
						
						case EVENT_TYPE_CORE:
							switch(event_map->value)
							{
								case EVENT_CORE_LAST_KEY:
									if(!last_key_code)
										break;
									
									send_key_down_event(uinput_fd,last_key_code);
									if(disable_repetition)
										send_key_up_event(uinput_fd,last_key_code);
									else
										last_key_down = last_key_code;
									
									break;
							}
							break;
					}
				}
			}
		}
	}

	return 0;
}
Exemplo n.º 2
0
int main(int argc,char **argv)
{
	char manufacturer[256],product[256];
	const char *map_filename = 0,*map_mouse_filename = 0;
	int mode = MODE_MAP;
	int lookup_mode = LOOKUP_MODE_NAME;
	
	// Check we are root
	uid_t uid;
	uid = geteuid();
	if(uid!=0)
	{
		fprintf(stderr,"hid_mapper must be run as root\n");
		return EXIT_FAILURE;
	}
	
	// Init hid_device
	init_hid_device(&hid_device);
	
	// Setup signal handler
	signal(SIGTERM,sigterm_handler);
	signal(SIGINT,sigterm_handler);
	
	if(argc==1)
	{
		print_usage();
		return -1;
	}
	
	if(argc==2 && strcmp(argv[1],"--list-devices")==0)
		return lookup_hid_product(LOOKUP_MODE_NAME,0,0,0);
	
	if(argc==3 && strcmp(argv[1],"--list-devices")==0 && strcmp(argv[2],"--lookup-id")==0)
		return lookup_hid_product(LOOKUP_MODE_ID,0,0,0);
	
	manufacturer[0] = '\0';
	product[0] = '\0';
	if(argc>=5)
	{
		for(int i=1;i<argc;i++)
		{
			if(strcmp(argv[i],"--learn")==0)
				mode = MODE_LEARN;
			if(strcmp(argv[i],"--lookup-id")==0)
				lookup_mode = LOOKUP_MODE_ID;
		}
		
		for(int i=1;i<argc-1;i++)
		{
			if(strcmp(argv[i],"--manufacturer")==0)
			{
				strcpy(manufacturer,argv[i+1]);
				i++;
			}
			else if(strcmp(argv[i],"--product")==0)
			{
				strcpy(product,argv[i+1]);
				i++;
			}
			else if(strcmp(argv[i],"--map")==0)
			{
				map_filename = argv[i+1];
				i++;
			}
			else if(strcmp(argv[i],"--map-mouse")==0)
			{
				map_mouse_filename = argv[i+1];
				i++;
			}
		}
	}
	
	if(manufacturer[0]=='\0' && product[0]=='\0')
	{
		print_usage();
		return -1;
	}
	
	if(mode==MODE_MAP && map_filename==0 && map_mouse_filename==0)
	{
		print_usage();
		return -1;
	}
	
	// Load map file
	EventMapping *map = new EventMapping();
	
	if(mode==MODE_MAP)
	{
		if(map_filename!=0)
		{
			try
			{
				MapReader::LoadMap(map_filename,map);
			}
			catch(Exception e)
			{
				fprintf(stderr,"Error loading map file\n");
				e.Print();
				return EXIT_FAILURE;
			}
			
			printf("Loaded map file %s\n",map_filename);
		}
		
		if(map_mouse_filename!=0)
		{
			try
			{
				MapReaderMouse::LoadMap(map_mouse_filename,map);
			}
			catch(Exception e)
			{
				fprintf(stderr,"Error loading mouse map file\n");
				e.Print();
				return EXIT_FAILURE;
			}
			
			printf("Loaded mouse map file %s\n",map_mouse_filename);
		}
	}
	
	// Lookup for specified HID device
	int re,max_hid_fd;
	
	re = lookup_hid_product(lookup_mode,manufacturer,product,&hid_device);
	if(re<0)
	{
		fprintf(stderr,"Unable to find specified HID device: %d\n", re);
		return EXIT_FAILURE;
	}
	
	printf("Found HID device\n");
	
	// HID
	re = open_hid_device(&hid_device);
	if(re<0)
	{
		fprintf(stderr,"Unable to open HID device\n");
		return EXIT_FAILURE;
	}
	
	// Setup event device
	if(mode==MODE_MAP)
	{
		uinput_fd = setup_device(Keys::GetMaxKey());
		if(uinput_fd==-1)
		{
			fprintf(stderr,"Unable to setup event device\n");
			return EXIT_FAILURE;
		}
		
		printf("Generic USB mapper driver setup\n");
	}
	
	
	LinkedList<event_mapping> *event_map_list;
	const event_mapping *event_map;
	unsigned int event_length;
	char event[EVENT_MAXLENGTH];
	int last_key_down = 0;
	
	while(1)
	{
		event_length = EVENT_MAXLENGTH;
		re = read_hid_event(&hid_device,event,&event_length);
		if(re<0)
		{
			fprintf(stderr,"Error reading HID event\n");
			continue;
		}
		
			if(mode==MODE_LEARN)
		{
			for(int i=0;i<event_length;i++)
				printf("%02x ",(unsigned char)event[i]);
			printf("\n");
		}
		else
		{
			if(last_key_down!=0)
			{
				send_key_up_event(uinput_fd,last_key_down);
				last_key_down = 0;
			}
			else
			{
				event_map_list = map->LookupEvent(event,event_length);
				event_map_list->StartEnum();
				while(event_map = event_map_list->Enum())
				{
					switch(event_map->type)
					{
						case EVENT_TYPE_KEYBOARD:
							send_key_down_event(uinput_fd,event_map->value);
							last_key_down = event_map->value;
							break;
						
						case EVENT_TYPE_MOUSE_X:
							send_mouse_X_event(uinput_fd,event_map->value);
							break;
						
						case EVENT_TYPE_MOUSE_Y:
							send_mouse_Y_event(uinput_fd,event_map->value);
							break;
					}
				}
			}
		}
	}

	return 0;
}
void UpcbJsonParser::ParseUpcbEvents( string eventsArray, PinoutMapping* pinoutMapping )
{
    size_t endIndex;
    size_t startFrom = 0;
    size_t start;
    size_t end;

    size_t sourceIndex;
    size_t targetIndex;
    size_t paramsIndex;
    size_t valueIndex;
    size_t dataTypeIndex;
    size_t parameterStartFrom;

    string parameters;
    string source;
    string target;
    string dataType;
    string eventSource;
    string eventTarget;
    string eventValue;

    while ( true )
    {
        paramsIndex = eventsArray.find( JsonParameters::Parameters, startFrom );
        if ( paramsIndex == string::npos )
            break;
        startFrom = paramsIndex + 1;

        sourceIndex = eventsArray.find( JsonParameters::Source, paramsIndex );
        targetIndex = eventsArray.find( JsonParameters::Target, sourceIndex );
        endIndex = eventsArray.find( "}", targetIndex );

        start = paramsIndex + JsonParameters::Parameters.size() + 3; // ":[ - 3 characters
        end = sourceIndex - 3; // - ]," -
        parameters = eventsArray.substr( start, end - start );

        start = sourceIndex + JsonParameters::Source.size() + 3; // ":"
        end = targetIndex - 3;
        source = eventsArray.substr( start, end - start );

        start = targetIndex + JsonParameters::Target.size() + 3;
        end = endIndex - 1;
        target = eventsArray.substr( start, end - start );

        EventMapping* eventMapping = new EventMapping( source, target );
#ifndef PROFILE
        pinoutMapping->Events()->push_back( eventMapping );
#endif

        parameterStartFrom = 0;
        while ( true )
        {
            dataTypeIndex = parameters.find( JsonParameters::DataType, parameterStartFrom );

            if ( dataTypeIndex == string::npos )
                break;

            parameterStartFrom = dataTypeIndex + 1;
            sourceIndex = parameters.find( JsonParameters::ParameterSource, dataTypeIndex );
            targetIndex = parameters.find( JsonParameters::ParameterTarget, dataTypeIndex );
            valueIndex = parameters.find( JsonParameters::Value, dataTypeIndex );
            endIndex = parameters.find( "}", valueIndex );

            start = dataTypeIndex + JsonParameters::DataType.size() + 3;
            end = sourceIndex - 3;
            dataType = parameters.substr( start, end - start );

            start = sourceIndex + JsonParameters::ParameterSource.size() + 3;
            end = targetIndex - 3;
            eventSource = parameters.substr( start, end - start );

            start = targetIndex + JsonParameters::ParameterTarget.size() + 3;
            end = valueIndex - 3;
            eventTarget = parameters.substr( start, end - start );

            start = valueIndex + JsonParameters::Value.size() + 3;
            end = endIndex - 1;
            eventValue = parameters.substr( start, end - start );

            void* eventValuePointer = NULL;
		    if( dataType == "string ")
		    {
			   string* stringValue  = new string();
			   stringValue->append( eventValue );
			   eventValuePointer = stringValue;
		    }
		    else if( dataType == "int" )
		    {
			   int value = atoi( eventValue.c_str() );
			   eventValuePointer = new int( value );
		    }

            EventParameterMapping* paramMapping =
            		new EventParameterMapping( eventSource, eventTarget, eventValuePointer, dataType );

            eventMapping->Parameters()->push_back( paramMapping );
        }
    }
}