Main Page | File List | Globals

validate_packet.c

Go to the documentation of this file.
00001 // This file has been prepared for Doxygen automatic documentation generation.
00023 #include "xmodem.h"
00024 
00025 extern struct global
00026 {
00027   volatile unsigned char *recv_ptr;
00028   volatile unsigned char buffer_status;
00029   volatile unsigned char recv_error;
00030   volatile unsigned char t1_timed_out;
00031 } gl;
00032 
00033 
00034 unsigned char validate_packet(unsigned char *bufptr,unsigned char *packet_number)
00035 {
00036 
00037   unsigned char packet;
00038   int crc;
00039 
00040 // uncomment the following line to allow error simulation
00041 // replace 'bad' with dup, end, err, out as required.
00042 //  if(!PIND_Bit3) return (bad); // simulate an error if button pressed
00043 
00044   packet = bad;
00045   if (!gl.t1_timed_out)
00046   {
00047     if (!gl.recv_error)
00048     {
00049       if (bufptr[0] == SOH) // valid start
00050       {
00051         if (bufptr[1] == ((*packet_number+1) & 0xff)) // sequential block number ?
00052         {
00053           if ((bufptr[1] + bufptr[2]) == 0xff) // block number and block number checksum are ok?
00054           {
00055             crc = calcrc(&bufptr[3],128);      // compute CRC and validate it
00056             if ((bufptr[131] == (unsigned char)(crc >> 8)) && (bufptr[132] == (unsigned char)(crc)))
00057             {
00058               *packet_number = *packet_number + 1; // good packet ... ok to increment
00059               packet = good;
00060             }// bad CRC, packet stays 'bad'
00061           }// bad block number checksum, packet stays 'bad'
00062         }// bad block number or same block number, packet stays 'bad'
00063         else if (bufptr[1] == ((*packet_number) & 0xff))
00064         {                         // same block number ... ack got glitched
00065           packet = dup;           // packet is duplicate, don't inc packet number
00066         }
00067       }
00068       else if (bufptr[0] == EOT)  // check for the end
00069         packet = end;
00070 
00071       else packet = bad;  // byte zero unrecognised
00072                           // statement not required, included for clarity
00073     }
00074     else packet = err; // UART Framing or overrun error
00075   }
00076   else packet = out; // receive timeout error
00077 
00078 
00079   return (packet); // one of: good, dup, end, bad, err, out
00080 }

Generated on Tue Aug 23 13:47:52 2005 for Atmel AVR Application Note by  doxygen 1.4.4