hostintf: fix sensor->curSamples non-zero on empty queue error

Adjust sensor->curSamples in enqueueSensorBufferEx on enqueue failure.
Check to make sure that sensor->curSamples == buffer->firstSample.numSamples
when the last block of a sensor is transfered to the AP and log an error
if they are not equal (setting sensor->curSamples to
buffer->firstSample.numSamples).

Bug: 31406809
Change-Id: I160030ee18564a540c55a2c222c481c822edd9c5
Signed-off-by: Ben Fennema <fennema@google.com>
diff --git a/firmware/src/hostIntf.c b/firmware/src/hostIntf.c
index 784c234..a9a6cee 100644
--- a/firmware/src/hostIntf.c
+++ b/firmware/src/hostIntf.c
@@ -547,9 +547,9 @@
     struct HostIntfDataBuffer *buffer = data;
     bool ret;
     struct ActiveSensor *sensor;
-    uint32_t i, count = 0;
+    uint32_t i;
 
-    ret = simpleQueueDequeue(mOutputQ, data);
+    ret = simpleQueueDequeue(mOutputQ, buffer);
     while (ret) {
         if (buffer->sensType > SENS_TYPE_INVALID && buffer->sensType <= SENS_TYPE_LAST_USER && mSensorList[buffer->sensType - 1] < MAX_REGISTERED_SENSORS) {
             sensor = mActiveSensorTable + mSensorList[buffer->sensType - 1];
@@ -559,8 +559,7 @@
                 else if (sensor->interrupt == NANOHUB_INT_NONWAKEUP)
                     mNonWakeupBlocks--;
                 sensor->curSamples -= buffer->firstSample.numSamples;
-                ret = simpleQueueDequeue(mOutputQ, data);
-                count++;
+                ret = simpleQueueDequeue(mOutputQ, buffer);
             } else {
                 break;
             }
@@ -572,9 +571,16 @@
     if (!ret) {
         // nothing in queue. look for partial buffers to flush
         for (i = 0; i < mNumSensors; i++, mLastSensor = (mLastSensor + 1) % mNumSensors) {
-            if (mActiveSensorTable[mLastSensor].buffer.length > 0) {
-                memcpy(data, &mActiveSensorTable[mLastSensor].buffer, sizeof(struct HostIntfDataBuffer));
-                resetBuffer(mActiveSensorTable + mLastSensor);
+            sensor = mActiveSensorTable + mLastSensor;
+
+            if (sensor->curSamples != sensor->buffer.firstSample.numSamples) {
+                osLog(LOG_ERROR, "hostIntfPacketDequeue: sensor(%d)->curSamples=%d != buffer->numSamples=%d\n", sensor->buffer.sensType, sensor->curSamples, sensor->buffer.firstSample.numSamples);
+                sensor->curSamples = sensor->buffer.firstSample.numSamples;
+            }
+
+            if (sensor->buffer.length > 0) {
+                memcpy(buffer, &sensor->buffer, sizeof(struct HostIntfDataBuffer));
+                resetBuffer(sensor);
                 ret = true;
                 mLastSensor = (mLastSensor + 1) % mNumSensors;
                 break;
@@ -811,6 +817,7 @@
             mWakeupBlocks--;
         else if (sensor->interrupt == NANOHUB_INT_NONWAKEUP)
             mNonWakeupBlocks--;
+        sensor->curSamples -= sensor->buffer.firstSample.numSamples;
     }
     resetBuffer(sensor);
     return queued ? 1 : 0;