Hay un script llamado encoders.sh que lee la posición de las manecillas del reloj a través de unos encoders conectados al GPIO, luego la escribe en dos archivos: "/var/www/vars/hora_caratula/hora" y "/var/www/vars/hora_caratula/minuto" respectivamente.
Hasta ahí todo va bien, pero estoy atorado con un segundo script llamado sincro.sh, lo que se supone que tiene que hacer es interpretar los valores de los archivos antes mencionados y compararlos con la hora del sistema, de manera que se pueda calcular si la carátula del reloj tiene algún retraso o adelanto, para posteriormente sincronizar las manecillas con la hora del sistema.
El valor de los archivos es hora=5 y minuto=0, así quedaron después de la última lectura de los encoders.
Este es el código:
Código:
#! /bin/bash
# sincro.sh
# Carga valores de hora en carátula
cHor=$(cat /var/www/vars/hora_caratula/hora)
cMin=$(cat /var/www/vars/hora_caratula/minuto)
# Carga valores de hora del sistema
sHor=$(date +%I)
sMin=$(date +%M)
# Filtra cadenas
sHor=${sHor/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sMin=${sMin/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sHor=${sHor/12/0} # Sustituye el 12 por 0.
# Calcula minutos transcurridos en carátula
minCar=$[$cHor * 60 + $cMin ]
# Calcula minutos trasncurridos en sistema
minSis=$[$sHor * 60 + $sMin ]
# Calcula la diferencia de minutos transcurridos
minDif=$[$minCar - $minSis ]
# Muestra la Horade la carátula y la hora del sistema:
echo "Hora Carátula: $cHor:$cMin | Minutos: $minCar"
echo "Hora Sistema: $sHor:$sMin | Minutos: $minSis"
# Muestra la diferencia de minutos entre ambas horas.
# Si la diferencia es negativa se aplica valor absoluto:
if [[ minDif -lt 0 ]]
then echo "Diferencia: Atrasado con $[$minDif * -1] minutos"
else echo "Diferencia: Adelantado con $minDif minutos"
fi
Código:
root@raspberrypi:~# ./sincro.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 5:53 | Minutos: 353
Diferencia: Atrasado con 353 minutos
Lo extraño es que cuando introduzco valores artificiales como asignación de las dos primeras variables en vez de asignar el valor de los archivos entonces el script se ejecuta correctamente y sin errores.
Aquí está el segmento que modifiqué:
Código:
#! /bin/bash
# sincro.sh
#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=5
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=0
...
Código:
root@raspberrypi:~# ./sincro.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:9 | Minutos: 369
Diferencia: Atrasado con 69 minutos
No comprendo porqué el error emerge cuando cargo los valores desde los archivos, así que para descartar un error de lectura elaboré otro script llamado ajuste.sh con el siguiente código:
Código:
#! /bin/bash
# ajuste.sh
./sincro.sh $(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)
Código:
#! /bin/bash
# sincro.sh
# Carga valores de hora en carátula
#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=$1
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=$2
...
Código:
root@raspberrypi:~# ./ajuste.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 6:25 | Minutos: 385
Diferencia: Atrasado con 385 minutos
La modificación fue comentar las asignaciones de los archivos y sustituirlos con valores artificiales '5' y '0'. He aquí el código:
Código:
#! /bin/bash
# ajuste.sh
./sincro.sh 5 0 #$(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)
Código:
root@raspberrypi:~# ./ajuste.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:34 | Minutos: 394
Diferencia: Atrasado con 94 minutos
Como pueden ver, aparece un patrón, este es que cuando asigno los valores desde los archivos ya sea desde el script original através de parámetros aparece el "error de sintaxis" y cuando asigno valores artificiales ya sea en el script original como atraves de parámetros, la salida está libre de errores.
Notarán que para los valores de asignación usé siempre los mismos valores que contenían los archivos desde la última lectura de los encoders ('5' y '0'), esto lo hice para evitar un sesgo, o sea que el código trate siempre con los mismos valores y solo cambie la situación del flujo de código de la "hora de la carátula". También se podrán dar cuenta que los valores de la "hora del sistema" han ido cambiando en cada ejecución, esto es natural, puesto que estos valores realmente son extraídos de la hora del sistema que está en avance constante, pero a pesar de eso nunca presentó anomalías, quiere decir que el problema está en la sección de asignación de valores de la "hora de la carátula" y sólo cuando dicha asignación era procedente de la lectura de los archivos.
Dudo que sea un problema de lectura porque estoy como root, además sistema de ficheros no está corrupto.
Cuando las pruebas fueron efectuadas los permisos de dichos archivos estaban en 755, posteriormente los cambié a 777 y repetí las pruebas pero todo sigue igual.
Para descartar definitivamente errores de lectura escribí otro script llamado valores.sh que simplemente muestra el contenido de los archivos:
Código:
#! /bin/bash
# valores.sh
echo "Hora: $(cat /var/www/vars/hora_caratula/hora)"
echo "Minuto: $(cat /var/www/vars/hora_caratula/minuto)"
Código:
root@raspberrypi:~# ./valores.sh
Hora: 5
Minuto: 0
Tal vez el problema no es tan grande, tal vez sea un error obvio de novato que está justo frente a mi, pero no logro verlo.
Si alguien encuentra el dichoso error de sintaxis agradecería que lo compartiera, es posible que yo no sea el único que pase por esto.
Saludos