Temat: Digitemp i kolejność danych z czujników

Przykładowo jeśli takim poleceniem

digitemp_DS9097 -q -s /dev/ttyUSB0 -a -o %R,%.2C
28F2B7DA02000049,24.62

generowałbym sobie odczyty ze wszystkich czujników do jakiegoś pliku tekstowego to w jaki sposób mógłbym generować następny plik na podstawie numeru z czujnika tj. np. "28F2B7DA02000049".

Kolejność czujników o danych numerach miałbym też w pliku tekstowym.
Dałoby radę zrobić jakiś prosty skrypt w basu który by generował odpowiednią kolejność temperatur na podstawie polecenia
digitemp_DS9097 -q -s /dev/ttyUSB0 -a -o %R,%.2C

2

Odp: Digitemp i kolejność danych z czujników

A=$(digitemp_DS9097 -q -s /dev/ttyUSB0 -a -o %R,%.2C)
FILE=$(echo $A | cut -f1 -d",")
echo "$A" > $FILE

Czy jakoś tak.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Digitemp i kolejność danych z czujników

Chciałbym sobie najpierw wczytać z jakiegoś pliku listę do tablicy

Na rpi mi to działa

IFS=$'\n' read -d '' -r -a lines < /tmp/temp.txt

printf "line 1: %s\n" "${lines[0]}"


ale już na openwrt nie

W jaki sposób w bashu mogę zastąpić
IFS=$'\n' read -d '' -r -a lines < /tmp/temp.txt
w jakiś inny sposób ?

4

Odp: Digitemp i kolejność danych z czujników

Ponieważ ash z busyboxa nie ma tablic, proste.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Digitemp i kolejność danych z czujników

W jaki sposób można to obejść ?
Docelowo chciałem zrobić coś takiego żeby wczytać z jednego pliku listę czujników według danej kolejności, odpowiednim skryptem za pomocą jakieś pętli while, for each ułożyć dane z kilku czujników.

6

Odp: Digitemp i kolejność danych z czujników

Nie wykorzystuj tablic w shelu, albo zainstaluj basha

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

7

Odp: Digitemp i kolejność danych z czujników

W jaki sposób mogę posegregować linie według ułożonej listy ?

Przykładowo mam taki plik z danymi

id, pomiar

222, 24.0
111, 24.5
922, 30.0

a w drugim pliku mam listę z kolejnością id
922
222
111
i chciałbym sobie utworzyć plik z temperaturami według tej drugiej listy

W jaki sposób w shellu coś takiego mogę wygenerować ?

8

Odp: Digitemp i kolejność danych z czujników

Wczytaj jeden plik, wczytaj drugi i leć w pętli po wszystkich argumentach.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

9

Odp: Digitemp i kolejność danych z czujników

Do tego potrzebne mi są właśnie tablice

10

Odp: Digitemp i kolejność danych z czujników

Wcale nie. Możesz używać zmiennych robionych przez eval.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

11 (edytowany przez viper_lasser 2014-03-19 16:05:06)

Odp: Digitemp i kolejność danych z czujników

Próbuję w shellu najpierw wczytać poszczególne linie do pseudo tablic a następnie je drugą pętlą wydrukować ale nie wiem dlaczego nie widzę odczytanych linii w zmiennych

To mój plik z danymi

root@OpenWrt:/tmp# cat /tmp/temp.txt
28F2B7DA0200004C,24.44
28F2B7DA0200004B,24.50
28F2B7DA0200004A,24.62
28F2B7DA02000049,24.50
root@OpenWrt:/tmp#

A to mój skrypt

c=0
while read -r line; do
        printf '%s\n' "$line"
        eval Array$c=\"$line\"
        c=$(expr $c + 1)
done < /tmp/temp.txt

eval dlg=\"$c\"
#echo $dlg

i=0;
while [ $i -le $dlg ]; do
echo $Array$i
i=$(expr $i + 1)
done

Skrypt niestety nie działa poprawnie bo zamiast zawartości pliku /tmp/temp.txt wyrzuca tylko iteracje
0
1
2
3
4

Edit:

Poradziłem sobie, podpowiedź znalazłem tutaj
http://lists.busybox.net/pipermail/busy … 12110.html

c=0
while read -r line; do
        printf '%s\n' "$line"
        eval Array$c=\"$line\"
#       eval assign="\$Array$c"
#       echo $assign
        c=$(expr $c + 1)
done < /tmp/temp.txt

eval dlg=\"$c\"
#echo $dlg

i=0;
while [ $i -le $dlg ]; do
eval assign="\$Array$i"
echo $assign
i=$(expr $i + 1)
done
root@OpenWrt:/tmp#


Edit:
Doszedłem do takiego skryptu który z pliku wynikowego z digitempa /tmp/temp.txt i pliku z numerami czujników /tmp/lista.txt generuje temperatury do pliku /tmp/wynik.txt według kolejności czujników

Myślałem że ten skrypt będzie działał szybciej. Da się to jakoś zoptymalizować czy lepiej to zrobić w c/c++ ?

TempFromDigiTemp="/tmp/temp.txt"
TempList="/tmp/lista.txt"
TempOutput="/tmp/wynik.txt"

rm $TempOutput
#odczyt temperatur z listy kolejnosci
c=0
while read -r line; do
        eval ArrayOrder$c=\"$line\"
        c=$(expr $c + 1)
done < $TempList
eval dlg=\"$(expr $c - 1)\"

#odczyt temperatur z digitempa
c=0
while read -r line; do
        zmienna=$(echo $line | cut -f1 -d",")
        eval ArrayTempIdList$c=\"$zmienna\"
        eval ArrayTempList$c=\"$line\"
        c=$(expr $c + 1)
done < $TempFromDigiTemp

#generowanie temperatur na podstawie kolejnosci i odczytow
j=0;
while [ $j -le $dlg ]; do
        i=0;
        while [ $i -le $dlg ]; do
        eval assign="\$ArrayOrder$j"
        eval assign2="\$ArrayTempIdList$i"
        eval assign3="\$ArrayTempList$i"

        temperatura=$(echo $assign3 | cut -f2 -d",")

        if [ "$assign" = "$assign2" ]
        then
                echo $temperatura >> $TempOutput
        fi
        i=$(expr $i + 1)
        done
j=$(expr $j + 1)
done