00001
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
00041
00042
00043
00044 packet = bad;
00045 if (!gl.t1_timed_out)
00046 {
00047 if (!gl.recv_error)
00048 {
00049 if (bufptr[0] == SOH)
00050 {
00051 if (bufptr[1] == ((*packet_number+1) & 0xff))
00052 {
00053 if ((bufptr[1] + bufptr[2]) == 0xff)
00054 {
00055 crc = calcrc(&bufptr[3],128);
00056 if ((bufptr[131] == (unsigned char)(crc >> 8)) && (bufptr[132] == (unsigned char)(crc)))
00057 {
00058 *packet_number = *packet_number + 1;
00059 packet = good;
00060 }
00061 }
00062 }
00063 else if (bufptr[1] == ((*packet_number) & 0xff))
00064 {
00065 packet = dup;
00066 }
00067 }
00068 else if (bufptr[0] == EOT)
00069 packet = end;
00070
00071 else packet = bad;
00072
00073 }
00074 else packet = err;
00075 }
00076 else packet = out;
00077
00078
00079 return (packet);
00080 }