RealtimeCompLab2

Dependencies:   mbed

Fork of PPP-Blinky by Nicolas Nackel

Revision:
15:b0154c910143
Parent:
14:c65831c25aaa
Child:
16:cb0b80c24ba2
--- a/main.cpp	Sun Jan 01 04:44:30 2017 +0000
+++ b/main.cpp	Sun Jan 01 13:25:23 2017 +0000
@@ -15,22 +15,22 @@
 // https://en.wikibooks.org/wiki/Serial_Programming/IP_Over_Serial_Connections
 
 Serial pc(USBTX, USBRX); // The USB com port - Set this up as a Dial-Up Modem on your pc
-Serial xx(PC_10, PC_11); // debug port - use an additional USB serial port to monitor this
+Serial xx(PC_10, PC_11); // debug((((( port - use an additional USB serial port to monitor this
 
-#define debug(x) xx.printf( x )
+#define debug(x) xx.printf x
 
 DigitalOut led1(LED1);
 
 #define FRAME_7E (0x7e)
 #define BUFLEN (1<<13)
-char rxbuf[BUFLEN];
+volatile char rxbuf[BUFLEN];
 char frbuf[3000]; // buffer for ppp frame
 
 struct {
     int online; 
     struct {
-        char * buf;
-        int head; 
+        volatile char * buf;
+        volatile int head; 
         int tail; 
         int total;
     } rx; // serial port buffer
@@ -51,11 +51,14 @@
 
 void rxHandler() // serial port receive interrupt handler
 {
-    ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in buffer
-    __disable_irq();
-    ppp.rx.head=(ppp.rx.head+1)&(BUFLEN-1);
-    ppp.rx.total++;
-    __enable_irq();
+    int next = (ppp.rx.head+1)&(BUFLEN-1);
+    if (next != ppp.rx.tail) {
+        ppp.rx.buf[ppp.rx.head]=pc.getc(); // insert in buffer
+        __disable_irq();
+        ppp.rx.head=next;
+        //ppp.rx.total++;
+        __enable_irq();
+    }
 }
 
 int ledState=0;
@@ -71,7 +74,7 @@
 
 int pc_getBuf() // get one character from the buffer
 {
-    if (pc_readable()) {
+    if (ppp.rx.head!=ppp.rx.tail) {
         int x = ppp.rx.buf[ ppp.rx.tail ];
         ppp.rx.tail=(ppp.rx.tail+1)&(BUFLEN-1);
         return x;
@@ -83,7 +86,7 @@
 
 void processFrame(int start, int end) { // process received frame
     led1Toggle(); // change led1 state when frames are received
-    if(start==end) { xx.printf("Null Frame c=%d\n",ppp.rx.total); pc.putc(0x7e); return; }
+    if(start==end) {  pc.putc(0x7e); return; }
     crcReset();
     char * dest = ppp.pkt.buf;
     ppp.pkt.len=0;
@@ -102,15 +105,15 @@
         void determinePacketType(); // declare early
         determinePacketType();
     } else { // crc error
-         xx.printf("CRC is %x Len is %d\n",ppp.pkt.crc,ppp.pkt.len);
-         for(int i=0;i<ppp.pkt.len;i++)xx.printf("%02x ", ppp.pkt.buf[i]);
-         xx.printf("\n");
+         debug(("CRC is %x Len is %d\n",ppp.pkt.crc,ppp.pkt.len));
+         for(int i=0;i<ppp.pkt.len;i++) debug(("%02x ", ppp.pkt.buf[i]));
+         debug(("\n"));
     }
 }
 
 void dumpFrame() {
-    for(int i=0;i<ppp.pkt.len/2;i++) xx.printf("%02x ", ppp.pkt.buf[i]);
-    xx.printf(" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len);
+    for(int i=0;i<ppp.pkt.len/2;i++) debug(("%02x ", ppp.pkt.buf[i]));
+    debug((" C %02x %02x L=%d\n", ppp.pkt.crc&0xff, (ppp.pkt.crc>>8)&0xff, ppp.pkt.len));
 }
 
 void sendFrame(){
@@ -119,7 +122,6 @@
     ppp.pkt.buf[ ppp.pkt.len-1 ] = (~crc>>8); // fcs hi (crc)
     pc.putc(0x7e); // frame start flag
     for(int i=0;i<ppp.pkt.len;i++) {
-        //xx.printf( "%2x ", ppp.pkt.buf[i]);
         unsigned int cc = (unsigned int)ppp.pkt.buf[i];
         if (cc>32) pc.putc(cc); else {pc.putc(0x7d); pc.putc(cc+32);}
     } 
@@ -127,16 +129,16 @@
 }
 
 void ipRequestHandler(){
-    debug("IPCP Conf ");
+    debug(("IPCP Conf "));
     if ( ppp.pkt.buf[7] != 4 ) {
-        debug("Rej\n"); // reject if any options are requested
+        debug(("Rej\n")); // reject if any options are requested
         ppp.pkt.buf[4]=4;
         sendFrame();
     } else  {
-        debug("Ack\n");
+        debug(("Ack\n"));
         ppp.pkt.buf[4]=2; // ack the minimum
         sendFrame(); // acknowledge
-        debug("IPCP Ask\n"); 
+        debug(("IPCP Ask\n")); 
         // send our own request now
         ppp.pkt.buf[4]=1; // request no options
         ppp.pkt.buf[5]++; // next sequence
@@ -144,14 +146,13 @@
     }
 }
 
-void ipAckHandler(){ debug("IPCP Grant\n"); }
+void ipAckHandler(){ debug(("IPCP Grant\n")); }
 
-void ipNackHandler(){ debug("IPCP Nack\n"); }
+void ipNackHandler(){ debug(("IPCP Nack\n")); }
 
-void ipDefaultHandler(){ debug("IPCP Other\n"); }
+void ipDefaultHandler(){ debug(("IPCP Other\n")); }
 
 void IPCPframe() {
-    //ppp.pkt.id = ppp.pkt.buf[5]; // remember the sequence number 
     int code = ppp.pkt.buf[4]; // packet type is here
     switch (code) {
         case 1: ipRequestHandler(); break;
@@ -178,12 +179,12 @@
     char * dstIP = udpPkt+16; // udp dst addr
     #define UDP_HEADER_SIZE 8
     int udpLength = ((udpLen[0]<<8) | udpLen[1]) - UDP_HEADER_SIZE; // size of the actual udp data
-    xx.printf("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort);
-    xx.printf("%d.%d.%d.%d:%d ",    dstIP[1],dstIP[1],dstIP[1],dstIP[1],dstPort);
-    xx.printf("Len %d ", udpLength);
+    debug(("UDP %d.%d.%d.%d:%d ", srcIP[0],srcIP[1],srcIP[2],srcIP[3],srcPort));
+    debug(("%d.%d.%d.%d:%d ",    dstIP[1],dstIP[1],dstIP[1],dstIP[1],dstPort));
+    debug(("Len %d ", udpLength));
     int printSize = udpLength; if (printSize > 20) printSize = 20; // print only first 20 characters
-    for (int i=0; i<printSize; i++) { char ch = udpInf[i]; if (ch>31 && ch<127) xx.putc(ch); else xx.putc('?'); } 
-    xx.printf("\n");
+    for (int i=0; i<printSize; i++) { char ch = udpInf[i]; if (ch>31 && ch<127) { debug(("%c", ch)); } else { debug(("?")); } } 
+    debug(("\n"));
 }
 
 int dataCheckSum(char * ptr, int len) {
@@ -229,7 +230,7 @@
         ipTTL[0]--; // decrement time to live
         char * srcAdr = ipPkt+12;
         char * dstAdr = ipPkt+16;
-        xx.printf("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]);
+        debug(("ICMP PING %d.%d.%d.%d %d.%d.%d.%d Head %04d Tail=%04d ", srcAdr[0],srcAdr[1],srcAdr[2],srcAdr[3],dstAdr[0],dstAdr[1],dstAdr[2],dstAdr[3],ppp.rx.head,ppp.rx.tail));
         char src[4]; char dst[4];
         memcpy(src, srcAdr,4);
         memcpy(dst, dstAdr,4);
@@ -244,36 +245,38 @@
         int dataLength = packetLength - headerSize; // length of ICMP data portion
         int sum = dataCheckSum( icmpType, dataLength); // this checksum on icmp data portion
         icmpSum[0]=sum>>8; icmpSum[1]=sum; // new checksum for ICMP data portion
-        sendFrame(); // reply to the ping
         
         int printSize = dataLength-8; // exclude size of icmp header
         char * icmpData = icmpType+8; // the actual data is after the header
-        if (printSize > 20) printSize = 20; // print only first 20 characters
-        for (int i=0; i<printSize; i++) { char ch = icmpData[i]; if (ch>31 && ch<127) xx.putc(ch); else xx.putc('?'); } 
-        xx.putc('\n');
+        if (printSize > 10) printSize = 10; // print only first 20 characters
+        for (int i=0; i<printSize; i++) { char ch = icmpData[i]; if (ch>31 && ch<127) { debug(("%c",ch)); } else { debug(("%c",'?')); }}
+        debug(("%c",'\n'));
+        
+        sendFrame(); // reply to the ping
+        
     } else {
-        xx.printf("ICMP type=%d \n", icmpType[0]); 
+        debug(("ICMP type=%d \n", icmpType[0])); 
     }
 }
 
 void IGMPpacket() { // internet group management protocol
-    xx.printf("IGMP type=%d \n", ppp.pkt.buf[28]); 
+    debug(("IGMP type=%d \n", ppp.pkt.buf[28])); 
 }    
 
 void TCPpacket() {
-    debug("TCP\n");
+    debug(("TCP\n"));
     /*
     switch (protocol) {
         case  2: TCPsyn();  break;
         case 17: TCPack();   break;
         case  6: TCPpacket();   break;
-        default: debug( "Other \n");
+        default: debug(((( "Other \n");
     }        
     */
 }    
 
 void otherProtocol() {
-    debug("Other IP protocol");
+    debug(("Other IP protocol"));
 }
 
 void IPframe() {
@@ -285,38 +288,38 @@
         case    6: TCPpacket();   break;
         default: otherProtocol();
     }        
-    //xx.printf("IP frame proto %3d len %4d %d.%d.%d.%d  %d.%d.%d.%d\n", ppp.pkt.buf[13],(ppp.pkt.buf[6]<<8)+ppp.pkt.buf[7],ppp.pkt.buf[16],ppp.pkt.buf[17],ppp.pkt.buf[18],ppp.pkt.buf[19],ppp.pkt.buf[20],ppp.pkt.buf[21],ppp.pkt.buf[22],ppp.pkt.buf[23] );
+    //debug((("IP frame proto %3d len %4d %d.%d.%d.%d  %d.%d.%d.%d\n", ppp.pkt.buf[13],(ppp.pkt.buf[6]<<8)+ppp.pkt.buf[7],ppp.pkt.buf[16],ppp.pkt.buf[17],ppp.pkt.buf[18],ppp.pkt.buf[19],ppp.pkt.buf[20],ppp.pkt.buf[21],ppp.pkt.buf[22],ppp.pkt.buf[23] );
 }    
 
 void LCPconfReq() {
-    debug("LCP Config ");
+    debug(("LCP Config "));
     if (ppp.pkt.buf[7] != 4) {
         ppp.pkt.buf[4]=4; // allow only no options
-        debug("Reject\n");
+        debug(("Reject\n"));
         sendFrame(); 
     } else {
         ppp.pkt.buf[4]=2; // ack zero conf
-        debug("Ack\n");
+        debug(("Ack\n"));
         sendFrame();
-        debug("LCP Ask\n");
+        debug(("LCP Ask\n"));
         ppp.pkt.buf[4]=1; // request no options
         sendFrame();
     }
 }
 
 void LCPconfAck() {
-    debug("LCP Ack\n");
+    debug(("LCP Ack\n"));
 } 
 
 void LCPend(){
-     debug("LCP End\n");
+     debug(("LCP End\n"));
      ppp.online=0; // start hunting for connect string again
      ppp.pkt.buf[4]=6;
      sendFrame(); // acknowledge
 }
 
 void LCPother(){
-     debug("LCP Other\n");
+     debug(("LCP Other\n"));
      dumpFrame();
 }
 
@@ -331,13 +334,13 @@
 }
 
 void discardedFrame() {
-    xx.printf("Dropping frame %02x %02x %02x %02x\n", ppp.pkt.buf[0],ppp.pkt.buf[1],ppp.pkt.buf[2],ppp.pkt.buf[3] );
+    debug(("Dropping frame %02x %02x %02x %02x\n", ppp.pkt.buf[0],ppp.pkt.buf[1],ppp.pkt.buf[2],ppp.pkt.buf[3]));
 }
 
 void determinePacketType() {
-    if ( ppp.pkt.buf[0] != 0xff ) {debug("byte0 != ff\n"); return;}
-    if ( ppp.pkt.buf[1] != 3    ) {debug("byte1 !=  3\n"); return;}
-    if ( ppp.pkt.buf[3] != 0x21 ) {debug("byte2 != 21\n"); return;}
+    if ( ppp.pkt.buf[0] != 0xff ) { debug(("byte0 != ff\n")); return;}
+    if ( ppp.pkt.buf[1] != 3    ) { debug(("byte1 !=  3\n")); return;}
+    if ( ppp.pkt.buf[3] != 0x21 ) { debug(("byte2 != 21\n")); return;}
     int packetType = ppp.pkt.buf[2];
     switch (packetType) {
         case 0xc0:  LCPframe();     break;  // link control
@@ -349,12 +352,12 @@
 
 void scanForConnectString() {
     if ( ppp.online==0 ) {
-        char * clientFound = strstr( rxbuf, "CLIENTCLIENT" ); // look for PC string
+        char * clientFound = strstr( (char *)rxbuf, "CLIENTCLIENT" ); // look for PC string
         if( clientFound ) { 
             strcpy( clientFound, "FOUND!FOUND!" ); // overwrite so we don't get fixated
             pc.printf("CLIENTSERVER"); // respond to PC
             ppp.online=1; // we can stop looking for the string
-            debug("Connect string found\n");
+            debug(("Connect string found\n"));
         }
     }
 }
@@ -362,7 +365,7 @@
 int main()
 {
     pc.baud(115200); // USB virtual serial port
-    xx.baud(115200); // second serial port for debug messages
+    xx.baud(115200); // second serial port for debug(((((((( messages
     xx.puts("\x1b[2J\x1b[HReady\n"); // VT100 code for clear screen & home
     
     pppInitStruct(); // initialize all the PPP properties