|
@@ -257,16 +257,20 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
|
{
|
|
|
shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
uint32_t outPayloadLength = length;
|
|
|
+ shellmatta_transport_packet_t *packet = &transportLayer->outputPacketBuffer;
|
|
|
|
|
|
/* handle data with length bigger than max length */
|
|
|
- uint16_t processedLength = 0u;
|
|
|
- uint16_t splitLength = 0u;
|
|
|
- uint16_t splitPayloadLength = 0u;
|
|
|
- uint16_t restOfPayload = 0u;
|
|
|
+ uint32_t piledUpPayload;
|
|
|
+ uint32_t processedLength = 0u;
|
|
|
+ uint32_t splitLength = 0u;
|
|
|
+ uint32_t splitPayloadLength = 0u;
|
|
|
+ uint32_t restOfPayload = 0u;
|
|
|
|
|
|
/* foot-controlled loop to send packets without payload length */
|
|
|
do
|
|
|
{
|
|
|
+ piledUpPayload = transportLayer->outputPacketBuffer.payloadLength;
|
|
|
+
|
|
|
/* compute length of next payload split */
|
|
|
restOfPayload = (outPayloadLength - processedLength);
|
|
|
if (restOfPayload > SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH)
|
|
@@ -279,14 +283,39 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
|
}
|
|
|
splitPayloadLength = splitLength - SHELLMATTA_HEADER_LENGTH - SHELLMATTA_LENGTH_CRC;
|
|
|
|
|
|
- transportLayer->outputPacketBuffer.packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
- transportLayer->outputPacketBuffer.payloadLength = splitPayloadLength;
|
|
|
- (void)memcpy(transportLayer->outputPacketBuffer.payload, &data[processedLength], splitPayloadLength);
|
|
|
-
|
|
|
- ret = shellmatta_transport_send(transportLayer, &transportLayer->outputPacketBuffer);
|
|
|
-
|
|
|
+ (void)memcpy(&packet->payload[piledUpPayload], &data[processedLength], splitPayloadLength);
|
|
|
+ packet->payloadLength += splitPayloadLength;
|
|
|
processedLength += splitPayloadLength;
|
|
|
+
|
|
|
+ if(packet->payloadLength >= SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH)
|
|
|
+ {
|
|
|
+ /** -# packet is full - send */
|
|
|
+ packet->packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
+ ret = shellmatta_transport_send(transportLayer, &transportLayer->outputPacketBuffer);
|
|
|
+ transportLayer->outputPacketBuffer.payloadLength = 0u;
|
|
|
+ }
|
|
|
}
|
|
|
while (processedLength < outPayloadLength);
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Send out piled up payload
|
|
|
+ *
|
|
|
+ * @param[in, out] transportLayer transport layer instance to work on
|
|
|
+ * @return errorcode #SHELLMATTA_OK
|
|
|
+ */
|
|
|
+shellmatta_retCode_t shellmatta_transport_flush(shellmatta_transport_layer_t *transportLayer)
|
|
|
+{
|
|
|
+ shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
+ shellmatta_transport_packet_t *packet = &transportLayer->outputPacketBuffer;
|
|
|
+
|
|
|
+ if(0 != transportLayer->outputPacketBuffer.payloadLength)
|
|
|
+ {
|
|
|
+ packet->packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
+ ret = shellmatta_transport_send(transportLayer, &transportLayer->outputPacketBuffer);
|
|
|
+ packet->payloadLength = 0u;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|