#!/bin/sh

# read and set time from RTC

# seconds
retry_timeout=2
max_retries=10
rtc_dev=/dev/rtc0

retry_count=0

HWCLOCK_PROBLEM_FILE=/var/local/telem/errors/hwclock
I2C_PROBLEM_FILE=/var/local/telem/errors/i2c-bus

while true; do
	OK=false
	I2C=false

	# Search for external RTC on i2c
	grep -Fq -- 'ds1339' /sys/bus/i2c/devices/*-0068/name 2>/dev/null \
	&& rtc_dev="/dev/$(ls -1 /sys/bus/i2c/devices/*-0068/rtc/ 2>/dev/null | grep -F -- rtc | head -n1)"
	[ -c "${rtc_dev}" ] && { OK=true; I2C=true; }

	# Search for internal SNVS RTC
	! $OK && grep -Fq -- 'snvs' "/sys/class/rtc/rtc0/name" 2>/dev/null && \
	{ OK=true; I2C=false; rtc_dev=/dev/rtc0; logger -s -p "user.info" -t "$0" "Using internal SNVS RTC '$rtc_dev'"; }

	if $OK; then
		hwclock -s -u -f "$rtc_dev"
		res=$?
		if [ "$res" = "0" ]; then
			logger -s -p "user.info" -t "$0" "Successfully read time from '$rtc_dev'"
			rm $HWCLOCK_PROBLEM_FILE 2> /dev/null
			$I2C && rm $I2C_PROBLEM_FILE 2> /dev/null
			exit 0
		elif [ "$res" = "1" ]; then
			logger -s -p "user.err" -t "$0" "Probably invalid time in '$rtc_dev'"
			exit 1
		else
			logger -s -p "user.err" -t "$0" "Reading current time from '$rtc_dev' failed"
		fi
	fi

	retry_count=$(($retry_count + 1))

	if [ $retry_count -gt $max_retries ]; then
		logger -s -p "user.err" -t "$0" "Too many retries, giving up."
		touch $HWCLOCK_PROBLEM_FILE
		$I2C && touch $I2C_PROBLEM_FILE
		exit 0
	fi

	logger -s -p "user.err" -t "$0" "ReadHwClock retry $retry_count in $retry_timeout seconds"

	sleep $retry_timeout
done
