From a0a64053e2712d73e00ccd99bbb96a17d32175ba Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Wed, 25 Jul 2018 10:03:47 +0200 Subject: [PATCH] update versione lettura IOB con filtro spike brevi --- IOB-PI/std_vers/IOB.cfg | 10 ++++ IOB-PI/std_vers/readParallela.py | 93 ++++++++++++++++++++++++++++---- 2 files changed, 92 insertions(+), 11 deletions(-) diff --git a/IOB-PI/std_vers/IOB.cfg b/IOB-PI/std_vers/IOB.cfg index 6fdb45b..d0e7e4b 100644 --- a/IOB-PI/std_vers/IOB.cfg +++ b/IOB-PI/std_vers/IOB.cfg @@ -44,3 +44,13 @@ bit5 = 0 bit6 = 0 bit7 = 0 +[filter] +MAX_COUNTER_FILTER = 5 +bit0 = 0 +bit1 = 1 +bit2 = 0 +bit3 = 0 +bit4 = 0 +bit5 = 0 +bit6 = 0 +bit7 = 0 diff --git a/IOB-PI/std_vers/readParallela.py b/IOB-PI/std_vers/readParallela.py index 4450429..be774fa 100644 --- a/IOB-PI/std_vers/readParallela.py +++ b/IOB-PI/std_vers/readParallela.py @@ -1,11 +1,12 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -# readParallela v. 2.1 +# readParallela v. 2.2 # - 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 #--------------------------------------------------------------- # levare locking @@ -40,7 +41,7 @@ MAXRETRY = 3 # numero campioni filtraggio segnale ballerino MAX_COUNTER_BLINK = 10 -PROGRAM_NAME ="ReadPar IOB-pi v.2.1" +PROGRAM_NAME ="ReadPar IOB-pi v.2.2" # DA FILE CONF idxMacchina = "1001" @@ -90,10 +91,15 @@ timer_busy = False 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_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_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 @@ -169,14 +175,66 @@ def readParallelaFiltrata(): for i in xrange(8) : # print (i) - # gestione inversione bit ingresso + # 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 - + 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 + else : + # fine disturbo breve di uno stato 1 + i_filter_counters[i] = 0 + B_temp[i] = 1 # tengo l' ingresso a 1 + + # 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 + else : + # fine disturbo breve di uno stato 0 + i_filter_counters[i] = 0 + B_temp[i] = 0 # tengo l' ingresso a 0 + + # 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] @@ -468,7 +526,20 @@ try: 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: print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'