|
@@ -0,0 +1,537 @@
|
|
|
+
|
|
|
+ * @file shellmatta_ymodem.c
|
|
|
+ * @brief ymodem functions of shellmatta
|
|
|
+ * @author Simon Fischer <dev@s-fischer.net>
|
|
|
+ */
|
|
|
+
|
|
|
+#include "shellmatta_ymodem.h"
|
|
|
+#include "shellmatta_crc.h"
|
|
|
+#include "shellmatta_utils.h"
|
|
|
+
|
|
|
+
|
|
|
+uint16_t yModemPacketSize = YMODEM_PACKET_SIZE;
|
|
|
+
|
|
|
+uint8_t shellmatta_ymodem_packet_counter = 0u;
|
|
|
+
|
|
|
+uint16_t shellmatta_ymodem_total_bytes_received = 0u;
|
|
|
+
|
|
|
+uint16_t shellmatta_ymodem_byte_counter = 0u;
|
|
|
+
|
|
|
+shellmatta_ymodem_packet_t shellmatta_ymodem_packet;
|
|
|
+
|
|
|
+shellmatta_ymodem_datatype_t shellmatta_ymodem_current_data_type = YMODEM_NONE;
|
|
|
+
|
|
|
+shellmatta_ymodem_callbacks_t shellmatta_ymodem_callbacks;
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Initialise the ymodem prior to actually receiving data
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] recvBuffer pointer to the buffer to save the received payload in
|
|
|
+ * @param[in] fileSize pointer to the file size variable
|
|
|
+ * @param[in] packetSize pointer to the packet size variable
|
|
|
+ * @param[in] callbacks callback functions for the ymodem module
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_init(shellmatta_handle_t handle,
|
|
|
+ uint8_t* recvBuffer,
|
|
|
+ uint16_t* fileSize,
|
|
|
+ uint16_t* packetSize,
|
|
|
+ shellmatta_ymodem_callbacks_t callbacks)
|
|
|
+{
|
|
|
+ if ((void*)0u == recvBuffer) return;
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetNumber = 0u;
|
|
|
+ shellmatta_ymodem_packet.reversePacketNumber = 0u;
|
|
|
+ shellmatta_ymodem_packet.packetCrc = 0u;
|
|
|
+ shellmatta_ymodem_packet.packetSize = packetSize;
|
|
|
+ shellmatta_ymodem_packet.fileSize = fileSize;
|
|
|
+ shellmatta_ymodem_packet.packetData = recvBuffer;
|
|
|
+
|
|
|
+
|
|
|
+ shellmatta_ymodem_callbacks = callbacks;
|
|
|
+
|
|
|
+
|
|
|
+ shellmatta_ymodem_set_state(handle, WAIT_FOR_START);
|
|
|
+
|
|
|
+
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_NONE;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief change the current state of the ymodem module
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] newState the state the ymodem module should be changed to
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_set_state(shellmatta_handle_t handle, shellmatta_ymodem_state_t newState)
|
|
|
+{
|
|
|
+ ((shellmatta_instance_t*)handle)->ymodemState = newState;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Returns the current state of the ymodem module
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @return the current state of the ymodem module
|
|
|
+*/
|
|
|
+shellmatta_ymodem_state_t shellmatta_ymodem_get_state(shellmatta_handle_t handle)
|
|
|
+{
|
|
|
+ return ((shellmatta_instance_t*)handle)->ymodemState;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief State machine that processes bytewise input during active ymodem transmission
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] byteIn the byte to be processed
|
|
|
+ * @note won't do anything if ymodem module is not initialized
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_receive_packet(shellmatta_handle_t handle, uint8_t byteIn)
|
|
|
+{
|
|
|
+ static uint8_t fileNameDelimiterPosition = 255u;
|
|
|
+ static uint8_t fileSizeDelimiterPosition = 255u;
|
|
|
+ static uint32_t fileSize = 0u;
|
|
|
+ static char fileSizeStr[7u];
|
|
|
+ shellmatta_ymodem_rcv_retcode_t recvRetCode;
|
|
|
+ recvRetCode = shellmatta_ymodem_receive_byte(handle, byteIn);
|
|
|
+ switch (shellmatta_ymodem_get_state(handle))
|
|
|
+ {
|
|
|
+ case INACTIVE:
|
|
|
+
|
|
|
+ return;
|
|
|
+ case WAIT_FOR_START:
|
|
|
+
|
|
|
+ switch (shellmatta_ymodem_current_data_type)
|
|
|
+ {
|
|
|
+ case YMODEM_NONE:
|
|
|
+ if (recvRetCode == SOH_RECEIVED || recvRetCode == STX_RECEIVED)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet_counter = 0u;
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+ shellmatta_printf(handle, "SOH receive\r\n");
|
|
|
+ shellmatta_ymodem_set_state(handle, RECEIVE_PACKET);
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_HEADER;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_HEADER:
|
|
|
+ if (recvRetCode == SOH_RECEIVED || recvRetCode == STX_RECEIVED)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+ shellmatta_printf(handle, "SOH receive\r\n");
|
|
|
+ shellmatta_ymodem_set_state(handle, RECEIVE_PACKET);
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_BODY;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_BODY:
|
|
|
+ if (recvRetCode == SOH_RECEIVED || recvRetCode == STX_RECEIVED)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+
|
|
|
+ shellmatta_printf(handle, "SOH receive\r\n");
|
|
|
+ shellmatta_ymodem_set_state(handle, RECEIVE_PACKET);
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_BODY;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ if (recvRetCode == EOT_RECEIVED)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+
|
|
|
+ shellmatta_printf(handle, "EOT receive\r\n");
|
|
|
+
|
|
|
+ shellmatta_ymodem_ack(handle);
|
|
|
+
|
|
|
+ shellmatta_ymodem_control(handle, YMODEM_CRC);
|
|
|
+
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_FOOTER;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case YMODEM_FOOTER:
|
|
|
+
|
|
|
+ if (recvRetCode == EOT_RECEIVED)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_ack(handle);
|
|
|
+
|
|
|
+ shellmatta_ymodem_control(handle, YMODEM_CRC);
|
|
|
+ }
|
|
|
+ if (recvRetCode == SOH_RECEIVED)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet_counter = 0u;
|
|
|
+
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+ shellmatta_printf(handle, "EOT packet starting\r\n");
|
|
|
+ shellmatta_ymodem_set_state(handle, RECEIVE_PACKET);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case RECEIVE_PACKET:
|
|
|
+
|
|
|
+ if (recvRetCode == DATA_RECEIVED)
|
|
|
+ {
|
|
|
+ switch (shellmatta_ymodem_current_data_type)
|
|
|
+ {
|
|
|
+ case YMODEM_HEADER:
|
|
|
+ switch (shellmatta_ymodem_byte_counter)
|
|
|
+ {
|
|
|
+
|
|
|
+ case 0:
|
|
|
+ shellmatta_ymodem_packet.packetNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "packet number = %u\r\n", shellmatta_ymodem_packet.packetNumber);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ shellmatta_ymodem_packet.reversePacketNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "reverse packet number = %u\r\n", shellmatta_ymodem_packet.reversePacketNumber);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_byte_counter >= YMODEM_HEADER_DATA_OFFSET && shellmatta_ymodem_byte_counter < YMODEM_HEADER_CRC_POSITION)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_packet.packetData[shellmatta_ymodem_byte_counter - YMODEM_HEADER_DATA_OFFSET] = byteIn;
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_byte_counter < fileNameDelimiterPosition)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (byteIn == YMODEM_NULL)
|
|
|
+ {
|
|
|
+ fileNameDelimiterPosition = shellmatta_ymodem_byte_counter + 1;
|
|
|
+ shellmatta_printf(handle, "%s\r\n", shellmatta_ymodem_packet.packetData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ else
|
|
|
+ if (shellmatta_ymodem_byte_counter >= fileNameDelimiterPosition && shellmatta_ymodem_byte_counter < fileSizeDelimiterPosition)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (byteIn == YMODEM_SPACE)
|
|
|
+ {
|
|
|
+ fileSizeDelimiterPosition = shellmatta_ymodem_byte_counter;
|
|
|
+
|
|
|
+ fileSize = utils_shellAsciiToUInt32(fileSizeStr, fileSizeDelimiterPosition - fileNameDelimiterPosition);
|
|
|
+ *shellmatta_ymodem_packet.fileSize = fileSize;
|
|
|
+ shellmatta_printf(handle, "fileSize = %u\r\n", fileSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fileSizeStr[shellmatta_ymodem_byte_counter - fileNameDelimiterPosition] = byteIn;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_byte_counter >= YMODEM_HEADER_CRC_POSITION)
|
|
|
+ {
|
|
|
+ if (shellmatta_ymodem_byte_counter == YMODEM_HEADER_CRC_POSITION)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetCrc = byteIn << 8u;
|
|
|
+ }
|
|
|
+ if (shellmatta_ymodem_byte_counter == YMODEM_HEADER_CRC_POSITION + 1)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetCrc |= byteIn;
|
|
|
+
|
|
|
+ shellmatta_printf(handle, "packetCrc = 0x%04x\r\n", shellmatta_ymodem_packet.packetCrc);
|
|
|
+ shellmatta_ymodem_check_packet(handle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ shellmatta_ymodem_byte_counter++;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_BODY:
|
|
|
+ switch (shellmatta_ymodem_byte_counter)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ shellmatta_ymodem_packet.packetNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "packet number = %u\r\n", shellmatta_ymodem_packet.packetNumber);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ shellmatta_ymodem_packet.reversePacketNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "reverse packet number = %u\r\n", shellmatta_ymodem_packet.reversePacketNumber);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_byte_counter > yModemPacketSize + 2)
|
|
|
+ {
|
|
|
+ if (shellmatta_ymodem_byte_counter == yModemPacketSize + 3)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetCrc = byteIn << 8u;
|
|
|
+ }
|
|
|
+ if (shellmatta_ymodem_byte_counter == yModemPacketSize + 4)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetCrc |= byteIn;
|
|
|
+
|
|
|
+ shellmatta_printf(handle, "packetCrc = 0x%04x\r\n", shellmatta_ymodem_packet.packetCrc);
|
|
|
+ shellmatta_ymodem_check_packet(handle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ if (shellmatta_ymodem_byte_counter > 1)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_packet.packetData[shellmatta_ymodem_byte_counter - YMODEM_HEADER_DATA_OFFSET] = byteIn;
|
|
|
+ }
|
|
|
+ shellmatta_ymodem_byte_counter++;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_FOOTER:
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet_counter = 0;
|
|
|
+
|
|
|
+ switch (shellmatta_ymodem_byte_counter)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ shellmatta_ymodem_packet.packetNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "packet number = %u\r\n", shellmatta_ymodem_packet.packetNumber);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ shellmatta_ymodem_packet.reversePacketNumber = byteIn;
|
|
|
+ shellmatta_printf(handle, "reverse packet number = %u\r\n", shellmatta_ymodem_packet.reversePacketNumber);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_byte_counter == YMODEM_PACKET_SIZE)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_check_packet(handle);
|
|
|
+ }
|
|
|
+ shellmatta_ymodem_byte_counter++;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Gives a return code depending on symbol received at different states of the ymodem module
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] byteIn currently processed input byte
|
|
|
+*/
|
|
|
+shellmatta_ymodem_rcv_retcode_t shellmatta_ymodem_receive_byte(shellmatta_handle_t handle, uint8_t byteIn)
|
|
|
+{
|
|
|
+ shellmatta_ymodem_rcv_retcode_t ret;
|
|
|
+ if (WAIT_FOR_START == shellmatta_ymodem_get_state(handle))
|
|
|
+ {
|
|
|
+ switch (byteIn)
|
|
|
+ {
|
|
|
+ case YMODEM_SOH:
|
|
|
+
|
|
|
+ yModemPacketSize = YMODEM_PACKET_SIZE;
|
|
|
+ ret = SOH_RECEIVED;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_STX:
|
|
|
+
|
|
|
+ yModemPacketSize = YMODEM_PACKET_SIZE_1K;
|
|
|
+ ret = STX_RECEIVED;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_EOT:
|
|
|
+
|
|
|
+ ret = EOT_RECEIVED;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_CA:
|
|
|
+
|
|
|
+ ret = CA_RECEIVED;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+
|
|
|
+ ret = ERROR;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ *shellmatta_ymodem_packet.packetSize = yModemPacketSize;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ if (RECEIVE_PACKET == shellmatta_ymodem_get_state(handle))
|
|
|
+ {
|
|
|
+ ret = DATA_RECEIVED;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Checks packet data for validity and sends ACK or NAK accordingly
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @note Only to be called after full packet is received
|
|
|
+ * @note Will call yModemRecvPacketCallback when packet is received correctly
|
|
|
+ * @note Will call ymodemTransmissionCompleteCallback when transmission is completed
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_check_packet(shellmatta_handle_t handle)
|
|
|
+{
|
|
|
+ uint8_t computedCrc = 0u;
|
|
|
+ if (shellmatta_ymodem_packet.packetNumber != (0xFF - shellmatta_ymodem_packet.reversePacketNumber))
|
|
|
+ {
|
|
|
+ shellmatta_printf(handle, "wrong packet number pair\r\n");
|
|
|
+ shellmatta_ymodem_nak(handle);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_packet.packetNumber != shellmatta_ymodem_packet_counter)
|
|
|
+ {
|
|
|
+ shellmatta_printf(handle, "wrong packet number\r\n");
|
|
|
+ shellmatta_printf(handle, "expected %u, got %u\r\n", shellmatta_ymodem_packet_counter, shellmatta_ymodem_packet.packetNumber);
|
|
|
+ shellmatta_ymodem_nak(handle);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ computedCrc = crc16Calc((const char*)shellmatta_ymodem_packet.packetData, yModemPacketSize);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ (void) computedCrc;
|
|
|
+ shellmatta_ymodem_total_bytes_received += shellmatta_ymodem_byte_counter;
|
|
|
+ shellmatta_ymodem_byte_counter = 0u;
|
|
|
+ shellmatta_ymodem_ack(handle);
|
|
|
+ if (shellmatta_ymodem_current_data_type == YMODEM_HEADER)
|
|
|
+ {
|
|
|
+
|
|
|
+ shellmatta_ymodem_control(handle, YMODEM_CRC);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ switch (shellmatta_ymodem_current_data_type)
|
|
|
+ {
|
|
|
+ case YMODEM_NONE:
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_HEADER:
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_BODY:
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_callbacks.yModemRecvPacketCallback != (void*)0u)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_callbacks.yModemRecvPacketCallback();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_FOOTER:
|
|
|
+
|
|
|
+ if (shellmatta_ymodem_callbacks.ymodemTransmissionCompleteCallback != (void*)0u)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_callbacks.ymodemTransmissionCompleteCallback();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Acknowledge handling. Will send ACK and set ymodem state back to WAIT_FOR_START
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_ack(shellmatta_handle_t handle)
|
|
|
+{
|
|
|
+ shellmatta_ymodem_control(handle, YMODEM_ACK);
|
|
|
+ shellmatta_ymodem_packet_counter++;
|
|
|
+ shellmatta_ymodem_set_state(handle, WAIT_FOR_START);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief Not-Acknowledge handling. Will send NAK and set ymodem state back to WAIT_FOR_START
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_nak(shellmatta_handle_t handle)
|
|
|
+{
|
|
|
+ shellmatta_ymodem_control(handle, YMODEM_NAK);
|
|
|
+ shellmatta_ymodem_set_state(handle, WAIT_FOR_START);
|
|
|
+
|
|
|
+ switch (shellmatta_ymodem_current_data_type)
|
|
|
+ {
|
|
|
+ case YMODEM_NONE:
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_HEADER:
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_NONE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_BODY:
|
|
|
+
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_BODY;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case YMODEM_FOOTER:
|
|
|
+
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_FOOTER;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void shellmatta_ymodem_control(shellmatta_handle_t handle, const char c)
|
|
|
+{
|
|
|
+ shellmatta_printf(handle, "0x%02x\r\n", c);
|
|
|
+ ((shellmatta_instance_t*)handle)->write(&c, 1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * @brief reset function for the ymodem module
|
|
|
+ * @param[in, out] handle shellmatta handle of the instance
|
|
|
+ * @param[in] doCancel flag to execute the cancel-callback
|
|
|
+*/
|
|
|
+void shellmatta_ymodem_reset(shellmatta_handle_t handle, bool doCancel)
|
|
|
+{
|
|
|
+
|
|
|
+ if (doCancel)
|
|
|
+ {
|
|
|
+ if (shellmatta_ymodem_callbacks.yModemCancelCallback != (void*)0u)
|
|
|
+ {
|
|
|
+ shellmatta_ymodem_callbacks.yModemCancelCallback();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ shellmatta_ymodem_packet.packetNumber = 0u;
|
|
|
+ shellmatta_ymodem_packet.reversePacketNumber = 0u;
|
|
|
+ shellmatta_ymodem_packet.packetCrc = 0u;
|
|
|
+ shellmatta_ymodem_packet.packetSize = 0u;
|
|
|
+ shellmatta_ymodem_packet.fileSize = 0u;
|
|
|
+ shellmatta_ymodem_packet.packetData = 0u;
|
|
|
+
|
|
|
+
|
|
|
+ shellmatta_ymodem_set_state(handle, INACTIVE);
|
|
|
+
|
|
|
+ shellmatta_ymodem_current_data_type = YMODEM_NONE;
|
|
|
+
|
|
|
+#ifdef SHELLMATTA_TRANSPORT_ENABLE
|
|
|
+
|
|
|
+ ((shellmatta_instance_t*)handle)->transportEnabled = true;
|
|
|
+#endif
|
|
|
+}
|