bool MacroPacket::read(CommPortPtr dev, int len, QString &err) { if (command == 0) { if (MACRO_DEBUG) printf("reading command from device\n"); int n = dev->read(&command, 1, err); if (n <= 0) { err = (n < 0) ? (tr("read command error: ") + err) : tr("read timeout"); return false; } checksum += command; len--; if (MACRO_DEBUG) printf("command %s\n" ,cEscape(&command,n).toLatin1().constData()); } if (MACRO_DEBUG) printf("reading %d from device\n", len); char buf[len]; int n = dev->read(&buf, len, err); if (n <= 0) { err = (n < 0) ? (tr("read error: ") + err) : tr("read timeout"); return false; } else if (n < len) { err += QString(tr(", read only %1 bytes instead of: %2")) .arg(n).arg(len); return false; } if (MACRO_DEBUG) printf("payload %s\n" ,cEscape(buf,n).toLatin1().constData()); addToPayload(buf,n); return true; }
bool PowerTapDevice::doWrite(CommPortPtr dev, char c, bool hwecho, QString &err) { if (PT_DEBUG) printf("writing '%c' to device\n", c); int n = dev->write(&c, 1, err); if (n != 1) { if (n < 0) err = QString(tr("failed to write %1 to device: %2")).arg(c).arg(err); else err = QString(tr("timeout writing %1 to device")).arg(c); return false; } if (hwecho) { char c; int n = dev->read(&c, 1, err); if (n != 1) { if (n < 0) err = QString(tr("failed to read back hardware echo: %2")).arg(err); else err = tr("timeout reading back hardware echo"); return false; } } return true; }
static bool dev2path(CommPortPtr dev, QString &path, QString &err) { // Read device path out of device name. Sketchy. QRegExp rx("^Serial: (.+)$"); if (!rx.exactMatch(dev->name())) { err = "SRM download not supported by device " + dev->name(); return false; } path = rx.cap(1); return true; }
bool SrmDevices::exclusivePort( CommPortPtr dev ) { switch( protoVersion ){ case 5: if( dev->type() == "Serial" && dev->name().contains( "PL2303" ) ) return true; break; case 6: case 7: if( dev->type() == "D2XX" && dev->name().startsWith( "POWERCONTROL" ) ) return true; break; } return false; }
QVector<CommPortPtr> D2XX::myListCommPorts(QString &err) { QVector<CommPortPtr> result; if (!lib) { lib = new D2XXWrapper; if (!lib->init(err)) { delete lib; lib = NULL; return result; } } DWORD numDevs; FT_STATUS ftStatus = lib->create_device_info_list(&numDevs); if(ftStatus != FT_OK) { err = QString("FT_CreateDeviceInfoList: %1").arg(ftStatus); return result; } FT_DEVICE_LIST_INFO_NODE *devInfo = new FT_DEVICE_LIST_INFO_NODE[numDevs]; ftStatus = lib->get_device_info_list(devInfo, &numDevs); if (ftStatus != FT_OK) err = QString("FT_GetDeviceInfoList: %1").arg(ftStatus); else { for (DWORD i = 0; i < numDevs; i++) result.append(CommPortPtr(new D2XX(devInfo[i]))); } delete [] devInfo; // If we can't open a D2XX device, it's usually because the VCP drivers // are installed, so it should also show up in the list of serial devices. for (int i = 0; i < result.size(); ++i) { CommPortPtr dev = result[i]; QString tmp; if (dev->open(tmp)) dev->close(); else result.remove(i--); } return result; }
static int readOneByOne(CommPortPtr dev, void *buf, size_t nbyte, QString &err) { char * data = ((char *)buf); int rtn=0; for (size_t i = 0; i < nbyte; i++) { int n = dev->read(data + i, 1, err); if (n <= 0) { return rtn; } if (data[i] == START_1){ int n = dev->read(data + i, 1, err); if (n <= 0) { return rtn; } } rtn++; } return rtn; }
bool MacroPacket::verifyCheckSum(CommPortPtr dev, QString &err) { char _checksum; if (MACRO_DEBUG) printf("reading checksum from device\n"); int n = dev->read(&_checksum, 1, err); if (n <= 0) { err = (n < 0) ? (tr("read checksum error: ") + err) : tr("read timeout"); return false; } if (MACRO_DEBUG) printf("CheckSum1 %d CheckSum2 %d", (0xff & (unsigned) checksum) , (0xff & (unsigned) _checksum)); return checksum == _checksum; }
bool SrmDevices::supportsPort( CommPortPtr dev ) { #if defined(SRMIO_HAVE_TERMIOS) || defined(SRMIO_HAVE_WINCOM) // we could check device name starts with "com" or "/dev" // but we wouldn't have got here unless it was a supported // serial port anyway. if( dev->type() == "Serial" ) return true; #endif #ifdef SRMIO_HAVE_D2XX if( dev->type() == "D2XX" ){ switch( protoVersion ){ case 6: case 7: return true; } } #endif return false; }
int PowerTapDevice::readUntilNewline(CommPortPtr dev, char *buf, int len, QString &err) { int sofar = 0; while (!hasNewline(buf, sofar)) { assert(sofar < len); // Read one byte at a time to avoid waiting for timeout. int n = dev->read(buf + sofar, 1, err); if (n <= 0) { err = (n < 0) ? (tr("read error: ") + err) : tr("read timeout"); err += QString(tr(", read %1 bytes so far: \"%2\"")) .arg(sofar).arg(cEscape(buf, sofar)); return -1; } sofar += n; } return sofar; }
bool MacroPacket::write(CommPortPtr dev, QString &err) { const char *msg = cEscape(data(), payload.count()+2).toLatin1().constData(); if (MACRO_DEBUG) printf("writing '%s' to device\n", msg); int n = dev->write(data(), payload.count()+2, err); if (n != payload.count()+2) { if (n < 0) { if (MACRO_DEBUG) printf("failed to write %s to device: %s\n", msg, err.toLatin1().constData()); err = QString(tr("failed to write to device: %1")).arg(err); } else { if (MACRO_DEBUG) printf("timeout writing %s to device\n", msg); err = QString(tr("timeout writing to device")); } return false; } if (MACRO_DEBUG) printf("writing to device ok\n"); return true; }