AT: Fine tuning for unhandled async requests
authorPaul Kocialkowski <contact@paulk.fr>
Mon, 30 Jul 2012 13:21:26 +0000 (15:21 +0200)
committerPaul Kocialkowski <contact@paulk.fr>
Mon, 30 Jul 2012 13:21:26 +0000 (15:21 +0200)
This following changes were introduced with this commit:
* AT send next command won't send if there is an unhandled async pending
* When deuqueing response for async, check unhandled requests before searching
  by command

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
at.c

diff --git a/at.c b/at.c
index e8cf821..5a60fa8 100644 (file)
--- a/at.c
+++ b/at.c
@@ -952,11 +952,16 @@ int at_async_response_dequeue(struct at_response *response)
        // First, try to grab the async request from the response, if it was already filled by sync dequeue
        async_request = at_async_request_find_response(response);
        if(async_request == NULL || async_request->func == NULL) {
-               // Grab the async request from the command
+               // Then, try to find an unhandled response
 
-               async_request = at_async_request_find_command(response->command);
+               async_request = at_async_request_find_handled(AT_RESPONSE_UNHANDELD_REASON_STATUS);
                if(async_request == NULL || async_request->func == NULL) {
-                       return -1;
+                       // Finally, grab the async request from the command
+
+                       async_request = at_async_request_find_command(response->command);
+                       if(async_request == NULL || async_request->func == NULL) {
+                               return -1;
+                       }
                }
 
                // FIXME: What if there is already a response with valid data?
@@ -983,6 +988,8 @@ int at_async_response_dequeue(struct at_response *response)
                async_request->handled = AT_RESPONSE_UNHANDELD_REASON_DATA;
                at_async_request_queue(async_request);
        } else {
+               LOGD("Response was handled!");
+
                // We can free the request
                at_async_request_free(async_request);
 
@@ -1541,13 +1548,19 @@ int at_send_next_request(void)
 {
        struct at_sync_request *sync_request = NULL;
        struct at_async_request *async_request = NULL;
+       struct at_async_request *async_request_sent = NULL;
+       struct at_async_request *async_request_unhandled_status = NULL;
+       struct at_async_request *async_request_unhandled_data = NULL;
        struct at_request *request = NULL;
        int rc;
 
+       // Unhandled requests are still going on too
        sync_request = at_sync_request_find_handled(AT_RESPONSE_SENT);
-       async_request = at_async_request_find_handled(AT_RESPONSE_SENT);
+       async_request_sent = at_async_request_find_handled(AT_RESPONSE_SENT);
+       async_request_unhandled_status = at_async_request_find_handled(AT_RESPONSE_UNHANDELD_REASON_STATUS);
+       async_request_unhandled_data = at_async_request_find_handled(AT_RESPONSE_UNHANDELD_REASON_DATA);
 
-       if(sync_request != NULL || async_request != NULL) {
+       if(sync_request != NULL || async_request_sent != NULL || async_request_unhandled_status != NULL || async_request_unhandled_data != NULL) {
                LOGE("There are still unanswered requests!");
                return -1;
        }