|
@@ -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
|