Esempio n. 1
0
static int uirt2_raw_deinit(void)
{
	int version;

	if (uirt2_getversion(dev, &version) >= 0 && version >= 0x0905)
		tty_setdtr(drv.fd, 1);
	uirt2_uninit(dev);
	dev = NULL;
	close(drv.fd);
	drv.fd = -1;
	tty_delete_lock();
	return 1;
}
Esempio n. 2
0
static int uirt2_send_mode2_struct1(uirt2_t * dev, struct ir_remote *remote, lirc_t * buf, int length)
{
	const int TABLE_LEN = 2;
	remstruct1_data_t rem;
	int res;
	int table[2][TABLE_LEN];
	int bits = 0;
	int i, j;
	int tUnit;
	int freq;
	int bFrequency;
	int version;
	int repeats = 1;

	memset(&rem, 0, sizeof(rem));

	memset(table[0], 0, sizeof(table[0]));
	memset(table[1], 0, sizeof(table[1]));

	res = uirt2_getversion(dev, &version);
	if (res < 0) {
		return res;
	}
	logprintf(LOG_INFO, "uirt2_raw: UIRT version %04x", version);
	freq = remote->freq;
	if (freq == 0)
		freq = DEFAULT_FREQ;
	if (version >= 0x0905) {
		if (((5000000 / freq) + 1) / 2 >= 0x80) {
			bFrequency = 0x80;
		} else {
			bFrequency = ((5000000 / freq) + 1) / 2;
		}
		tUnit = (bFrequency * 100) / 125;
	} else {
		tUnit = UIRT2_UNIT;
	}
	for (i = 0; i < length; i++) {
		int bit;
		int len = buf[i] / tUnit;

		if (len > UCHAR_MAX) {
			LOGPRINTF(0, "signal too long for transmission %lu", (__u32) buf[i]);
			return 0;
		}
		if (i == 0) {
			rem.bHdr1 = len;
			continue;
		} else if (i == 1) {
			rem.bHdr0 = len;
			continue;
		}

		bit = calc_data_bit(remote, table[i % 2], TABLE_LEN, buf[i], tUnit);

		if (bit < 0) {
			int part_length = i + 1;

			/* is this a repeated signal sequence? */
			if (!(i % 2 /* space */  && buf[i] == remote->min_remaining_gap)) {
				return 0;
			}

			if ((length + 1) % part_length != 0) {
				return 0;
			}

			repeats = (length + 1) / part_length;

			for (j = 1; j < repeats; j++) {
				if (memcmp
				    (&buf[0], &buf[j * part_length],
				     (j + 1 == repeats ? part_length - 1 : part_length) * sizeof(*buf)) != 0) {
					return 0;
				}
			}
			break;
		}

		if (i - 2 > UIRT2_MAX_BITS) {
			logprintf(LOG_ERR, "uirt2_raw: UIRT tried to send %d bits, max is %d", length - 2,
				  UIRT2_MAX_BITS);

			return 0;
		}

		set_data_bit(rem.bDatBits, i - 2, bit);
		bits++;
	}

	LOGPRINTF(2, "bits %d", bits);

	rem.bISDlyHi = remote->min_remaining_gap / tUnit / 256;
	rem.bISDlyLo = (remote->min_remaining_gap / tUnit) & 255;
	rem.bBits = bits;
	rem.bOff0 = table[1][0];
	rem.bOff1 = table[1][1];
	rem.bOn0 = table[0][0];
	rem.bOn1 = table[0][1];

	res = uirt2_send_struct1(dev, freq, repeats, &rem);

	return res;
}
Esempio n. 3
0
static int uirt2_raw_init(void)
{
	int version;

	if (!tty_create_lock(hw.device)) {
		logprintf(LOG_ERR, "uirt2_raw: could not create lock files");
		return (0);
	}

	if ((hw.fd = open(hw.device, O_RDWR | O_NONBLOCK | O_NOCTTY)) < 0) {
		logprintf(LOG_ERR, "uirt2_raw: could not open %s", hw.device);
		tty_delete_lock();
		return (0);
	}

	if (!tty_reset(hw.fd)) {
		logprintf(LOG_ERR, "uirt2_raw: could not reset tty");
		close(hw.fd);
		tty_delete_lock();
		return (0);
	}

	/* Wait for UIRT device to power up */
	usleep(100 * 1000);

	if (!tty_setbaud(hw.fd, 115200)) {
		logprintf(LOG_ERR, "uirt2_raw: could not set baud rate");
		close(hw.fd);
		tty_delete_lock();
		return (0);
	}

	if (!tty_setcsize(hw.fd, 8)) {
		logprintf(LOG_ERR, "uirt2_raw: could not set csize");
		close(hw.fd);
		tty_delete_lock();
		return (0);
	}

	if (!tty_setrtscts(hw.fd, 1)) {
		logprintf(LOG_ERR, "uirt2_raw: could not enable hardware flow");
		close(hw.fd);
		tty_delete_lock();
		return (0);
	}

	if ((dev = uirt2_init(hw.fd)) == NULL) {
		logprintf(LOG_ERR, "uirt2_raw: No UIRT2 device found at %s", hw.device);
		close(hw.fd);
		tty_delete_lock();
		return (0);
	}

	if (uirt2_setmoderaw(dev) < 0) {
		logprintf(LOG_ERR, "uirt2_raw: could not set raw mode");
		uirt2_raw_deinit();
		return (0);
	}

	if (uirt2_getversion(dev, &version) < 0) {
		uirt2_raw_deinit();
		return (0);
	}
	if (version >= 0x0905) {
		if (!tty_setdtr(hw.fd, 0)) {
			logprintf(LOG_ERR, "uirt2_raw: could not set DTR");
			uirt2_raw_deinit();
			return (0);
		}
	}

	init_rec_buffer();
	init_send_buffer();

	rec_rptr = 0;
	rec_wptr = 0;
	rec_size = sizeof(rec_buf) / sizeof(rec_buf[0]);

	return (1);
}