ESPQuickFlash

Dependencies:   BufferedSerial mbed

Revision:
0:d84cdaf22096
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/slip.h	Mon Apr 18 20:36:49 2016 +0000
@@ -0,0 +1,119 @@
+#ifndef SLIP_H
+#define SLIP_H
+
+// Packet wrapping using the SLIP protocol
+template <typename SERIAL>
+class SLIPPacket {
+private:
+    SERIAL _serial;
+    
+public:
+    SLIPPacket(PinName tx, PinName rx) : _serial(tx, rx) {}
+    
+    int checkgetc() {
+        Timer timer;
+        timer.start();
+        
+        while (!_serial.readable()) {
+            if (timer.read_ms() > 1500)
+                return -1;
+        }
+            
+        int c = _serial.getc();
+#ifdef DEBUG
+        printf("<- 0x%02x\r\n", c);
+#endif
+        return c;
+    }
+    
+    int checkputc(char c) {
+        wait_us(100);
+        
+        while (!_serial.writeable())
+            ;
+
+#ifdef DEBUG
+        printf("-> 0x%02x\r\n", c);
+#endif
+        return _serial.putc(c);
+    }
+    
+    void flush() {
+        while (_serial.readable())
+            _serial.getc();
+    }
+
+public:
+    bool req_start() {
+#ifdef LED_STATUS
+        led_blue = 0; // Show progress
+#endif
+        return !(checkputc(0xc0) < 0);
+    }
+    
+    bool req_finish() {
+#ifdef LED_STATUS
+        led_blue = 1; // Show progress
+#endif
+        return !(checkputc(0xc0) < 0);
+    }
+    
+    bool putc(char c) {
+        switch (c) {
+            case 0xdb: return checkputc(0xdb) >= 0 && checkputc(0xdd) >= 0;
+            case 0xc0: return checkputc(0xdb) >= 0 && checkputc(0xdc) >= 0;
+            default:   return checkputc(c) >= 0;
+        }
+    }
+    
+    bool send(const void *data, int len) {
+        for (int i = 0; i < len; i++) {
+            if (!putc(((char *)data)[i]))
+                return false;
+        }
+        
+        return true;
+    }
+ 
+public:
+    bool resp_start() {
+        return checkgetc() == 0xc0;
+    }
+    
+    bool resp_finish() {
+        return checkgetc() == 0xc0;
+    }
+    
+    int getc() {
+        int c = checkgetc();
+        
+        if (c < 0) {
+            return -1;
+        } else if (c == 0xdb) {
+            c = checkgetc();
+            switch (c) {
+                case 0xdd: return 0xdb;
+                case 0xdc: return 0xc0;
+                default:   return -1;
+            }
+        } else {
+            return c;
+        }
+    }
+    
+    bool recv(void *resp, int len) {
+        for (int i = 0; i < len; i++) {
+            int c = getc();
+            
+            if (c < 0)
+                return false;
+            
+            if (resp)
+                ((char *)resp)[i] = c;
+        }
+        
+        return true;
+    }
+};
+
+#endif
\ No newline at end of file