1 Commits

Author SHA1 Message Date
marco.locatelli@steamware.net fedf88ca28 Prima release progetto C# 2020-07-23 11:15:50 +02:00
867 changed files with 2386 additions and 253036 deletions
-6
View File
@@ -331,9 +331,3 @@ _Pvt_Extensions
.settings
# Area temp
/SMGen/*/unsafe_uploads/*
/SMGen/*/Rules/*/*
/SMGen/*/Rules/*
-87
View File
@@ -1,87 +0,0 @@
variables:
VERS_MAIN: '0.9'
NEW_REL: ''
APP_NAME: 'SMGen'
SOL_NAME: 'SMGen'
# helper x fix pacchetti nuget da repo locale nexus.steamware.net
.nuget-fix: &nuget-fix
- |
echo "esecuzione Nuget FIX steps"
dotnet nuget list source
$hasSource = dotnet nuget list source | Select-String -Pattern "Steamware Nexus Proxy"
if (! [String]::IsNullOrWhiteSpace($hasSource)) {
dotnet nuget remove source "`"Steamware Nexus Proxy`""
}
$hasSource = dotnet nuget list source | Select-String -Pattern "Steamware Nexus"
if (! [String]::IsNullOrWhiteSpace($hasSource)) {
dotnet nuget remove source "`"Steamware Nexus`""
}
$hasSource = dotnet nuget list source | Select-String -Pattern "nexus-proxy-v3"
if (! [String]::IsNullOrWhiteSpace($hasSource)) {
dotnet nuget remove source nexus-proxy-v3
}
dotnet nuget add source https://nexus.steamware.net/repository/nuget-group-3/index.json -n "Steamware Nexus" -u nugetUser -p $NEXUS_PASSWD --store-password-in-clear-text
echo "Steamware Nexus Source added"
stages:
- build
- staging
- deploy
# ---------- BUILD ----------
SMGen:build:
stage: build
tags:
- win
variables:
APP_NAME: SMGen
SOL_NAME: SMGen
before_script:
- *nuget-fix
- dotnet restore "$env:SOL_NAME.sln"
script:
- dotnet build $env:APP_NAME/$env:APP_NAME.csproj
# ---------- STAGING ----------
SMGen:staging:
stage: staging
tags:
- win
variables:
APP_NAME: SMGen
SOL_NAME: SMGen
only:
- develop
needs: ["SMGen:build"]
before_script:
- *nuget-fix
- dotnet restore "$env:SOL_NAME.sln"
script:
- dotnet build $env:APP_NAME/$env:APP_NAME.csproj
- dotnet publish -p:PublishProfile=IIS01.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj
# ---------- DEPLOY ----------
SMGen:deploy:
stage: deploy
tags:
- win
environment:
name: production
url: https://office.egalware.com/MP/SMGEN
variables:
APP_NAME: SMGen
SOL_NAME: SMGen
only:
- master
needs: ["SMGen:build"]
before_script:
- *nuget-fix
- dotnet restore "$env:SOL_NAME.sln"
script:
- dotnet build $env:APP_NAME/$env:APP_NAME.csproj
# IIS PROD
- dotnet publish -p:PublishProfile=IIS-PROD.pubxml -p:RunCodeAnalysis=false -p:Configuration=Release -p:username=jenkins -p:Password=$IIS_PWD -p:AllowUntrustedCertificate=true -p:verbosity=quiet $env:APP_NAME/$env:APP_NAME.csproj
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -62,6 +62,6 @@ echo "$(date) | chiusura processi precedenti!" >> $logFile
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
echo "$(date) | apertura nuovo URL!" >> $logFile
DISPLAY=:0.0 chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLBASE = http://10.74.82.219/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.219/MPIO/Alive.aspx
URLENABLED = http://10.74.82.219/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -62,6 +62,6 @@ echo "$(date) | chiusura processi precedenti!" >> $logFile
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
echo "$(date) | apertura nuovo URL!" >> $logFile
DISPLAY=:0.0 chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -1,9 +1,9 @@
ven 14 ott 2016, 16.24.45, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.24.45, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.24.45, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.24.45, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
ven 14 ott 2016, 16.29.23, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.29.23, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.29.23, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.29.23, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
sab 19 nov 2016, 07.17.19, CET | Cavo connesso, eth: up
sab 19 nov 2016, 07.17.19, CET | IP: 192.168.51.173
sab 19 nov 2016, 07.17.19, CET | Siamo a Passirano, imposto pagina a http://192.168.51.71/MP-MON!
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -1,9 +1,9 @@
ven 14 ott 2016, 16.46.26, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.46.26, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.46.26, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.46.26, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
ven 14 ott 2016, 16.47.44, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.47.44, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.47.44, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.47.44, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
sab 17 dic 2016, 11.17.20, CET | Cavo connesso, eth: up
lun 19 dic 2016, 06.44.42, CET | IP: 192.168.51.174
lun 19 dic 2016, 06.44.42, CET | Siamo a Passirano, imposto pagina a http://192.168.51.71/MP-MON!
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+2 -2
View File
@@ -1,9 +1,9 @@
ven 14 ott 2016, 16.41.10, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.41.10, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.41.10, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.41.10, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
ven 14 ott 2016, 16.43.19, CEST | Cavo connesso, eth: up
ven 14 ott 2016, 16.43.19, CEST | IP: 10.74.82.23
ven 14 ott 2016, 16.43.19, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.218/MP-MON!
ven 14 ott 2016, 16.43.19, CEST | Siamo in Steamware, imposto pagina a http://10.74.82.219/MP-MON!
ven 16 dic 2016, 19.17.19, CET | Cavo connesso, eth: up
ven 16 dic 2016, 19.17.19, CET | IP: 192.168.51.175
ven 16 dic 2016, 19.17.19, CET | Siamo a Passirano, imposto pagina a http://192.168.51.71/MP-MON!
+2 -2
View File
@@ -47,7 +47,7 @@ url='file:///home/pi/steamware/MP-MON-DEMO.html'
if [[ $iaddr == "10.74.82"* ]]
then
url='http://10.74.82.218/MP-MON'
url='http://10.74.82.219/MP-MON'
echo "$(date) | Siamo in Steamware, imposto pagina a $url!" >> $logFile
elif [[ $iaddr == "192.168.51"* ]]
then
@@ -61,6 +61,6 @@ fi
killall -9 chromium-browser
# avvio chromium in KIOSK senza segnalazione errori...
#chromium-browser --noerrdialogs --kiosk http://10.74.82.218/MP-MON --incognito --disable-translate
#chromium-browser --noerrdialogs --kiosk http://10.74.82.219/MP-MON --incognito --disable-translate
chromium-browser --noerrdialogs --kiosk $url --incognito --disable-translate
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
Binary file not shown.
+4 -4
View File
@@ -6,11 +6,11 @@ port = COM1
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
Binary file not shown.
@@ -2,11 +2,11 @@
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
@@ -2,11 +2,11 @@
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+1 -25
View File
@@ -1,27 +1,3 @@
# Upgrade sw IOB-PI clienti
ATTENZIONE: se si copia dalla versione standard, SUL PI VA DATO un dos2unix * x tutti i files..
## Salt install##
Se il minion è taggato come iop-pi bast dare state apply, poiché dallo stato top.sls è configurato di fare gli stati
* iob-pi.sls
* iob-setup.sls
## approfondimenti
Valutato python-rq x gestione code con redis tramite esecuzione workers python gestiti in autonomia:
https://python-rq.org/
https://python-rq.org/docs/workers/
Testato ma al momento non è rispondente ai requisiti del programma per cui si rischia un blocco inf ase di invio se server non OK, per ora implementata copia "manuale" della coda verso redis per salvaguardare dati accumulati (vers 2.6.x)
## MD5 zip##
creazione MD5: da powershell
<code>
Get-FileHash .\Mapo.zip -Algorithm MD5
</code>
ATTENZIONE: se si copia dalla versione standard, SUL PI VA DATO un dos2unix * x tutti i files..
BIN
View File
Binary file not shown.
-788
View File
@@ -1,788 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.6.1 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
# - (2.5.3) Fix gestione stringhe e print x python 3.11 in debian 12 / raspberry OS 2025
# - (2.6.0) Aggiunto gestione Redis x code salvate ogni minuto e ricaricate all'avvio 2025.04.17
# - (2.6.1) Cleanup generale vecchia queue post test vari
import time
import sys
from datetime import datetime
import urllib
import urllib.request
import configparser
import os, sys
import logging
import logging.handlers
import threading
import redis
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.6.1"
# 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) su Redis x registrazione eventi ed invio URL
CodaR = redis.Redis(host='localhost', port=6379, db=0, password='24068Seriate')
queue_name = 'IOB'
#-----------------------------------
# Gestione code REDIS (sost. coda in ram)
# Function to add an item to the queue (enqueue)
def rqEnqueue(item):
CodaR.rpush(queue_name, item)
#logQue.info(f"Enqueued: {item}")
# Function to remove an item from the queue (dequeue)
def rqDequeue():
item = CodaR.lpop(queue_name)
if item:
#logQue.info(f"Dequeued: {item.decode('utf-8')}")
return item.decode('utf-8')
else:
logQue.info("Queue is empty, nothing to retrieve!")
# Function to count queue actual lenght in Redis
def rqLen():
cLen = CodaR.llen(queue_name)
if cLen:
#logQue.info(f"Queue len: {cLen}")
return cLen
else:
#logQue.info("Queue is empty")
return 0
#---------------------------------------------------------------
# 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 range(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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]
rqEnqueue(dtEve + '#' + value + '#' + cont)
except Exception as e:
logPro.error( "QUEUE:Errore coda \n\n" )
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuotaCoda():
global onLine
global sending
global timer_busy
global NMAXSEND
#logPro.info ("start timer ")
if ( timer_busy == False ):
timer_busy = True
#logPro.info ("start timer ok ")
try:
if not rqLen() == 0:
#logPro.info ("coda da svuotare!")
response = urllib.request.urlopen(URLALIVE)
answ = response.read().decode('utf-8')
#logPro.info(answ)
if answ == 'OK':
#logPro.info ("OK alive")
response2 = urllib.request.urlopen(URLENABLED + idxMacchina)
answ2 = response2.read().decode('utf-8')
if answ2 == 'OK':
# aggiorno stato ad online
if onLine == '0':
logPro.info("IOB ONLINE!")
onLine = '1' # imposto comunque online
else:
if onLine == '1':
logPro.error("IOB offline")
onLine = '0'
else:
if onLine == '1':
logPro.error("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 rqLen() == 0:
# formatto dataOra corrente
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#prendo primo elemento dalla coda
resp = rqDequeue()
# 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.request.urlopen ( url )
answ3 = response3.read().decode('utf-8')
#logSnd.info(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#logSnd.info ("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))
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
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()
#--------------------------------------------------------------
# Qui avvio thread periodico di "svuotaCoda"
#print ("Avvia svuota coda")
do_every ( SENDURLTIME , svuotaCoda );
#---------------------------------------------------------------
# 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
-788
View File
@@ -1,788 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.6.1 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
# - (2.5.3) Fix gestione stringhe e print x python 3.11 in debian 12 / raspberry OS 2025
# - (2.6.0) Aggiunto gestione Redis x code salvate ogni minuto e ricaricate all'avvio 2025.04.17
# - (2.6.1) Cleanup generale vecchia queue post test vari
import time
import sys
from datetime import datetime
import urllib
import urllib.request
import configparser
import os, sys
import logging
import logging.handlers
import threading
import redis
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.6.1"
# 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) su Redis x registrazione eventi ed invio URL
CodaR = redis.Redis(host='localhost', port=6379, db=0, password='24068Seriate')
queue_name = 'IOB'
#-----------------------------------
# Gestione code REDIS (sost. coda in ram)
# Function to add an item to the queue (enqueue)
def rqEnqueue(item):
CodaR.rpush(queue_name, item)
#logQue.info(f"Enqueued: {item}")
# Function to remove an item from the queue (dequeue)
def rqDequeue():
item = CodaR.lpop(queue_name)
if item:
#logQue.info(f"Dequeued: {item.decode('utf-8')}")
return item.decode('utf-8')
else:
logQue.info("Queue is empty, nothing to retrieve!")
# Function to count queue actual lenght in Redis
def rqLen():
cLen = CodaR.llen(queue_name)
if cLen:
#logQue.info(f"Queue len: {cLen}")
return cLen
else:
#logQue.info("Queue is empty")
return 0
#---------------------------------------------------------------
# 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 range(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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]
rqEnqueue(dtEve + '#' + value + '#' + cont)
except Exception as e:
logPro.error( "QUEUE:Errore coda \n\n" )
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuotaCoda():
global onLine
global sending
global timer_busy
global NMAXSEND
#logPro.info ("start timer ")
if ( timer_busy == False ):
timer_busy = True
#logPro.info ("start timer ok ")
try:
if not rqLen() == 0:
#logPro.info ("coda da svuotare!")
response = urllib.request.urlopen(URLALIVE)
answ = response.read().decode('utf-8')
#logPro.info(answ)
if answ == 'OK':
#logPro.info ("OK alive")
response2 = urllib.request.urlopen(URLENABLED + idxMacchina)
answ2 = response2.read().decode('utf-8')
if answ2 == 'OK':
# aggiorno stato ad online
if onLine == '0':
logPro.info("IOB ONLINE!")
onLine = '1' # imposto comunque online
else:
if onLine == '1':
logPro.error("IOB offline")
onLine = '0'
else:
if onLine == '1':
logPro.error("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 rqLen() == 0:
# formatto dataOra corrente
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#prendo primo elemento dalla coda
resp = rqDequeue()
# 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.request.urlopen ( url )
answ3 = response3.read().decode('utf-8')
#logSnd.info(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#logSnd.info ("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))
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
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()
#--------------------------------------------------------------
# Qui avvio thread periodico di "svuotaCoda"
#print ("Avvia svuota coda")
do_every ( SENDURLTIME , svuotaCoda );
#---------------------------------------------------------------
# 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
-731
View File
@@ -1,731 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.6.1 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
# - (2.5.3) Fix gestione stringhe e print x python 3.11 in debian 12 / raspberry OS 2025
# - (2.6.0) Aggiunto gestione Redis x code salvate ogni minuto e ricaricate all'avvio 2025.04.17
# - (2.6.1) Cleanup generale vecchia queue post test vari
import time
import sys
from datetime import datetime
import urllib
import urllib.request
import configparser
import os, sys
import logging
import logging.handlers
import threading
import redis
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.6.1"
# 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) su Redis x registrazione eventi ed invio URL
CodaR = redis.Redis(host='localhost', port=6379, db=0, password='24068Seriate')
queue_name = 'IOB'
#-----------------------------------
# Gestione code REDIS (sost. coda in ram)
# Function to add an item to the queue (enqueue)
def rqEnqueue(item):
CodaR.rpush(queue_name, item)
#logQue.info(f"Enqueued: {item}")
# Function to remove an item from the queue (dequeue)
def rqDequeue():
item = CodaR.lpop(queue_name)
if item:
#logQue.info(f"Dequeued: {item.decode('utf-8')}")
return item.decode('utf-8')
else:
logQue.info("Queue is empty, nothing to retrieve!")
# Function to count queue actual lenght in Redis
def rqLen():
cLen = CodaR.llen(queue_name)
if cLen:
#logQue.info(f"Queue len: {cLen}")
return cLen
else:
#logQue.info("Queue is empty")
return 0
#---------------------------------------------------------------
# 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 range(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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 " + str(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]
rqEnqueue(dtEve + '#' + value + '#' + cont)
except Exception as e:
logPro.error( "QUEUE:Errore coda \n\n" )
logPro.error(str(e))
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuotaCoda():
global onLine
global sending
global timer_busy
global NMAXSEND
#logPro.info ("start timer ")
if ( timer_busy == False ):
timer_busy = True
#logPro.info ("start timer ok ")
try:
if not rqLen() == 0:
#logPro.info ("coda da svuotare!")
response = urllib.request.urlopen(URLALIVE)
answ = response.read().decode('utf-8')
#logPro.info(answ)
if answ == 'OK':
#logPro.info ("OK alive")
response2 = urllib.request.urlopen(URLENABLED + idxMacchina)
answ2 = response2.read().decode('utf-8')
if answ2 == 'OK':
# aggiorno stato ad online
if onLine == '0':
logPro.info("IOB ONLINE!")
onLine = '1' # imposto comunque online
else:
if onLine == '1':
logPro.error("IOB offline")
onLine = '0'
else:
if onLine == '1':
logPro.error("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 rqLen() == 0:
# formatto dataOra corrente
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#prendo primo elemento dalla coda
resp = rqDequeue()
# 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.request.urlopen ( url )
answ3 = response3.read().decode('utf-8')
#logSnd.info(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#logSnd.info ("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))
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
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()
#--------------------------------------------------------------
# Qui avvio thread periodico di "svuotaCoda"
#print ("Avvia svuota coda")
do_every ( SENDURLTIME , svuotaCoda );
#---------------------------------------------------------------
# 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
-138
View File
@@ -1,138 +0,0 @@
#!/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 urllib.request
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.request.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 = 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 )
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+4 -4
View File
@@ -2,11 +2,11 @@
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLBASE = http://10.74.82.219/MP/IO/IOB/input/
URLALIVE = http://10.74.82.219/MP/IO/IOB
URLENABLED = http://10.74.82.219/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
URLREBO = http://10.74.82.219/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
+7 -16
View File
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.5.1
# readParallela v. 2.4
# - single instance timer
# - invio multiplo x send eventi accodati
# - gestione segnali BLINKING
@@ -9,9 +9,6 @@
# - 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
#---------------------------------------------------------------
# levare locking
@@ -41,12 +38,12 @@ from array import *
# COSTANTI
MSGLEN = 9
TIMEOUTSERIALE = 10
MAXRETRY = 10
MAXRETRY = 3
# 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.4"
# DA FILE CONF
idxMacchina = "1001"
@@ -307,7 +304,7 @@ def readParallelaFiltrata():
B_output[i] = 0
logPro.info("END Blink on bit " + `i` )
#Rimettiamo insieme i bit
#Rimettiamo insieme i bit
new_value = 0
if ( B_output[0] == 1 ) :
@@ -357,7 +354,7 @@ def accoda():
logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` )
except:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
#print "Url aforte" , url
# print "Url aforte" , url
#--------------------------------------------------------------
@@ -443,13 +440,7 @@ def svuota_coda():
# 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")
logPro.info("WAIT active send to complete")
else:
pass
@@ -464,7 +455,7 @@ def svuota_coda():
onLine = '0'
# in ogni caso
# in ogni caso
timer_busy = False
#print "end timer ok"
-16
View File
@@ -1,16 +0,0 @@
## Note operative test Python Redis-Queue
Impiego degli script python x test...
1) setup preliminare, installando redis + python rq
2) chiamare (per fare enqueue) lo script che esegue fuzione python ed accoda task:
```python
python3 rctest.py
```
3) chiamare demone esecuzione (su altro processo, schedulabile) che invoca lo script python rset.py come argomento
```python
rq worker -c rset
```
Binary file not shown.
-27
View File
@@ -1,27 +0,0 @@
from redis import Redis
from rq import Queue
from wcount import count_words_at_url
import time
#redis_conn = Redis()
redis_conn = Redis(
host='localhost',
port=6379,
password='24068Seriate')
q = Queue(connection=redis_conn) # no args implies the default queue
# Delay execution of count_words_at_url('http://nvie.com')
job1 = q.enqueue(count_words_at_url, 'http://nview.com')
job2 = q.enqueue(count_words_at_url, 'https://repubblica.it')
print('Job1 id: %s' % job1.id)
print('Job2 id: %s' % job2.id)
print(job1.result) # => None # Changed to job.return_value() in RQ >= 1.12.0
print(job2.result) # => None # Changed to job.return_value() in RQ >= 1.12.0
# Now, wait a while, until the worker is finished
time.sleep(2)
print(job1.result)
print(job2.result)
-11
View File
@@ -1,11 +0,0 @@
#REDIS_URL = 'redis://localhost:6379/1'
# You can also specify the Redis DB to use
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_DB = 0
# REDIS_PASSWORD = 'very secret'
REDIS_PASSWORD = '24068Seriate'
# Queues to listen on
QUEUES = ['high', 'default', 'low']
-7
View File
@@ -1,7 +0,0 @@
import requests
def count_words_at_url(url):
resp = requests.get(url)
nwords = len(resp.text.split())
print ( nwords )
return nwords
-48
View File
@@ -1,48 +0,0 @@
import redis
import time
CodaR = redis.Redis(host='localhost', port=6379, db=0, password='24068Seriate')
queue_name='IOB'
#-----------------------------------
# Gestione code REDIS
# per sostituzione 1:1 con coda in ram
# Function to add an item to the queue (enqueue)
def enqueue(item):
CodaR.rpush(queue_name, item)
print(f"Enqueued: {item}")
# Function to remove an item from the queue (dequeue)
def dequeue():
item = CodaR.lpop(queue_name)
if item:
print(f"Dequeued: {item.decode('utf-8')}")
return item.decode('utf-8')
else:
print("Queue is empty")
# Function to count queue actual lenght in Redis
def rqlen():
clen = CodaR.llen(queue_name)
if clen:
print(f"Queue len: {clen}")
return clen
else:
print("Queue is empty")
return 0
lung = rqlen()
print ("queue lenght: "+str(lung))
enqueue('prova1')
enqueue('prova2')
enqueue('prova3')
time.sleep(5)
lung = rqlen()
while lung > 0:
dequeue()
lung = rqlen()
-31
View File
@@ -1,31 +0,0 @@
import fcntl
import os
import logging
#---------------------------------------------------------------
# meccanismo di file lock per evitare multiple instances
# The function will try to lock the file specified , if it success, return True, else return False.
# The nice thing is that the lock will be dropped when the program terminates.
# >>>Use :
# if not lockFile(".lock.pod"):
# sys.exit(0)
def lockFile ( lockfile ) :
fd = os.open ( lockfile , os.O_CREAT | os.O_TRUNC | os.O_WRONLY )
try:
# Request exclusive (EX) non-blocking (NB) advisory lock.
fcntl.lockf ( fd , fcntl.LOCK_EX | fcntl.LOCK_NB )
except IOError:
return False
return True
if not lockFile ( ".lockfile" ) :
print('\n noi non siamo soli ...\n')
logging.error( "LOCK: Piu istanze aperte")
#sys.exit ( 0 )
#- print '\n running alone ...\n'
-248
View File
@@ -1,248 +0,0 @@
#!/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 "--------------------------------"
-287
View File
@@ -1,287 +0,0 @@
#!/bin/bash
# script per update IOB-PI (file 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
systemctl stop MapoIOB
echo "Arrestato servizio..."
#fix permessi
chown pi:pi . -R
# 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:pi . -R
chmod +x readP*
# conf redis
# aggiunta passwd accesso se mancante
file="/etc/redis/redis.conf"
line="24068Seriate"
# Check if the line is missing
if grep -q "$line" "$file"; then
echo "requirepass ok!"
else
# execute the sed command
echo "rquirepass missing! adding"
sed -i '/#requirepass*/a\requirepass 24068Seriate' $file
fi
# aggiunta criterio save da num changes
line="save 3600 1 600 10"
if grep -q "$line" "$file"; then
echo "save rdb OK"
else
# execute the sed command
echo "save rdb not found: adding!"
sed -i '/# save 3600*/a\save 3600 1 600 10 300 100 60 10000' $file
fi
# riportare bind a solo localhost
sed -i '/#bind 127.0.0.1*/c\bind 127.0.0.1 -::1' $file
# rimozione bind a rete globale x test
sed -i '/bind 0.0.0.0/c\#bind 0.0.0.0' $file
#riavvio redis
systemctl restart redis
# riavvio esecuzione...
systemctl restart MapoIOB
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 "------------------"
-23
View File
@@ -1,23 +0,0 @@
[id]
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
TIMEOUTSHORT = 0.30
TIMEOUTLONG = 50
SENDURLTIME = 0.50
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = logReboot.txt
[comm]
port = /dev/ttyAMA0
-23
View File
@@ -1,23 +0,0 @@
[id]
idxMacchina = 1002
[web]
URLBASE = http://192.168.51.71/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://192.168.51.71/MPIO/Alive.aspx
URLENABLED = http://192.168.51.71/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://192.168.51.71/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.25
TIMEOUTSHORT = 2
TIMEOUTLONG = 50
SENDURLTIME = 0.2
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = /var/log/logReboot.txt
[comm]
port = /dev/ttyAMA0
-23
View File
@@ -1,23 +0,0 @@
[id]
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MPIO/inputIOB.aspx?idxMacchina=
URLALIVE = http://10.74.82.218/MPIO/Alive.aspx
URLENABLED = http://10.74.82.218/MPIO/Enabled.aspx?idxMacchina=
URLADV1 = &valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.20
TIMEOUTSHORT = 0.30
TIMEOUTLONG = 50
SENDURLTIME = 0.50
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = logReboot.txt
[comm]
port = /dev/ttyAMA0
-41
View File
@@ -1,41 +0,0 @@
### BEGIN INIT INFO
# Provides: MapoIOB: script Steamware per avvio driver IOB
# Required-Start: $remote_fs $syslog ramlog
# Required-Stop: $remote_fs $syslog ramlog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Steamware's MapoIOB driver
# Description: Steamware's MapoIOB driver, versione lettura porta parallela
### END INIT INFO
#! /bin/sh
# /etc/init.d/MapoIOB
export HOME
case "$1" in
start)
echo "Starting readParallela"
cd /home/pi/steamware
/usr/bin/python ./readParallela.py 2>&1 &
;;
stop)
echo "Stopping readParallela"
RS_PID=`ps auxwww | grep readParallela.py | head -1 | awk '{print $2}'`
kill -9 $RS_PID
cd /home/pi/steamware
rm .lockfile
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
killall python
$0 start
;;
*)
echo "Usage: /etc/init.d/MapoIOB {start|stop|restart}"
exit 1
;;
esac
exit 0
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
# controlla se il logfile è correntemente scritto (quindi MapoIOB è alive) altrimenti riavvia!
DATE=`date +%Y-%m-%d`
cd /var/log
if [ -f MapoIOB ]
then
# controllo SE sia stato acceduto da meno di 2 minuti (=alive da log...)
trovato=`find . -name 'MapoIOB*' -cmin -1`
if [[ $trovato != './MapoIOB' ]]
then
/etc/init.d/MapoIOB restart
echo $date + "riavvio!"
fi
else
# in questo caso AVVIO il processo MapoIOB
/etc/init.d/MapoIOB start
echo $date + "file non trovato, avvio!"
fi
-14
View File
@@ -1,14 +0,0 @@
#!/bin/bash
DATE=`date +%Y-%m-%d_%T`
# log inizio pulizia
echo $DATE " - INIZIO pulizia processi python" >> clean.log
# effettua pulizia processi: killa tutti i processi python
killall python
# avvia MapoIob
/etc/init.d/MapoIOB start
# log fatto!
DATE=`date +%Y-%m-%d_%T`
echo $DATE " - FINE pulizia processi python + riavvio MapoIOB" >> clean.log
-1
View File
@@ -1 +0,0 @@
* * * * * /bin/bash /home/pi/steamware/checkAlive.sh >> /home/pi/stdout 2>> /home/pi/stderr
-47
View File
@@ -1,47 +0,0 @@
#|/bin/bash
#installa il necessario per RPI-3-IOB partendo dal contenuto della folder /home/pi/steamware
#step 1: creo file di log nuovi
rm /var/log/log*.txt
rm /var/log/MapoIOB
rm /home/pi/steamware/log*.txt
touch /var/log/logReboot.txt
touch /var/log/logTemp.txt
touch /var/log/MapoIOB
ln -sf /var/log/logReboot.txt /home/pi/steamware/logReboot.txt
ln -sf /var/log/logTemp.txt /home/pi/steamware/logTemp.txt
ln -sf /var/log/MapoIOB /home/pi/steamware/logfile.txt
chown pi:pi /home/pi -R
chmod 666 /var/log/log*.txt
chmod 666 /var/log/MapoIOB
#step 2: copio files in /usr/local/bin
cd /home/pi/steamware
chmod +x *.sh
cp *.sh /usr/local/bin/
# step 3: copio target systemd in avvio...
cp -f sendRebootIOB /etc/init.d/sendRebootIOB
cp -f sendRebootIOB.service /etc/systemd/system/sendRebootIOB.service
echo ""
echo "-----------------------------------------------"
echo "Completare registrazione servizio avvio: digitare i seguenti comandi"
echo "systemctl enable sendRebootIOB"
echo "systemctl daemon-reload"
echo "systemctl status sendRebootIOB"
echo "-----------------------------------------------"
echo ""
echo ""
echo ""
echo "-----------------------------------------------"
echo "Infine creare voce crontab che salvi temperatura CPU/GPU ogni 20 minuti..."
echo "crontab -e"
echo "*/20 * * * * /usr/local/bin/saveTemp.sh"
echo "-----------------------------------------------"
-2
View File
@@ -1,2 +0,0 @@
#!/bin/bash
/usr/bin/python /home/pi/steamware/readParallela.py
-2
View File
@@ -1,2 +0,0 @@
#!/bin/bash
/usr/bin/python /home/steamware/readSeriale.py
-530
View File
@@ -1,530 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 1.8
# versione estetica di Carlo + single instance timer
#---------------------------------------------------------------
# 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
#--------------------------------------------------------------
# COSTANTI
MSGLEN = 9
TIMEOUTSERIALE = 10
MAXRETRY = 3
PROGRAM_NAME ="ReadPar IOB-pi v.1.8"
# DA FILE CONF
idxMacchina = "1001"
SAMPLETIME = 0.1
TIMEOUTSHORT = (SAMPLETIME*20)
TIMEOUTLONG = (SAMPLETIME*600)
SENDURLTIME = 0.08
# 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 999
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
#--------------------------------------------------------------
# Gestione coda (condivisa) x registrazione eventi ed invio URL
#print "Creazione coda 1000 elementi"
Coda = Queue.Queue(0)
#queueLock = threading.Lock()
#---------------------------------------------------------------
# lettura parallela
# ritorna il byte letto pulito ( due char hex )
def readParallela():
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 = ''
# print "input : "
# ritorna '' se non ci sono abbastanza caratteri
try:
num_value = 255
# print "num_value : " , num_value , in_0
if GPIO.input(in_0):
num_value = num_value - 1
if GPIO.input(in_1):
num_value = num_value - 2
if GPIO.input(in_2):
num_value = num_value - 4
if GPIO.input(in_3):
num_value = num_value - 8
if GPIO.input(in_4):
num_value = num_value - 16
if GPIO.input(in_5):
num_value = num_value - 32
if GPIO.input(in_6):
num_value = num_value - 64
if GPIO.input(in_7):
num_value = num_value - 128
current = hex( num_value ).replace ( "0x" , "" ).upper()
# print "\n\n\n\n\n" , num_value , current
except:
pass
return current
#--------------------------------------------------------------
# MARCO: cambiare: chiama URL NON deve chiamare url MA METTERE IN CODA (riempiCoda!!!)
# la parte URL vera va messa in svuotaCoda, PARAMETRICA
#---------------------------------------------------------------
#Funzione di scrittura su coda con try-except
def accoda():
try:
# url = URLBASE + idxMacchina + URLADV1 + value
# urllib.urlopen ( url )
#dtEve = time.strftime("%y%m%d%H%M%S")+"000"
dtEve = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
#logPro.debug( "Nuovo valore inserito in coda: " + dtEve + "#" + value + '#' + cont)
#print(dtEve)
#queueLock.acquire()
Coda.put(dtEve + '#' + value + '#' + cont)
#queueLock.release()
#print "Nuovo valore inserito in coda: " + dtEve + "#", value
except Queue.Full:
logPro.error( "Quque full" + dtEve + '#' + value + '#' + cont )
except:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
# print "Url aforte" , url
#--------------------------------------------------------------
# MARCO: scrivere svuotaCoda come thread etc...
def svuota_coda():
global onLine
global sending
global timer_busy
#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'
# formatto dataOra corrente
#dtCurr = time.strftime("%y%m%d%H%M%S")+"000"
dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3]
# prendo 1 valore dalla coda...
#queueLock.acquire()
resp = Coda.get()
# RILASCIO SUBITO la coda x nuovi insert...
#queueLock.release()
# recupero valori da 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)
#logPro.debug(url)
# log valore inviato!
logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 )
#print "Valore smaltito dalla coda"
# completato invio, riporto sending a zero!
sending = '0'
else:
logPro.info("WAIT active send to complete")
else:
pass
else:
pass
except:
if onLine == '1':
logPro.error("Server Non raggiungibile")
#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 % 1000 # round robin 1000 eventi x track
cont = str(ctr)
except:
print("errore incremento contatore")
#---------------------------------------------------------------
# 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:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
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' )
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' )
except:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
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:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
#--------------------------------------------
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:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
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:
logPro.info("First_SLEEP: errore attesa sampletime")
# lettura dati da IOB
value = readParallela()
if ( value != '' ) :
if value != old :
#loggo e invio dati
try:
logQue.info( value + ' ['+ cont +']')
errormsglen = 0
accoda()
contatore()
except:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
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:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
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:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
pass
to_long = TIMEOUTLONG
-363
View File
@@ -1,363 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
#---------------------------------------------------------------
import serial
import time
import sys
import datetime
import urllib
import ConfigParser
import os, sys
#---------------------------------------------------------------
# COSTANTI
MSGLEN = 9
TIMEOUTSERIALE = 10
MAXRETRY = 3
# DA FILE CONF
idxMacchina = "2001"
SAMPLETIME = 0.1
TIMEOUTSHORT = (SAMPLETIME*20)
TIMEOUTLONG = (SAMPLETIME*600)
# VAR
to_enable = False
to_short = TIMEOUTSHORT
to_long = TIMEOUTLONG
to_serial = TIMEOUTSERIALE
to_retry = MAXRETRY
errormsglen = 0
#---------------------------------------------------------------
# classe logger
class Logger:
def __init__(self, filename):
try:
self.filename = filename
except:
logga("LOGGER: errore try su self.filename")
sys.exit(1)
def __call__(self, string):
try:
file = open(self.filename, 'a')
file.write('[' + time.strftime("%Y-%m-%d %H:%M:%S") + '] ')
file.write(string + '\n')
file.close()
except:
logga("LOGGER: errore try su scrittura")
sys.exit(1)
#---------------------------------------------------------------
# lettura buffer seriale e pulizia caratteri non stampabili
# ritorna '' se non c'è un messaggio buono o il messaggio pulito ( due bytes hex )
# il messaggio ha il formato xx<ACK>i00 00<CR><LF>xxx
def readSeriale():
global to_serial
global to_retry
global errormsglen
ret = ''
current = ''
i = 0
# ritorna '' se non ci sono abbastanza caratteri
try:
if ser.inWaiting() < MSGLEN :
#
# to_serial = to_serial - 1 # se non mi risponde, faccio un ' altra richiesta....
# if to_serial <= 0:
# try:
# requestData ()
# except:
# logga("SERIALE: errore su requestData")
# sys.exit(1)
# to_serial = TIMEOUTSERIALE # ripristino timer
# to_retry = to_retry - 1 # contatore retry
# if to_retry <= 0:
# logga ( 'IOB not responding' )
# return ret
logga("SERIALE: errore msglen < 9 char - Errore no. " + str(errormsglen))
errormsglen = errormsglen +1
avviaSeriale()
time.sleep(.2)
if errormsglen > 30:
sys.exit(1)
except:
if startstatus == 0:
logga ("Porta SERIALE non disponibile - ser.inWaiting error - exit... - Errore no. " + str(errormsglen))
errormsglen = errormsglen +1
avviaSeriale()
time.sleep(.2)
if errormsglen > 30:
sys.exit(1)
# finchè c'è robba .. leggi e tieni i buoni
to_serial = TIMEOUTSERIALE
to_retry = MAXRETRY
try:
while ser.inWaiting() > 0 :
try:
c = ser.read(1)
except:
logga("SERIALE: errore su try ser.read")
sys.exit(1)
# filtra caratteri non stampabili
if c > ' ' :
current += c
#sys.stdout.write(current + '<<<<\n')
# ora il messaggio ha il formato xxxxxi00 00xxx : cerco la 'i' iniziale
try:
while i < len(current) and current[i] != 'i':
i = i + 1
except:
logga("SERIALE: errore su ricerca i iniziale")
sys.exit(1)
# se non ho trovato la 'i' restituisco ''
if i == len(current)-1:
return ret
else:
current = current[i+1:i+3]
# richiesta dati ad IOB
requestData()
#sys.stdout.write ( current + '\n')
except:
if startstatus == 0:
logga ('Porta SERIALE non disponibile - ser.inWaiting e filtraggio error...exit')
sys.exit(1)
return current
#---------------------------------------------------------------
# richiesta dati ad IOB : scrittura su seriale
def requestData ():
try :
ser.write ("$i" + '\r\n')
ser.flush()
except :
if startstatus == 0:
logga ( "SERIAL: Errore di scrittura/flush")
#---------------------------------------------------------------
#Funzione di scrittura su url con try-except
def chiamaUrl():
try:
url = URLBASE + idxMacchina + URLADV1 + value
urllib.urlopen ( url )
except:
logga ( "NETWORK:Errore http-no com rete-timeout" + url )
#---------------------------------------------------------------
# Funzione che verifica possibilità di creare log e include testo corrente
def logga(message) :
try:
log(message)
except :
pass
#---------------------------------------------------------------
def avviaSeriale():
global ser
try:
ser = serial.Serial(
port = comm_port ,
baudrate = 9600 ,
parity = serial.PARITY_NONE ,
stopbits = serial.STOPBITS_ONE ,
bytesize = serial.EIGHTBITS
)
startstatus = 0
except serial.serialutil.SerialException , e :
try:
if startstatus == 0:
logga ( "SERIAL:Errore apertura seriale - " + comm_port)
except:
pass
sys.stdout.write ( '\nErrore apertura seriale\n\n%s\n\n' % e )
if errormsglen > 30:
sys.exit (1)
#---------------------------------------------------------------
#---------------------------------------------------------------
# MAIN
try:
config = ConfigParser.RawConfigParser()
config.read ( 'readSeriale.cfg' )
SAMPLETIME = config.getfloat ( 'time' , 'SAMPLETIME' )
TIMEOUTSHORT = config.getfloat ( 'time' , 'TIMEOUTSHORT' )
TIMEOUTLONG = config.getfloat ( 'time' , 'TIMEOUTLONG' )
idxMacchina = config.get ( 'id' , 'idxMacchina' )
comm_port = config.get ( 'comm' , 'port' )
URLBASE = config.get ( 'web' , 'URLBASE' )
URLADV1 = config.get ( 'web' , 'URLADV1' )
LOGFILE = config.get ( 'log' , 'LOGFILE' )
LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' )
except:
sys.exit(1)
# oggetto Logger
try:
log = Logger(LOGFILE)
except:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
print '\n\n Read seriale IOB v.0.2 !!!!\n'
global startstatus
startstatus = 1
if startstatus == 1:
logga("Avvio Programma")
# 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
logga ( "Start Read seriale IOB v.0.2")
# lettura file configurazione
# [comm]
# port = /dev/ttyS0
# [id]
# idxMacchina = 2001
# [time]
# SAMPLETIME = 0.1
# TIMEOUTSHORT = 200
# TIMEOUTLONG = 6000
print ( ' comm_port = %s' % ( comm_port ) )
print ( ' idxMacchina = %s' % ( idxMacchina ) )
print ( ' SAMPLETIME = %4.2f' % ( SAMPLETIME ) )
print ( ' TIMEOUTSHORT = %4.2f' % ( TIMEOUTSHORT ) )
print ( ' TIMEOUTLONG = %4.2f' % ( TIMEOUTLONG ) )
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 seriale
avviaSeriale()
#try:
# ser = serial.Serial(
# port = comm_port ,
# baudrate = 9600 ,
# parity = serial.PARITY_NONE ,
# stopbits = serial.STOPBITS_ONE ,
# bytesize = serial.EIGHTBITS
# )
# print "Initialized!"
#except serial.serialutil.SerialException , e :
# try:
# logga ( "SERIAL:Errore apertura seriale - " + comm_port)
# except:
# pass
# sys.stdout.write ( '\nErrore apertura seriale\n\n%s\n\n' % e )
# sys.exit (1)
#---------------------------------------------------------------
# ciclo forever and ever
old = ''
# richiesta dati ad IOB
try:
requestData()
except:
logga("SERIALE: errore sul try di requestData")
sys.exit(1)
while 1:
try:
time.sleep (SAMPLETIME)
except:
logga("SERIALE_SLEEP: errore attesa sampletime")
# lettura dati da IOB
try:
value = readSeriale()
except:
if startstatus == 0:
logga("errore PRIMA LETTURA SERIALE")
sys.exit(1)
if ( value != '' ) :
if value != old :
#loggo e invio dati
try:
logga ( value )
errormsglen = 0
chiamaUrl()
except:
logga("URLBROWSER: errore registrazione valore e chiamaUrl")
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:
logga ( '>' + value )
errormsglen = 0
chiamaUrl()
except:
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:
logga ( '>>' + value )
errormsglen = 0
chiamaUrl()
except:
pass
to_long = TIMEOUTLONG
-17
View File
@@ -1,17 +0,0 @@
#!/bin/bash
#salva la temperatura CPU e GPU su chiamata...
# imposto logfile...
logFile="/var/log/logTemp.txt"
cpuTemp0=$(cat /sys/class/thermal/thermal_zone0/temp)
cpuTemp1=$(($cpuTemp0/1000))
cpuTemp2=$(($cpuTemp0/100))
cpuTempM=$(($cpuTemp2 % $cpuTemp1))
gpuTemp=`vcgencmd measure_temp`
loadAvg=`cat /proc/loadavg`
echo "$(date) | CPU: temp=$cpuTemp1.$cpuTempM ºC | GPU: $gpuTemp | LoadAvg: $loadAvg" >> $logFile
-130
View File
@@ -1,130 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# sendReboot v. 1.8
#---------------------------------------------------------------
import time
import sys
from datetime import datetime
import urllib
import ConfigParser
import os, sys
import logging
import time
#---------------------------------------------------------------
# COSTANTI
PROGRAM_NAME = "SendReboot IOB-pi v.1.8"
# 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, e:
print e
logging.info ( e )
print "Url aforte" , 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:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
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:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
#--------------------------------------------
print "\n\n" + PROGRAM_NAME + "\n\n"
global startstatus
startstatus = 1
if startstatus == 1:
logging.info("Avvio Programma " + PROGRAM_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 )
-33
View File
@@ -1,33 +0,0 @@
#!/bin/sh -
#
### BEGIN INIT INFO
# Provides: sendReboot
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Steamware's IOB reboot signal
# Description: Steamware's sendReboot segnalazione reboot dispositivo
### END INIT INFO
#! /bin/sh
# /etc/init.d/sendReboot
export HOME
case "$1" in
start)
cd /home/pi/steamware
echo "Starting sendReboot"
/usr/bin/python ./sendReboot.py 2>&1 &
echo "Verifica Rete e file IOB"
/usr/local/bin/setIobConf.sh
;;
*)
echo "Usage: /etc/init.d/sendReboot {start}"
exit 1
;;
esac
exit 0
-22
View File
@@ -1,22 +0,0 @@
[Unit]
SourcePath=/etc/init.d/sendRebootIOB
Description=LSB: Steamware's IOB reboot signal
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target shutdown.target
Wants=network-online.target
After=network.target network-online.target auditd.service
Conflicts=shutdown.target
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SysVStartPriority=2
ExecStart=/etc/init.d/sendRebootIOB start
ExecStop=/etc/init.d/sendRebootIOB stop
[Install]
WantedBy=multi-user.target
-26
View File
@@ -1,26 +0,0 @@
#!/bin/bash
# verifico se sia rete donati o rete steamware o offline...
netStatus=`cat /sys/class/net/eth0/operstate`
iaddr=`ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`
cd /home/pi/steamware
if [[ $netStatus != "up" ]]
then
echo "Siamo Offline, pagina demo!"
elif [[ $iaddr == "10.74.82"* ]]
then
cp IOB.cfg.steamware IOB.cfg -f
echo "Siamo in Steamware!"
elif [[ $iaddr == "192.168.51"* ]]
then
cp IOB.cfg.donati IOB.cfg -f
echo "Siamo a Passirano!"
else
echo "Siamo altrove, pagina demo!"
fi
echo "$iaddr"
chown pi:pi *
-31
View File
@@ -1,31 +0,0 @@
import logging
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='test.log',
filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)
# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')
# Now, define a couple of other loggers which might represent areas in your
# application:
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
-31
View File
@@ -1,31 +0,0 @@
import fcntl
import os
import logging
#---------------------------------------------------------------
# meccanismo di file lock per evitare multiple instances
# The function will try to lock the file specified , if it success, return True, else return False.
# The nice thing is that the lock will be dropped when the program terminates.
# >>>Use :
# if not lockFile(".lock.pod"):
# sys.exit(0)
def lockFile ( lockfile ) :
fd = os.open ( lockfile , os.O_CREAT | os.O_TRUNC | os.O_WRONLY )
try:
# Request exclusive (EX) non-blocking (NB) advisory lock.
fcntl.lockf ( fd , fcntl.LOCK_EX | fcntl.LOCK_NB )
except IOError:
return False
return True
if not lockFile ( ".lockfile" ) :
print '\n noi non siamo soli ...\n'
logging.error( "LOCK: Piu istanze aperte")
#sys.exit ( 0 )
#- print '\n running alone ...\n'
Binary file not shown.
-32
View File
@@ -1,32 +0,0 @@
import win32api
print " Running on WINDOWS\n"
import os
#---------------------------------------------------------------
# meccanismo di file lock per evitare multiple instances
# The function will try to lock the file specified , if it success, return True, else return False.
# The nice thing is that the lock will be dropped when the program terminates.
# >>>Use :
# if not lockFile(".lock.pod"):
# sys.exit(0)
def lockFile ( lockfile ) :
try:
fd = os.open ( lockfile , os.O_CREAT | os.O_TRUNC | os.O_WRONLY )
except:
logga("Errore nel file WIN.PY per FD")
try:
# Request exclusive (EX) non-blocking (NB) advisory lock.
#fcntl.lockf ( fd , fcntl.LOCK_EX | fcntl.LOCK_NB )
print " Dummy Method! Completa Lockfile\n"
except IOError:
return False
return True
try:
if not lockFile ( ".lockfile" ) :
print '\n noi non siamo soli ...\n'
logga ( "LOCK: Piu istanze aperte")
sys.exit ( 0 )
except:
logga("if not lockfile NON RIUSCITO in file WIN.PY")
sys.exit(1)
Binary file not shown.
-68
View File
@@ -1,68 +0,0 @@
[id]
idxMacchina = 0001
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
TIMEOUTSHORT = 0.30
TIMEOUTLONG = 50
SENDURLTIME = 0.15
NMAXSEND = 5
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = logReboot.txt
[comm]
port = /dev/ttyAMA0
[blink]
MAX_COUNTER_BLINK = 30
bit0 = 0
bit1 = 0
bit2 = 0
bit3 = 0
bit4 = 0
bit5 = 0
bit6 = 0
bit7 = 0
bit8 = 0
bit9 = 0
bit10 = 0
bit11 = 0
[invert]
bit0 = 0
bit1 = 0
bit2 = 0
bit3 = 0
bit4 = 0
bit5 = 0
bit6 = 0
bit7 = 0
bit8 = 0
bit9 = 0
bit10 = 0
bit11 = 0
[filter]
MAX_COUNTER_FILTER = 8
bit0 = 0
bit1 = 0
bit2 = 0
bit3 = 0
bit4 = 0
bit5 = 0
bit6 = 0
bit7 = 0
bit8 = 0
bit9 = 0
bit10 = 0
bit11 = 0
-35
View File
@@ -1,35 +0,0 @@
[id]
idxMacchina = 2007
[web]
URLBASE = http://192.168.51.77/MP/IO/IOB/input/
URLALIVE = http://192.168.51.77/MP/IO/IOB
URLENABLED = http://192.168.51.77/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://192.168.51.77/MP/IO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
TIMEOUTSHORT = 0.30
TIMEOUTLONG = 50
SENDURLTIME = 0.15
NMAXSEND = 5
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = logReboot.txt
[comm]
port = /dev/ttyAMA0
[blink]
MAX_COUNTER_BLINK = 30
bit0 = 0
bit1 = 0
bit2 = 0
bit3 = 1
bit4 = 0
bit5 = 0
bit6 = 0
bit7 = 0
-35
View File
@@ -1,35 +0,0 @@
[id]
idxMacchina = 1005
[web]
URLBASE = http://10.74.82.218/MP/IO/IOB/input/
URLALIVE = http://10.74.82.218/MP/IO/IOB
URLENABLED = http://10.74.82.218/MP/IO/IOB/enabled/
URLADV1 = ?valore=
URLREBO = http://10.74.82.218/MPIO/sendReboot.aspx?idxMacchina=
[time]
SAMPLETIME = 0.05
TIMEOUTSHORT = 0.30
TIMEOUTLONG = 50
SENDURLTIME = 0.15
NMAXSEND = 5
[log]
LOGLEVEL = 10
LOGFILE = logfile.txt
LOGREBO = logReboot.txt
[comm]
port = /dev/ttyAMA0
[blink]
MAX_COUNTER_BLINK = 30
bit0 = 0
bit1 = 0
bit2 = 0
bit3 = 1
bit4 = 0
bit5 = 0
bit6 = 0
bit7 = 0
-41
View File
@@ -1,41 +0,0 @@
#! /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
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Steamware's MapoIOB driver
# Description: Steamware's MapoIOB driver, versione lettura porta parallela
### END INIT INFO
# /etc/init.d/MapoIOB
export HOME
case "$1" in
start)
echo "Starting readParallela"
cd /home/pi/steamware
/usr/bin/python ./readParallela.py 2>&1 &
;;
stop)
echo "Stopping readParallela"
RS_PID=`ps auxwww | grep readParallela.py | head -1 | awk '{print $2}'`
kill -9 $RS_PID
cd /home/pi/steamware
rm .lockfile
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
killall python
$0 start
;;
*)
echo "Usage: /etc/init.d/MapoIOB {start|stop|restart}"
exit 1
;;
esac
exit 0
-22
View File
@@ -1,22 +0,0 @@
[Unit]
SourcePath=/etc/init.d/MapoIOB
Description=LSB: Steamware's MapoIOB driver
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target shutdown.target
Wants=network-online.target
After=network.target network-online.target auditd.service
Conflicts=shutdown.target
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SysVStartPriority=1
ExecStart=/etc/init.d/MapoIOB start
ExecStop=/etc/init.d/MapoIOB stop
[Install]
WantedBy=multi-user.target
-28
View File
@@ -1,28 +0,0 @@
/var/log/MapoIOB.log {
size 8M
copytruncate
create 700 pi pi
dateext
rotate 100
compress
maxage 366
missingok
}
/var/log/logReboot.txt {
size 1M
copytruncate
create 700 pi pi
dateext
rotate 30
compress
missingok
}
/var/log/logTemp.txt {
size 1M
copytruncate
create 700 pi pi
dateext
rotate 30
compress
missingok
}
-20
View File
@@ -1,20 +0,0 @@
#!/bin/bash
# controlla se il logfile è correntemente scritto (quindi MapoIOB è alive) altrimenti riavvia!
DATE=`date +%Y-%m-%d`
cd /var/log
if [ -f MapoIOB.log ]
then
# controllo SE sia stato acceduto da meno di 2 minuti (=alive da log...)
trovato=`find . -name 'MapoIOB*' -cmin -1`
if [[ $trovato != './MapoIOB.log' ]]
then
/etc/init.d/MapoIOB restart
echo $date + "riavvio!"
fi
else
# in questo caso AVVIO il processo MapoIOB
/etc/init.d/MapoIOB start
echo $date + "file non trovato, avvio!"
fi
-14
View File
@@ -1,14 +0,0 @@
#!/bin/bash
DATE=`date +%Y-%m-%d_%T`
# log inizio pulizia
echo $DATE " - INIZIO pulizia processi python" >> clean.log
# effettua pulizia processi: killa tutti i processi python
killall python
# avvia MapoIob
/etc/init.d/MapoIOB start
# log fatto!
DATE=`date +%Y-%m-%d_%T`
echo $DATE " - FINE pulizia processi python + riavvio MapoIOB" >> clean.log
-46
View File
@@ -1,46 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readFile v. 0.1
# - single instance timer
# - invio multiplo x send eventi accodati
#---------------------------------------------------------------
import os, sys
import argparse
#--------------------------------------------------------------
# gestione parser argomenti in input
parser = argparse.ArgumentParser()
parser.add_argument("inFile")
parser.add_argument("outFile")
args = parser.parse_args()
#with open('logfile.txt', 'r') as inf, open('persMem.dat',"w") as outf:
with open(args.inFile, 'r') as inf, open(args.outFile,"w") as outf:
data = inf.readlines()
lastDt = ""
lastMs = 0
stepMs = 200
for line in data:
words = line.split()
if words[2] == 'queue':
# recupero dataOra
newDt = words[0].replace("-","") + words[1].replace(":","")
# verifico se data/ora identica...
if (lastDt == newDt):
# --> aggiungo stepMs
lastMs += stepMs
else:
lastMs = 0
lastDt = newDt
newDt = newDt + '{:03d}'.format(lastMs) #str(lastMs)
#print words[0].replace("-","") + words[1].replace(":","") + " | " + newDt + "\n"
# print words
# outf.write(words[0].replace("-","") + words[1].replace(":","") + '#' + words[4].replace(">","") + '#' + words[5].replace("[","").replace("]","") +'\n')
outf.write(newDt + '#' + words[4].replace(">","") + '#' + words[5].replace("[","").replace("]","") +'\n')
-1
View File
@@ -1 +0,0 @@
* * * * * /bin/bash /home/pi/steamware/checkAlive.sh >> /home/pi/stdout 2>> /home/pi/stderr
-54
View File
@@ -1,54 +0,0 @@
#|/bin/bash
#installa il necessario per RPI-3-IOB partendo dal contenuto della folder /home/pi/steamware
#step 1: creo file di log nuovi
rm /var/log/log*.txt
rm /var/log/MapoIOB*
rm /home/pi/steamware/log*.txt
touch /var/log/logReboot.txt
touch /var/log/logTemp.txt
touch /var/log/MapoIOB.log
ln -sf /var/log/logReboot.txt /home/pi/steamware/logReboot.txt
ln -sf /var/log/logTemp.txt /home/pi/steamware/logTemp.txt
ln -sf /var/log/MapoIOB.log /home/pi/steamware/logfile.txt
chown pi:pi /home/pi -R
chmod 666 /var/log/log*.txt
chmod 666 /var/log/MapoIOB.log
#step 2: copio files in /usr/local/bin
cd /home/pi/steamware
chmod +x *.sh
cp *.sh /usr/local/bin/
#step 3: copio files x logrotate...
cd /home/pi/steamware
cp MapoIOB_logrot /etc/logrotate.d/
# step 4: copio target systemd in avvio...
cp -f sendRebootIOB /etc/init.d/sendRebootIOB
cp -f sendRebootIOB.service /etc/systemd/system/sendRebootIOB.service
#echo ""
#echo "-----------------------------------------------"
#echo "Completare registrazione servizio avvio: digitare i seguenti comandi"
#echo "systemctl enable sendRebootIOB"
#echo "systemctl daemon-reload"
#echo "systemctl status sendRebootIOB"
#echo "-----------------------------------------------"
#echo ""
# step 5: copio target MapoIOB in avvio...
cp -f MapoIOB /etc/init.d/MapoIOB
cp -f MapoIOB.service /etc/systemd/system/MapoIOB.service
#echo ""
#echo ""
#echo "-----------------------------------------------"
#echo "Infine creare voce crontab che salvi temperatura CPU/GPU ogni 20 minuti..."
#echo "crontab -e"
#echo "*/20 * * * * /usr/local/bin/saveTemp.sh"
#echo "-----------------------------------------------"
-152
View File
@@ -1,152 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readFile v. 0.1
# - single instance timer
# - invio multiplo x send eventi accodati
#---------------------------------------------------------------
import time
from datetime import datetime
import urllib
import ConfigParser
import os, sys
import logging
import logging.handlers
import Queue
import argparse
#--------------------------------------------------------------
# gestione parser argomenti in input
parser = argparse.ArgumentParser()
parser.add_argument("memFile")
parser.add_argument("logFile")
args = parser.parse_args()
#definizione variabili BASE
stepQueuePut=25000
stepQueueGet=250
NMAXSEND=500000 # limite invio file x fare prove...
idxMacchina = "2003"
#--------------------------------------------------------------
# Gestione coda (condivisa) x registrazione eventi ed invio URL
#print "Creazione coda illimitata"
Coda = Queue.Queue(0)
#---------------------------------------------------------------
#Funzione di scrittura su coda con try-except
def accoda(valore):
try:
Coda.put(valore)
except Queue.Full:
logPro.error( "Queue full" + dtEve + '#' + value + '#' + cont )
except:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
#--------------------------------------------------------------
# svuotaCoda x invio dati al server
def svuota_coda():
global NMAXSEND
try:
if not Coda.empty():
# invio SOLO i primi NMAXSEND eventi... SE minore del num eventi...
if NMAXSEND > Coda.qsize():
NMAXSEND = Coda.qsize()
i = 0
with open(args.logFile,"w") as outf:
while i <= NMAXSEND:
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()
# registro chiamata + risposta
# outf.write(url + " --> " + answ3 + "\n")
# incremento e controllo se mostrare output
i += 1
if (i % stepQueueGet) == 0:
print "Inviati %d valori..." % i
print "Inviati %d valori..." % i
except:
print "Errore in svuotamento coda!"
#---------------------------------------------------------------
# MAIN
try:
config = ConfigParser.RawConfigParser()
config.read ( 'IOB.cfg' )
# NMAXSEND = config.getint ( 'time' , 'NMAXSEND' )
# idxMacchina = config.get ( 'id' , 'idxMacchina' )
URLBASE = config.get ( 'web' , 'URLBASE' )
URLADV1 = config.get ( 'web' , 'URLADV1' )
LOGFILE = config.get ( 'log' , 'LOGFILE' )
LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' )
except:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
sys.exit(1)
#---------------------------------------------------------------
dtCurr = datetime.utcnow().strftime('%H:%M:%S.%f')[:-3]
print "Inizio elaborazione: %s" % dtCurr
# Leggo il file!
i = 0
with open(args.memFile, 'r') as inf, open(args.logFile,"w") as outf:
data = inf.readlines()
print "Trovate %d da processare..." % len(data)
# leggo e metto in QUEUE...
for line in data:
accoda(line)
i += 1
if (i % stepQueuePut) == 0:
print "Accodati %d valori..." % i
print "Completata lettura file! %d righe accodate da trasmettere" % Coda.qsize()
dtCurr = datetime.utcnow().strftime('%H:%M:%S.%f')[:-3]
print "Inizio invio: %s" % dtCurr
# chiamo procedura x svuotare coda...
svuota_coda()
dtCurr = datetime.utcnow().strftime('%H:%M:%S.%f')[:-3]
print "Completato invio: %s" % dtCurr
-719
View File
@@ -1,719 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# readParallela v. 2.4.8
# - 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)
#---------------------------------------------------------------
# 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.0"
# 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:
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:
logPro.error( "NETWORK:Errore http-no com rete-timeout" + url )
# print "Url aforte" , url
#--------------------------------------------------------------
# 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:
if onLine == '1':
logPro.error("Server Non raggiungibile")
#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:
print("errore incremento contatore")
#---------------------------------------------------------------
# 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:
print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n")
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:
print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg'
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:
# manda mail o simili - FARE!!!
print "LOG: Impossibile creare file log con nome "
print (LOGFILE)
#--------------------------------------------
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:
print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n")
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:
logPro.info("First_SLEEP: errore attesa sampletime")
# 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:
logPro.error("URLBROWSER: errore registrazione valore e accoda")
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:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short")
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:
logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long")
pass
to_long = TIMEOUTLONG

Some files were not shown because too many files have changed in this diff Show More