Exemplo n.º 1
0
static void rbwrite(int l)
{
	if (lirc_buffer_full(&rbuf)) {
		/* no new signals will be accepted */
		dprintk("Buffer overrun\n");
		return;
	}
	lirc_buffer_write(&rbuf, (void *)&l);
}
Exemplo n.º 2
0
static void inline rbwrite(lirc_t l)
{
	if(lirc_buffer_full(&rbuf))    /* no new signals will be accepted */
	{
		dprintk("Buffer overrun\n");
		return;
	}
	_lirc_buffer_write_1(&rbuf, (void *)&l);
}
Exemplo n.º 3
0
static void urb_complete(struct urb *urb)
#endif
{
	struct ttusbir_device *ttusbir;
	unsigned char *buf;
	int i;
	lirc_t l;

	ttusbir = urb->context;

	if (!ttusbir->opened)
		return;

	buf = (unsigned char *)urb->transfer_buffer;

	for (i = 0; i < 128; i++) {
		/* Here we do the filtering and some kind of down sampling */
		buf[i] = ~map_table[buf[i]];
		if (ttusbir->last_pulse == buf[i]) {
			if (ttusbir->last_num < PULSE_MASK/63)
				ttusbir->last_num++;
		/*
		 * else we are in a idle period and do not need to
		 * increment any longer
		 */
		} else {
			l = ttusbir->last_num * 62; /* about 62 = us/byte */
			if (ttusbir->last_pulse) /* pulse or space? */
				l |= PULSE_BIT;
			if (!lirc_buffer_full(&ttusbir->rbuf)) {
				lirc_buffer_write(&ttusbir->rbuf, (void *)&l);
				wake_up_interruptible(&ttusbir->rbuf.wait_poll);
			}
			ttusbir->last_num = 0;
			ttusbir->last_pulse = buf[i];
		}
	}
	usb_submit_urb(urb, GFP_ATOMIC); /* keep data rolling :-) */
}
static int cmdir_convert_RX(unsigned char *orig_rxbuffer)
{
	unsigned char tmp_char_buffer[80];
	unsigned int tmp_int_buffer[20];
	unsigned int final_data_buffer[20];
	unsigned int num_data_values = 0;
	unsigned char num_data_bytes = 0;
	unsigned int orig_index = 0;
	int i;

	for (i = 0; i < 80; i++)
		tmp_char_buffer[i] = 0;
	for (i = 0; i < 20; i++)
		tmp_int_buffer[i] = 0;

	/*
	 * get number of data bytes that follow the control bytes
	 * (NOT including them)
	 */
	num_data_bytes = orig_rxbuffer[1];

	/* check if num_bytes is multiple of 3; if not, error */
	if (num_data_bytes % 3 > 0)
		return -1;
	if (num_data_bytes > 60)
		return -3;
	if (num_data_bytes < 3)
		return -2;

	/*
	 * get number of ints to be returned; num_data_bytes does
	 * NOT include control bytes
	 */
	num_data_values = num_data_bytes/3;

	for (i = 0; i < num_data_values; i++) {
		tmp_char_buffer[i*4] = orig_rxbuffer[(i+1)*3];
		tmp_char_buffer[i*4+1] = orig_rxbuffer[(i+1)*3+1];
		tmp_char_buffer[i*4+2] = 0;
		tmp_char_buffer[i*4+3] = 0;
	}

	/* convert to int array */
	memcpy((unsigned char *)tmp_int_buffer, tmp_char_buffer,
						(num_data_values*4));

	if (orig_rxbuffer[5] < 255) {
		/* space */
		final_data_buffer[0] = get_time_value(last_mc_time,
						tmp_int_buffer[0],
						orig_rxbuffer[5]);
	} else { /* is pulse */
		final_data_buffer[0] = get_time_value(last_mc_time,
						tmp_int_buffer[0],
						0);
		final_data_buffer[0] |= PULSE_BIT;
	}
	for (i = 1; i < num_data_values; i++) {
		/*
		 * index of orig_rxbuffer that corresponds to
		 * overflow/pulse/space
		 */
		orig_index = (i + 1)*3 + 2;
		if (orig_rxbuffer[orig_index] < 255) {
			final_data_buffer[i] =
				get_time_value(tmp_int_buffer[i - 1],
					       tmp_int_buffer[i],
					       orig_rxbuffer[orig_index]);
		} else {
			final_data_buffer[i] =
				get_time_value(tmp_int_buffer[i - 1],
					       tmp_int_buffer[i],
					       0);
			final_data_buffer[i] |= PULSE_BIT;
		}
	}
	last_mc_time = tmp_int_buffer[num_data_values - 1];

	if (lirc_buffer_full(&rbuf)) {
		printk(KERN_ERR  LIRC_DRIVER_NAME ": lirc_buffer is full\n");
		return -EOVERFLOW;
	}
	lirc_buffer_write_n(&rbuf, (char *)final_data_buffer, num_data_values);

	return 0;
}