enhanced version

This commit is contained in:
john30
2016-11-20 16:23:41 +01:00
parent 2f99e30e43
commit e7324d3b8d
+105 -46
View File
@@ -1,68 +1,127 @@
#!/bin/sh #!/bin/sh
ebusctl grab result|awk ' port=8888
if [ "x$1" = "x-p" ]; then
shift
port=$1
shift
fi
maxidlen=3
if [ "x$1" = "x-m" ]; then
shift
maxidlen=$1
fi
echo "grab result"|nc localhost $port|awk -vmaxidlen=$maxidlen '
BEGIN{ BEGIN{
len[""]=0 sdatas[""]=0
delete len[""] delete sdatas[""]
found=0 sdatasorder[""]=0
delete sdatasorder[""]
FS="/"
} }
/grab disabled/ { /grab disabled/ {
print "enable grab first!" print "enable grab first!"
exit exit
} }
/empty/ {
print "empty"
exit
}
/.+/ { /.+/ {
len[substr($1,3)]=length($3)/2; m=gensub(" ", "", "g", gensub("=.*$", "", "", $1))
found=1 s=gensub(" ", "", "g", gensub("=.*$", "", "", $2))
pbsbnnid=substr(m,5,(3+maxidlen)*2)
if (!shorted[pbsbnnid]) {
shorted[pbsbnnid]=1
sdatas[substr(m,3)]=s
sdatasorder[length(sdatasorder)]=substr(m,3)
}
}
function hextodec(str,pos) {
if (length(str)<pos+1) return -1
return index("123456789abcdef",substr(str,pos,1))*16+index("123456789abcdef",substr(str,pos+1,1))
}
function ismaster(zz) {
z=substr(zz,1,1)
if (z!="0" && z!="1" && z!="3" && z!="7" && z!="f") return false
z=substr(zz,2,1)
if (z!="0" && z!="1" && z!="3" && z!="7" && z!="f") return false
return true
} }
END { END {
if (found>0) if (length(sdatas)>0)
print "# type (r[1-9];w;u),circuit,name,[comment],[QQ],ZZ,PBSB,[ID],field1,part (m/s),datatypes/templates,divider/values,unit,comment,field2,part (m/s),datatypes/templates" print "# type (r[1-9];w;u),circuit,name,[comment],[QQ],ZZ,PBSB,[ID],field1,part (m/s),datatypes/templates,divider/values,unit,comment,field2,part (m/s),datatypes/templates"
for (i in len) { for (i=0; i<length(sdatasorder); i++) {
zz=substr(i,1,2) mdata=sdatasorder[i]
pbsb=substr(i,3,4) sdata=sdatas[mdata]
id=substr(i,9) zz=substr(mdata,1,2)
pbsbdd=substr(mdata,3,4) substr(mdata,9,2)
pbsb=substr(mdata,3,4)
id=substr(mdata,9)
idlen=length(id)/2 idlen=length(id)/2
if (pbsb=="b509" && substr(id,1,2)=="0d") { if (idlen>maxidlen) {
# register read idlen=maxidlen
reg=index("123456789abcdef",tolower(substr(id,4,1))) master=substr(id,1+idlen*2)
reg+=index("123456789abcdef",tolower(substr(id,3,1)))*16 id=substr(id,1,idlen*2)
reg+=index("123456789abcdef",tolower(substr(id,6,1)))*256 } else {
reg+=index("123456789abcdef",tolower(substr(id,5,1)))*4096 master=""
print "r,unknown" zz ",reg" reg ",,," zz "," pbsb "," substr(id,1,6) ",data,,HEX:" (len[i]-1) }
} else if (pbsb=="b509" && substr(id,1,2)=="0e") { masterlen=length(master)/2
# register write sdata=sdatas[mdata]
reg=index("123456789abcdef",tolower(substr(id,4,1))) if (sdata=="") {
reg+=index("123456789abcdef",tolower(substr(id,3,1)))*16 slave=""
reg+=index("123456789abcdef",tolower(substr(id,6,1)))*256 slavelen=0
reg+=index("123456789abcdef",tolower(substr(id,5,1)))*4096 } else {
print "w,unknown" zz ",reg" reg ",,," zz "," pbsb "," substr(id,1,6) ",data,,HEX:" (idlen-3) slave=substr(sdata,3)
} else if (pbsb=="b509" && substr(id,1,2)=="29") { slavelen=length(slave)/2
# register update }
reg=index("123456789abcdef",tolower(substr(id,4,1))) if (idlen>=3 && pbsbdd=="b5090d") {
reg+=index("123456789abcdef",tolower(substr(id,3,1)))*16 # vaillant register read
reg+=index("123456789abcdef",tolower(substr(id,6,1)))*256 reg=hextodec(id,5)*256+hextodec(id,3)
reg+=index("123456789abcdef",tolower(substr(id,5,1)))*4096 print "# " mdata " / " sdata ": reg=" reg ", data=" slave
print "u,unknown" zz ",reg" reg ",,," zz "," pbsb "," substr(id,1,6) ",,,IGN:2,,,,data,,HEX:" (len[i]-3) printf "r,unknown" zz ",reg" reg ",,," zz "," pbsb "," id
} else if (len[i]<=1 || idlen>3) { print ",data,s,HEX:" slavelen ",,,"
# seems to be a write } else if (idlen>=3 && pbsbdd=="b5090e") {
if (idlen>3) idlen=3 # vaillant register write
else if (len[i]<=1) idlen--; reg=hextodec(id,5)*256+hextodec(id,3)
printf "w,unknown" zz "," print "# " mdata " / " sdata ": reg=" reg ", data=" master (slavelen>0 ? ", result=" slave : "")
printf "w,unknown" zz ",reg" reg ",,," zz "," pbsb "," id
printf ",data,m,HEX:" masterlen ",,,"
if (slavelen>0)
printf ",result,s,HEX:" slavelen
print ""
} else if (idlen>=3 && pbsbdd=="b50929") {
# vaillant register update
reg=hextodec(id,5)*256+hextodec(id,3)
print "# " mdata " / " sdata ": reg=" reg ", data=" substr(slave,5)
printf "u,unknown" zz ",reg" reg ",,," zz "," pbsb "," id
print ",,,IGN:2,,,,data,,HEX:" (slavelen-2)
} else if (slavelen<=0 || masterlen>0) {
# generic write or write+read
if (masterlen<=0 && slavelen<=0) { # no slave data and no master data: move one byte from id to master data
idlen--
masterlen++
master=substr(id,1+idlen*2) master
id=substr(id,1,idlen*2)
}
print "# " mdata " / " sdata ": pbsb=" pbsb ", id=" id (masterlen>0 ? ", data=" master : "") (slavelen>0 ? ", result=" slave : "")
if (zz=="fe") printf "w,broadcast,"
else printf "w,unknown" zz ","
if (substr(pbsb,1,2)=="b5") printf "block" substr(pbsb,3,2) if (substr(pbsb,1,2)=="b5") printf "block" substr(pbsb,3,2)
else printf pbsb else printf pbsb
printf substr(id,1,idlen*2) ",,," zz "," pbsb "," substr(id,1,idlen*2) printf id ",,," zz "," pbsb "," id
if (length(id)/2>idlen) if (masterlen>0)
printf ",data,,HEX:" (length(id)/2-idlen) printf ",data,m,HEX:" masterlen ",,,"
else if (slavelen>0)
printf ",,," printf ",result,s,HEX:" slavelen
if (len[i]>1)
printf ",,,,result,s,HEX:" (len[i]-1)
print "" print ""
} else { } else {
# generic read
print "# " mdata " / " sdata ": pbsb=" pbsb ", id=" id ", data=" slave
printf "r,unknown" zz "," printf "r,unknown" zz ","
if (substr(pbsb,1,2)=="b5") printf "block" substr(pbsb,3,2) if (substr(pbsb,1,2)=="b5") printf "block" substr(pbsb,3,2)
else printf pbsb else printf pbsb
print id ",,," zz "," pbsb "," id ",data,,HEX:" (len[i]-1) print id ",,," zz "," pbsb "," id ",data,s,HEX:" slavelen
} }
} }
} }
'|sort|uniq '