Skip to content

Instantly share code, notes, and snippets.

@eni23
Created June 11, 2015 11:23
Show Gist options
  • Save eni23/e4f0e9f0734baca8ae43 to your computer and use it in GitHub Desktop.
Save eni23/e4f0e9f0734baca8ae43 to your computer and use it in GitHub Desktop.
#!/bin/bash
RESOURCE_PREFIX="staticfile_"
LOOKUP_FUNCTION_NAME="lookup_file"
DATATABLENAME="datatable"
XXD="/usr/bin/xxd"
INPUT_DIR=$1
OUTPUT_FILE=$2
###################
incfile=$(basename $2)
tempdir=$(mktemp -d --suffix=genstatic.sh)
tempinc=$tempdir/$incfile
touch $tempdir/$incfile
# c template
cat << 'EOF' > $tempinc
/*
* Embedded static files
* generated: #!gendate
*
* This File is autogenerated, do not edit manually
*/
#include "Arduino.h"
int #!lookupfn(const char *name){
typedef struct item_t { const char *name; int id; } item_t;
item_t table[] = {
#!lookuptable { 0, 0 }
};
for (item_t *p = table; p->name != 0; ++p) {
if (strcmp(p->name, name) == 0) {
return p->id;
}
}
return 0;
}
EOF
IFS=$'\n' files=($( find $INPUT_DIR -not -empty -type f | sed "s:^$INPUT_DIR/::" ))
flength=${#files[@]}
lookuptable=""
datatable=""
resid=1
totalsize=0
for (( i=0; i<${flength}; i++ )); do
IFS=$'\n' file="${files[$i]}"
realfile=$INPUT_DIR/$file
resvar=$RESOURCE_PREFIX$resid
tempfile=$tempdir/$resvar
echo "$resid: $file"
fileinfo=$(file $realfile | sed "s:^$INPUT_DIR/::")
fileinfo_short=${fileinfo:0:80}
filesize=$(ls -lh $realfile | awk '{print $5}')
echo "/* $fileinfo_short" > $tempfile
echo " * Size: $filesize */" >> $tempfile
$XXD -i $realfile >> $tempfile
xddresname=$( cat $tempfile | head -n3 | tail -n1 | awk '{print $3}' | sed 's:\[\]$::g')
xddressize=$( cat $tempfile | tail -n1 | awk '{print $5}' | sed 's:;::g' )
sed -i "s:$xddresname:$resvar:g" $tempfile
sed -i "s:$resvar\[\]:$resvar\[$xddressize\]:g" $tempfile
sed -i "s:unsigned char:PROGMEM prog_uchar:g" $tempfile
echo -e "\n" >> $tempfile
cat $tempfile >> $tempinc
lookupentry=" { \"$file\", $resid },\n"
lookuptable=$lookuptable$lookupentry
dataentry=" $resvar,\n"
datatable=$datatable$dataentry
let resid=resid+1
let totalsize=$totalsize+$xddressize
done
sed -i "s|#!lookupfn|$LOOKUP_FUNCTION_NAME|g" $tempinc
sed -i "s|#!lookuptable|$lookuptable|g" $tempinc
sed -i "s|#!datatable|$datatable|g" $tempinc
sed -i "s|#!gendate|$(date) on $(hostname)|g" $tempinc
echo "PROGMEM const char *$DATATABLENAME[] = {" >> $tempinc
echo -e $datatable >> $tempinc
echo "};" >> $tempinc
mv $tempinc $OUTPUT_FILE
rm -r $tempdir
echo "Total using $totalsize bytes"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment