Lab2_web / Mbed 2 deprecated webserverBlinky

Dependencies:   mbed

Fork of webserverBlinky by RealTimeCompLab2

Revision:
124:18ef53f1d8b7
Parent:
123:fc64fc6caae0
Child:
125:ea88200b1df6
diff -r fc64fc6caae0 -r 18ef53f1d8b7 main.cpp
--- a/main.cpp	Tue Aug 08 20:22:19 2017 +0000
+++ b/main.cpp	Wed Aug 09 12:37:01 2017 +0000
@@ -65,7 +65,7 @@
 
 // verbosity flags used in debug printouts - change to 1 to see increasingly more detailed debug info.
 #define v0 1
-#define v1 1
+#define v1 0
 #define v2 0
 #define IP_HEADER_DUMP_YES /* YES for ip header dump */
 #define TCP_HEADER_DUMP_YES /* YES for tcp header dump */
@@ -110,7 +110,7 @@
     int httpPageCount;
     int firstFrame; // cleared after first frame
     struct {
-#define RXBUFLEN (1<<11)
+#define RXBUFLEN (1<<15)
         // the serial port receive buffer and packet buffer, size is RXBUFLEN (currently 2048 bytes)
         char buf[RXBUFLEN]; // RXBUFLEN MUST be a power of two because we use & operator for fast wrap-around in ring buffer
         int head;
@@ -198,10 +198,16 @@
     while( *nextChar != 0 ) {
         putcWhileCheckingInput( *nextChar ); // write one character to debug port while checking input
         nextChar++;
-    }
+    } 
 #endif
 }
 
+// a sniffer tool to assist in figuring out where in the code we are having characters in the input buffer
+void qq()
+{
+    if ( pc.readable() ) printWhileCheckingInput( "Character available!\n" );
+}
+
 void crcReset()
 {
     ppp.crc=0xffff;   // crc restart
@@ -213,7 +219,7 @@
         ppp.crc=((ppp.crc&1)^(x&1))?(ppp.crc>>1)^0x8408:ppp.crc>>1; // crc calculator
         x>>=1;
     }
-    // fillbuf();
+    fillbuf(); // handle input
 }
 
 int crcBuf(char * buf, int size) // crc on an entire block of memory
@@ -223,12 +229,6 @@
     return ppp.crc;
 }
 
