Classes | |
| struct | ResponseFormat |
| Estructura intermedia para pasar datos desde el callback Modbus a las tareas. More... | |
| struct | BitPacker |
| Utilidad para empaquetar bits arbitrarios en un flujo de bytes. More... | |
| struct | SensorDataPayload |
| Contenedor para los datos procesados de un sensor, listo para ser agregado. More... | |
Macros | |
| #define | MAX_SENSOR_PAYLOAD 128 |
| Tamaño máximo del payload de un sensor individual. | |
| #define | AGGREGATION_INTERVAL_MS 6100 |
| Intervalo de agregación (ms). | |
| #define | AGGREGATION_INTERVAL_MS 6100 |
| Intervalo de agregación (ms). | |
Functions | |
| static bool | formatAndEnqueueSensorData (const ResponseFormat &response, const ModbusRequestInfo &request, std::vector< uint8_t > &values) |
| Extrae y formatea los datos de una respuesta Modbus de muestreo. | |
| void | DataFormatter (void *pvParameters) |
| Tarea Formateador de Datos. | |
| std::vector< uint8_t > | construirPayloadUnificado (uint8_t id_mensaje, const std::vector< SensorDataPayload > &collectedPayloads) |
| Construye un payload unificado a partir de una colección de datos de sensores. | |
| void | DataAggregatorTask (void *pvParameters) |
| Tarea proactiva que recolecta y empaqueta datos de sensores a un ritmo fijo. | |
Este módulo se encarga de:
Resumen del flujo :
1) Formateo de respuestas
Descubrimiento: valida estructura y delega la actualización de parámetros del sensor (ver grupo Modbus).
2) Agregación de payloads
3) Entrega a transmisión
El firmware usa un esquema binario optimizado para maximizar la eficiencia de transmisión sobre LoRaWAN. Esta sección describe la estructura del payload para facilitar la implementación del decodificador.
Componentes del payload:
Estructura de cada byte de longitud (8 bits):
Descripción de campos:
Orden de bytes de longitud:
Los bytes de longitud siguen el mismo orden que las banderas del Activate byte (LSB → MSB):
Ejemplo: Si Activate byte = 0x06 (voltaje + corriente activos), habrá 2 bytes de longitud: primero para voltaje, segundo para corriente.
| #define AGGREGATION_INTERVAL_MS 6100 |
Intervalo de agregación (ms).
Intervalo de agregación (6s + 100ms de margen).
| #define AGGREGATION_INTERVAL_MS 6100 |
Intervalo de agregación (ms).
Intervalo de agregación (6s + 100ms de margen).
| std::vector< uint8_t > construirPayloadUnificado | ( | uint8_t | id_mensaje, |
| const std::vector< SensorDataPayload > & | collectedPayloads ) |
Construye un payload unificado a partir de una colección de datos de sensores.
Estructura del Payload: [ID_MSG][TIMESTAMP][ACTIVATE_BYTE][LEN_BYTES...][DATA_BLOCKS...]
| id_mensaje | El byte de ID del mensaje (Cabecera). |
| collectedPayloads | El vector con los datos recolectados. |
| void DataAggregatorTask | ( | void * | pvParameters | ) |
Tarea proactiva que recolecta y empaqueta datos de sensores a un ritmo fijo.
Se despierta cada AGGREGATION_INTERVAL_MS, vacía la cola de datos y envía un único payload LoRaWAN si ha recolectado algo.
| void DataFormatter | ( | void * | pvParameters | ) |
Tarea Formateador de Datos.
Consume respuestas de queueRespuestas, las procesa según su tipo (Descubrimiento o Muestreo) y encola los resultados formateados.
|
static |
Extrae y formatea los datos de una respuesta Modbus de muestreo.
| response | Respuesta cruda recibida. |
| request | Información de la solicitud original. |
| values | Vector de salida donde se guardarán los bytes procesados. |