1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-20 10:54:14 +01:00

OP-1122 OP-1125 uavtalk - minor OPReview-593 related cleanups

This commit is contained in:
Philippe Renon 2013-11-28 23:42:08 +01:00
parent 2f0974fda9
commit 50a0a4f512
4 changed files with 50 additions and 42 deletions

View File

@ -63,7 +63,6 @@ typedef struct {
uint32_t objId;
uint16_t instId;
uint32_t length;
uint8_t instanceLength;
uint8_t timestampLength;
uint8_t cs;
uint16_t timestamp;

View File

@ -32,6 +32,8 @@
#include "openpilot.h"
#include "uavtalk_priv.h"
// Size of instance ID (2 bytes)
#define UAVTALK_INSTANCE_LENGTH 2
// Private functions
static int32_t objectTransaction(UAVTalkConnectionData *connection, uint8_t type, UAVObjHandle obj, uint16_t instId, int32_t timeout);
@ -422,23 +424,23 @@ UAVTalkRxState UAVTalkProcessInputStreamQuiet(UAVTalkConnection connectionHandle
iproc->timestampLength = (iproc->type & UAVTALK_TIMESTAMPED) ? 2 : 0;
}
// Message always contain an instance ID
iproc->instanceLength = 2;
// Check length and determine next state
if (iproc->length >= UAVTALK_MAX_PAYLOAD_LENGTH) {
// packet error - exceeded payload max length
connection->stats.rxErrors++;
iproc->state = UAVTALK_STATE_ERROR;
break;
}
// Check the lengths match
if ((iproc->rxPacketLength + iproc->instanceLength + iproc->timestampLength + iproc->length) != iproc->packet_size) { // packet error - mismatched packet size
if ((iproc->rxPacketLength + UAVTALK_INSTANCE_LENGTH + iproc->timestampLength + iproc->length) != iproc->packet_size) {
// packet error - mismatched packet size
connection->stats.rxErrors++;
iproc->state = UAVTALK_STATE_ERROR;
break;
}
// Message always contain an instance ID
iproc->rxCount = 0;
iproc->instId = 0;
iproc->state = UAVTALK_STATE_INSTID;
@ -585,25 +587,23 @@ UAVTalkRxState UAVTalkRelayPacket(UAVTalkConnection inConnectionHandle, UAVTalkC
// Lock
xSemaphoreTakeRecursive(outConnection->lock, portMAX_DELAY);
// Setup type and object id fields
outConnection->txBuffer[0] = UAVTALK_SYNC_VAL; // sync byte
// Setup sync byte
outConnection->txBuffer[0] = UAVTALK_SYNC_VAL;
// Setup type
outConnection->txBuffer[1] = inIproc->type;
// data length inserted here below
int32_t dataOffset = 8;
// next 2 bytes are reserved for data length (inserted here later)
int32_t dataOffset = 4;
if (inIproc->objId != 0) {
// Setup object ID
outConnection->txBuffer[4] = (uint8_t)(inIproc->objId & 0xFF);
outConnection->txBuffer[5] = (uint8_t)((inIproc->objId >> 8) & 0xFF);
outConnection->txBuffer[6] = (uint8_t)((inIproc->objId >> 16) & 0xFF);
outConnection->txBuffer[7] = (uint8_t)((inIproc->objId >> 24) & 0xFF);
// Setup instance ID if one is required
if (inIproc->instanceLength > 0) {
outConnection->txBuffer[8] = (uint8_t)(inIproc->instId & 0xFF);
outConnection->txBuffer[9] = (uint8_t)((inIproc->instId >> 8) & 0xFF);
dataOffset = 10;
}
} else {
dataOffset = 4;
// Setup instance ID
outConnection->txBuffer[8] = (uint8_t)(inIproc->instId & 0xFF);
outConnection->txBuffer[9] = (uint8_t)((inIproc->instId >> 8) & 0xFF);
dataOffset = 10;
}
// Add timestamp when the transaction type is appropriate
@ -860,26 +860,26 @@ static int32_t sendSingleObject(UAVTalkConnectionData *connection, uint8_t type,
int32_t length;
int32_t dataOffset;
// Important note : obj can be null (when type is NACK for example) so protect all obj dereferences.
// IMPORTANT : obj can be null (when type is NACK for example)
if (!connection->outStream) {
return -1;
}
// Setup type and object id fields
connection->txBuffer[0] = UAVTALK_SYNC_VAL; // sync byte
// Setup sync byte
connection->txBuffer[0] = UAVTALK_SYNC_VAL;
// Setup type
connection->txBuffer[1] = type;
// data length inserted here below
// next 2 bytes are reserved for data length (inserted here later)
// Setup object ID
connection->txBuffer[4] = (uint8_t)(objId & 0xFF);
connection->txBuffer[5] = (uint8_t)((objId >> 8) & 0xFF);
connection->txBuffer[6] = (uint8_t)((objId >> 16) & 0xFF);
connection->txBuffer[7] = (uint8_t)((objId >> 24) & 0xFF);
dataOffset = 8;
// The instance ID is always sent
// Setup instance ID
connection->txBuffer[8] = (uint8_t)(instId & 0xFF);
connection->txBuffer[9] = (uint8_t)((instId >> 8) & 0xFF);
dataOffset += 2;
dataOffset = 10;
// Add timestamp when the transaction type is appropriate
if (type & UAVTALK_TIMESTAMPED) {

View File

@ -248,6 +248,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte)
case STATE_SYNC:
if (rxbyte != SYNC_VAL) {
// continue until synch byte is matched
UAVTALK_QXTLOG_DEBUG("UAVTalk: Sync->Sync (" + QString::number(rxbyte) + " " + QString("0x%1").arg(rxbyte, 2, 16) + ")");
break;
}
@ -337,14 +338,16 @@ bool UAVTalk::processInputByte(quint8 rxbyte)
if (rxType == TYPE_OBJ_REQ || rxType == TYPE_ACK || rxType == TYPE_NACK) {
rxLength = 0;
} else {
rxLength = rxObj->getNumBytes();
if (rxObj) {
rxLength = rxObj->getNumBytes();
} else {
rxLength = packetSize - rxPacketLength;
}
}
// The instance ID is always sent
rxInstanceLength = 2;
// Check length and determine next state
if (rxLength >= MAX_PAYLOAD_LENGTH) {
// packet error - exceeded payload max length
stats.rxErrors++;
rxState = STATE_SYNC;
UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Sync (oversize)");
@ -352,7 +355,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte)
}
// Check the lengths match
if ((rxPacketLength + rxInstanceLength + rxLength) != packetSize) {
if ((rxPacketLength + INSTANCE_LENGTH + rxLength) != packetSize) {
// packet error - mismatched packet size
stats.rxErrors++;
rxState = STATE_SYNC;
@ -360,6 +363,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte)
break;
}
// Message always contain an instance ID
rxCount = 0;
rxInstId = 0;
rxState = STATE_INSTID;
@ -707,22 +711,25 @@ bool UAVTalk::transmitObject(quint8 type, quint32 objId, quint16 instId, UAVObje
*/
bool UAVTalk::transmitSingleObject(quint8 type, quint32 objId, quint16 instId, UAVObject *obj)
{
#ifdef VERBOSE_UAVTALK
qDebug() << "UAVTalk - transmitting object" << objId << instId << (obj != NULL ? obj->toStringBrief() : "<null object>");
#endif
qint32 length;
qint32 dataOffset;
// Setup type and object id fields
txBuffer[0] = SYNC_VAL;
txBuffer[1] = type;
// data length inserted here below
qToLittleEndian<quint32>(objId, &txBuffer[4]);
dataOffset = 8;
#ifdef VERBOSE_UAVTALK
qDebug() << "UAVTalk - transmitting object" << objId << instId << (obj != NULL ? obj->toStringBrief() : "<null object>");
#endif
// The instance ID is always sent
// IMPORTANT : obj can be null (when type is NACK for example)
// Setup sync byte
txBuffer[0] = SYNC_VAL;
// Setup type
txBuffer[1] = type;
// next 2 bytes are reserved for data length (inserted here later)
// Setup object ID
qToLittleEndian<quint32>(objId, &txBuffer[4]);
// Setup instance ID
qToLittleEndian<quint16>(instId, &txBuffer[8]);
dataOffset += 2;
dataOffset = 10;
// Determine data length
if (type == TYPE_OBJ_REQ || type == TYPE_ACK || type == TYPE_NACK) {
@ -743,6 +750,7 @@ bool UAVTalk::transmitSingleObject(quint8 type, quint32 objId, quint16 instId, U
}
}
// Store the packet length
qToLittleEndian<quint16>(dataOffset + length, &txBuffer[2]);
// Calculate checksum

View File

@ -94,6 +94,8 @@ private:
static const quint16 ALL_INSTANCES = 0xFFFF;
static const quint8 INSTANCE_LENGTH = 2;
static const int TX_BUFFER_SIZE = 2 * 1024;
static const quint8 crc_table[256];
@ -114,7 +116,6 @@ private:
quint16 rxInstId;
quint16 rxLength;
quint16 rxPacketLength;
quint8 rxInstanceLength;
quint8 rxCSPacket, rxCS;
qint32 rxCount;