--- /dev/null
+#!/bin/bash
+
+set -e
+
+fail () { echo >&2 "$0: error: $*"; exit 1; }
+
+if [ $# != 2 ]; then cat >&2 <<END; exit 1; fi
+ usage:
+ ./reprogram /dev/ttyS0 LOCO|FILENAME
+ where LOCO means ./LOCO.cv-s
+ and FILENAME must contain a slash
+END
+
+port="$1"; shift
+filename="$1"; shift
+
+case "$filename" in
+*/*) ;;
+*) filename="$filename.cv-s";;
+esac
+exec <"$filename"
+
+while read cv value; do
+ case "$cv" in
+ addr)
+ [ x$addr = x ] || fail 'addr twice'
+ addr=$(( $value + 0 ))
+ ;;
+ [0-9]*)
+ cv=$(( $cv + 0 ))
+ value=$(( $value + 0 ))
+ cvlist="$cvlist $cv=$value"
+ ;;
+ '#'*)
+ ;;
+ *)
+ fail 'invalid syntax'
+ ;;
+ esac
+done
+
+echo "Factory reset"
+./factory-reset-svc "$port"
+
+echo "Setting address to $addr"
+./program-cv-svc "$port" 1 $addr
+
+for cvv in $cvlist; do
+ sleep 1
+ cv=${cvv%=*}
+ value=${cvv#*=}
+ echo "Setting CV $cv = $value"
+ ./program-cv "$port" $addr $cv $value
+done