static void send_fragment(struct igorplug *ir, struct lirc_buffer *buf,
			   int i, int max)
{
	/* MODE2: pulse/space (PULSE_BIT) in 1us units */
	while (i < max) {
		/* 1 Igor-tick = 85.333333 us */
		lirc_t code = (unsigned int)ir->buf_in[i] * 85 +
			(unsigned int)ir->buf_in[i] / 3;
		ir->last_time.tv_usec += code;
		if (ir->in_space)
			code |= PULSE_BIT;
		lirc_buffer_write_n(buf, (unsigned char *)&code, 1);
		/* 1 chunk = CODE_LENGTH bytes */
		ir->in_space ^= 1;
		++i;
	}
}
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;
}