Exemplo n.º 1
0
/***************************************************************************
 *  Function       handle_rc_connect
 *
 *  - Argument:    tBTA_AV_RC_OPEN 	RC open data structure
 *
 *  - Description: RC connection event handler
 *
 ***************************************************************************/
void handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
{
    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
    bt_status_t result = BT_STATUS_SUCCESS;
    int i;
    char bd_str[18];

    if(p_rc_open->status == BTA_AV_SUCCESS)
    {
        memcpy(btif_rc_cb.rc_addr, p_rc_open->peer_addr, sizeof(BD_ADDR));
        btif_rc_cb.rc_features = p_rc_open->peer_features;

        btif_rc_cb.rc_connected = TRUE;
        btif_rc_cb.rc_handle = p_rc_open->rc_handle;

        result = uinput_driver_check();
        if(result == BT_STATUS_SUCCESS)
        {
            init_uinput();
        }
    }
    else
    {
        BTIF_TRACE_ERROR2("%s Connect failed with error code: %d",
            __FUNCTION__, p_rc_open->status);
        btif_rc_cb.rc_connected = FALSE;
    }
}
Exemplo n.º 2
0
static void avctp_connect_cb(GIOChannel *chan, GError *err, gpointer data)
{
	struct avctp *session = data;
	char address[18];
	uint16_t imtu, omtu;
	GError *gerr = NULL;

	if (err) {
		avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
		error("%s", err->message);
		return;
	}

	bt_io_get(chan, &gerr,
			BT_IO_OPT_DEST, &address,
			BT_IO_OPT_IMTU, &imtu,
			BT_IO_OPT_IMTU, &omtu,
			BT_IO_OPT_INVALID);
	if (gerr) {
		avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
		error("%s", gerr->message);
		g_error_free(gerr);
		return;
	}

	DBG("AVCTP: connected to %s", address);

	if (session->control == NULL)
		session->control = avctp_channel_create(session, chan, NULL);

	session->control->imtu = imtu;
	session->control->omtu = omtu;
	session->control->buffer = g_malloc0(MAX(imtu, omtu));
	session->control->watch = g_io_add_watch(session->control->io,
				G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
				(GIOFunc) session_cb, session);

	session->passthrough_id = avctp_register_pdu_handler(session,
						AVC_OP_PASSTHROUGH,
						handle_panel_passthrough,
						NULL);
	session->unit_id = avctp_register_pdu_handler(session,
						AVC_OP_UNITINFO,
						handle_unit_info,
						NULL);
	session->subunit_id = avctp_register_pdu_handler(session,
						AVC_OP_SUBUNITINFO,
						handle_subunit_info,
						NULL);

	init_uinput(session);

	avctp_set_state(session, AVCTP_STATE_CONNECTED);
}
Exemplo n.º 3
0
static void avctp_connect_cb(GIOChannel *chan, int err, const bdaddr_t *src,
			const bdaddr_t *dst, gpointer data)
{
	struct avctp *session = data;
	struct l2cap_options l2o;
	socklen_t len;
	int sk;
	char address[18];

	if (!g_slist_find(sessions, session)) {
		error("avctp_connect_cb: session no longer exists");
		return;
	}

	if (err < 0) {
		avctp_unref(session);
		error("AVCTP connect(%s): %s (%d)", address, strerror(-err),
				-err);
		return;
	}

	ba2str(&session->dst, address);
	debug("AVCTP: connected to %s", address);

	g_io_channel_set_close_on_unref(chan, FALSE);
	sk = g_io_channel_unix_get_fd(chan);
	session->sock = sk;

	memset(&l2o, 0, sizeof(l2o));
	len = sizeof(l2o);
	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
		err = errno;
		avctp_unref(session);
		error("getsockopt(L2CAP_OPTIONS): %s (%d)", strerror(err),
				err);
		return;
	}

	init_uinput(session);

	g_dbus_emit_signal(session->dev->conn, session->dev->path,
					AUDIO_CONTROL_INTERFACE, "Connected",
					DBUS_TYPE_INVALID);

	session->state = AVCTP_STATE_CONNECTED;
	session->mtu = l2o.imtu;
	if (session->io)
		g_source_remove(session->io);
	session->io = g_io_add_watch(chan,
				G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
				(GIOFunc) session_cb, session);
}
Exemplo n.º 4
0
Arquivo: rkbd.c Projeto: 0pq76r/LRKB
int main(int argc, char **argv)
{
	char keys[1024]={0};	

	if(init_uinput()<0)
	{
		perror("init_uinput failed");
		return -1;
	}
	
	int src=server(12345);
	int data;
	
	while(1)
	{
		if(!read(src, &data, 4)){
			exit(1);
		}		
		if(data<1024)
		{
			printf("Got Keycode: %i\n", data);
			keys[data]^=1;
			if(keys[data])
			{
				press_key(data);
			}
			else
			{
				release_key(data);
			}			
		}
		else
		{
			int i;
			for(i=0;i<1024;i++)
			{
				release_key(i);
			}
			memset(keys, 0, 1024);
		}
	}
	
	
	destroy_uinput();

	return 0;
}
Exemplo n.º 5
0
static void avctp_connect_cb(GIOChannel *chan, GError *err, gpointer data)
{
	struct avctp *session = data;
	char address[18];
	uint16_t imtu;
	GError *gerr = NULL;

	if (err) {
		avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
		error("%s", err->message);
		return;
	}

	bt_io_get(chan, BT_IO_L2CAP, &gerr,
			BT_IO_OPT_DEST, &address,
			BT_IO_OPT_IMTU, &imtu,
			BT_IO_OPT_INVALID);
	if (gerr) {
		avctp_set_state(session, AVCTP_STATE_DISCONNECTED);
		error("%s", gerr->message);
		g_error_free(gerr);
		return;
	}

	DBG("AVCTP: connected to %s", address);

	if (!session->io)
		session->io = g_io_channel_ref(chan);

	init_uinput(session);

	avctp_set_state(session, AVCTP_STATE_CONNECTED);
	session->mtu = imtu;
	session->io_id = g_io_add_watch(chan,
				G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
				(GIOFunc) session_cb, session);
}
Exemplo n.º 6
0
static void avctp_connect_session(struct avctp *session)
{
	GIOChannel *io;

	session->state = AVCTP_STATE_CONNECTED;
	session->dev = manager_device_connected(&session->dst,
						AVRCP_TARGET_UUID);
	session->dev->control->session = session;

	init_uinput(session);

	g_dbus_emit_signal(session->dev->conn, session->dev->path,
					AUDIO_CONTROL_INTERFACE, "Connected",
					DBUS_TYPE_INVALID);

	if (session->io)
		g_source_remove(session->io);

	io = g_io_channel_unix_new(session->sock);
	session->io = g_io_add_watch(io,
			G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
			(GIOFunc) session_cb, session);
	g_io_channel_unref(io);
}
Exemplo n.º 7
0
void
XboxdrvDaemon::run()
{
  try 
  {
    create_pid_file();

    init_uinput();

    USBSubsystem usb_subsystem;

    UdevSubsystem udev_subsystem;
    udev_subsystem.set_device_callback(boost::bind(&XboxdrvDaemon::process_match, this, _1));

    boost::scoped_ptr<DBusSubsystem> dbus_subsystem;
    if (m_opts.dbus != Options::kDBusDisabled)
    {
      DBusBusType dbus_bus_type;

      switch(m_opts.dbus)
      {
        case Options::kDBusAuto:
          if (getuid() == 0)
          {
            dbus_bus_type = DBUS_BUS_SYSTEM;
          }
          else
          {
            dbus_bus_type = DBUS_BUS_SESSION;
          }
          break;

        case Options::kDBusSession:
          dbus_bus_type = DBUS_BUS_SESSION;
          break;

        case Options::kDBusSystem:
          dbus_bus_type = DBUS_BUS_SYSTEM;
          break;

        case Options::kDBusDisabled:
        default:
          assert(!"should never happen");
          break;
      }

      dbus_subsystem.reset(new DBusSubsystem("org.seul.Xboxdrv", dbus_bus_type));
      dbus_subsystem->register_xboxdrv_daemon(this);
      dbus_subsystem->register_controller_slots(m_controller_slots);
    }
    
    log_debug("launching into main loop");
    g_main_loop_run(m_gmain);
    log_debug("main loop exited");

    // get rid of active ControllerThreads before the subsystems shutdown
    m_inactive_controllers.clear();
    m_controller_slots.clear();
  }
  catch(const std::exception& err)
  {
    log_error("fatal exception: " << err.what());
  }
}
Exemplo n.º 8
0
int main(int argc, char **argv)
{
	int i;
	int res;
	int one = 1;
	int option_index = 0;
	int c;

	char *main_script = NULL;

	// adding default include paths
	add_include_path(".");
	// TODO: once ordinary installation is available, add /usr/share/kbd-mangler/js or something

	while (1) {
		c = getopt_long(argc, argv, "r:w:I:", long_options, &option_index);
		if (c == -1)
			break;
		switch (c) {
			case 'r': {
				// preparing input device
				int input_fd = open(optarg, O_RDONLY);
				if (input_fd < 0)
				{
					fprintf(stderr, "could not open input device %s: %s\n", optarg, strerror(errno));
					exit(2);
				}
				if (ioctl(input_fd, EVIOCGRAB, (void *)1) < 0)
				{
					fprintf (stderr, "unable to grab device '%s' : %s\n", optarg, strerror(errno));
				}
				if (ioctl(input_fd, FIONBIO, (void *)&one) < 0)
				{
					fprintf (stderr, "unable to set device '%s' to non-blocking mode : %s\n", optarg, strerror(errno));
				}
				if (input_count < MAX_INPUTS) {
					input_fds[input_count++] = input_fd;
				} else {
					fprintf (stderr, "Maximum number of input devices exceeded (%d)\n", MAX_INPUTS);
					exit(1);
				}
				break;
			}

			case 'w':
				if (uinput_fd >= 0) {
					fprintf(stderr, "multiple -w options are not allowed\n");
					usage();
					exit(1);
				}
				init_uinput(optarg);
				break;

			case 'I':
				add_include_path(optarg);
				break;

			case '?':
				break;
			default:
				fprintf(stderr, "getopt returned unexpectd char code: 0%o\n", c);
				exit(1);
		}
	}

	if (uinput_fd == -1) {
		usage();
	}

	// script name left
	if (argc - optind  != 1)
		usage();

	res = InitScripting(argv[optind]); // custom main script

	if (res) {
		main_loop();
	} else {
		fprintf(stderr, "Error initializing scripting\n");
	}

	DestroyScripting();

	for (i = 0; i < input_count; i++)
		close(input_fds[i]);
	close(uinput_fd);
}
Exemplo n.º 9
0
/*
  Chatpad Interface:
  ==================
  bInterfaceNumber        2
  bInterfaceClass       255 Vendor Specific Class
  bInterfaceSubClass     93 
  bInterfaceProtocol      2 
*/
Chatpad::Chatpad(libusb_device_handle* handle, uint16_t bcdDevice,
                 bool no_init, bool debug) :
  m_init_state(kStateInit1),
  m_handle(handle),
  m_bcdDevice(bcdDevice),
  m_no_init(no_init),
  m_debug(debug),
  m_quit_thread(false),
  m_uinput(),
  m_keymap(),
  m_state(),
  m_led_state(0),
  m_read_transfer(0)
{
  if (m_bcdDevice != 0x0110 && m_bcdDevice != 0x0114)
  {
    throw std::runtime_error("unknown bcdDevice version number, please report this issue "
                             "to <*****@*****.**> and include the output of 'lsusb -v'");
  }

  std::fill(m_keymap.begin(), m_keymap.end(), 0);
  std::fill(m_state.begin(), m_state.end(), 0);

  m_keymap[CHATPAD_KEY_1] = KEY_1;
  m_keymap[CHATPAD_KEY_2] = KEY_2; 
  m_keymap[CHATPAD_KEY_3] = KEY_3; 
  m_keymap[CHATPAD_KEY_4] = KEY_4; 
  m_keymap[CHATPAD_KEY_5] = KEY_5; 
  m_keymap[CHATPAD_KEY_6] = KEY_6; 
  m_keymap[CHATPAD_KEY_7] = KEY_7; 
  m_keymap[CHATPAD_KEY_8] = KEY_8; 
  m_keymap[CHATPAD_KEY_9] = KEY_9; 
  m_keymap[CHATPAD_KEY_0] = KEY_0; 
  m_keymap[CHATPAD_KEY_Q] = KEY_Q; 
  m_keymap[CHATPAD_KEY_W] = KEY_W; 
  m_keymap[CHATPAD_KEY_E] = KEY_E; 
  m_keymap[CHATPAD_KEY_R] = KEY_R; 
  m_keymap[CHATPAD_KEY_T] = KEY_T; 
  m_keymap[CHATPAD_KEY_Y] = KEY_Y; 
  m_keymap[CHATPAD_KEY_U] = KEY_U; 
  m_keymap[CHATPAD_KEY_I] = KEY_I; 
  m_keymap[CHATPAD_KEY_O] = KEY_O; 
  m_keymap[CHATPAD_KEY_P] = KEY_P; 
  m_keymap[CHATPAD_KEY_A] = KEY_A; 
  m_keymap[CHATPAD_KEY_S] = KEY_S; 
  m_keymap[CHATPAD_KEY_D] = KEY_D; 
  m_keymap[CHATPAD_KEY_F] = KEY_F; 
  m_keymap[CHATPAD_KEY_G] = KEY_G; 
  m_keymap[CHATPAD_KEY_H] = KEY_H; 
  m_keymap[CHATPAD_KEY_J] = KEY_J; 
  m_keymap[CHATPAD_KEY_K] = KEY_K; 
  m_keymap[CHATPAD_KEY_L] = KEY_L; 
  m_keymap[CHATPAD_KEY_COMMA] = KEY_COMMA; 
  m_keymap[CHATPAD_KEY_Z] = KEY_Z; 
  m_keymap[CHATPAD_KEY_X] = KEY_X; 
  m_keymap[CHATPAD_KEY_C] = KEY_C; 
  m_keymap[CHATPAD_KEY_V] = KEY_V; 
  m_keymap[CHATPAD_KEY_B] = KEY_B; 
  m_keymap[CHATPAD_KEY_N] = KEY_N; 
  m_keymap[CHATPAD_KEY_M] = KEY_M; 
  m_keymap[CHATPAD_KEY_PERIOD] = KEY_DOT;
  m_keymap[CHATPAD_KEY_ENTER] = KEY_ENTER;     
  m_keymap[CHATPAD_KEY_BACKSPACE] = KEY_BACKSPACE; 
  m_keymap[CHATPAD_KEY_LEFT] = KEY_LEFT; 
  m_keymap[CHATPAD_KEY_SPACEBAR] = KEY_SPACE;  
  m_keymap[CHATPAD_KEY_RIGHT] = KEY_RIGHT;

  m_keymap[CHATPAD_MOD_SHIFT]  = KEY_LEFTSHIFT;
  m_keymap[CHATPAD_MOD_GREEN]  = KEY_LEFTALT;
  m_keymap[CHATPAD_MOD_ORANGE] = KEY_LEFTCTRL;
  m_keymap[CHATPAD_MOD_PEOPLE] = KEY_LEFTMETA;
  
  init_uinput();
  
  if (no_init)
  {
    m_init_state = kStateKeepAlive_1e;
  }

  send_command();

  if (m_bcdDevice == 0x0110)
  {
    usb_submit_read(6, 32);
  }
  else if (m_bcdDevice == 0x0114)
  {
    usb_submit_read(4, 32);
  }
}
Exemplo n.º 10
0
int main(int argc, char *argv[])
{
  int en_daemonize = 0;
  int i;

  for(i=1; i<argc; i++){
    if(!strcmp(argv[i], "-d")){
      en_daemonize = 1;
      //daemonize("/tmp", "/tmp/pikeyd.pid");
    }
    if(!strcmp(argv[i], "-k")){
      daemonKill("/tmp/pikeyd.pid");
      exit(0);
    }
    if(!strcmp(argv[i], "-r")){
      joy_enable_repeat();
    }
    if(!strcmp(argv[i], "-v")){
      showVersion();
      exit(0);
    }
    if(!strcmp(argv[i], "-h")){
      showHelp();
      exit(0);
    }
  }

  if(en_daemonize){
    daemonize("/tmp", "/tmp/pikeyd.pid");
  }

  init_iic();
  init_config();

  //test_config(); exit(0);

  //test_iic(0x20);  close_iic();  exit(0);

  //printf("init uinput\n");

  if(init_uinput() == 0){
    sleep(1);
    //test_uinput();
    if(joy_RPi_init()>=0){

      if(!en_daemonize){
	printf("Press ^C to exit.\n");
      }

      for(;;){
	joy_RPi_poll();
	usleep(4000);
      }

      joy_RPi_exit();
    }

    close_uinput();
  }

  return 0;
}