43 #define UAVTALK_QXTLOG_DEBUG(...) qDebug() << __VA_ARGS__
44 #else // UAVTALK_DEBUG
45 #define UAVTALK_QXTLOG_DEBUG(...)
46 #endif // UAVTALK_DEBUG
51 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
52 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
53 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
54 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
55 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
56 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
57 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
58 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
59 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
60 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
61 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
62 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
63 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63,
64 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
65 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
66 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3
84 connect(
io.data(), &QIODevice::readyRead,
this, &UAVTalk::processInputStream);
109 void UAVTalk::processInputStream()
111 while (
io &&
io->isReadable()) {
193 if (length <
sizeof(*hdr)) {
197 data +=
sizeof(*hdr);
198 length -=
sizeof(*hdr);
227 if (hdr->
sync != SYNC_VAL) {
252 if ((hdr->
size + 1u) > bytesAvail) {
259 if (ourCrc != *theirCrc) {
270 quint8 *payload =
rxBuffer + startOffset +
sizeof(*hdr);
271 unsigned int payloadBytes = hdr->size -
sizeof(*hdr);
276 startOffset += hdr->size + 1;
283 quint32 rxObjId = qFromLittleEndian(hdr->objId);
291 if (rxObj ==
nullptr) {
293 UAVTALK_QXTLOG_DEBUG(
"UAVTalk: unknown object");
296 UAVTALK_QXTLOG_DEBUG(
"UAVTalk: (transmitting NACK)");
303 quint16 rxInstId = 0;
306 if ((rxType !=
TYPE_NACK) || (payloadBytes == 2)) {
309 rxInstId = *(payload++);
310 rxInstId |= *(payload++) << 8;
320 if (payloadBytes != 0) {
321 UAVTALK_QXTLOG_DEBUG(
"UAVTalk: Unexpected data in req/ack/nack");
328 UAVTALK_QXTLOG_DEBUG(
"UAVTalk: Unexpected payload size for obj");
335 receiveObject(rxType, rxObjId, rxInstId, payload, payloadBytes);
368 if (obj ==
nullptr) {
369 UAVTALK_QXTLOG_DEBUG(
370 QString(
"[uavtalk.cpp ] Received a UAVObject update for a UAVObject we don't "
371 "know about OBJID:%0 INSTID:%1")
372 .arg(QString(QString(
"0x") + QString::number(objId, 16).toUpper()))
386 if (obj !=
nullptr) {
389 UAVTALK_QXTLOG_DEBUG(QString(
"[uavtalk.cpp ] Received an acknowledged UAVObject "
390 "update for a UAVObject we don't know about:")
407 if (obj !=
nullptr) {
427 if (obj !=
nullptr) {
428 UAVTALK_QXTLOG_DEBUG(
429 QString(
"[uavtalk.cpp ] The %0 UAVObject does not exist on the remote end, "
432 + QString(QString(
" 0x") + QString::number(objId, 16).toUpper())));
435 UAVTALK_QXTLOG_DEBUG(
436 QString(
"[uavtalk.cpp ] Critical error: Received a Nack for an unknown "
438 .arg(QString(QString(
"0x") + QString::number(objId, 16).toUpper())));
447 UAVTALK_QXTLOG_DEBUG(
448 QString(
"[uavtalk.cpp ] Got ack for instance:%0 of UAVObject:%1 with ID:%2")
451 .arg(QString(QString(
"0x") + QString::number(objId, 16).toUpper())));
454 if (obj !=
nullptr) {
455 UAVTALK_QXTLOG_DEBUG(
456 QString(
"[uavtalk.cpp ] UAVObject name:%0").arg(obj->
getName()));
480 if (obj ==
nullptr) {
483 if (tobj ==
nullptr) {
488 if (dobj ==
nullptr) {
516 allInstances =
false;
525 for (quint32 instId = 0; instId < numInst; ++instId) {
557 qToLittleEndian<quint32>(objId, &
txBuffer[4]);
583 if (!
io.isNull() &&
io->isWritable() && !blocked) {
586 UAVTALK_QXTLOG_DEBUG(
"UAVTalk: TX refused");
614 qToLittleEndian<quint32>(fileId, &
txBuffer[4]);
615 qToLittleEndian<quint32>(offset, &
txBuffer[8]);
642 qToLittleEndian<quint32>(objId, &
txBuffer[4]);
650 qToLittleEndian<quint16>(allInstId, &
txBuffer[8]);
653 qToLittleEndian<quint16>(instId, &
txBuffer[8]);
quint8 rxBuffer[MAX_PACKET_LENGTH *12]
qint32 unpack(const quint8 *dataIn)
qint32 pack(quint8 *dataOut)
bool receiveObject(quint8 type, quint32 objId, quint16 instId, quint8 *data, quint32 length)
bool objectTransaction(UAVObject *obj, quint8 type, bool allInstances)
static const int TYPE_OBJ_ACK
bool registerObject(UAVDataObject *obj)
bool receiveFileChunk(quint32 fileId, quint8 *data, quint32 length)
static const quint8 crc_table[256]
static const int MAX_PACKET_LENGTH
bool sendObject(UAVObject *obj, bool acked, bool allInstances)
bool transmitNack(quint32 objId)
static const int TYPE_FILEDATA
UAVTalk(QIODevice *iodev, UAVObjectManager *objMngr, bool canBlock=true)
static const int TYPE_VER
static const int TYPE_OBJ
static const int TYPE_MASK
static const int TYPE_OBJ_REQ
static const int TYPE_ACK
static const int MAX_PAYLOAD_LENGTH
void fileDataReceived(quint32 fileId, quint32 offset, quint8 *data, quint32 dataLen, bool eof, bool lastInSeq)
bool transmitFrame(quint32 length, bool incrTxObj=true)
static const quint8 FILEDATA_FLAG_LAST
UAVObject * updateObject(quint32 objId, quint16 instId, quint8 *data)
static const int VER_MASK
static const quint8 FILEDATA_FLAG_EOF
void ackReceived(UAVObject *obj)
static const int TYPE_FILEREQ
UAVObjectManager * objMngr
static const int CHECKSUM_LENGTH
static const int TYPE_NACK
static const quint16 ALL_INSTANCES
virtual UAVDataObject * clone(quint32 instID=0)=0
bool transmitSingleObject(UAVObject *obj, quint8 type, bool allInstances)
quint8 txBuffer[MAX_PACKET_LENGTH]
else error('Your technical computing program does not support file choosers.Please input the file name in the argument. ') end elseif nargin >0 logfile
static const int TX_BACKLOG_SIZE
bool requestFile(quint32 fileId, quint32 offset)
bool transmitObject(UAVObject *obj, quint8 type, bool allInstances)
quint8 updateCRC(quint8 crc, const quint8 *data, qint32 length)
UAVObject * getObject(const QString &name, quint32 instId=0)
static const int MIN_HEADER_LENGTH
qint32 getNumInstances(const QString &name)
bool sendObjectRequest(UAVObject *obj, bool allInstances)
void nackReceived(UAVObject *obj)