Closed Frozen-Burrito closed 2 years ago
Otro problema sucede cuando se ha repetido este bug varias veces, donde storage_task
recupera el registro de hidratación desde NVS con éxito, pero no puede enviado a xSyncQueue
porque la queue está llena. Esto resulta en que errQUEUE_FULL
sea retornado por la función xQueueSendToBack
.
El problema del comentario anterior también evita que generator_task
pueda enviar registros de hidratación para sincronización.
Después de más pruebas y análisis, parece que la causa del problema sí era la forma en que se generan y usan los índices para almacenar/recuperar registros de NVS. Aparentemente, storage_task
generaba índices irregularmente, causando que cuando registros con cierto índice fueran leídos de NVS, hubiera la posibilidad de las keys de NVS para el índice dado no hubieran sido escritas.
El problema fue solucionado al cambiar ligeramente la obtención del índice para almacenar:
- lastReceivedRecordIdx = (i + lastReceivedRecordIdx) % MAX_STORED_RECORD_COUNT;
int16_t recordIndex = (i + indexOfLastStoredRecord + 1) % MAX_STORED_RECORD_COUNT;
En vez de modificar la misma variable que es usada para mantener el índice del último registro almacenado, se asigna el resultado a una nueva variable que es usada como índice.
p.d. también arreglé el orden en que son recuperados los registros de NVS. Antes era un orden por índice (con un índice simple de 0 - 5), ahora se recuperan primero los registro con más antigüedad en NVS, con el último siendo el registro más recientemente almacenado.
El problema del comentario anterior también evita que
generator_task
pueda enviar registros de hidratación para sincronización.
Identifiqué que los problemas que resultan en errQUEUE_FULL
son dados por la forma en que pruebo la extensión para botellas: xSyncQueue
siempre está llena porque por el momento todavía no se sincronizan los registros por BLE y no son removidos de la queue.
Ya hice más pruebas y me parece que este problema ha quedado solucionado, los índices para los registros de hidratación están implementados correctamente.
Descripción del Error Cuando la extensión de la botella entra en modo de sincronización e intenta obtener los registros de hidratación almacenados en NVS, puede obtener un solo registro y luego produce un error
ESP_ERR_NVS_NOT_FOUND
para los cuatro registros restantes (la extensión puede almacenar hasta 5 registros de hidratación en NVS).Cómo Reproducir Pasos para reproducir el error:
Comportamiento Esperado Al entrar en modo de sincronización, la extensión para botellas debería sincronizar todos los registros encontrados en
xSyncQueue
, los registros previamente enviados axStorageQueue
, y los registros almacenados en NVS (hasta 5 de los últimos).Entorno
Contexto Adicional Es muy probable que el problema esté relacionado con los índices de acceso a entradas de NVS (el parámetro
index
, recibido por la funciónget_hydration_record()
enstorage.h
. También es posible que el problema esté en la forma que se obtienen las keys para NVS (obtenerlas según el índice, comowater_amount_1
ywater_amount_2
corresponden a los registros con índice 1 y 2, respectivamente).Los logs producidos antes, durante y después de uno de los varios eventos de error producidos por la extensión de botellas: