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