Marcus Chang / AsyncSerial
Revision:
6:9d48f2197243
Parent:
5:aecd37846dcc
Child:
7:5ba3a01e13c4
--- a/source/AsyncSerial.cpp	Wed Apr 01 16:28:02 2015 +0000
+++ b/source/AsyncSerial.cpp	Wed Apr 01 17:44:12 2015 +0100
@@ -128,15 +128,31 @@
 {
     isReceiving = false;
 
-    if (receiveDoneHandler)
+    if ((receiveBuffer == NULL) && (conditionStartBuffer == 0))
     {
-        receiveDoneHandler(receiveBuffer, receiveIndex, status);
-        receiveDoneHandler = NULL;
+        if (waitDoneHandler)
+        {
+            waitDoneHandler();
+            waitDoneHandler = NULL;
+        }
+        else if (waitObject)
+        {
+            waitDoneObject(waitObject, waitMember);
+            waitObject = NULL;
+        }
     }
-    else if (receiveObject)
+    else
     {
-        receiveDoneObject(receiveObject, receiveMember, receiveBuffer, receiveIndex, status);
-        receiveObject = NULL;
+        if (receiveDoneHandler)
+        {
+            receiveDoneHandler(receiveBuffer, receiveIndex, status);
+            receiveDoneHandler = NULL;
+        }
+        else if (receiveObject)
+        {
+            receiveDoneObject(receiveObject, receiveMember, receiveBuffer, receiveIndex, status);
+            receiveObject = NULL;
+        }
     }
 }
 
@@ -189,6 +205,8 @@
     receiveMaxLength = maxLength;
     receiveIndex = 0;
 
+    conditionStartBuffer = _conditionStartBuffer;
+    conditionStartLength = _conditionStartLength;
     conditionEndBuffer = _conditionEndBuffer;
     conditionEndLength = _conditionEndLength;
     conditionIndex = 0;
@@ -196,8 +214,6 @@
     if ((_conditionStartBuffer != NULL) && (_conditionStartLength != 0))
     {
         insideCondition = false;
-        conditionStartBuffer = _conditionStartBuffer;
-        conditionStartLength = _conditionStartLength;
     }
     else
     {
@@ -208,6 +224,23 @@
     isReceiving = true;
 }
 
+void AsyncSerial::wait(wait_handler_t handler,
+                       const uint8_t* conditionEndBuffer, uint16_t conditionEndLength,
+                       uint32_t timeoutMilli)
+{
+    if (handler)
+    {
+        waitDoneHandler = handler;
+
+        waitObject = NULL;
+
+        receive(NULL, 0,
+                NULL, 0,
+                conditionEndBuffer, conditionEndLength,
+                timeoutMilli);
+    }
+}
+
 void AsyncSerial::receiveTimeout()
 {
     getDone(AsyncSerial::RECEIVE_TIMEOUT);