Ymodem ESP32 1.0.0
Loading...
Searching...
No Matches
YmodemTransmit.cpp
Go to the documentation of this file.
1
14#include "YmodemTransmit.h"
15
17{
18 unsigned char receivedC;
19 int err = 0;
20
21 do {
23 LED_toggle();
24 } while (Receive_Byte(&receivedC, NAK_TIMEOUT) < 0 && err++ < 45);
25
26 if (err >= 45 || receivedC != CRC16) {
27 send_CA();
28 return -1;
29 }
30
31 return 0;
32}
33
34int sendInitialPacket(char* sendFileName, unsigned int sizeFile)
35{
36 uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
37 int err;
38
39 Ymodem_PrepareIntialPacket(packet_data, sendFileName, sizeFile);
40 do {
41 // Send Packet
42 uart_write_bytes(EX_UART_NUM, (char*)packet_data, PACKET_SIZE + PACKET_OVERHEAD);
43
44 // Wait for Ack
45 err = Ymodem_WaitResponse(ACK, 10);
46 if (err == 0 || err == 4) {
47 send_CA();
48 return -2; // timeout or wrong response
49 }
50 else if (err == 2)
51 return 98; // abort
52 LED_toggle();
53 } while (err != 1);
54
55 // After initial block the receiver sends 'C' after ACK
56 if (Ymodem_WaitResponse(CRC16, 10) != 1) {
57 send_CA();
58 return -3;
59 }
60
61 return 0;
62}
63
64int sendFileBlocks(unsigned int sizeFile, fs::File& ffd)
65{
66 uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
67 uint16_t blkNumber = 0x01;
68 int err;
69 uint32_t size = sizeFile;
70
71 while (size) {
72 // Prepare and send next packet
73 Ymodem_PreparePacket(packet_data, blkNumber, size, ffd);
74 do {
75 // Send Packet
76 uart_write_bytes(EX_UART_NUM, (char*)packet_data, PACKET_1K_SIZE + PACKET_OVERHEAD);
77
78 // Wait for Ack
79 err = Ymodem_WaitResponse(ACK, 10);
80 if (err == 1) {
81 blkNumber++;
82 if (size > PACKET_1K_SIZE)
83 size -= PACKET_1K_SIZE; // Next packet
84 else
85 size = 0; // Last packet sent
86 }
87 else if (err == 0 || err == 4) {
88 send_CA();
89 return -4; // timeout or wrong response
90 }
91 else if (err == 2)
92 return -5; // abort
93 } while (err != 1);
94 LED_toggle();
95 }
96
97 return 0;
98}
99
101{
102 int err;
103
104 Send_Byte(EOT); // Send (EOT)
105 do {
106 // Wait for Ack
107 err = Ymodem_WaitResponse(ACK, 10);
108 if (err == 3) { // NAK
109 Send_Byte(EOT); // Send (EOT)
110 }
111 else if (err == 0 || err == 4) {
112 send_CA();
113 return -6; // timeout or wrong response
114 }
115 else if (err == 2)
116 return -7; // abort
117 } while (err != 1);
118
119 return 0;
120}
121
123{
124 uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
125 int err;
126
127 if (Ymodem_WaitResponse(CRC16, 10) != 1) {
128 send_CA();
129 return -8;
130 }
131
132 LED_toggle();
133 Ymodem_PrepareLastPacket(packet_data);
134 do {
135 // Send Packet
136 uart_write_bytes(EX_UART_NUM, (char*)packet_data, PACKET_SIZE + PACKET_OVERHEAD);
137 // Wait for Ack
138 err = Ymodem_WaitResponse(ACK, 10);
139 if (err == 0 || err == 4) {
140 send_CA();
141 return -9; // timeout or wrong response
142 }
143 else if (err == 2)
144 return -10; // abort
145 } while (err != 1);
146
147#if YMODEM_LED_ACT
148 digitalWrite(YMODEM_LED_ACT, YMODEM_LED_ACT_ON ^ 1);
149#endif
150
151 return 0;
152}
#define CRC16
Definition YmodemDef.h:42
#define YMODEM_LED_ACT_ON
Definition YmodemDef.h:24
#define EX_UART_NUM
Definition YmodemDef.h:18
#define NAK_TIMEOUT
Definition YmodemDef.h:47
#define YMODEM_LED_ACT
Definition YmodemDef.h:23
#define PACKET_1K_SIZE
Definition YmodemDef.h:33
#define ACK
Definition YmodemDef.h:39
#define PACKET_OVERHEAD
Definition YmodemDef.h:31
#define EOT
Definition YmodemDef.h:38
#define PACKET_SIZE
Definition YmodemDef.h:32
void Ymodem_PrepareIntialPacket(uint8_t *data, char *fileName, uint32_t length)
Prepares the initial packet for Ymodem transmission.
void Ymodem_PreparePacket(uint8_t *data, uint8_t pktNo, uint32_t sizeBlk, fs::File &ffd)
Prepares a Ymodem packet with the given data.
uint8_t Ymodem_WaitResponse(uint8_t ackchr, uint8_t tmo)
Waits for a specific response character within a given timeout period.
void Ymodem_PrepareLastPacket(uint8_t *data)
Prepares the last packet for Ymodem transmission.
int sendInitialPacket(char *sendFileName, unsigned int sizeFile)
Sends the initial packet for a file transfer using the Ymodem protocol.
int sendFileBlocks(unsigned int sizeFile, fs::File &ffd)
Sends file blocks over a communication channel.
int waitForReceiverResponse()
Waits for a response from the receiver.
int sendEOT()
Sends the End Of Transmission (EOT) signal.
int sendLastPacket()
Sends the last packet in the Ymodem transmission.
Ymodem Packet transmission functions.
void IRAM_ATTR LED_toggle()
Toggles the state of an LED.
void send_CA()
Sends the CA (Cancel) signal.
uint32_t Send_Byte(char c)
Sends a single byte of data.
int32_t Receive_Byte(unsigned char *c, uint32_t timeout)
Receives a byte from a communication interface.