MCPcopy Create free account
hub / github.com/Serial-Studio/Serial-Studio / processInput

Method processInput

app/src/IO/FileTransmission/YMODEM.cpp:183–251  ·  view source on GitHub ↗

* @brief Processes bytes received from the remote device (YMODEM state machine). */

Source from the content-addressed store, hash-verified

181 * @brief Processes bytes received from the remote device (YMODEM state machine).
182 */
183void IO::Protocols::YMODEM::processInput(const QByteArray& data)
184{
185 for (const char byte : data) {
186 const quint8 ch = static_cast<quint8>(byte);
187
188 switch (m_yState) {
189 case YState::WaitingForInitialC:
190 if (ch == kCRC) {
191 m_timeoutTimer.stop();
192 sendBlock0();
193 }
194 break;
195
196 case YState::WaitingForBlock0Ack:
197 handleBlock0AckByte(ch);
198 break;
199
200 case YState::WaitingForDataC:
201 if (ch == kCRC) {
202 m_timeoutTimer.stop();
203 m_blockNumber = 1;
204 m_yState = YState::SendingData;
205 sendDataBlock();
206 }
207 break;
208
209 case YState::WaitingForDataAck:
210 if (!handleDataAckByte(ch))
211 return;
212
213 break;
214
215 case YState::WaitingForFirstEOTResponse:
216 if (ch == kNAK || ch == kACK) {
217 m_timeoutTimer.stop();
218 m_yState = YState::WaitingForSecondEOTAck;
219 Q_EMIT writeRequested(QByteArray(1, static_cast<char>(kEOT)));
220 Q_EMIT statusMessage(tr("Sending second EOT…"));
221 m_timeoutTimer.start(m_timeoutMs);
222 }
223 break;
224
225 case YState::WaitingForSecondEOTAck:
226 handleSecondEotAckByte(ch);
227 break;
228
229 case YState::WaitingForEndBatchC:
230 if (ch == kCRC) {
231 m_timeoutTimer.stop();
232 sendEndOfBatch();
233 }
234 break;
235
236 case YState::WaitingForEndBatchAck:
237 if (ch == kACK) {
238 m_timeoutTimer.stop();
239 m_yState = YState::Done;
240 resetState();

Callers

nothing calls this directly

Calls 3

resetStateFunction · 0.85
stopMethod · 0.45
startMethod · 0.45

Tested by

no test coverage detected