-int rxbufNotEmpty()   // check if rx buffer has data
-{
-    int emptyStatus = (ppp.rx.head==ppp.rx.tail) ? 0 : 1 ;
-    return emptyStatus;
-}
-
 int pc_getBuf()   // get one character from the buffer
 {
     int x = ppp.rx.buf[ ppp.rx.tail ];
@@ -244,15 +244,15 @@
 {
     char pbuf[30];
     for(int i=0; i<ppp.pkt.len; i++) {
-         fillbuf();
-         sprintf(pbuf, "%02x ", ppp.pkt.buf[i]);
-         fillbuf();
-         printWhileCheckingInput(pbuf);
-         }
-         fillbuf();
-         sprintf(pbuf, " CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len);
-         fillbuf();
-         printWhileCheckingInput(pbuf);
+        fillbuf();
+        sprintf(pbuf, "%02x ", ppp.pkt.buf[i]);
+        fillbuf();
+        printWhileCheckingInput(pbuf);
+    }
+    fillbuf();
+    sprintf(pbuf, " CRC=%04x Len=%d\n", ppp.pkt.crc, ppp.pkt.len);
+    fillbuf();
+    printWhileCheckingInput(pbuf);
 }
 
 void processPPPFrame(int start, int end)   // process received frame
@@ -267,6 +267,7 @@
     int unstuff=0;
     int idx = start;
     while(1) {
+        fillbuf();
         if (unstuff==0) {
             if (ppp.rx.buf[idx]==0x7d) unstuff=1;
             else {
@@ -291,27 +292,31 @@
         void determinePacketType(); // declaration only
         determinePacketType();
     } else {
-        if (0) { // set to 1 to report FCS errors
+#ifdef REPORT_FCS_ERROR_YES            
             char pbuf[50]; // local print buffer
             fillbuf();
-            sprintf(pbuf, "PPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line
+            sprintf(pbuf, "\nPPP FCS(crc) Error CRC=%x Length = %d\n",ppp.pkt.crc,ppp.pkt.len); // print a debug line
             fillbuf();
             printWhileCheckingInput( pbuf );
             if(0) dumpPPPFrame(); // set to 1 to dump frames with errors in them
-        }
+#endif        
     }
 }
 
+void pcPutcWhileCheckingInput(int ch)
+{
+    fillbuf(); // check input
+    pc.putc(ch);
+    fillbuf();
+}
+
 void hdlcPut(int ch)   // do hdlc handling of special (flag) characters
 {
     if ( (ch<0x20) || (ch==0x7d) || (ch==0x7e) ) {
-        fillbuf();
-        pc.putc(0x7d);
-        fillbuf();
-        pc.putc(ch^0x20);  // these characters need special handling
+        pcPutcWhileCheckingInput(0x7d);
+        pcPutcWhileCheckingInput(ch^0x20);  // these characters need special handling
     } else {
-        fillbuf();
-        pc.putc(ch);
+        pcPutcWhileCheckingInput(ch);
     }
 }
 
@@ -320,11 +325,11 @@
     int crc = crcBuf(ppp.pkt.buf, ppp.pkt.len-2); // update crc
     ppp.pkt.buf[ ppp.pkt.len-2 ] = (~crc>>0); // fcs lo (crc)
     ppp.pkt.buf[ ppp.pkt.len-1 ] = (~crc>>8); // fcs hi (crc)
-    pc.putc(0x7e); // hdlc start-of-frame "flag"
+    pcPutcWhileCheckingInput(0x7e); // hdlc start-of-frame "flag"
     for(int i=0; i<ppp.pkt.len; i++) {
         hdlcPut( ppp.pkt.buf[i] ); // send a character
     }
-    pc.putc(0x7e); // hdlc end-of-frame "flag"
+    pcPutcWhileCheckingInput(0x7e); // hdlc end-of-frame "flag"
 }
 
 void ipcpConfigRequestHandler()
@@ -337,7 +342,7 @@
     ppp.pkt.buf[4]=1; // change code to request
     ppp.pkt.buf[7]=4; // no options in this request
     ppp.pkt.len=10; // no options in this request shortest ipcp packet possible (4 ppp + 4 ipcp + 2 crc)
-    send_pppFrame(); // send our request
+    send_pppFrame(); // send our request 
 }
 
 void ipcpAckHandler()
@@ -423,6 +428,7 @@
         ptr[len]=0;
     }
     for (int i=0; i<len/2; i++) {
+        fillbuf();
         unsigned int hi = *ptr;
         ptr++;
         unsigned int lo = *ptr;
@@ -451,6 +457,7 @@
         ptr++;
         int val = ( lo & 0xff ) | ( (hi<<8) & 0xff00 );
         sum = sum + val;
+        fillbuf();
     }
     sum = sum + (sum>>16);
     sum = ~sum;
@@ -459,7 +466,7 @@
 }
 
 void ICMPpacket()   // internet control message protocol
