#!/bin/sh
#
# Copyright 2009 by Oliver Dippel <o.dippel@gmx.de>
#



TEMPFILE="`mktemp /tmp/avr-fuses.tmp.XXXXX`"
TEMPFILE2="`mktemp /tmp/avr-fuses2.tmp.XXXXX`"

uisp -v -dprog=dapa --rd_fuses > "$TEMPFILE2"

LOW_NAMES="\
BODLEVEL: Brown out detector trigger level
BODEN: Brown out detector enable
SUT1: Select start-up time
SUT0: Select start-up time
CKSEL3: Select Clock source
CKSEL2: Select Clock source
CKSEL1: Select Clock source
CKSEL0: Select Clock source
"

HIGH_NAMES="\
RSTDISBL: Select if PC6 is I/O pin or RESET pin {unprogrammed=PC6 is RESET}
WDTON: WDT always on {unprogrammed=WDT enabled by WDTCR}
SPIEN: Enable Serial Program and Data Downloading {programmed=SPI programming enabled}
CKOPT: Oscillator options
EESAVE: EEPROM memory is preserved through the Chip Erase {unprogrammed=EEPROM not preserved}
BOOTSZ1: Select Boot Size
BOOTSZ0: Select Boot Size
BOOTRST: Select Reset Vector
"

while echo -n
do

	echo -n > "$TEMPFILE"
	cat "$TEMPFILE2" | grep "^Fuse " | while read LINE
	do
		TYPE="`echo $LINE | cut -d" " -f2`"
		VALUE="`echo $LINE | cut -d"=" -f2- | sed "s|  *||g"`"
		if test "$TYPE" = "Low"
		then
			echo "$TYPE $VALUE" >> "$TEMPFILE"
		elif test "$TYPE" = "High"
		then
			echo "$TYPE $VALUE" >> "$TEMPFILE"
		elif test "$TYPE" = "Extended"
		then
			echo "$TYPE $VALUE" >> "$TEMPFILE"
		fi
	done
	VALUES="`cat "$TEMPFILE"`"
	echo -n > "$TEMPFILE"
	gdialog --menu "Fuses" 20 120 10 $VALUES exit Exit 2> "$TEMPFILE" || break
	RET="`cat "$TEMPFILE"`"
	if test "$RET" = "exit"
	then
		break;
	fi

	TYPE="`cat "$TEMPFILE"`"
	VALUE="`cat "$TEMPFILE2" | grep "^Fuse $TYPE Byte" | cut -d"=" -f2- | sed "s|  *||g"`"
	let VALUE=$VALUE
	TOGGLE="0"
	if test "$TYPE" = "Low"
	then
		while ! test -e "/tmp/exit"
		do
			VALUE2="$VALUE"
			N="1"
			echo -n > "$TEMPFILE"
			for BIT in 128 64 32 16 8 4 2 1
			do
				echo -n "$BIT '`echo "$LOW_NAMES" | head -n$N | tail -n1` " >> "$TEMPFILE"
				if test "$VALUE2" -ge "$BIT"
				then
					VALUE2="`expr $VALUE2 - $BIT`"
					echo "1 (unprogrammed)'" >> "$TEMPFILE"
				else
					echo "0 (programmed)'" >> "$TEMPFILE"
				fi
				N="`expr $N + 1`"
			done
			VALUES="`cat "$TEMPFILE"`"
			eval gdialog --menu \"Low-Fuses \(0x`printf "%02X" $VALUE`\)\" 20 120 10 $VALUES burn Burn-Low-Fuses exit Exit 2> "$TEMPFILE" || break
			TOGGLE="`cat "$TEMPFILE"`"
			if test "$TOGGLE" = "exit"
			then
				break;
			elif test "$TOGGLE" = "burn"
			then
				clear
				echo "Burn Low-Fuses: 0x`printf "%02X" $VALUE`"
				uisp -v -dprog=dapa --wr_fuse_l=0x`printf "%02X" $VALUE`
				sleep 1
				uisp -v -dprog=dapa --rd_fuses > "$TEMPFILE2"
				break;
			else
				VALUE2="$VALUE"
				for BIT in 128 64 32 16 8 4 2 1
				do
					if test "$VALUE2" -ge "$BIT"
					then
						VALUE2="`expr $VALUE2 - $BIT`"
						if test "$TOGGLE" = "$BIT"
						then
							VALUE="`expr $VALUE - $BIT`"
						fi
					else
						if test "$TOGGLE" = "$BIT"
						then
							VALUE="`expr $VALUE + $BIT`"
						fi
					fi
				done
			fi
		done
		rm -rf "/tmp/exit"
	elif test "$TYPE" = "High"
	then
		while ! test -e "/tmp/exit"
		do
			VALUE2="$VALUE"
			N="1"
			echo -n > "$TEMPFILE"
			for BIT in 128 64 32 16 8 4 2 1
			do
				echo -n "$BIT '`echo "$HIGH_NAMES" | head -n$N | tail -n1` " >> "$TEMPFILE"
				if test "$VALUE2" -ge "$BIT"
				then
					VALUE2="`expr $VALUE2 - $BIT`"
					echo "1 (unprogrammed)'" >> "$TEMPFILE"
				else
					echo "0 (programmed)'" >> "$TEMPFILE"
				fi
				N="`expr $N + 1`"
			done
			VALUES="`cat "$TEMPFILE"`"
			eval gdialog --menu \"High-Fuses \(0x`printf "%02X" $VALUE`\)\" 20 120 10 $VALUES burn Burn-Low-Fuses exit Exit 2> "$TEMPFILE" || break
			TOGGLE="`cat "$TEMPFILE"`"
			if test "$TOGGLE" = "exit"
			then
				break;
			elif test "$TOGGLE" = "burn"
			then
				clear
				echo "Burn High-Fuses: 0x`printf "%02X" $VALUE`"
				uisp -v -dprog=dapa --wr_fuse_h=0x`printf "%02X" $VALUE`
				sleep 1
				uisp -v -dprog=dapa --rd_fuses > "$TEMPFILE2"
				break;
			else
				VALUE2="$VALUE"
				for BIT in 128 64 32 16 8 4 2 1
				do
					if test "$VALUE2" -ge "$BIT"
					then
						VALUE2="`expr $VALUE2 - $BIT`"
						if test "$TOGGLE" = "$BIT"
						then
							VALUE="`expr $VALUE - $BIT`"
						fi
					else
						if test "$TOGGLE" = "$BIT"
						then
							VALUE="`expr $VALUE + $BIT`"
						fi
					fi
				done
			fi
		done
		rm -rf "/tmp/exit"
	elif test "$TYPE" = "Extended"
	then
		echo "$TYPE $VALUE"
	fi

done

rm -rf "$TEMPFILE"
rm -rf "$TEMPFILE2"

