Ура!
На своём тронсмарте (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, - точное время.
|