From 1f7324ea9af0d4df0f3e0567195bec1d743171da Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Wed, 23 May 2018 20:57:25 +0200 Subject: [PATCH] New ML support - postbuild.sh - initial version --- lang/postbuild.sh | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 lang/postbuild.sh diff --git a/lang/postbuild.sh b/lang/postbuild.sh new file mode 100644 index 000000000..43fe8c8a0 --- /dev/null +++ b/lang/postbuild.sh @@ -0,0 +1,99 @@ +#!/bin/sh +# postbuild.sh +# +# Output folder and elf file: +OUTDIR="../../output" +OUTELF="$OUTDIR/Firmware.ino.elf" +# +# AVR gcc tools used: +OBJCOPY=C:/arduino-1.6.8/hardware/tools/avr/bin/avr-objcopy.exe + +function finish +{ + echo + echo "postbuild.sh finished... press enter key" + read + exit +} + +echo "postbuild.sh started..." + +#check input files +echo " checking files:" +if [ ! -e $OUTDIR ]; then echo " folder '$OUTDIR' not found!"; finish; fi +echo " folder OK" +if [ ! -e $OUTELF ]; then echo " elf file '$OUTELF' not found!"; finish; fi +echo " elf OK" +if ! ls $OUTDIR/sketch/*.o >/dev/null 2>&1; then echo " no object files in '$OUTDIR/sketch/'!"; finish; fi +echo " objects OK" + +#run progmem.sh to examine content of progmem1 +./progmem.sh 1 + +#create sorted list of strings from progmem1.var and lang_en.txt +#lines from progmem1.var will contain addres (8 chars) and english text +#lines from lang_en.txt will contain linenumber and english text +#after sort this will generate pairs of lines (line from progmem1 first) +#result of sort is compiled with simple script and stored to file textaddr.txt +echo "compiling progmem1.var and lang_en.txt" +addr='' +text='' +(cat progmem1.var | sed -E "s/^([^ ]*) ([^ ]*) (.*)/\1 \"\3\"/";\ + cat lang_en.txt | sed "/^$/d;/^#/d" | sed = | sed '{N;s/\n/ /}') |\ + sort -k2 |\ + sed "s/\\\/\\\\\\\/g" | while read num txt; do + if [ ${#num} -eq 8 ]; then + if [ -z "$addr" ]; then + addr=$num + else + if [ "$text" == "$txt" ]; then + addr="$addr $num" + else + echo "ADDR NF $addr $text" + addr=$num + fi + fi + text=$txt + else + if [ -z "$addr" ]; then + echo "TEXT NF $num $txt" + else + if [ "$text" == "$txt" ]; then + if [ ${#addr} -eq 8 ]; then + echo "ADDR OK $addr $num" + else + echo "$addr" | sed "s/ /\n/g" | while read ad; do + echo "ADDR OK $ad $num" + done + fi + addr='' + text='' + else + echo "TEXT NF $num $txt" + fi + fi + fi +done > textaddr.txt + +#check for messages declared in progmem1, but not found in lang_en.txt +echo "checking textaddr.txt..." +if cat textaddr.txt | grep "^ADDR NF"; then echo "Some strings not found in lang_en.txt!"; finish; fi + +#update progmem1 id entries in binary file +echo "extracting binary..." +$OBJCOPY -I ihex -O binary $OUTDIR/Firmware.ino.hex ./firmware.bin + +#update progmem1 id entries in binary file +echo "updating binary..." +#dd if=/dev/zero of=test.bin bs=512 count=64 2>/dev/null +time cat textaddr.txt | grep "^ADDR OK" | cut -f3- -d' ' | sed "s/^0000/0x/" |\ + awk '{ hi = int($2 / 256); lo = int($2 - 256 * hi); printf("%d \\\\x%02x\\\\x%02x\n", strtonum($1), hi, lo); }' |\ + while read addr data; do + echo -n -e $data | dd of=./firmware.bin bs=1 count=2 seek=$addr conv=notrunc oflag=nonblock 2>/dev/null + done + +#update progmem1 id entries in binary file +echo "converting to hex..." +$OBJCOPY -I binary -O ihex ./firmware.bin ./firmware.hex + +finish