X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=mware%2Fxmodem.c;h=5861ac9acc9a07890116d1d462c3c9e1b13ec04b;hb=de2caf08ef2eca066c3d5a40ab91d7f34c3f555e;hp=ba38810b935cf7adf943bec7f20bbadf948e5ae7;hpb=ed046ec2e30d22f13729f02739a5aa80806d72ec;p=bertos.git diff --git a/mware/xmodem.c b/mware/xmodem.c index ba38810b..5861ac9a 100755 --- a/mware/xmodem.c +++ b/mware/xmodem.c @@ -16,6 +16,18 @@ /* * $Log$ + * Revision 1.5 2004/08/12 23:46:21 bernie + * Remove extra indentation level in switch statements. + * + * Revision 1.4 2004/08/12 23:35:50 bernie + * Replace a handmade loop with memset(). + * + * Revision 1.3 2004/08/12 23:34:36 bernie + * Replace if/else with continue to reduce indentation level. + * + * Revision 1.2 2004/08/12 23:24:07 bernie + * Rename UPDCRC() to UPDCRC16(). + * * Revision 1.1 2004/08/11 19:54:22 bernie * Import XModem protocol into DevLib. * @@ -29,6 +41,8 @@ #include #include +#include /* for memset() */ + /*! * \name Protocol control codes @@ -181,136 +195,136 @@ bool xmodem_recv(KFile *fd) switch (ser_getchar()) { - case XM_STX: /* Start of header (1024-byte block) */ - blocksize = 1024; - goto getblock; + case XM_STX: /* Start of header (1024-byte block) */ + blocksize = 1024; + goto getblock; - case XM_SOH: /* Start of header (128-byte block) */ - blocksize = 128; + case XM_SOH: /* Start of header (128-byte block) */ + blocksize = 128; - getblock: - /* Get block number */ - c = ser_getchar(); + getblock: + /* Get block number */ + c = ser_getchar(); - /* Check complemented block number */ - if ((~c & 0xff) != ser_getchar()) - { - lcd_printf(0, 3, LCD_FILL, "Bad blk (%d)", c); - purge = true; - break; - } + /* Check complemented block number */ + if ((~c & 0xff) != ser_getchar()) + { + lcd_printf(0, 3, LCD_FILL, "Bad blk (%d)", c); + purge = true; + break; + } - /* Determine which block is being sent */ - if (c == (blocknr & 0xff)) - /* Last block repeated */ - lcd_printf(0, 2, LCD_FILL, "Repeat blk %d", blocknr); - else if (c == ((blocknr + 1) & 0xff)) - /* Next block */ - lcd_printf(0, 2, LCD_FILL, "Recv blk %d", ++blocknr); - else + /* Determine which block is being sent */ + if (c == (blocknr & 0xff)) + /* Last block repeated */ + lcd_printf(0, 2, LCD_FILL, "Repeat blk %d", blocknr); + else if (c == ((blocknr + 1) & 0xff)) + /* Next block */ + lcd_printf(0, 2, LCD_FILL, "Recv blk %d", ++blocknr); + else + { + /* Sync lost */ + lcd_printf(0, 3, LCD_FILL, "Sync lost (%d/%d)", c, blocknr); + purge = true; + break; + } + + buf = block_buffer; /* Reset pointer to start of buffer */ + checksum = 0; + crc = 0; + for (i = 0; i < blocksize; i++) + { + if ((c = ser_getchar()) == EOF) { - /* Sync lost */ - lcd_printf(0, 3, LCD_FILL, "Sync lost (%d/%d)", c, blocknr); purge = true; break; } - buf = block_buffer; /* Reset pointer to start of buffer */ - checksum = 0; - crc = 0; - for (i = 0; i < blocksize; i++) - { - if ((c = ser_getchar()) == EOF) - { - purge = true; - break; - } + /* Store in buffer */ + *buf++ = (char)c; + + /* Calculate block checksum or CRC */ + if (usecrc) + crc = UPDCRC16(c, crc); + else + checksum += (char)c; + } - /* Store in buffer */ - *buf++ = (char)c; + if (purge) + break; - /* Calculate block checksum or CRC */ - if (usecrc) - crc = UPDCRC(c, crc); - else - checksum += (char)c; - } + /* Get the checksum byte or the CRC-16 MSB */ + if ((c = ser_getchar()) == EOF) + { + purge = true; + break; + } - if (purge) - break; + if (usecrc) + { + crc = UPDCRC16(c, crc); - /* Get the checksum byte or the CRC-16 MSB */ + /* Get CRC-16 LSB */ if ((c = ser_getchar()) == EOF) { purge = true; break; } - if (usecrc) - { - crc = UPDCRC(c, crc); - - /* Get CRC-16 LSB */ - if ((c = ser_getchar()) == EOF) - { - purge = true; - break; - } + crc = UPDCRC16(c, crc); - crc = UPDCRC(c, crc); - - if (crc) - { - lcd_printf(0, 3, LCD_FILL, "Bad CRC: %04x", crc); - purge = true; - break; - } - } - /* Compare the checksum */ - else if (c != checksum) + if (crc) { - lcd_printf(0, 3, LCD_FILL, "Bad sum: %04x/%04x", checksum, c); + lcd_printf(0, 3, LCD_FILL, "Bad CRC: %04x", crc); purge = true; break; } + } + /* Compare the checksum */ + else if (c != checksum) + { + lcd_printf(0, 3, LCD_FILL, "Bad sum: %04x/%04x", checksum, c); + purge = true; + break; + } - /* - * Avoid flushing the same block twice. - * This could happen when the sender does not receive our - * acknowledge and resends the same block. - */ - if (last_block_done < blocknr) + /* + * Avoid flushing the same block twice. + * This could happen when the sender does not receive our + * acknowledge and resends the same block. + */ + if (last_block_done < blocknr) + { + /* Call user function to flush the buffer */ + if (fd->write(fd, block_buffer, blocksize)) { - /* Call user function to flush the buffer */ - if (fd->write(fd, block_buffer, blocksize)) - { - /* Acknowledge block and clear error counter */ - ser_putchar(XM_ACK); - retries = 0; - last_block_done = blocknr; - } - else - { - /* User callback failed: abort transfer immediately */ - retries = XM_MAXRETRIES; - purge = true; - } + /* Acknowledge block and clear error counter */ + ser_putchar(XM_ACK); + retries = 0; + last_block_done = blocknr; } - break; + else + { + /* User callback failed: abort transfer immediately */ + retries = XM_MAXRETRIES; + purge = true; + } + } + break; - case XM_EOT: /* End of transmission */ - ser_putchar(XM_ACK); - lcd_printf(0, 2, LCD_FILL, "Transfer completed"); - return true; + case XM_EOT: /* End of transmission */ + ser_putchar(XM_ACK); + lcd_printf(0, 2, LCD_FILL, "Transfer completed"); + return true; - case EOF: /* Timeout or serial error */ - purge = true; - break; + case EOF: /* Timeout or serial error */ + purge = true; + break; - default: - lcd_printf(0, 3, LCD_FILL, "Skipping garbage"); - purge = true; - break; + default: + lcd_printf(0, 3, LCD_FILL, "Skipping garbage"); + purge = true; + break; } } /* End forever */ } @@ -340,91 +354,90 @@ bool xmodem_send(KFile *fd) switch (c = ser_getchar()) { - case XM_NAK: - case XM_C: - if (blocknr == 1) + case XM_NAK: + case XM_C: + if (blocknr == 1) + { + if (c == XM_C) { - if (c == XM_C) - { - lcd_printf(0, 2, LCD_FILL, "Tx start (CRC)"); - usecrc = true; - } - else - lcd_printf(0, 2, LCD_FILL, "Tx start (BCC)"); - - /* Call user function to read in one block */ - size = fd->read(fd, block_buffer, XM_BUFSIZE); + lcd_printf(0, 2, LCD_FILL, "Tx start (CRC)"); + usecrc = true; } else - lcd_printf(0, 2, LCD_FILL, "Resend blk %d", blocknr); - proceed = true; - break; - - case XM_ACK: - /* End of transfer? */ - if (!size) - return true; + lcd_printf(0, 2, LCD_FILL, "Tx start (BCC)"); /* Call user function to read in one block */ size = fd->read(fd, block_buffer, XM_BUFSIZE); - blocknr++; - retries = 0; - proceed = true; - lcd_printf(0, 2, LCD_FILL, "Send blk %d", blocknr); - break; - - case EOF: - retries++; - SerialError(retries); - if (retries <= XM_MAXRETRIES) - break; - /* falling through! */ + } + else + lcd_printf(0, 2, LCD_FILL, "Resend blk %d", blocknr); + proceed = true; + break; - case XM_CAN: - lcd_printf(0, 2, LCD_FILL, "Transfer aborted"); - return false; + case XM_ACK: + /* End of transfer? */ + if (!size) + return true; + + /* Call user function to read in one block */ + size = fd->read(fd, block_buffer, XM_BUFSIZE); + blocknr++; + retries = 0; + proceed = true; + lcd_printf(0, 2, LCD_FILL, "Send blk %d", blocknr); + break; - default: - lcd_printf(0, 3, LCD_FILL, "Skipping garbage"); + case EOF: + retries++; + SerialError(retries); + if (retries <= XM_MAXRETRIES) break; + /* falling through! */ + + case XM_CAN: + lcd_printf(0, 2, LCD_FILL, "Transfer aborted"); + return false; + + default: + lcd_printf(0, 3, LCD_FILL, "Skipping garbage"); + break; } } while (!proceed); if (!size) + { ser_putchar(XM_EOT); - else + continue; + } + + /* Pad block with 0xFF if it's partially full */ + memset(block_buffer + size, 0xFF, XM_BUFSIZE - size); + + /* Send block header (STX, blocknr, ~blocknr) */ + ser_putchar(XM_STX); + ser_putchar(blocknr & 0xFF); + ser_putchar(~blocknr & 0xFF); + + /* Send block and compute its CRC/checksum */ + sum = 0; + crc = 0; + for (i = 0; i < XM_BUFSIZE; i++) { - /* Pad block with 0xFF if it's partially full */ - if (size < XM_BUFSIZE) - for (i = size; i < XM_BUFSIZE; i++) - block_buffer[i] = (char)0xFF; - - /* Send block header (STX, blocknr, ~blocknr) */ - ser_putchar(XM_STX); - ser_putchar(blocknr & 0xFF); - ser_putchar(~blocknr & 0xFF); - - /* Send block and compute its CRC/checksum */ - sum = 0; - crc = 0; - for (i = 0; i < XM_BUFSIZE; i++) - { - ser_putchar(block_buffer[i]); - crc = UPDCRC(block_buffer[i], crc); - sum += block_buffer[i]; - } + ser_putchar(block_buffer[i]); + crc = UPDCRC16(block_buffer[i], crc); + sum += block_buffer[i]; + } - /* Send CRC/Checksum */ - if (usecrc) - { - crc = UPDCRC(0, crc); - crc = UPDCRC(0, crc); - ser_putchar(crc >> 8); - ser_putchar(crc & 0xFF); - } - else - ser_putchar(sum); + /* Send CRC/Checksum */ + if (usecrc) + { + crc = UPDCRC16(0, crc); + crc = UPDCRC16(0, crc); + ser_putchar(crc >> 8); + ser_putchar(crc & 0xFF); } + else + ser_putchar(sum); } }