-{
+{ 
     char * ipPkt = ppp.pkt.buf+4; // ip packet start
     char * pktLen = ipPkt+2;
     int packetLength = (pktLen[0]<<8) | pktLen[1]; // icmp packet length
@@ -472,12 +479,20 @@
         ipTTL[0]--; // decrement time to live
         char * srcAdr = ipPkt+12;
         char * dstAdr = ipPkt+16;
-#ifndef SERIAL_PORT_MONITOR_NO
+#ifdef SERIAL_PORT_MONITOR_YES
         int icmpIdent = (icmpType[4]<<8)|icmpType[5];
         int icmpSequence = (icmpType[6]<<8)|icmpType[7];
-#endif
-        if(v0) debugPrintf("ICMP PING %d.%d.%d.%d %d.%d.%d.%d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]);
-        if(v0) debugPrintf("Ident %04x Sequence %04d ",icmpIdent,icmpSequence);
+        if(0) {
+            char pbuf[50];
+            fillbuf();
+            sprintf(pbuf, "ICMP PING %d.%d.%d.%d %d.%d.%d.%d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3]);
+            printWhileCheckingInput( pbuf );
+            fillbuf();
+            sprintf(pbuf, "Ident %04x Sequence %04d ",icmpIdent,icmpSequence);
+            fillbuf();
+            printWhileCheckingInput( pbuf );
+        }
+#endif        
         char src[4];
         char dst[4];
         memcpy(src, srcAdr,4);
@@ -500,24 +515,23 @@
         int printSize = icmpLength-8; // exclude size of icmp header
         char * icmpData = icmpType+8; // the actual payload data is after the header
         if (printSize > 10) printSize = 10; // print up to 20 characters
-        if (v0) {
+        if (0) {
             for (int i=0; i<printSize; i++) {
                 char ch = icmpData[i];
                 if (ch>31 && ch<127) {
-                    debugPrintf("%c",ch);
+                    putcWhileCheckingInput(ch);
                 } else {
-                    debugPrintf("_");
+                    putcWhileCheckingInput('_');
                 }
             }
-            debugPrintf("\n");
+            putcWhileCheckingInput('\n');
         }
         send_pppFrame(); // reply to the ping
-
     } else {
         if (v0) {
             debugPrintf("ICMP type=%d \n", icmpType[0]);
         }
-    }
+    } 
 }
 
 void IGMPpacket()   // internet group management protocol
@@ -556,11 +570,8 @@
     int IPv4Id = (ident[0]<<8)|ident[1];
     char pbuf[50]; // local print buffer
     int n=0;
-    fillbuf(); // we are expecting the first character of the next packet
     n=n+sprintf(pbuf+n, outGoing ? "\x1b[34m" : "\x1b[30m" ); // VT100 color code, print black for incoming, blue for outgoing headers
-    fillbuf(); // we are expecting the first character of the next packet
     n=n+sprintf(pbuf+n, "%05d ",IPv4Id); // IPv4Id is a good way to correlate our dumps with net monitor or wireshark traces
-    fillbuf(); // we are expecting the first character of the next packet
 #define DUMP_FULL_IP_ADDRESS_YES
 #ifdef DUMP_FULL_IP_ADDRESS_YES
     char * srcAdr =     ipPkt+12; // 4 bytes
@@ -606,7 +617,7 @@
     if (flags & (1<<0)) flagInfo[0]='F';
     if (flags & (1<<3)) flagInfo[0]='P';
     if (flags & (1<<2)) flagInfo[0]='R';
-    flagInfo[1]=' ';
+    flagInfo[1]=0; // ' '
     flagInfo[2]=0;
 #endif
     printWhileCheckingInput( flagInfo );
@@ -724,6 +735,8 @@
     char * flagbitstcp   = tcp + 12; // 9 bits
     char * windowsizetcp = tcp + 14; // 2 bytes
     char * checksumtcp   = tcp + 16; // 2 bytes
+    
+    if(ident) {}; // shut up unused variable reference warning
 
     int tcpSize = packetLength - headerSizeIP;
     int headerSizeTCP = ((offset[0]>>4)&0x0f)*4; // size of tcp header only
@@ -814,8 +827,8 @@
 
     // increment our outgoing ip packet counter
     ppp.ip.ident++; // get next ident number for our packet
-    ident[0] = ppp.ip.ident>>8;
-    ident[1] = ppp.ip.ident>>0; // insert OUR ident
+    //ident[0] = ppp.ip.ident>>8;
+    //ident[1] = ppp.ip.ident>>0; // insert OUR ident
 
     // Now we recalculate all the header sizes
     int newPacketSize = headerSizeIP + headerSizeTCP + dataLen; // calculate size of the outgoing packet
@@ -849,9 +862,9 @@
     memcpy( tcp-12, tempHold, 12); // restore the 12 bytes that the pseudo-header overwrote
     dumpHeaderIP(1); // dump outgoing IP header
     dumpHeaderTCP(1); // dump outgoing TCP header
-    for (int i=0; i<60000/50; i++) { // a 60 ms delay before sending frame - typical internet delay time
+    for (int i=0; i<70*1000/10; i++) { // 70 ms delay before sending frame - a typical internet delay time
         fillbuf(); // catch any incoming characters
-        wait_us(50); // wait less than 1 character duration at 115200
+        wait_us(10); // wait less than 1 character duration at 115200
     }
     send_pppFrame(); // All preparation complete - send the TCP response
 }
@@ -877,12 +890,12 @@
 }
 
 void TCPpacket()
-{
+{ 
     dumpHeaderIP(0);     // dump incoming packet header
     dumpHeaderTCP(0);   // dump incoming packet header
     if (v2) {
         dumpDataTCP();
-    }
+    } 
     tcpHandler();
 }
 
@@ -1008,7 +1021,7 @@
 {
     while(1) {
         fillbuf(); // handle received characters
-        if ( rxbufNotEmpty() ) {
+        if ( ppp.rx.head != ppp.rx.tail ) {
             int oldTail = ppp.rx.tail; // remember where the character is located in the buffer
             int rx = pc_getBuf(); // get the character
             if (rx==FRAME_7E) {