http://mbed.org/users/okini3939/notebook/melinverter

Dependents:   MelInverter_sample

Revision:
1:5963d2a1c30f
Parent:
0:db82bb30177e
Child:
2:b1ef1c4d9c12
--- a/MelInverter.cpp	Thu Mar 29 06:13:13 2012 +0000
+++ b/MelInverter.cpp	Tue Sep 18 14:30:22 2012 +0000
@@ -35,32 +35,32 @@
 
     switch (_mel_mode) {
     case MELMODE_NONE:
-	    switch (dat) {
-	    case INVCTRL_STX:
-	        // Start of text
-	        DBG("INVCTRL_STX\r\n");
-	        _mel_mode = MELMODE_STX;
-	        mode = 0;
-	        len = 0;
-	        sum = 0;
-	        s = 0;
-	        _iid = 0;
-	        break;
-	    case INVCTRL_ACK:
-	        // Acknowledge
-	        DBG("INVCTRL_ACK\r\n");
-	        _mel_mode = MELMODE_ACK;
-	        len = 0;
-	        _iid = 0;
-	        break;
-	    case INVCTRL_NAK:
-	        // Negative acknowledge
-	        DBG("INVCTRL_NAK\r\n");
-	        _mel_mode = MELMODE_NAK;
-	        len = 0;
-	        _iid = 0;
-	        break;
-	    }
+        switch (dat) {
+        case INVCTRL_STX:
+            // Start of text
+            DBG("INVCTRL_STX\r\n");
+            _mel_mode = MELMODE_STX;
+            mode = 0;
+            len = 0;
+            sum = 0;
+            s = 0;
+            _iid = 0;
+            break;
+        case INVCTRL_ACK:
+            // Acknowledge
+            DBG("INVCTRL_ACK\r\n");
+            _mel_mode = MELMODE_ACK;
+            len = 0;
+            _iid = 0;
+            break;
+        case INVCTRL_NAK:
+            // Negative acknowledge
+            DBG("INVCTRL_NAK\r\n");
+            _mel_mode = MELMODE_NAK;
+            len = 0;
+            _iid = 0;
+            break;
+        }
         break;
 
     case MELMODE_STX:
@@ -151,6 +151,7 @@
 int MelInverter::send (int iid, MELCMD cmd, char *data) {
     int i, sum = 0;
     char buf[40];
+    Timer timer;
 
     _mel.putc(INVCTRL_ENQ);
     sprintf(buf, "%02X%02X%01X", iid, cmd, MELDELAY);
@@ -161,14 +162,30 @@
     }
     _mel.printf("%02X\r", sum & 0xff);
     DBG("command: %d %02X %s\r\n", iid, cmd, buf);
-    while (!_mel_ok && !_mel_failure);
+
+    timer.start();
+    while (_mel_ok == 0 && _mel_failure == 0) {
+        if (timer.read_ms() >= MELTIMEOUT) {
+            DBG("timeout\r\n");
+            timer.stop();
+            return 0;
+        }
+    }
+    timer.stop();
     return (_mel_ok == 1);
 }
 
 int MelInverter::recv (int iid, char *buf, int len) {
     int r;
+    Timer timer;
     
-    while (iid != _iid && _mel_recv == 0);
+    timer.start();
+    while (iid != _iid && _mel_recv == 0) {
+        if (timer.read_ms() >= MELTIMEOUT) {
+            DBG("timeout\r\n");
+            return 0;
+        }
+    }
 
     _mel_recv = 0;
     r = _buf_data.get(buf, len);