Merge branch 'release/AddUpdater_2.5'

This commit is contained in:
2024-06-14 18:47:08 +02:00
9 changed files with 2068 additions and 120 deletions
+796
View File
@@ -0,0 +1,796 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.5.2 12 Ingressi
# - single instance timer
# - invio multiplo x send eventi accodati
# - gestione segnali BLINKING
# - gestione INVERSIONE segnali cv 10-VII-2018
# - gestione FILTRAGGIO segnali brevi cv 23-VII-2018
# - (2.3) gestione 12 bit cv 14-I-2020
# - (2.4) fix ingressi e conf apertura parallela + gestione vari bit filtraggio x nuovi ingressi + update conf con 12 parametri bit SEL 15-I-2020
# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit)
# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo)
# - (2.5.1) Fix numero versione 18.05.2023
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
# levare locking
# timer semplificata
# GPIO global
import time
import sys
from datetime import datetime
import urllib
import ConfigParser
import os, sys
import logging
import logging.handlers
import threading
import Queue
from array import *
#--------------------------------------------------------------
# COSTANTI
MSGLEN = 9
TIMEOUTSERIALE = 10
MAXRETRY = 10
# numero campioni filtraggio segnale ballerino
MAX_COUNTER_BLINK = 10
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "1001"
SAMPLETIME = 0.1
TIMEOUTSHORT = (SAMPLETIME*20)
TIMEOUTLONG = (SAMPLETIME*600)
SENDURLTIME = 0.08
NMAXSEND = 5 # numero massimo di invii per singolo ciclo di svuotamento
# VAR
to_enable = False
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
to_serial = TIMEOUTSERIALE
to_retry = MAXRETRY
errormsglen = 0
# VAR
out_0 = 24
out_1 = 26
in_0 = 11
in_1 = 12
in_2 = 13
in_3 = 15
in_4 = 16
in_5 = 18
in_6 = 22
in_7 = 7
in_8 = 29
in_9 = 31
in_10 = 32
in_11 = 36
# contatore: serve x match tra accoda ed invia x possibile controllo a posteriori... ogni volta che accodo incremento di 1, va da 0 a 9999
cont = '0'
# variabile stato online/offline della macchina
onLine = '1'
# variabile stato seinding/waiting x la parte invio URL
sending = '0'
# variabile stato timer thread busy
timer_busy = False
#
# array per ingressi filtrati
i_counters = array ( 'i',[0,0,0,0,0,0,0,0,0,0,0,0])
B_blinking = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_previous = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_input = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_output = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_inverting = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_filter = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_filter_prev = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
B_temp = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0])
i_filter_counters = array ( 'i',[0,0,0,0,0,0,0,0,0,0,0,0])
#--------------------------------------------------------------
# Gestione coda (condivisa) x registrazione eventi ed invio URL
#print "Creazione coda illimitata"
Coda = Queue.Queue(0)
#queueLock = threading.Lock()
#---------------------------------------------------------------
# lettura parallela
# ritorna il byte letto pulito ( due char hex )
def readParallelaFiltrata():
global in_0
global in_1
global in_2
global in_3
global in_4
global in_5
global in_6
global in_7
global in_8
global in_9
global in_10
global in_11
global GPIO
current = ''
try:
if GPIO.input(in_0):
B_input[0] = 0
else:
B_input[0] = 1
if GPIO.input(in_1):
B_input[1] = 0
else:
B_input[1] = 1
if GPIO.input(in_2):
B_input[2] = 0
else:
B_input[2] = 1
if GPIO.input(in_3):
B_input[3] = 0
else:
B_input[3] = 1
if GPIO.input(in_4):
B_input[4] = 0
else:
B_input[4] = 1
if GPIO.input(in_5):
B_input[5] = 0
else:
B_input[5] = 1
if GPIO.input(in_6):
B_input[6] = 0
else:
B_input[6] = 1
if GPIO.input(in_7):
B_input[7] = 0
else:
B_input[7] = 1
if GPIO.input(in_8):
B_input[8] = 0
else:
B_input[8] = 1
if GPIO.input(in_9):
B_input[9] = 0
else:
B_input[9] = 1
if GPIO.input(in_10):
B_input[10] = 0
else:
B_input[10] = 1
if GPIO.input(in_11):
B_input[11] = 0
else:
B_input[11] = 1
#ciclo per ogni segnale
for i in xrange(12) :
#print (i)
# v2.1 gestione inversione bit ingresso
if ( B_inverting[i] == 1 ) :
if ( B_input[i] == 0 ) :
B_input[i] = 1
else :
B_input[i] = 0
# v2.2 gestione filtro segnali brevi
if ( B_filter[i] == 1 ) :
# fronte 0 -> 1
if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 0 ) :
if ( i_filter_counters[i] == 0 ) :
# vero fronte 0 -> 1
i_filter_counters[i] = MAX_COUNTER_FILTER
B_temp[i] = 0 # tengo l' ingresso a 0
#logPro.info("START spike 0->1 on bit " + `i` )
else :
# fine disturbo breve di uno stato 1
i_filter_counters[i] = 0
B_temp[i] = 1 # tengo l' ingresso a 1
logPro.info("END spike 0->1 on bit " + `i` )
# stabile 1 -> 1
if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 1 ) :
if ( i_filter_counters[i] == 0 ) :
# segnale stabile a 1
B_temp[i] = 1 # tengo l' ingresso a 1
else :
# poco dopo il fronte
i_filter_counters[i] = i_filter_counters[i] - 1
B_temp[i] = 0 # tengo l' ingresso a 0
# fronte 1 -> 0
if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 1 ) :
if ( i_filter_counters[i] == 0 ) :
# vero fronte 1 -> 0
i_filter_counters[i] = MAX_COUNTER_FILTER
B_temp[i] = 1 # tengo l' ingresso a 1
#logPro.info("START spike 1->0 on bit " + `i` )
else :
# fine disturbo breve di uno stato 0
i_filter_counters[i] = 0
B_temp[i] = 0 # tengo l' ingresso a 0
logPro.info("END spike 1->0 on bit " + `i` )
# stabile 0 -> 0
if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 0 ) :
if ( i_filter_counters[i] == 0 ) :
# segnale stabile a 0
B_temp[i] = 0 # tengo l' ingresso a 0
else :
# poco dopo il fronte
i_filter_counters[i] = i_filter_counters[i] - 1
B_temp[i] = 1 # tengo l' ingresso a 1
B_filter_prev [i] = B_input[i]
B_input[i] = B_temp[i]
# fine gestione filtro segnali brevi
# se non blinking, copia ingresso
if ( B_blinking[i] == 0 ) :
B_output[i] = B_input[i]
else:
# gestione segnale blinking
# se fronte del segnale
if ( B_previous[i] != B_input[i] ) :
B_previous[i] = B_input[i]
# se fronte di salita
if ( B_input[i] == 1 ) :
# subito uscita = 1
B_output[i] = 1
i_counters[i] = MAX_COUNTER_BLINK
#else :
# # loggo che ho rilevato un blink...
# logPro.info("Blink down on bit " + `i`)
else:
# no , segnale eguale a prima
# se input a 0
if ( B_input[i] == 0 ) :
# E CONTEGGIO IN CORSO
if ( i_counters[i] > 0 ) :
i_counters[i] = i_counters[i] -1
if ( i_counters[i] == 0 ) :
B_output[i] = 0
logPro.info("END Blink on bit " + `i` )
#Rimettiamo insieme i bit
new_value = 0
if ( B_output[0] == 1 ) :
new_value = new_value + 1
if ( B_output[1] == 1 ) :
new_value = new_value + 2
if ( B_output[2] == 1 ) :
new_value = new_value + 4
if ( B_output[3] == 1 ) :
new_value = new_value + 8
if ( B_output[4] == 1 ) :
new_value = new_value + 16
if ( B_output[5] == 1 ) :
new_value = new_value + 32
if ( B_output[6] == 1 ) :
new_value = new_value + 64
if ( B_output[7] == 1 ) :
new_value = new_value + 128
if ( B_output[8] == 1 ) :
new_value = new_value + 256
if ( B_output[9] == 1 ) :
new_value = new_value + 512
if ( B_output[10] == 1 ) :
new_value = new_value + 1024
if ( B_output[11] == 1 ) :
new_value = new_value + 2048
current = hex( new_value ).replace ( "0x" , "" ).upper()
except Exception as e:
print "Errore in readParallelaFiltrata \n\n"
print str(e)
pass
return current
#---------------------------------------------------------------
#Funzione di scrittura su coda con try-except
def accoda():
try:
dtEve = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
Coda.put(dtEve + '#' + value + '#' + cont)
except Queue.Full:
logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` )
except Exception as e:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuota_coda():
global onLine
global sending
global timer_busy
global NMAXSEND
#print "start timer "
if ( timer_busy == False ):
timer_busy = True
#print "start timer ok "
try:
if not Coda.empty():
#print "coda da svuotare!"
response = urllib.urlopen(URLALIVE)
answ = response.read()
if answ == 'OK':
#print "OK alive"
response2 = urllib.urlopen(URLENABLED + idxMacchina)
answ2 = response2.read()
if answ2 == 'OK':
# aggiorno stato ad online
if onLine == '0':
logPro.info("IOB ONLINE!")
#print("IOB ONLINE")
onLine = '1' # imposto comunque online
else:
if onLine == '1':
logPro.error("IOB offline")
#print("IOB offline")
onLine = '0'
else:
if onLine == '1':
logPro.error("Server offline")
#print("Server offline")
onLine = '0'
# ora verifico SE si possa inviare (ovvero sia online server e NON ci siano altri send attivi...)
if onLine == '1':
if sending == '0':
#segnalo che sono in sending!
sending = '1'
# SAM 2016.12.23: modifica x invio FINO A nMaxSend ELEMENTI ad ogni ciclo di svuotamento
i = NMAXSEND
while i >= 0:
if not Coda.empty():
# formatto dataOra corrente
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#prendo primo elemento dalla coda
resp = Coda.get()
# recupero valori da elemento coda!
dtEve = resp.split("#")[0]
value = resp.split("#")[1]
cnt = resp.split("#")[2]
url = URLBASE + idxMacchina + URLADV1 + value
url = url + '&dtCurr=' + dtCurr + '&dtEve=' + dtEve + '&cnt=' + cnt
# CHIAMO URL
response3 = urllib.urlopen ( url )
answ3 = response3.read()
#print(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#print "Valore smaltito dalla coda"
# tolgo 1 al contatore
i -= 1
# completato invio, riporto sending a zero!
sending = '0'
else:
if to_retry > 0:
to_retry -= 1
logPro.info("WAIT active send to complete")
else:
sending = '0'
to_retry = MAXRETRY
logPro.info("END WAIT, reset to_retry var")
else:
pass
else:
pass
except Exception as e:
if onLine == '1':
logPro.error("Server Non raggiungibile")
logPro.error(str(e))
#print "Non raggiungibile"
onLine = '0'
# in ogni caso
timer_busy = False
#print "end timer ok"
#print "end timer "
#---------------------------------------------------------------
# funzione timer thread
#---------------------------------------------------------------
def do_every (interval, worker_func, iterations = 0):
if iterations != 1:
threading.Timer (
interval,
do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
).start ();
worker_func ();
#---------------------------------------------------------------
# gestione contatore
#---------------------------------------------------------------
def contatore():
try:
global cont
ctr = int(cont)
ctr +=1
ctr = ctr % 10000 # round robin 10000 eventi x track
cont = str(ctr)
except Exception as e:
print("errore incremento contatore \n\n")
print(str(e))
#---------------------------------------------------------------
# avvia porta parallela
#---------------------------------------------------------------
def avviaParallela():
global in_0
global in_1
global in_2
global in_3
global in_4
global in_5
global in_6
global in_7
global in_8
global in_9
global in_10
global in_11
global GPIO
try:
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
#GPIO.setup(out_0, GPIO.OUT) # output 0
#GPIO.setup(out_1, GPIO.OUT) # output 1
GPIO.setup(in_0, GPIO.IN) # input 0
GPIO.setup(in_1, GPIO.IN) # input 1
GPIO.setup(in_2, GPIO.IN) # input 2
GPIO.setup(in_3, GPIO.IN) # input 3
GPIO.setup(in_4, GPIO.IN) # input 4
GPIO.setup(in_5, GPIO.IN) # input 5
GPIO.setup(in_6, GPIO.IN) # input 6
GPIO.setup(in_7, GPIO.IN) # input 7
GPIO.setup(in_8, GPIO.IN) # input 8
GPIO.setup(in_9, GPIO.IN) # input 9
GPIO.setup(in_10, GPIO.IN) # input 10
GPIO.setup(in_11, GPIO.IN) # input 11
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
print str(e)
sys.exit(1)
print( "\n\n" + PROGRAM_NAME + " - init ok \n\n")
#---------------------------------------------------------------
#---------------------------------------------------------------
# MAIN
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
SAMPLETIME = config.getfloat ( 'time' , 'SAMPLETIME' )
TIMEOUTSHORT = config.getfloat ( 'time' , 'TIMEOUTSHORT' )
TIMEOUTLONG = config.getfloat ( 'time' , 'TIMEOUTLONG' )
SENDURLTIME = config.getfloat ( 'time' , 'SENDURLTIME' )
NMAXSEND = config.getint ( 'time' , 'NMAXSEND' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLBASE = config.get ( 'web' , 'URLBASE' )
URLENABLED = config.get('web' , 'URLENABLED')
URLALIVE = config.get ('web' , 'URLALIVE')
URLADV1 = config.get ( 'web' , 'URLADV1' )
LOGFILE = config.get ( 'log' , 'LOGFILE' )
LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' )
B_blinking[0] = config.getint ( 'blink' , 'bit0' )
B_blinking[1] = config.getint ( 'blink' , 'bit1' )
B_blinking[2] = config.getint ( 'blink' , 'bit2' )
B_blinking[3] = config.getint ( 'blink' , 'bit3' )
B_blinking[4] = config.getint ( 'blink' , 'bit4' )
B_blinking[5] = config.getint ( 'blink' , 'bit5' )
B_blinking[6] = config.getint ( 'blink' , 'bit6' )
B_blinking[7] = config.getint ( 'blink' , 'bit7' )
B_blinking[8] = config.getint ( 'blink' , 'bit8' )
B_blinking[9] = config.getint ( 'blink' , 'bit9' )
B_blinking[10] = config.getint ( 'blink' , 'bit10' )
B_blinking[11] = config.getint ( 'blink' , 'bit11' )
MAX_COUNTER_BLINK = config.getint ( 'blink' , 'MAX_COUNTER_BLINK' )
# cv 2.1 se bit = 1 allora inverto segnale in ingresso...
B_inverting[0] = config.getint ( 'invert' , 'bit0' )
B_inverting[1] = config.getint ( 'invert' , 'bit1' )
B_inverting[2] = config.getint ( 'invert' , 'bit2' )
B_inverting[3] = config.getint ( 'invert' , 'bit3' )
B_inverting[4] = config.getint ( 'invert' , 'bit4' )
B_inverting[5] = config.getint ( 'invert' , 'bit5' )
B_inverting[6] = config.getint ( 'invert' , 'bit6' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
B_inverting[8] = config.getint ( 'invert' , 'bit8' )
B_inverting[9] = config.getint ( 'invert' , 'bit9' )
B_inverting[10] = config.getint ( 'invert' , 'bit10' )
B_inverting[11] = config.getint ( 'invert' , 'bit11' )
# cv 2.2 se bit = 1 allora filtro segnali brevi ...
B_filter[0] = config.getint ( 'filter' , 'bit0' )
B_filter[1] = config.getint ( 'filter' , 'bit1' )
B_filter[2] = config.getint ( 'filter' , 'bit2' )
B_filter[3] = config.getint ( 'filter' , 'bit3' )
B_filter[4] = config.getint ( 'filter' , 'bit4' )
B_filter[5] = config.getint ( 'filter' , 'bit5' )
B_filter[6] = config.getint ( 'filter' , 'bit6' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
B_filter[8] = config.getint ( 'filter' , 'bit8' )
B_filter[9] = config.getint ( 'filter' , 'bit9' )
B_filter[10] = config.getint ( 'filter' , 'bit10' )
B_filter[11] = config.getint ( 'filter' , 'bit11' )
MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' )
except Exception as e:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
print str(e)
sys.exit(1)
#--------------------------------------------
# oggetto Logger
#--------------------------------------------
try:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a'
)
# aggiungo 2 logger specifici x queue e send...
logQue = logging.getLogger('queue')
logSnd = logging.getLogger('sendUrl')
logPro = logging.getLogger('program')
except Exception as e:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome"
print (LOGFILE)
print "\n\n"
print str(e)
#--------------------------------------------
print "\n\n" + PROGRAM_NAME + "\n\n"
global startstatus
startstatus = 1
if startstatus == 1:
logPro.info("Avvio Programma" + PROGRAM_NAME)
## Verifica l'OS e di conseguenza carica il file relativo con metodo di lockfile appropriato + check singola istanza
if os.name == 'posix':
import unix
else:
import win
logPro.info( "Start " + PROGRAM_NAME )
# lettura file configurazione
# [id]
# idxMacchina = 2001
# [time]
# SAMPLETIME = 0.1
# TIMEOUTSHORT = 200
# TIMEOUTLONG = 6000
print ( ' idxMacchina = %s' % ( idxMacchina ) )
print ( ' SAMPLETIME = %4.2f' % ( SAMPLETIME ) )
print ( ' TIMEOUTSHORT = %4.2f' % ( TIMEOUTSHORT ) )
print ( ' TIMEOUTLONG = %4.2f' % ( TIMEOUTLONG ) )
print ( ' SENDURLTIME = %4.2f' % ( SENDURLTIME ) )
print ( ' URLBASE = %s' % ( URLBASE ) )
print ( ' URLADV1 = %s' % ( URLADV1 ) )
print ( ' LOGFILE = %s' % ( LOGFILE ) )
print ( ' LOGLEVEL = %s' % ( LOGLEVEL ) )
# -sys.stdout.write ( 'idxMacchina ?' + idxMacchina + '\n')
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
#--------------------------------------------------------------
# apertura parallela
try:
import RPi.GPIO as GPIO
except RuntimeError:
print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges")
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
print str(e)
sys.exit(1)
avviaParallela()
#--------------------------------------------------------------
# MARCO: qui inserire avvio thread di "svuotaCoda"
# avviaSvuotaCoda
#print "Avvia svuota coda"
do_every ( SENDURLTIME , svuota_coda );
#---------------------------------------------------------------
# ciclo forever and ever
old = ''
#print "Avvio ciclo"
logPro.info("Avvio loop principale")
while 1:
try:
time.sleep (SAMPLETIME)
except Exception as e:
logPro.info("First_SLEEP: errore attesa sampletime")
logPro.error(str(e))
# lettura dati da IOB
value = readParallelaFiltrata()
if ( value != '' ) :
if value != old :
#loggo e invio dati
try:
logQue.info( value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
logPro.error(str(e))
pass
#enable e reset timer
to_enable = True
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
old = value
# gestione timeout breve
if ( to_enable ) :
to_short = to_short - SAMPLETIME
if to_short <= 0:
#loggo e invio dati
try:
logQue.info( '>' + value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
logPro.error(str(e))
pass
to_short = TIMEOUTSHORT
to_enable = False # dopo un colpo il timer breve viene disabilitato
to_long = TIMEOUTLONG
# gestione timeout lungo
to_long = to_long - SAMPLETIME
if to_long <= 0:
#loggo e invio dati
try:
logQue.info( '>>' + value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
logPro.error(str(e))
pass
to_long = TIMEOUTLONG
+733
View File
@@ -0,0 +1,733 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.5.2 8 Ingressi
# - single instance timer
# - invio multiplo x send eventi accodati
# - gestione segnali BLINKING
# - gestione INVERSIONE segnali cv 10-VII-2018
# - gestione FILTRAGGIO segnali brevi cv 23-VII-2018
# - (2.3) gestione 12 bit cv 14-I-2020
# - (2.4) fix ingressi e conf apertura parallela + gestione vari bit filtraggio x nuovi ingressi + update conf con 12 parametri bit SEL 15-I-2020
# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit)
# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo)
# - (2.5.1) Fix numero versione 18.05.2023
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
# levare locking
# timer semplificata
# GPIO global
import time
import sys
from datetime import datetime
import urllib
import ConfigParser
import os, sys
import logging
import logging.handlers
import threading
import Queue
from array import *
#--------------------------------------------------------------
# COSTANTI
MSGLEN = 9
TIMEOUTSERIALE = 10
MAXRETRY = 10
# numero campioni filtraggio segnale ballerino
MAX_COUNTER_BLINK = 10
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "1001"
SAMPLETIME = 0.1
TIMEOUTSHORT = (SAMPLETIME*20)
TIMEOUTLONG = (SAMPLETIME*600)
SENDURLTIME = 0.08
NMAXSEND = 5 # numero massimo di invii per singolo ciclo di svuotamento
# VAR
to_enable = False
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
to_serial = TIMEOUTSERIALE
to_retry = MAXRETRY
errormsglen = 0
# VAR
out_0 = 24
out_1 = 26
in_0 = 11
in_1 = 12
in_2 = 13
in_3 = 15
in_4 = 16
in_5 = 18
in_6 = 22
in_7 = 7
# contatore: serve x match tra accoda ed invia x possibile controllo a posteriori... ogni volta che accodo incremento di 1, va da 0 a 9999
cont = '0'
# variabile stato online/offline della macchina
onLine = '1'
# variabile stato seinding/waiting x la parte invio URL
sending = '0'
# variabile stato timer thread busy
timer_busy = False
#
# array per ingressi filtrati
i_counters = array ( 'i',[0,0,0,0,0,0,0,0])
B_blinking = array ( 'B',[0,0,0,0,0,0,0,0])
B_previous = array ( 'B',[0,0,0,0,0,0,0,0])
B_input = array ( 'B',[0,0,0,0,0,0,0,0])
B_output = array ( 'B',[0,0,0,0,0,0,0,0])
B_inverting = array ( 'B',[0,0,0,0,0,0,0,0])
B_filter = array ( 'B',[0,0,0,0,0,0,0,0])
B_filter_prev = array ( 'B',[0,0,0,0,0,0,0,0])
B_temp = array ( 'B',[0,0,0,0,0,0,0,0])
i_filter_counters = array ( 'i',[0,0,0,0,0,0,0,0])
#--------------------------------------------------------------
# Gestione coda (condivisa) x registrazione eventi ed invio URL
#print "Creazione coda illimitata"
Coda = Queue.Queue(0)
#queueLock = threading.Lock()
#---------------------------------------------------------------
# lettura parallela
# ritorna il byte letto pulito ( due char hex )
def readParallelaFiltrata():
global in_0
global in_1
global in_2
global in_3
global in_4
global in_5
global in_6
global in_7
global GPIO
current = ''
try:
if GPIO.input(in_0):
B_input[0] = 0
else:
B_input[0] = 1
if GPIO.input(in_1):
B_input[1] = 0
else:
B_input[1] = 1
if GPIO.input(in_2):
B_input[2] = 0
else:
B_input[2] = 1
if GPIO.input(in_3):
B_input[3] = 0
else:
B_input[3] = 1
if GPIO.input(in_4):
B_input[4] = 0
else:
B_input[4] = 1
if GPIO.input(in_5):
B_input[5] = 0
else:
B_input[5] = 1
if GPIO.input(in_6):
B_input[6] = 0
else:
B_input[6] = 1
if GPIO.input(in_7):
B_input[7] = 0
else:
B_input[7] = 1
#ciclo per ogni segnale
for i in xrange(8) :
#print (i)
# v2.1 gestione inversione bit ingresso
if ( B_inverting[i] == 1 ) :
if ( B_input[i] == 0 ) :
B_input[i] = 1
else :
B_input[i] = 0
# v2.2 gestione filtro segnali brevi
if ( B_filter[i] == 1 ) :
# fronte 0 -> 1
if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 0 ) :
if ( i_filter_counters[i] == 0 ) :
# vero fronte 0 -> 1
i_filter_counters[i] = MAX_COUNTER_FILTER
B_temp[i] = 0 # tengo l' ingresso a 0
#logPro.info("START spike 0->1 on bit " + `i` )
else :
# fine disturbo breve di uno stato 1
i_filter_counters[i] = 0
B_temp[i] = 1 # tengo l' ingresso a 1
logPro.info("END spike 0->1 on bit " + `i` )
# stabile 1 -> 1
if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 1 ) :
if ( i_filter_counters[i] == 0 ) :
# segnale stabile a 1
B_temp[i] = 1 # tengo l' ingresso a 1
else :
# poco dopo il fronte
i_filter_counters[i] = i_filter_counters[i] - 1
B_temp[i] = 0 # tengo l' ingresso a 0
# fronte 1 -> 0
if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 1 ) :
if ( i_filter_counters[i] == 0 ) :
# vero fronte 1 -> 0
i_filter_counters[i] = MAX_COUNTER_FILTER
B_temp[i] = 1 # tengo l' ingresso a 1
#logPro.info("START spike 1->0 on bit " + `i` )
else :
# fine disturbo breve di uno stato 0
i_filter_counters[i] = 0
B_temp[i] = 0 # tengo l' ingresso a 0
logPro.info("END spike 1->0 on bit " + `i` )
# stabile 0 -> 0
if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 0 ) :
if ( i_filter_counters[i] == 0 ) :
# segnale stabile a 0
B_temp[i] = 0 # tengo l' ingresso a 0
else :
# poco dopo il fronte
i_filter_counters[i] = i_filter_counters[i] - 1
B_temp[i] = 1 # tengo l' ingresso a 1
B_filter_prev [i] = B_input[i]
B_input[i] = B_temp[i]
# fine gestione filtro segnali brevi
# se non blinking, copia ingresso
if ( B_blinking[i] == 0 ) :
B_output[i] = B_input[i]
else:
# gestione segnale blinking
# se fronte del segnale
if ( B_previous[i] != B_input[i] ) :
B_previous[i] = B_input[i]
# se fronte di salita
if ( B_input[i] == 1 ) :
# subito uscita = 1
B_output[i] = 1
i_counters[i] = MAX_COUNTER_BLINK
#else :
# # loggo che ho rilevato un blink...
# logPro.info("Blink down on bit " + `i`)
else:
# no , segnale eguale a prima
# se input a 0
if ( B_input[i] == 0 ) :
# E CONTEGGIO IN CORSO
if ( i_counters[i] > 0 ) :
i_counters[i] = i_counters[i] -1
if ( i_counters[i] == 0 ) :
B_output[i] = 0
logPro.info("END Blink on bit " + `i` )
#Rimettiamo insieme i bit
new_value = 0
if ( B_output[0] == 1 ) :
new_value = new_value + 1
if ( B_output[1] == 1 ) :
new_value = new_value + 2
if ( B_output[2] == 1 ) :
new_value = new_value + 4
if ( B_output[3] == 1 ) :
new_value = new_value + 8
if ( B_output[4] == 1 ) :
new_value = new_value + 16
if ( B_output[5] == 1 ) :
new_value = new_value + 32
if ( B_output[6] == 1 ) :
new_value = new_value + 64
if ( B_output[7] == 1 ) :
new_value = new_value + 128
current = hex( new_value ).replace ( "0x" , "" ).upper()
except Exception as e:
print "Errore in readParallelaFiltrata \n\n"
print str(e)
pass
return current
#---------------------------------------------------------------
#Funzione di scrittura su coda con try-except
def accoda():
try:
dtEve = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
Coda.put(dtEve + '#' + value + '#' + cont)
except Queue.Full:
logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` )
except Exception as e:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuota_coda():
global onLine
global sending
global timer_busy
global NMAXSEND
#print "start timer "
if ( timer_busy == False ):
timer_busy = True
#print "start timer ok "
try:
if not Coda.empty():
#print "coda da svuotare!"
response = urllib.urlopen(URLALIVE)
answ = response.read()
if answ == 'OK':
#print "OK alive"
response2 = urllib.urlopen(URLENABLED + idxMacchina)
answ2 = response2.read()
if answ2 == 'OK':
# aggiorno stato ad online
if onLine == '0':
logPro.info("IOB ONLINE!")
#print("IOB ONLINE")
onLine = '1' # imposto comunque online
else:
if onLine == '1':
logPro.error("IOB offline")
#print("IOB offline")
onLine = '0'
else:
if onLine == '1':
logPro.error("Server offline")
#print("Server offline")
onLine = '0'
# ora verifico SE si possa inviare (ovvero sia online server e NON ci siano altri send attivi...)
if onLine == '1':
if sending == '0':
#segnalo che sono in sending!
sending = '1'
# SAM 2016.12.23: modifica x invio FINO A nMaxSend ELEMENTI ad ogni ciclo di svuotamento
i = NMAXSEND
while i >= 0:
if not Coda.empty():
# formatto dataOra corrente
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#prendo primo elemento dalla coda
resp = Coda.get()
# recupero valori da elemento coda!
dtEve = resp.split("#")[0]
value = resp.split("#")[1]
cnt = resp.split("#")[2]
url = URLBASE + idxMacchina + URLADV1 + value
url = url + '&dtCurr=' + dtCurr + '&dtEve=' + dtEve + '&cnt=' + cnt
# CHIAMO URL
response3 = urllib.urlopen ( url )
answ3 = response3.read()
#print(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#print "Valore smaltito dalla coda"
# tolgo 1 al contatore
i -= 1
# completato invio, riporto sending a zero!
sending = '0'
else:
if to_retry > 0:
to_retry -= 1
logPro.info("WAIT active send to complete")
else:
sending = '0'
to_retry = MAXRETRY
logPro.info("END WAIT, reset to_retry var")
else:
pass
else:
pass
except Exception as e:
if onLine == '1':
logPro.error("Server Non raggiungibile")
logPro.error(str(e))
#print "Non raggiungibile"
onLine = '0'
# in ogni caso
timer_busy = False
#print "end timer ok"
#print "end timer "
#---------------------------------------------------------------
# funzione timer thread
#---------------------------------------------------------------
def do_every (interval, worker_func, iterations = 0):
if iterations != 1:
threading.Timer (
interval,
do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
).start ();
worker_func ();
#---------------------------------------------------------------
# gestione contatore
#---------------------------------------------------------------
def contatore():
try:
global cont
ctr = int(cont)
ctr +=1
ctr = ctr % 10000 # round robin 10000 eventi x track
cont = str(ctr)
except Exception as e:
print("errore incremento contatore \n\n")
print(str(e))
#---------------------------------------------------------------
# avvia porta parallela
#---------------------------------------------------------------
def avviaParallela():
global in_0
global in_1
global in_2
global in_3
global in_4
global in_5
global in_6
global in_7
global GPIO
try:
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
#GPIO.setup(out_0, GPIO.OUT) # output 0
#GPIO.setup(out_1, GPIO.OUT) # output 1
GPIO.setup(in_0, GPIO.IN) # input 0
GPIO.setup(in_1, GPIO.IN) # input 1
GPIO.setup(in_2, GPIO.IN) # input 2
GPIO.setup(in_3, GPIO.IN) # input 3
GPIO.setup(in_4, GPIO.IN) # input 4
GPIO.setup(in_5, GPIO.IN) # input 5
GPIO.setup(in_6, GPIO.IN) # input 6
GPIO.setup(in_7, GPIO.IN) # input 7
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
print str(e)
sys.exit(1)
print( "\n\n" + PROGRAM_NAME + " - init ok \n\n")
#---------------------------------------------------------------
#---------------------------------------------------------------
# MAIN
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
SAMPLETIME = config.getfloat ( 'time' , 'SAMPLETIME' )
TIMEOUTSHORT = config.getfloat ( 'time' , 'TIMEOUTSHORT' )
TIMEOUTLONG = config.getfloat ( 'time' , 'TIMEOUTLONG' )
SENDURLTIME = config.getfloat ( 'time' , 'SENDURLTIME' )
NMAXSEND = config.getint ( 'time' , 'NMAXSEND' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLBASE = config.get ( 'web' , 'URLBASE' )
URLENABLED = config.get('web' , 'URLENABLED')
URLALIVE = config.get ('web' , 'URLALIVE')
URLADV1 = config.get ( 'web' , 'URLADV1' )
LOGFILE = config.get ( 'log' , 'LOGFILE' )
LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' )
B_blinking[0] = config.getint ( 'blink' , 'bit0' )
B_blinking[1] = config.getint ( 'blink' , 'bit1' )
B_blinking[2] = config.getint ( 'blink' , 'bit2' )
B_blinking[3] = config.getint ( 'blink' , 'bit3' )
B_blinking[4] = config.getint ( 'blink' , 'bit4' )
B_blinking[5] = config.getint ( 'blink' , 'bit5' )
B_blinking[6] = config.getint ( 'blink' , 'bit6' )
B_blinking[7] = config.getint ( 'blink' , 'bit7' )
MAX_COUNTER_BLINK = config.getint ( 'blink' , 'MAX_COUNTER_BLINK' )
# cv 2.1 se bit = 1 allora inverto segnale in ingresso...
B_inverting[0] = config.getint ( 'invert' , 'bit0' )
B_inverting[1] = config.getint ( 'invert' , 'bit1' )
B_inverting[2] = config.getint ( 'invert' , 'bit2' )
B_inverting[3] = config.getint ( 'invert' , 'bit3' )
B_inverting[4] = config.getint ( 'invert' , 'bit4' )
B_inverting[5] = config.getint ( 'invert' , 'bit5' )
B_inverting[6] = config.getint ( 'invert' , 'bit6' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
# cv 2.2 se bit = 1 allora filtro segnali brevi ...
B_filter[0] = config.getint ( 'filter' , 'bit0' )
B_filter[1] = config.getint ( 'filter' , 'bit1' )
B_filter[2] = config.getint ( 'filter' , 'bit2' )
B_filter[3] = config.getint ( 'filter' , 'bit3' )
B_filter[4] = config.getint ( 'filter' , 'bit4' )
B_filter[5] = config.getint ( 'filter' , 'bit5' )
B_filter[6] = config.getint ( 'filter' , 'bit6' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' )
except Exception as e:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
print str(e)
sys.exit(1)
#--------------------------------------------
# oggetto Logger
#--------------------------------------------
try:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a'
)
# aggiungo 2 logger specifici x queue e send...
logQue = logging.getLogger('queue')
logSnd = logging.getLogger('sendUrl')
logPro = logging.getLogger('program')
except Exception as e:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome"
print (LOGFILE)
print "\n\n"
print str(e)
#--------------------------------------------
print "\n\n" + PROGRAM_NAME + "\n\n"
global startstatus
startstatus = 1
if startstatus == 1:
logPro.info("Avvio Programma" + PROGRAM_NAME)
## Verifica l'OS e di conseguenza carica il file relativo con metodo di lockfile appropriato + check singola istanza
if os.name == 'posix':
import unix
else:
import win
logPro.info( "Start " + PROGRAM_NAME )
# lettura file configurazione
# [id]
# idxMacchina = 2001
# [time]
# SAMPLETIME = 0.1
# TIMEOUTSHORT = 200
# TIMEOUTLONG = 6000
print ( ' idxMacchina = %s' % ( idxMacchina ) )
print ( ' SAMPLETIME = %4.2f' % ( SAMPLETIME ) )
print ( ' TIMEOUTSHORT = %4.2f' % ( TIMEOUTSHORT ) )
print ( ' TIMEOUTLONG = %4.2f' % ( TIMEOUTLONG ) )
print ( ' SENDURLTIME = %4.2f' % ( SENDURLTIME ) )
print ( ' URLBASE = %s' % ( URLBASE ) )
print ( ' URLADV1 = %s' % ( URLADV1 ) )
print ( ' LOGFILE = %s' % ( LOGFILE ) )
print ( ' LOGLEVEL = %s' % ( LOGLEVEL ) )
# -sys.stdout.write ( 'idxMacchina ?' + idxMacchina + '\n')
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
#--------------------------------------------------------------
# apertura parallela
try:
import RPi.GPIO as GPIO
except RuntimeError:
print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges")
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
print str(e)
sys.exit(1)
avviaParallela()
#--------------------------------------------------------------
# MARCO: qui inserire avvio thread di "svuotaCoda"
# avviaSvuotaCoda
#print "Avvia svuota coda"
do_every ( SENDURLTIME , svuota_coda );
#---------------------------------------------------------------
# ciclo forever and ever
old = ''
#print "Avvio ciclo"
logPro.info("Avvio loop principale")
while 1:
try:
time.sleep (SAMPLETIME)
except Exception as e:
logPro.info("First_SLEEP: errore attesa sampletime")
logPro.error(str(e))
# lettura dati da IOB
value = readParallelaFiltrata()
if ( value != '' ) :
if value != old :
#loggo e invio dati
try:
logQue.info( value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
logPro.error(str(e))
pass
#enable e reset timer
to_enable = True
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
old = value
# gestione timeout breve
if ( to_enable ) :
to_short = to_short - SAMPLETIME
if to_short <= 0:
#loggo e invio dati
try:
logQue.info( '>' + value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
logPro.error(str(e))
pass
to_short = TIMEOUTSHORT
to_enable = False # dopo un colpo il timer breve viene disabilitato
to_long = TIMEOUTLONG
# gestione timeout lungo
to_long = to_long - SAMPLETIME
if to_long <= 0:
#loggo e invio dati
try:
logQue.info( '>>' + value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
logPro.error(str(e))
pass
to_long = TIMEOUTLONG
+135
View File
@@ -0,0 +1,135 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# sendReboot v. 1.8
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
import time
import sys
from datetime import datetime
import urllib
import ConfigParser
import os, sys
import logging
import time
#---------------------------------------------------------------
# COSTANTI
SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "99"
# registro se ho fatto chiamata
global numTry
numTry = 1
#---------------------------------------------------------------
#Funzione di scrittura su url con try-except
#---------------------------------------------------------------
def chiamaUrl(numTry):
try:
urllib.urlopen ( url )
numTry = numTry + 10
except Exception as e:
print("Errore in chiamaUrl")
print(str(e))
logging.info ( str(e) )
print("Url chiamato: " , url)
return numTry
#---------------------------------------------------------------
# Funzione di recupero mac address per poterlo inviare a MPIO
#---------------------------------------------------------------
def getMAC(interface):
# Return the MAC address of interface
try:
str = open('/sys/class/net/' + interface + '/address').read()
except:
str = "00:00:00:00:00:00"
return str[0:17]
#---------------------------------------------------------------
# MAIN
#---------------------------------------------------------------
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLREBO = config.get ( 'web' , 'URLREBO' )
LOGFILE = config.get ( 'log' , 'LOGREBO' )
except Exception as e:
print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg')
print(str(e))
sys.exit(1)
#--------------------------------------------
# oggetto Logger
#--------------------------------------------
try:
# log = Logger(LOGFILE)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a')
except Exception as e:
# manda mail o simili - FARE!!!
print("LOG: Impossibile creare file log con nome ")
print(LOGFILE)
print(str(e))
#--------------------------------------------
print("\n\n" + SR_PROG_NAME + "\n\n")
global startstatus
startstatus = 1
if startstatus == 1:
logging.info("Avvio Programma " + SR_PROG_NAME)
# lettura file configurazione
print ( ' idxMacchina = %s' % ( idxMacchina ) )
print ( ' URLREBO = %s' % ( URLREBO ) )
print ( ' LOGFILE = %s' % ( LOGFILE ) )
# lettura mac address
myMac = getMAC('eth0')
print ( ' MAC Address = %s' % ( myMac ) )
# configuro URL da inviare
url = URLREBO + idxMacchina + "&mac=" + myMac
# modifica: cerco se ho inviato segnale altrimenti ritento invio...
while (numTry < 11):
logging.info("Tentativo invio URL: $numTry" )
numTry = chiamaUrl(numTry)
time.sleep(3)
numTry = numTry + 1
# registro che ho inviato!
logging.info("Inviato segnale di reboot!: " + url )
+248
View File
@@ -0,0 +1,248 @@
#!/bin/bash
# script per update IOB-PI (filre readParallela) secondo la tipologia del raspberry tra 8 e 12 ingressi
revNum=`awk '/^Revision/ {sub("^1000", "", $3); print $3}' /proc/cpuinfo`
anno=2000
model='na'
ram=0
# decodifica da questa tabella: https://elinux.org/RPi_HardwareHistory e https://ozzmaker.com/check-raspberry-software-hardware-version-command-line
case $revNum in
0002 | 0003 | 0004 | 0005 | 0006)
anno='2012'
model='B'
ram=256
;;
0007 | 0008 | 0009)
anno='2013'
model='A'
ram=256
;;
000d | 000e | 000f)
anno='2012'
model='B'
ram=512
;;
0010)
anno='2014'
model='B+'
ram=512
;;
0011)
anno='2014'
model='CM1'
ram=512
;;
0012)
anno='2014'
model='A+'
ram=256
;;
0013)
anno='2015'
model='B+'
ram=512
;;
0014)
anno='2014'
model='CM1'
ram=512
;;
0015)
anno='2014'
model='A+'
ram=512
;;
a01040 | a01041 | a21042)
anno='2015'
model='2 Model B'
ram=1024
;;
a22042)
anno='2016'
model='2 Model B'
ram=1024
;;
900021)
anno='2016'
model='A+'
ram=512
;;
900032)
anno='2016'
model='B+'
ram=512
;;
900092)
anno='2015'
model='Zero'
ram=512
;;
900093 | 920093)
anno='2016'
model='Zero'
ram=512
;;
9000c1)
anno='2017'
model='Zero W'
ram=512
;;
a02082 | a22082 | a22082 | a32082)
anno='2016'
model='3 Model B'
ram=1024
;;
a020a0)
anno='2017'
model='CM3'
ram=1024
;;
a020d3)
anno='2018'
model='3 Model B+'
ram=1024
;;
9020e0)
anno='2018'
model='3 Model A+'
ram=512
;;
a02100)
anno='2019'
model='CM3'
ram=1024
;;
a03111)
anno='2019'
model='4 Model B'
ram=1024
;;
b03111 | b03112)
anno='2019'
model='4 Model B'
ram=2048
;;
b03114)
anno='2020'
model='4 Model B'
ram=2048
;;
b03115)
anno='2022'
model='4 Model B'
ram=2048
;;
c03111 | c03112)
anno='2019'
model='4 Model B'
ram=4096
;;
c03114)
anno='2020'
model='4 Model B'
ram=4096
;;
c03115)
anno='2022'
model='4 Model B'
ram=2048
;;
d03114)
anno='2020'
model='4 Model B'
ram=8192
;;
d03115)
anno='2022'
model='4 Model B'
ram=8192
;;
902120)
anno='2021'
model='Zero 2 W'
ram=512
;;
*)
anno='2000'
model='Unknown'
ram=128
;;
esac
echo "RPI $anno | model $model | RAM $ram"
echo "Revisione: $revNum"
# default a 8 IN...
selIn=8
# verifico anno/ram, se almeno 2014 e 1gb --> 12 bit...
if [ $anno -gt 2015 ] && [ $ram -gt 512 ]; then
selIn=12
fi
echo "Scelta versione $selIn ingressi"
# fermo esecuzione...
/etc/init.d/MapoIOB stop
echo "Arrestato servizio..."
# mv file readParallela.py corrente...
mv readParallela.py readParallela_$(date -d "today" +"%Y%m%d").py
# secondo tipo copio il file corretto
if [ $selIn -eq 8 ]; then
cp -f readParallela_8.py readParallela.py
else
cp -f readParallela_12.py readParallela.py
fi
# fix permessi
chown pi: *
chmod +x readP*
# riavvio esecuzione...
/etc/init.d/MapoIOB restart
echo "Modifiche effettuate..."
echo "Attenzione: verificare effettiva partenza servizio, per farlo digitare il comando"
echo "/etc/init.d/MapoIOB restart"
echo "--------------------------------"
echo "In particolare il file IOB.cfg deve contenere NMAXSEND = 5 nella sezione [time]"
echo "--------------------------------"
echo "Inoltre verificare presenza sezioni [blink] [invert] [filter]"
echo "--------------------------------"
+37 -24
View File
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.5.1
# readParallela v. 2.5.2 12 Ingressi
# - single instance timer
# - invio multiplo x send eventi accodati
# - gestione segnali BLINKING
@@ -12,6 +12,7 @@
# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit)
# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo)
# - (2.5.1) Fix numero versione 18.05.2023
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
# levare locking
@@ -46,7 +47,7 @@ MAXRETRY = 10
# numero campioni filtraggio segnale ballerino
MAX_COUNTER_BLINK = 10
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.1"
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "1001"
@@ -214,7 +215,7 @@ def readParallelaFiltrata():
#ciclo per ogni segnale
for i in xrange(12) :
# print (i)
#print (i)
# v2.1 gestione inversione bit ingresso
@@ -339,7 +340,9 @@ def readParallelaFiltrata():
current = hex( new_value ).replace ( "0x" , "" ).upper()
except:
except Exception as e:
print "Errore in readParallelaFiltrata \n\n"
print str(e)
pass
return current
@@ -355,10 +358,9 @@ def accoda():
except Queue.Full:
logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` )
except:
except Exception as e:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
#print "Url aforte" , url
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
@@ -450,16 +452,17 @@ def svuota_coda():
sending = '0'
to_retry = MAXRETRY
logPro.info("END WAIT, reset to_retry var")
else:
pass
else:
pass
except:
except Exception as e:
if onLine == '1':
logPro.error("Server Non raggiungibile")
logPro.error(str(e))
#print "Non raggiungibile"
onLine = '0'
@@ -496,8 +499,9 @@ def contatore():
ctr +=1
ctr = ctr % 10000 # round robin 10000 eventi x track
cont = str(ctr)
except:
print("errore incremento contatore")
except Exception as e:
print("errore incremento contatore \n\n")
print(str(e))
#---------------------------------------------------------------
# avvia porta parallela
@@ -541,8 +545,9 @@ def avviaParallela():
GPIO.setup(in_10, GPIO.IN) # input 10
GPIO.setup(in_11, GPIO.IN) # input 11
except:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
print str(e)
sys.exit(1)
@@ -598,7 +603,7 @@ try:
B_inverting[4] = config.getint ( 'invert' , 'bit4' )
B_inverting[5] = config.getint ( 'invert' , 'bit5' )
B_inverting[6] = config.getint ( 'invert' , 'bit6' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
B_inverting[8] = config.getint ( 'invert' , 'bit8' )
B_inverting[9] = config.getint ( 'invert' , 'bit9' )
B_inverting[10] = config.getint ( 'invert' , 'bit10' )
@@ -613,7 +618,7 @@ try:
B_filter[4] = config.getint ( 'filter' , 'bit4' )
B_filter[5] = config.getint ( 'filter' , 'bit5' )
B_filter[6] = config.getint ( 'filter' , 'bit6' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
B_filter[8] = config.getint ( 'filter' , 'bit8' )
B_filter[9] = config.getint ( 'filter' , 'bit9' )
B_filter[10] = config.getint ( 'filter' , 'bit10' )
@@ -622,8 +627,9 @@ try:
MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' )
except:
except Exception as e:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
print str(e)
sys.exit(1)
#--------------------------------------------
@@ -642,10 +648,12 @@ try:
logSnd = logging.getLogger('sendUrl')
logPro = logging.getLogger('program')
except:
except Exception as e:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print "LOG: Impossibile creare file log con nome"
print (LOGFILE)
print "\n\n"
print str(e)
#--------------------------------------------
@@ -699,8 +707,9 @@ try:
import RPi.GPIO as GPIO
except RuntimeError:
print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges")
except:
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
print str(e)
sys.exit(1)
@@ -726,8 +735,9 @@ while 1:
try:
time.sleep (SAMPLETIME)
except:
logPro.info("First_SLEEP: errore attesa sampletime")
except Exception as e:
logPro.info("First_SLEEP: errore attesa sampletime")
logPro.error(str(e))
# lettura dati da IOB
value = readParallelaFiltrata()
@@ -740,8 +750,9 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
logPro.error(str(e))
pass
#enable e reset timer
to_enable = True
@@ -761,8 +772,9 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
logPro.error(str(e))
pass
to_short = TIMEOUTSHORT
to_enable = False # dopo un colpo il timer breve viene disabilitato
@@ -777,7 +789,8 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
logPro.error(str(e))
pass
to_long = TIMEOUTLONG
+41 -36
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# sendReboot v. 1.8
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
@@ -23,7 +23,7 @@ import time
#---------------------------------------------------------------
# COSTANTI
PROGRAM_NAME = "SendReboot IOB-pi v.1.8"
SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "99"
@@ -39,44 +39,48 @@ numTry = 1
def chiamaUrl(numTry):
try:
urllib.urlopen ( url )
numTry = numTry + 10
except Exception, e:
print e
logging.info ( e )
print "Url aforte" , url
return numTry
try:
urllib.urlopen ( url )
numTry = numTry + 10
except Exception as e:
print("Errore in chiamaUrl")
print(str(e))
logging.info ( str(e) )
print("Url chiamato: " , url)
return numTry
#---------------------------------------------------------------
# Funzione di recupero mac address per poterlo inviare a MPIO
#---------------------------------------------------------------
def getMAC(interface):
# Return the MAC address of interface
try:
str = open('/sys/class/net/' + interface + '/address').read()
except:
str = "00:00:00:00:00:00"
return str[0:17]
# Return the MAC address of interface
try:
str = open('/sys/class/net/' + interface + '/address').read()
except:
str = "00:00:00:00:00:00"
return str[0:17]
#---------------------------------------------------------------
# MAIN
#---------------------------------------------------------------
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLREBO = config.get ( 'web' , 'URLREBO' )
URLREBO = config.get ( 'web' , 'URLREBO' )
LOGFILE = config.get ( 'log' , 'LOGREBO' )
except:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
sys.exit(1)
LOGFILE = config.get ( 'log' , 'LOGREBO' )
except Exception as e:
print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg')
print(str(e))
sys.exit(1)
#--------------------------------------------
@@ -84,26 +88,27 @@ except:
#--------------------------------------------
try:
# log = Logger(LOGFILE)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a')
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a')
except:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
except Exception as e:
# manda mail o simili - FARE!!!
print("LOG: Impossibile creare file log con nome ")
print(LOGFILE)
print(str(e))
#--------------------------------------------
print "\n\n" + PROGRAM_NAME + "\n\n"
print("\n\n" + SR_PROG_NAME + "\n\n")
global startstatus
startstatus = 1
if startstatus == 1:
logging.info("Avvio Programma " + PROGRAM_NAME)
logging.info("Avvio Programma " + SR_PROG_NAME)
# lettura file configurazione
@@ -120,7 +125,7 @@ url = URLREBO + idxMacchina + "&mac=" + myMac
# modifica: cerco se ho inviato segnale altrimenti ritento invio...
while (numTry < 11):
logging.info("Tentativo invio URL: " + `numTry` )
logging.info("Tentativo invio URL: $numTry" )
numTry = chiamaUrl(numTry)
time.sleep(3)
numTry = numTry + 1
+2 -2
View File
@@ -1,8 +1,8 @@
#! /bin/bash
### BEGIN INIT INFO
# Provides: MapoIOB: script Steamware per avvio driver IOB
# Required-Start: $remote_fs $syslog ramlog
# Required-Stop: $remote_fs $syslog ramlog
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Steamware's MapoIOB driver
+35 -22
View File
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.5.1
# readParallela v. 2.5.2 8 Ingressi
# - single instance timer
# - invio multiplo x send eventi accodati
# - gestione segnali BLINKING
@@ -12,6 +12,7 @@
# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit)
# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo)
# - (2.5.1) Fix numero versione 18.05.2023
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
# levare locking
@@ -46,7 +47,7 @@ MAXRETRY = 10
# numero campioni filtraggio segnale ballerino
MAX_COUNTER_BLINK = 10
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.1"
PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "1001"
@@ -296,7 +297,9 @@ def readParallelaFiltrata():
current = hex( new_value ).replace ( "0x" , "" ).upper()
except:
except Exception as e:
print "Errore in readParallelaFiltrata \n\n"
print str(e)
pass
return current
@@ -312,10 +315,9 @@ def accoda():
except Queue.Full:
logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` )
except:
except Exception as e:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
#print "Url aforte" , url
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
@@ -414,9 +416,10 @@ def svuota_coda():
else:
pass
except:
except Exception as e:
if onLine == '1':
logPro.error("Server Non raggiungibile")
logPro.error(str(e))
#print "Non raggiungibile"
onLine = '0'
@@ -453,8 +456,9 @@ def contatore():
ctr +=1
ctr = ctr % 10000 # round robin 10000 eventi x track
cont = str(ctr)
except:
print("errore incremento contatore")
except Exception as e:
print("errore incremento contatore \n\n")
print(str(e))
#---------------------------------------------------------------
# avvia porta parallela
@@ -490,8 +494,9 @@ def avviaParallela():
GPIO.setup(in_6, GPIO.IN) # input 6
GPIO.setup(in_7, GPIO.IN) # input 7
except:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
print str(e)
sys.exit(1)
@@ -543,7 +548,7 @@ try:
B_inverting[4] = config.getint ( 'invert' , 'bit4' )
B_inverting[5] = config.getint ( 'invert' , 'bit5' )
B_inverting[6] = config.getint ( 'invert' , 'bit6' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
B_inverting[7] = config.getint ( 'invert' , 'bit7' )
# cv 2.2 se bit = 1 allora filtro segnali brevi ...
@@ -554,13 +559,14 @@ try:
B_filter[4] = config.getint ( 'filter' , 'bit4' )
B_filter[5] = config.getint ( 'filter' , 'bit5' )
B_filter[6] = config.getint ( 'filter' , 'bit6' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
B_filter[7] = config.getint ( 'filter' , 'bit7' )
MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' )
except:
except Exception as e:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
print str(e)
sys.exit(1)
#--------------------------------------------
@@ -579,10 +585,12 @@ try:
logSnd = logging.getLogger('sendUrl')
logPro = logging.getLogger('program')
except:
except Exception as e:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print "LOG: Impossibile creare file log con nome"
print (LOGFILE)
print "\n\n"
print str(e)
#--------------------------------------------
@@ -636,8 +644,9 @@ try:
import RPi.GPIO as GPIO
except RuntimeError:
print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges")
except:
except Exception as e:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
print str(e)
sys.exit(1)
@@ -663,8 +672,9 @@ while 1:
try:
time.sleep (SAMPLETIME)
except:
logPro.info("First_SLEEP: errore attesa sampletime")
except Exception as e:
logPro.info("First_SLEEP: errore attesa sampletime")
logPro.error(str(e))
# lettura dati da IOB
value = readParallelaFiltrata()
@@ -677,8 +687,9 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
logPro.error(str(e))
pass
#enable e reset timer
to_enable = True
@@ -698,8 +709,9 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
logPro.error(str(e))
pass
to_short = TIMEOUTSHORT
to_enable = False # dopo un colpo il timer breve viene disabilitato
@@ -714,7 +726,8 @@ while 1:
errormsglen = 0
accoda()
contatore()
except:
except Exception as e:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
logPro.error(str(e))
pass
to_long = TIMEOUTLONG
+41 -36
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
# sendReboot v. 1.8
# - (2.5.2) Fix gestione eccezioni con report dettagliato
#---------------------------------------------------------------
@@ -23,7 +23,7 @@ import time
#---------------------------------------------------------------
# COSTANTI
PROGRAM_NAME = "SendReboot IOB-pi v.1.8"
SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2"
# DA FILE CONF
idxMacchina = "99"
@@ -39,44 +39,48 @@ numTry = 1
def chiamaUrl(numTry):
try:
urllib.urlopen ( url )
numTry = numTry + 10
except Exception, e:
print e
logging.info ( e )
print "Url aforte" , url
return numTry
try:
urllib.urlopen ( url )
numTry = numTry + 10
except Exception as e:
print("Errore in chiamaUrl")
print(str(e))
logging.info ( str(e) )
print("Url chiamato: " , url)
return numTry
#---------------------------------------------------------------
# Funzione di recupero mac address per poterlo inviare a MPIO
#---------------------------------------------------------------
def getMAC(interface):
# Return the MAC address of interface
try:
str = open('/sys/class/net/' + interface + '/address').read()
except:
str = "00:00:00:00:00:00"
return str[0:17]
# Return the MAC address of interface
try:
str = open('/sys/class/net/' + interface + '/address').read()
except:
str = "00:00:00:00:00:00"
return str[0:17]
#---------------------------------------------------------------
# MAIN
#---------------------------------------------------------------
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLREBO = config.get ( 'web' , 'URLREBO' )
URLREBO = config.get ( 'web' , 'URLREBO' )
LOGFILE = config.get ( 'log' , 'LOGREBO' )
except:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
sys.exit(1)
LOGFILE = config.get ( 'log' , 'LOGREBO' )
except Exception as e:
print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg')
print(str(e))
sys.exit(1)
#--------------------------------------------
@@ -84,26 +88,27 @@ except:
#--------------------------------------------
try:
# log = Logger(LOGFILE)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a')
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=LOGFILE,
filemode='a')
except:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
except Exception as e:
# manda mail o simili - FARE!!!
print("LOG: Impossibile creare file log con nome ")
print(LOGFILE)
print(str(e))
#--------------------------------------------
print "\n\n" + PROGRAM_NAME + "\n\n"
print("\n\n" + SR_PROG_NAME + "\n\n")
global startstatus
startstatus = 1
if startstatus == 1:
logging.info("Avvio Programma " + PROGRAM_NAME)
logging.info("Avvio Programma " + SR_PROG_NAME)
# lettura file configurazione
@@ -120,7 +125,7 @@ url = URLREBO + idxMacchina + "&mac=" + myMac
# modifica: cerco se ho inviato segnale altrimenti ritento invio...
while (numTry < 11):
logging.info("Tentativo invio URL: " + `numTry` )
logging.info("Tentativo invio URL: $numTry" )
numTry = chiamaUrl(numTry)
time.sleep(3)
numTry = numTry + 1