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; }