En este artículo me gustaría explicar en detalle la estructura de datos utilizada para gestionar el equipo y los valores medidos. Todas las definiciones de estructura se pueden encontrar en el archivo de biblioteca AT_Database.h.
Cuando se registra un dispositivo, sus características se almacenan en la lista de dispositivos. La lista de dispositivos es una matriz de bloques de datos con la siguiente estructura:
definición de _Device typedef
estructura ATDEVICE
uint8_t activ 0; el dispositivo definido aquí existe
uint8_t servicio 0; 0-ESP-Now Preparación si otros servicios son más adelante
imp-lemented
uint8_t id[6] á .0,0,0,0; Dirección MAC del dispositivo
uint16_t bits de dispositivo s 0; Campo de bits con información sobre el dispositivo y la transmisión de datos
Nombre de la cadena ""; Nombre del dispositivo
String last á ""; Marca de tiempo para la última transferencia de datos exitosa
};
El número de dispositivo sirve como índice en esta matriz. La clase AT_Database define una lista de dispositivos para 32 dispositivos. Para almacenar los datrs del dispositivo permanentemente, se almacenan en el sistema de archivos SPIF en el flash del ESP32.
Las siguientes funciones de la clase se utilizan para trabajar con la lista de dispositivos:
-
booleano readDevices (String fileName); Lee la lista de dispositivos de un archivo con nombres Nombre spiFFS. Devuelve false si se ha producido un error.
-
boolean writeDevices (String fileName); Escribe la lista de dispositivos en un archivo con nombres Nombre spiFFS. Devuelve false si se ha producido un error.
- boolean clearDevices (String fileName); Elimina todos los dispositivos y guarda el resultado en Nombre spiFFS. Devuelve false si se ha producido un error.
- int16_t findDevice(uint8_t id[6]); Esta función encuentra un dispositivo en la lista de dispositivos con el Id (dirección MAC). La función devuelve el índice al número de dispositivo del dispositivo. -1 significa que el dispositivo no está en la lista de dispositivos.
- String getDeviceId(uint8_t dispositivo); Devuelve el identificador del dispositivo con el número de dispositivo Dispositivo Atrás.
Si se toman valores medidos para un dispositivo registrado, los valores se almacenan en la tabla de resultados. La tabla de resultados consta de elementos con la siguiente estructura:
typedef _Structure para almacenar los valores medidos
estructura ATCURVALUES
uint8_t válido; La estructura contiene un valor medido válido
uint8_t paso; se utiliza para guardar los pasos de procesamiento
uint8_t tipo; El tipo de valor medido almacenado
unidad uint8_t; La unidad del valor medido almacenado
uint8_t valor[4]; cuatro bytes con lectura em, ya sea entero de 32 bits o float
dependiendo del tipo. El tipo booleano utiliza solo el primer byte
};
La clase AT_Database asigna espacio para una tabla de resultados con 256 entradas (32 dispositivos con hasta ocho canales cada uno). El índice de esta tabla se calcula a partir del número de dispositivo y el número de canal.
Index: número de dispositivo * 32 + número de canal
Las siguientes funciones de la AT_Database Klkasse funcionan con la tabla de resultados:
- void setResult(uint8_t index, ATDATAPACKET data); Esta función actualiza los datos del índice con los valores de la estructura de datos. La estructura ATDATAPACKET se ha definido en la biblioteca ATMessageBuffer y también se utiliza para la transferencia de datos.
- ATCURVALUES getResult(uint16_t index); Esta función devuelve la estructura descrita anteriormente para el resultado y el índice de posición en la tabla de resultados.
- void setStep(uint8_t paso, uint16_t índice); El paso de procesamiento para el resultado en el índice de la tabla de resultados se establece en el paso value.
- String getValueString(uint16_t index, uint8_t precision, boolean useunit ); Devuelve el valor del resultado como una cadena en el índice de la tabla de resultados. El parámetro precision especifica el número de decimales para los valores float, si el parámetro useunit es true, el nombre del huevo se anexa a la cadena.
- uint8_t getBooleanValue(índice uint16_t); Devuelve el valor booleano del resultado en el índice como 0 o 1. Solo es útil para el tipo booleano.
- booleano isValueOutput(uint16_t index); Devuelve true si el tipo de resultado es un tipo de salida en el índice de puntos, es decir, contiene datos que se envían desde la oficina central al dispositivo. (por ejemplo, interruptor).
- booleano isSwitchOut(uint16_t índice); Similar a la función anterior, sin embargo, sólo es cierto si es un switch:
- booleano isValueZero(índice uint16_t); Devuelve true si el valor del resultado es exactamente 0 en el índice de lugar.
- void toggleResult(uint16_t index); Cambia el resultado en el índice de 0 a 1 o viceversa. Solo es útil para el tipo booleano.
- int8_t getResponse(dispositivo int16_t, búfer de uint8_t *, uint8_t * tamaño);Examina todos los resultados con un tipo de salida para el dispositivo de dispositivo y rellena un búfer de búfer con un paquete de mensajes terminado que, a continuación, se puede transferir al dispositivo. El parámetro size contiene el tamaño máximo del búfer y, cuando se devuelve la función, el tamaño de búfer realmente utilizado. El valor devuelto es el número de paquetes de datos encontrados, o -1 si el tamaño del búfer era demasiado pequeño.
Otra estructura3 de esta biblioteca se utiliza para controlar la visualización de los resultados. Hay una lista de páginas. Cada página contiene 8 entradas de widgets con la siguiente estructura:
typedef _Definition de un widget de Diosplay
estructura ATDISPLAYWIDGET
uint16_t fuente; Indice al resultado asignado
estado uint8_t; Estado 0-no utilizado, 1-usado, 2-marcador de posición, 3-oculto
uint8_t tamaño; Tamaño del widget 0-240x30,1-240x60 a la izquierda
2-120x60 derecha 3-120x60
uint8_t tipo; Tipo de widget, actualmente sólo 0-simple
uint16_t bgcolor; Color de fondo normal
uint16_t bgcolorOn; Color de fondo para los botones cuando está activado
uint16_t fontcolor; Color
uint8_t imagen; Indice de una imagen (aún no utilizada)
uint8_t precisión; Número de decimales para los valores medidos
Etiqueta de cadena á ""; Etiqueta
};
La clase AT_Database reserva espacio para 32 páginas, cada una con hasta ocho widgets. Las siguientes funciones funcionan con esta tabla:
- int16_t getFreeSlot(página uint8_t, tamaño uint8_t); Esta función devuelve el índice de un widget en la página con el tamaño todavía plkatz o -1 si no hay espacio en la página.
- ATDISPLAYPAGE getPage(página uint8_t); Devuelve una lista de todos los widgets de la página.
La función
boolean registerDev(String deviceId, AT_MessageBuffer msg);
registra un dispositivo con el Id deviceId si aún no se ha registrado. El parámetro msg contiene una estructura AT_Messagebuffer con los datos recibidos por última vez de este dispositivo. Para cada canal de este dispositivo, se rellena una entrada en la tabla de resultados y se busca espacio para un widget de visualización en la primera página posible. El tamaño del widget se establece en 30 x 240 píxeles y todos los ajustes se rellenan con los valores predeterminados. Esto garantiza que un dispositivo recién registrado pueda ver todos sus canales. En versiones posteriores del panel de control, estos parámetros de visualización se pueden cambiar individualmente a través de una configuración.
Así que creo que ya es suficiente con la teoría, pero es importante para mí que también entiendas la estructura del sistema para encontrar errores más fácilmente y posiblemente desarrollar extensiones tú mismo.