|
@@ -7,6 +7,7 @@
|
|
|
#include "shellmatta_transport.h"
|
|
|
#include "shellmatta.h"
|
|
|
#include "shellmatta_crc.h"
|
|
|
+#include "shellmatta_utils.h"
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
@@ -64,21 +65,74 @@ shellmatta_retCode_t shellmatta_transport_init( shellmatta_transport_layer_t
|
|
|
return SHELLMATTA_OK;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @brief Configures the transport layer
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] mandatory enforce using the transport layer
|
|
|
+ * @param[in] disableAutoFlush enforce manual flushing of the output packet
|
|
|
+ * @param[in] customCrcFct use a custom crc generation (default NULL)
|
|
|
+ * @return errorcode
|
|
|
+ */
|
|
|
+shellmatta_retCode_t shellmatta_transport_configure(shellmatta_handle_t handle,
|
|
|
+ bool mandatory,
|
|
|
+ bool disableAutoFlush,
|
|
|
+ shellmatta_transport_crc_t customCrcFct)
|
|
|
+{
|
|
|
+ shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
+ shellmatta_instance_t *inst = (shellmatta_instance_t*)handle;
|
|
|
+
|
|
|
+ /** -# check parameters for plausibility */
|
|
|
+ if( (NULL != inst)
|
|
|
+ && (SHELLMATTA_MAGIC == inst->magic))
|
|
|
+ {
|
|
|
+ shellmatta_transport_layer_t *transportLayer = &inst->transportLayer;
|
|
|
+
|
|
|
+ transportLayer->mandatory = mandatory;
|
|
|
+ transportLayer->disableAutoFlush = disableAutoFlush;
|
|
|
+ transportLayer->customCrcFct = customCrcFct;
|
|
|
+
|
|
|
+ /** -# set the transport layer active when configured as mandatory */
|
|
|
+ if(true == mandatory)
|
|
|
+ {
|
|
|
+ transportLayer->active = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = SHELLMATTA_USE_FAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @brief Resets all values of tranportLayerInst except for sequence counters
|
|
|
- * @param[in, out] transportLayer transport layer instance to work on
|
|
|
- * @return errorcode #SHELLMATTA_OK
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @return errorcode
|
|
|
*/
|
|
|
-shellmatta_retCode_t shellmatta_transport_reset(shellmatta_transport_layer_t *transportLayer)
|
|
|
+shellmatta_retCode_t shellmatta_transport_reset(shellmatta_handle_t handle)
|
|
|
{
|
|
|
- uint8_t sequenceH2S = transportLayer->sequenceH2S;
|
|
|
- uint8_t sequenceS2H = transportLayer->sequenceS2H;
|
|
|
- memset(transportLayer, 0u, sizeof(shellmatta_transport_layer_t));
|
|
|
+ shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
+ shellmatta_instance_t *inst = (shellmatta_instance_t*)handle;
|
|
|
|
|
|
- transportLayer->sequenceH2S = sequenceH2S;
|
|
|
- transportLayer->sequenceS2H = sequenceS2H;
|
|
|
+ /** -# check parameters for plausibility */
|
|
|
+ if( (NULL != inst)
|
|
|
+ && (SHELLMATTA_MAGIC == inst->magic))
|
|
|
+ {
|
|
|
+ shellmatta_transport_layer_t *transportLayer = &inst->transportLayer;
|
|
|
+ uint8_t sequenceH2S = transportLayer->sequenceH2S;
|
|
|
+ uint8_t sequenceS2H = transportLayer->sequenceS2H;
|
|
|
+ memset(transportLayer, 0u, sizeof(shellmatta_transport_layer_t));
|
|
|
|
|
|
- return SHELLMATTA_OK;
|
|
|
+ transportLayer->sequenceH2S = sequenceH2S;
|
|
|
+ transportLayer->sequenceS2H = sequenceS2H;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ret = SHELLMATTA_USE_FAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -175,7 +229,9 @@ shellmatta_retCode_t shellmatta_transport_process(shellmatta_transport_layer_t
|
|
|
|
|
|
if (transportLayer->crcIndex >= SHELLMATTA_TRANSPORT_LENGTH_CRC)
|
|
|
{
|
|
|
- refCrc = crc32Calc(rawPacket, SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength);
|
|
|
+ refCrc = SHELLMATTA_TRANSPORT_CALC_CRC(transportLayer,
|
|
|
+ rawPacket,
|
|
|
+ SHELLMATTA_TRANSPORT_LENGTH_HEADER + header->payloadLength);
|
|
|
|
|
|
/* if crc is correct, further handling of data depends on type of packet */
|
|
|
if (transportLayer->inPacket.crc == refCrc)
|
|
@@ -311,19 +367,31 @@ shellmatta_retCode_t shellmatta_transport_write(shellmatta_transport_layer_t *tr
|
|
|
/**
|
|
|
* @brief Send out piled up payload
|
|
|
*
|
|
|
- * @param[in, out] transportLayer transport layer instance to work on
|
|
|
- * @return errorcode #SHELLMATTA_OK
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @return errorcode
|
|
|
*/
|
|
|
-shellmatta_retCode_t shellmatta_transport_flush(shellmatta_transport_layer_t *transportLayer)
|
|
|
+shellmatta_retCode_t shellmatta_transport_flush(shellmatta_handle_t handle)
|
|
|
{
|
|
|
- shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
- shellmatta_transport_packet_t *packet = &transportLayer->outPacket;
|
|
|
+ shellmatta_retCode_t ret = SHELLMATTA_OK;
|
|
|
+ shellmatta_instance_t *inst = (shellmatta_instance_t*)handle;
|
|
|
+
|
|
|
+ /** -# check parameters for plausibility */
|
|
|
+ if( (NULL != inst)
|
|
|
+ && (SHELLMATTA_MAGIC == inst->magic))
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_transport_packet_t *packet = &inst->transportLayer.outPacket;
|
|
|
|
|
|
- if(0 != packet->header.payloadLength)
|
|
|
+ if(0 != packet->header.payloadLength)
|
|
|
+ {
|
|
|
+ packet->header.packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
+ ret = shellmatta_transport_send(&inst->transportLayer, packet);
|
|
|
+ packet->header.payloadLength = 0u;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- packet->header.packetType = SHELLMATTA_TRANSPORT_PACKET_DATA;
|
|
|
- ret = shellmatta_transport_send(transportLayer, &transportLayer->outPacket);
|
|
|
- packet->header.payloadLength = 0u;
|
|
|
+ ret = SHELLMATTA_USE_FAULT;
|
|
|
}
|
|
|
|
|
|
return ret;
|