chiark / gitweb /
0203f85c8fb453a014f82f6107072a458d89cde5
[trains.git] / hostside / reprogram
1 #!/bin/bash
2
3 set -e
4
5 fail () { echo >&2 "$0: error: $*"; exit 1; }
6
7 if [ $# != 2 ]; then cat >&2 <<END; exit 1; fi
8  usage:
9   ./reprogram /dev/ttyS0 LOCO|FILENAME
10   where LOCO means ./LOCO.cv-s
11   and FILENAME must contain a slash
12 END
13
14 port="$1"; shift
15 filename="$1"; shift
16
17 case "$filename" in
18 */*)    ;;
19 *)      filename="$filename.cv-s";;
20 esac
21 exec <"$filename"
22
23 while read cv value; do
24         case "$cv" in
25         addr)
26                 [ x$addr = x ] || fail 'addr twice'
27                 addr=$(( $value + 0 ))
28                 ;;
29         [0-9]*)
30                 cv=$(( $cv + 0 ))
31                 value=$(( $value + 0 ))
32                 cvlist="$cvlist $cv=$value"
33                 ;;
34         '#'*)
35                 ;;
36         *)
37                 fail 'invalid syntax'
38                 ;;
39         esac
40 done
41
42 echo "Factory reset"
43 ./factory-reset-svc "$port"
44
45 echo "Setting address to $addr"
46 ./program-cv-svc "$port" 1 $addr
47
48 for cvv in $cvlist; do
49         sleep 1
50         cv=${cvv%=*}
51         value=${cvv#*=}
52         echo "Setting CV $cv = $value"
53         ./program-cv "$port" $addr $cv $value
54 done