diff --git a/flight/UAVTalk/inc/uavtalk.h b/flight/UAVTalk/inc/uavtalk.h index f4616ae7d..f15dd1a0a 100644 --- a/flight/UAVTalk/inc/uavtalk.h +++ b/flight/UAVTalk/inc/uavtalk.h @@ -54,6 +54,7 @@ UAVTalkOutputStream UAVTalkGetOutputStream(UAVTalkConnection connection); int32_t UAVTalkSendObject(UAVTalkConnection connection, UAVObjHandle obj, uint16_t instId, uint8_t acked, int32_t timeoutMs); int32_t UAVTalkSendObjectRequest(UAVTalkConnection connection, UAVObjHandle obj, uint16_t instId, int32_t timeoutMs); UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connection, uint8_t rxbyte); +UAVTalkRxState UAVTalkProcessInputStreamQuiet(UAVTalkConnection connection, uint8_t rxbyte); void UAVTalkGetStats(UAVTalkConnection connection, UAVTalkStats *stats); void UAVTalkResetStats(UAVTalkConnection connection); diff --git a/flight/UAVTalk/uavtalk.c b/flight/UAVTalk/uavtalk.c index 1c91ade99..4e944d2ae 100644 --- a/flight/UAVTalk/uavtalk.c +++ b/flight/UAVTalk/uavtalk.c @@ -254,7 +254,7 @@ static int32_t objectTransaction(UAVTalkConnectionData *connection, UAVObjHandle * \param[in] rxbyte Received byte * \return UAVTalkRxState */ -UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connectionHandle, uint8_t rxbyte) +UAVTalkRxState UAVTalkProcessInputStreamQuiet(UAVTalkConnection connectionHandle, uint8_t rxbyte) { UAVTalkConnectionData *connection; CHECKCONHANDLE(connectionHandle,connection,return -1); @@ -449,15 +449,9 @@ UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connectionHandle, uin iproc->state = UAVTALK_STATE_ERROR; break; } - - if (iproc->obj) - { - xSemaphoreTakeRecursive(connection->lock, portMAX_DELAY); - receiveObject(connection, iproc->type, iproc->objId, iproc->instId, connection->rxBuffer, iproc->length); - connection->stats.rxObjectBytes += iproc->length; - connection->stats.rxObjects++; - xSemaphoreGiveRecursive(connection->lock); - } + + connection->stats.rxObjectBytes += iproc->length; + connection->stats.rxObjects++; iproc->state = UAVTALK_STATE_COMPLETE; break; @@ -470,6 +464,30 @@ UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connectionHandle, uin // Done return iproc->state; } + +/** + * Process an byte from the telemetry stream. + * \param[in] connection UAVTalkConnection to be used + * \param[in] rxbyte Received byte + * \return UAVTalkRxState + */ +UAVTalkRxState UAVTalkProcessInputStream(UAVTalkConnection connectionHandle, uint8_t rxbyte) +{ + UAVTalkRxState state = UAVTalkProcessInputStreamQuiet(connectionHandle, rxbyte); + + if (state == UAVTALK_STATE_COMPLETE) + { + UAVTalkConnectionData *connection; + CHECKCONHANDLE(connectionHandle,connection,return -1); + UAVTalkInputProcessor *iproc = &connection->iproc; + + xSemaphoreTakeRecursive(connection->lock, portMAX_DELAY); + receiveObject(connection, iproc->type, iproc->objId, iproc->instId, connection->rxBuffer, iproc->length); + xSemaphoreGiveRecursive(connection->lock); + } + + return state; +} /** * Receive an object. This function process objects received through the telemetry stream. @@ -495,7 +513,7 @@ static int32_t receiveObject(UAVTalkConnectionData *connection, uint8_t type, ui switch (type) { case UAVTALK_TYPE_OBJ: // All instances, not allowed for OBJ messages - if (instId != UAVOBJ_ALL_INSTANCES) + if (obj && (instId != UAVOBJ_ALL_INSTANCES)) { // Unpack object, if the instance does not exist it will be created! UAVObjUnpack(obj, instId, data); @@ -509,7 +527,7 @@ static int32_t receiveObject(UAVTalkConnectionData *connection, uint8_t type, ui break; case UAVTALK_TYPE_OBJ_ACK: // All instances, not allowed for OBJ_ACK messages - if (instId != UAVOBJ_ALL_INSTANCES) + if (obj && (instId != UAVOBJ_ALL_INSTANCES)) { // Unpack object, if the instance does not exist it will be created! if ( UAVObjUnpack(obj, instId, data) == 0 ) @@ -539,7 +557,7 @@ static int32_t receiveObject(UAVTalkConnectionData *connection, uint8_t type, ui break; case UAVTALK_TYPE_ACK: // All instances, not allowed for ACK messages - if (instId != UAVOBJ_ALL_INSTANCES) + if (obj && (instId != UAVOBJ_ALL_INSTANCES)) { // Check if an ack is pending updateAck(connection, obj, instId);