#!/bin/sh
################################################################################
#
# cme3100 init script.
#
################################################################################

KERNEL_CONFIG=/application/CMe3100/internal/kernel.config
MACHINE_INFO=/application/CMe3100/internal/machine.info

# create new machine.info
createMachineInfo() {
    cp -f /application/CMe3100/internal/machine.config $MACHINE_INFO
    echo "product.sw=" >> $MACHINE_INFO
    echo "product.mac=" >> $MACHINE_INFO
    echo "product.kv=" >> $MACHINE_INFO
    sed -i '/product.password/d' $MACHINE_INFO
}

createKernelConfig() {
    if [ ! -f $KERNEL_CONFIG ]
    then
        touch $KERNEL_CONFIG
        # eth0 mac address
        echo "product.mac=" > $KERNEL_CONFIG
        # Kernel version
        echo "product.kv=" >> $KERNEL_CONFIG
    fi
		
    # append product.mac if not exist in file
    if ! grep product.mac= ${KERNEL_CONFIG}; 
        then
        echo "product.mac=" >> $KERNEL_CONFIG
    fi
	# append product.kv if not exist in file
    if ! grep product.kv= ${KERNEL_CONFIG}; 
        then
        echo "product.kv=" >> $KERNEL_CONFIG
    fi
}

setSoftlinks() {
    # configure serial ports (a-uart)
    echo "Configuring serial port 0, 1, 4"
    ln -sf /dev/ttyAPP0 /dev/ttyS0
    ln -sf /dev/ttyAPP1 /dev/ttyS1
    ln -sf /dev/ttyAPP4 /dev/ttyS4
}

setGpioPins() {
    # configure gpio pins
    echo "Exporting GPIO 4, 5, 6, 7, 34, and 38"
    echo 4 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio4/direction
    echo 0 > /sys/class/gpio/gpio4/value
    echo 1 > /sys/class/gpio/gpio4/active_low
    echo 5 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio5/direction	
    echo 1 > /sys/class/gpio/gpio5/active_low
    echo 1 > /sys/class/gpio/gpio5/value
    echo 6 > /sys/class/gpio/export
    echo in > /sys/class/gpio/gpio6/direction
    echo 1 > /sys/class/gpio/gpio6/active_low
    echo both > /sys/class/gpio/gpio6/edge
    echo 7 > /sys/class/gpio/export
    echo in > /sys/class/gpio/gpio7/direction
    echo 1 > /sys/class/gpio/gpio7/active_low
    echo both > /sys/class/gpio/gpio7/edge
    echo 34 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio34/direction
    echo 1 > /sys/class/gpio/gpio34/active_low
    echo 38 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio38/direction
    echo 0 > /sys/class/gpio/gpio38/value
    echo 1 > /sys/class/gpio/gpio38/active_low
}

checkForNewLicenseFile() {
    mkdir -p /mnt/usbhdd
    mount -t auto /dev/mmcblk0p6 /mnt/usbhdd
    if [ -f /mnt/usbhdd/*.lic ]
    then
        echo "new license file discovered"
        mv /mnt/usbhdd/*lic /application/CMe3100/license/
    fi
    cp -f /application/CMe3100/internal/machine.info /mnt/usbhdd/machine.info
    # convert the machine.info to windows format for usb storage drive
    unix2dos /mnt/usbhdd/machine.info
    echo "umounting usbdrive"
    umount /dev/mmcblk0p6
}

sendArping() {
    # wait for valid ip address for arping (max 1 minute)
    while true; do
        sleep 1
        # get ip address for arping command
        IP_ADDRESS=$(ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/&&!/169.254.254.1/{split($2,_," ");print _[1]}')
        echo "ip: $IP_ADDRESS"
        if [ ! -z "$IP_ADDRESS" ]
        then
            arping -fbDU -w 1 -I eth0 -s $IP_ADDRESS $IP_ADDRESS
            break
        else 
            echo "no ip, waiting"
        fi
        COUNT=$((COUNT + 1))
        echo "count: $COUNT"
        if [ $COUNT -gt 60 ]
        then
            break
        fi
    done
}

checkDisks() {
    MOUNTED=$(df | grep "application")
    if [ -z "$MOUNTED" ]
    then
        echo "application not mounted, running fsck"
        # Note that -c -y takes time and is not guaranteed to make
        # things better. Therefore we only use it when the application
        # partition is unmountable.
        fsck.ext3 /dev/mmcblk0p5 -c -y
        mount -t auto /dev/mmcblk0p5 /application
    fi
}

case "$1" in
    start)
        # Check disks for errors
        checkDisks

        # configure serial ports (a-uart)
        setSoftlinks
        # configure gpio pins
        setGpioPins
		echo "Starting hwclock trickle charge"
		i2cset -f -y 0 0x68 0x10 0xA5
		;;
	stop)
		echo -n "not supported..."
		;;
	*)
		echo "Usage: $0 {start}"
	    exit 1
	esac

exit 0
