Показать сообщение отдельно
Старый 15.06.2016, 18:48   #909
0617
Пользователь
 
Регистрация: 15.04.2014
Город: Волжский
Регион: 34
Машина: Peugeot 408
Сообщений: 57
0617 is a jewel in the rough0617 is a jewel in the rough0617 is a jewel in the rough
По умолчанию Ура!

На своём тронсмарте (AmLogic S905, Android 5.1.1) сделал автозапуск GPS и перезапуск при отключении/подключении ресивера, также сделал синхронизацию времени с GPS (в приставке отсутствует батарейка, поэтому при каждом запуске время ставится 01.01.2015; при проводном подключении время синхронизируется с ntp-серером в сети, а при наличии только Wi-Fi приставка не подключается к сети из-за слишком большой разницы во времени).
Автозапуск работает только из
install-recovery-2.sh
Код:
#!/system/bin/sh

/system/etc/init.gps.sh
/system/etc/init.date.sh
init.gps.sh
Код:
#!/system/bin/sh

# gps device settings
GPSTTYdefault="ttyACM0"
SPEEDdefault="9600"
# time zone shift:  3 for MSK
TimeZone=3
# ################################################ #
# set 1 for logging, 0 for work
LOG=0
# path to log file
LOGFILE=/sdcard/gps.init.log.txt
# ################################################ #

GPSinit() {
	FOUND=""
	SLEEPTIME=1
	while [ 1 = 1 ]
	do
		if [ -c /dev/$GPSTTY ];
		then
			SET666=$(ls /dev/$GPSTTY -l | grep rw-rw-rw)
			if [[ $FOUND = "" ]] || [[ $SET666 = "" ]]
			then
log "$GPSTTY found!"
				chown root:system /dev/$GPSTTY
				chmod 666 /dev/$GPSTTY
				busybox stty -F /dev/$GPSTTY ispeed $SPEED
				FOUND="found"
				SLEEPTIME=10
				GPStimesync
			fi
		else
log "... no $GPSTTY found for one more second ..."
			FOUND=""
			SLEEPTIME=1
		fi
		sleep $SLEEPTIME
	done
}

GPStimesync() {
	sleep 2
	# wait for full RMC packet (no matter if it is V or A)
log "... GPS $GPSTTY time sync started"
	GPRMC=$(cat /dev/$GPSTTY | grep -m 1 -e '$GPRMC,[0-9]\{6\}.[0-9]*,\(.*,\)\{7\}[0-9]\{6\}')
log "... GPRMC=$GPRMC"
	D=$(echo $GPRMC | cut -d , -f 10)
	T=$(echo $GPRMC | cut -d , -f 2)
	Dy=$(expr substr $D 5 2)
	Dm=$(expr substr $D 3 2)
	Dd=$(expr substr $D 1 2)
	T=$(expr substr $T 1 6)
log "... time to set 20$Dy$Dm$Dd.$T"
	date -s 20$Dy$Dm$Dd.$T
	T0=$(date +%s)
	# add double time shift for local time
	TZ=$(($T0+2*TimeZone*3600))
	date -u $TZ
}

log() {
# LOG: 1 = logging on
# LOGFILE: log file name
# no parameters: clear log file
	if [ "$LOG" = 1 ]
	then
		if [ "$1" ]
		then
			echo $1 >> $LOGFILE
		else
			echo Start logging > $LOGFILE
		fi
	fi
}

log
log "Start logging $GPSTTY init"

GPSTTY=$(getprop ro.kernel.android.gps)
SPEED=$(getprop ro.kernel.android.gps.speed)
if [ "$GPSTTY" == "" ];
	then
		GPSTTY=$GPSTTYdefault
		SPEED=$SPEEDdefault
		setprop  ro.kernel.android.gps $GPSTTY
		setprop ro.kernel.android.gps.speed $SPEED
fi
GPSinit &
exit
init.date.sh
Код:
#!/system/bin/sh

# reads last known date (LKD) from saved file, sets it as current date, updates every hour

SaveDateEveryHour() {
	while [ 1 = 1 ]
	do
		sleep 600
		date +%Y%m%d.%H%M%S > /sdcard/lastdate.txt
		sleep 3000
	done
}

if [ -f  /sdcard/lastdate.txt ]
then 
	LKD=$(cat /sdcard/lastdate.txt)
	date -s $LKD
else
	date -s 20160701.010101
fi;

SaveDateEveryHour &
exit
По окончании загрузки оба скрипта продолжают выполняться в фоновом режиме.
init.gps каждые 10 секунд определяет наличие и доступность устройства /dev/ttyACM0 (или что там прописано в ро.кернел.адроид.гпс). Если устройство отсутствует, задержка опроса уменьшается до 1 секунды. Как только устройство появляется, на него повторно раздаются права, и оно становится опять доступно программам навигации. Таким образом, при отключении и повторном подключении ресивера он станет доступен не более, чем через 10 секунд. При каждой инициализации GPS (автозапуск или перезапуск) скрипт ожидает первый пакет GPRMC, в котором полностью заполнены поля даты и времени, и выставляет соответствующее время с учётом пояса.
За процессом загрузки можно проследить в логфайле (LOG=1)
Начальная установка времени делается следующим образом:
init.date.sh при запуске считывает содержимое файла с /sdcard/ и устанавливает время из него, а затем через 10 минут и потом каждый час обновляет файл. Т.о. при отсутствии синхронизации при следующем запуске будет установлено время незадолго перед последним отключением. Т.е. сразу после загрузки - 01.01.2015, через несколько секунд - время перед последним выключением, затем, после получения пакета GPRMC с GPS, - точное время.

Последний раз редактировалось 0617; 30.06.2016 в 15:40. Причина: Обновил скрипт
0617 вне форума   Ответить с цитированием