Changeset 846 for trunk/tools/runonphone/symbianutils/trkdevice.cpp
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/tools/runonphone/symbianutils/trkdevice.cpp
r769 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 53 53 #include <QtCore/QWaitCondition> 54 54 #include <QtCore/QSharedPointer> 55 #include <QtCore/QScopedPointer> 55 56 #include <QtCore/QMetaType> 56 57 … … 103 104 enum { verboseTrk = 0 }; 104 105 106 static inline QString msgAccessingClosedDevice(const QString &msg) 107 { 108 return QString::fromLatin1("Error: Attempt to access device '%1', which is closed.").arg(msg); 109 } 110 105 111 namespace trk { 106 112 … … 156 162 157 163 class TrkWriteQueue 158 { 164 { 159 165 Q_DISABLE_COPY(TrkWriteQueue) 160 166 public: 161 167 explicit TrkWriteQueue(); 168 void clear(); 162 169 163 170 // Enqueue messages. … … 209 216 } 210 217 218 void TrkWriteQueue::clear() 219 { 220 m_trkWriteToken = 0; 221 m_trkWriteBusy = false; 222 m_trkWriteQueue.clear(); 223 const int discarded = m_writtenTrkMessages.size(); 224 m_writtenTrkMessages.clear(); 225 if (verboseTrk) 226 qDebug() << "TrkWriteQueue::clear: discarded " << discarded; 227 } 228 211 229 byte TrkWriteQueue::nextTrkWriteToken() 212 230 { … … 215 233 ++m_trkWriteToken; 216 234 if (verboseTrk) 217 qDebug() << " Write token:" << m_trkWriteToken;235 qDebug() << "nextTrkWriteToken:" << m_trkWriteToken; 218 236 return m_trkWriteToken; 219 237 } … … 350 368 Q_OBJECT 351 369 Q_DISABLE_COPY(WriterThread) 352 public: 370 public: 353 371 explicit WriterThread(const QSharedPointer<DeviceContext> &context); 354 372 … … 358 376 void queueTrkInitialPing(); 359 377 378 void clearWriteQueue(); 379 360 380 // Call this from the device read notification with the results. 361 381 void slotHandleResult(const TrkResult &result); … … 375 395 void invokeNoopMessage(const trk::TrkMessage &); 376 396 377 private: 397 private: 378 398 bool write(const QByteArray &data, QString *errorMessage); 379 399 inline int writePendingMessage(); … … 463 483 wait(); 464 484 m_terminate = false; 485 m_queue.clear(); 465 486 } 466 487 … … 562 583 } 563 584 585 void WriterThread::clearWriteQueue() 586 { 587 m_dataMutex.lock(); 588 m_queue.clear(); 589 m_dataMutex.unlock(); 590 } 591 564 592 void WriterThread::queueTrkInitialPing() 565 593 { … … 593 621 public: 594 622 623 int bytesPending() const { return m_trkReadBuffer.size(); } 624 595 625 signals: 596 626 void messageReceived(const trk::TrkResult &result, const QByteArray &rawData); … … 607 637 608 638 QByteArray m_trkReadBuffer; 639 bool linkEstablishmentMode; 609 640 }; 610 641 611 642 ReaderThreadBase::ReaderThreadBase(const QSharedPointer<DeviceContext> &context) : 612 m_context(context) 643 m_context(context), linkEstablishmentMode(true) 613 644 { 614 645 static const int trkResultMetaId = qRegisterMetaType<trk::TrkResult>(); … … 633 664 TrkResult r; 634 665 QByteArray rawData; 635 while (extractResult(&m_trkReadBuffer, m_context->serialFrame, &r, &rawData)) {666 while (extractResult(&m_trkReadBuffer, m_context->serialFrame, &r, linkEstablishmentMode, &rawData)) { 636 667 emit messageReceived(r, rawData); 637 668 } … … 693 724 emit error(QString::fromLatin1("ClearCommError failed: %1").arg(winErrorMessage(GetLastError()))); 694 725 return -7; 695 } 726 } 696 727 const DWORD bytesToRead = qMax(DWORD(1), qMin(comStat.cbInQue, DWORD(BufSize))); 697 728 // Trigger read … … 709 740 emit error(QString::fromLatin1("Read error: %1").arg(winErrorMessage(readError))); 710 741 return -1; 711 } 742 } 712 743 // Wait for either termination or data 713 744 const DWORD wr = WaitForMultipleObjects(HandleCount, m_handles, false, INFINITE); … … 784 815 }; 785 816 786 UnixReaderThread::UnixReaderThread(const QSharedPointer<DeviceContext> &context) : 817 UnixReaderThread::UnixReaderThread(const QSharedPointer<DeviceContext> &context) : 787 818 ReaderThreadBase(context) 788 819 { … … 878 909 879 910 QSharedPointer<DeviceContext> deviceContext; 880 QS haredPointer<WriterThread> writerThread;881 QS haredPointer<ReaderThread> readerThread;911 QScopedPointer<WriterThread> writerThread; 912 QScopedPointer<ReaderThread> readerThread; 882 913 883 914 QByteArray trkReadBuffer; … … 918 949 bool TrkDevice::open(QString *errorMessage) 919 950 { 920 if (d->verbose )951 if (d->verbose || verboseTrk) 921 952 qDebug() << "Opening" << port() << "is open: " << isOpen() << " serialFrame=" << serialFrame(); 953 if (isOpen()) 954 return true; 922 955 if (d->port.isEmpty()) { 923 956 *errorMessage = QLatin1String("Internal error: No port set on TrkDevice"); 924 957 return false; 925 958 } 926 927 close();928 959 #ifdef Q_OS_WIN 929 960 const QString fullPort = QLatin1String("\\\\.\\") + d->port; … … 976 1007 } 977 1008 #endif 978 d->readerThread = QSharedPointer<ReaderThread>(new ReaderThread(d->deviceContext));1009 d->readerThread.reset(new ReaderThread(d->deviceContext)); 979 1010 connect(d->readerThread.data(), SIGNAL(error(QString)), this, SLOT(emitError(QString)), 980 1011 Qt::QueuedConnection); … … 984 1015 d->readerThread->start(); 985 1016 986 d->writerThread = QSharedPointer<WriterThread>(new WriterThread(d->deviceContext));1017 d->writerThread.reset(new WriterThread(d->deviceContext)); 987 1018 connect(d->writerThread.data(), SIGNAL(error(QString)), this, SLOT(emitError(QString)), 988 Qt::QueuedConnection); 989 d->writerThread->start(); 990 991 if (d->verbose )992 qDebug() << "Opened" << d->port ;1019 Qt::QueuedConnection); 1020 d->writerThread->start(); 1021 1022 if (d->verbose || verboseTrk) 1023 qDebug() << "Opened" << d->port << d->readerThread.data() << d->writerThread.data(); 993 1024 return true; 994 1025 } … … 996 1027 void TrkDevice::close() 997 1028 { 1029 if (verboseTrk) 1030 qDebug() << "close" << d->port << " is open: " << isOpen() 1031 << " read pending " << (d->readerThread.isNull() ? 0 : d->readerThread->bytesPending()) 1032 << sender(); 998 1033 if (!isOpen()) 999 1034 return; … … 1011 1046 d->deviceContext->file.close(); 1012 1047 #endif 1048 1013 1049 if (d->verbose) 1014 1050 emitLogMessage("Close"); … … 1031 1067 void TrkDevice::setPort(const QString &p) 1032 1068 { 1069 if (verboseTrk) 1070 qDebug() << "setPort" << p; 1033 1071 d->port = p; 1034 1072 } … … 1046 1084 void TrkDevice::setSerialFrame(bool f) 1047 1085 { 1086 if (verboseTrk) 1087 qDebug() << "setSerialFrame" << f; 1048 1088 d->deviceContext->serialFrame = f; 1049 1089 } … … 1061 1101 void TrkDevice::slotMessageReceived(const trk::TrkResult &result, const QByteArray &rawData) 1062 1102 { 1063 d->writerThread->slotHandleResult(result); 1064 if (d->verbose > 1) 1065 qDebug() << "Received: " << result.toString(); 1066 emit messageReceived(result); 1067 if (!rawData.isEmpty()) 1068 emit rawDataReceived(rawData); 1103 if (isOpen()) { // Might receive bytes after closing due to queued connections. 1104 d->writerThread->slotHandleResult(result); 1105 if (d->verbose > 1) 1106 qDebug() << "Received: " << result.toString(); 1107 emit messageReceived(result); 1108 if (!rawData.isEmpty()) 1109 emit rawDataReceived(rawData); 1110 } 1069 1111 } 1070 1112 … … 1076 1118 } 1077 1119 1120 void TrkDevice::clearWriteQueue() 1121 { 1122 if (isOpen()) 1123 d->writerThread->clearWriteQueue(); 1124 } 1125 1078 1126 void TrkDevice::sendTrkMessage(byte code, TrkCallback callback, 1079 1127 const QByteArray &data, const QVariant &cookie) 1080 1128 { 1129 if (!isOpen()) { 1130 emitError(msgAccessingClosedDevice(d->port)); 1131 return; 1132 } 1081 1133 if (!d->writerThread.isNull()) { 1082 1134 if (d->verbose > 1) { 1083 QByteArray msg = "Sending: ";1135 QByteArray msg = "Sending: 0x"; 1084 1136 msg += QByteArray::number(code, 16); 1085 1137 msg += ": "; 1086 1138 msg += stringFromArray(data).toLatin1(); 1139 if (cookie.isValid()) 1140 msg += " Cookie: " + cookie.toString().toLatin1(); 1087 1141 qDebug("%s", msg.data()); 1088 1142 } … … 1093 1147 void TrkDevice::sendTrkInitialPing() 1094 1148 { 1149 if (!isOpen()) { 1150 emitError(msgAccessingClosedDevice(d->port)); 1151 return; 1152 } 1095 1153 if (!d->writerThread.isNull()) 1096 1154 d->writerThread->queueTrkInitialPing(); … … 1099 1157 bool TrkDevice::sendTrkAck(byte token) 1100 1158 { 1159 if (!isOpen()) { 1160 emitError(msgAccessingClosedDevice(d->port)); 1161 return false; 1162 } 1101 1163 if (d->writerThread.isNull()) 1102 1164 return false;
Note:
See TracChangeset
for help on using the changeset viewer.