ReadParallela IOB-PI
Overview
readParallela.py is a high-frequency data acquisition script designed for Raspberry Pi. It interfaces with a custom GPIO board to read 12 parallel digital inputs, applies various signal processing filters, and queues events for asynchronous transmission to a remote server via Redis and HTTP.
Panoramica
readParallela.py è uno script di acquisizione dati ad alta frequenza progettato per Raspberry Pi. Interfaccia una scheda GPIO personalizzata per leggere 12 ingressi digitali paralleli, applica vari filtri di elaborazione del segnale e mette in coda gli eventi per la trasmissione asincrona a un server remoto tramite Redis e HTTP.
Core Functionality
1. Signal Acquisition & Processing
The script polls 12 GPIO pins at a configurable interval (SAMPLETIME). For each input, it applies a three-stage processing pipeline:
- Inversion: Reverses the signal logic if configured for a specific bit.
- Short Signal Filtering (Debounce): Filters out brief electrical spikes or noise by requiring a signal to remain stable for a specific number of cycles (
MAX_COUNTER_FILTER). - Blinking Logic: Detects and manages "blinking" signals, allowing for specific timing-based event detection.
2. Data Packaging
Once processed, the 12 bits are aggregated into a single integer value and converted into a Hexadecimal string.
3. Event Queuing & Transmission
To ensure high-speed reading is not interrupted by network latency:
- Redis Queue: Detected changes (and timeout events) are timestamped and pushed into a Redis list (
IOB). - Asynchronous Sender: A dedicated background thread (
svuotaCoda) periodically dequeues items from Redis and performs HTTP requests to a central server. - Reliability: The script implements a "retry" mechanism and monitors server availability (
URLALIVE) to manage offline periods.
4. Timeout Management
The script tracks two types of timeouts:
- Short Timeout: Ensures that a signal state is recorded even if it changes quickly.
- Long Timeout: Provides a fallback to ensure state consistency over longer periods.
Funzionalità Principali
1. Acquisizione e Elaborazione Segnali
Lo script interroga 12 pin GPIO a un intervallo configurabile (SAMPLETIME). Per ogni ingresso, applica una pipeline di elaborazione a tre stadi:
- Inversione: Inverte la logica del segnale se configurata per un bit specifico.
- Filtraggio Segnali Brevi (Debounce): Filtra i picchi elettrici o il rumore richiedendo che il segnale rimanga stabile per un numero specifico di cicli (
MAX_COUNTER_FILTER). - Gestione Blinking: Rileva e gestisce segnali "blinking", permettendo il rilevamento di eventi basati su timing specifici.
2. Impacchettamento Dati
Una volta elaborati, i 12 bit vengono aggregati in un unico valore intero e convertiti in una stringa Esadecimale.
3. Code e Trasmissione Eventi
Per garantire che la lettura ad alta velocità non sia interrotta dalla latenza di rete:
- Coda Redis: Le variazioni rilevate (e gli eventi di timeout) vengono datate e inserite in una lista Redis (
IOB). - Invio Asincrono: Un thread dedicato in background (
svuotaCoda) estrae periodicamente gli elementi dalla coda Redis e esegue richieste HTTP a un server centrale. - Affidabilità: Lo script implementa un meccanismo di "retry" e monitora la disponibilità del server (
URLALIVE) per gestire i periodi offline.
4. Gestione Timeout
Lo script monitora due tipi di timeout:
- Timeout Breve: Assicura che lo stato di un segnale venga registrato anche se cambia rapidamente.
- Timeout Lungo: Fornisce un sistema di fallback per garantire la coerenza dello stato su periodi più lunghi.
Implementation Details (Refactored Version)
The script has been modernized with the following improvements:
- Object-Oriented Design: Logic is encapsulated within a
ReadParallelaIOBclass, eliminating reliance on dangerous global variables. - Efficient Bitwise Operations: Replaced manual
ifchecks with bitwise operators for faster bit reconstruction. - Modern Networking: Replaced
urllibwith therequestslibrary for more robust and readable HTTP communication. - Optimized Configuration: Uses loops to load per-bit settings from the configuration file.
Dettagli di Implementazione (Versione Refactored)
Lo script è stato modernizzato con i seguenti miglioramenti:
- Design Orientato agli Oggetti: La logica è incapsulata all'interno della classe
ReadParallelaIOB, eliminando la dipendenza da variabili globali pericolose. - Operazioni Bitwise Efficienti: Sostituzione dei controlli manuali
ifcon operatori bitwise per una ricostruzione dei bit più veloce. - Networking Moderno: Sostituzione di
urllibcon la libreriarequestsper una comunicazione HTTP più robusta e leggibile. - Configurazione Ottimizzata: Utilizzo di cicli per caricare le impostazioni per singolo bit dal file di configurazione.
Configuration
Settings are managed via IOB.cfg, including:
[time]: Sampling rates and timeouts.[id]: Machine identifier.[web]: URLs for data transmission and connectivity checks.[blink],[invert],[filter]: Per-bit configuration for signal processing.[log]: Logging verbosity and file paths.
Configurazione
Le impostazioni sono gestite tramite IOB.cfg, tra cui:
[time]: Frequenze di campionamento e timeout.[id]: Identificativo macchina.[web]: URL per la trasmissione dati e controlli di connettività.[blink],[invert],[filter]: Configurazione per singolo bit per l'elaborazione dei segnali.[log]: Livello di logging e percorsi dei file.
Dependencies
RPi.GPIO: For hardware interfacing.redis: For local event queuing.requests: For web communication.configparser: For configuration management.
Dipendenze
RPi.GPIO: Per l'interfacciamento hardware.redis: Per la gestione della coda locale.requests: Per la comunicazione web.configparser: Per la gestione della configurazione.