Leyendo el RTC con Python

En la segunda parte del trabajo práctico número 5 de Informática Electrónica se propone leer el RTC en un sistema Linux haciendo uso de la interfaz ioctl, resulta que investigando un poco encontramos que hay una forma aún mejor y más sencilla que es usando el API definidio por sysfs, esté código implementa una posible solución usando python (aviso por ser un ejemplo academico esta cargado de cosas no del todo necesarias, el código se puede reducir en muchas lineas)

#!/bin/env python
# -*- coding: utf-8 -*-

'''
Código simple que muestra el estado del RTC utilizando la interfaz
provista por sysfs, según: 
    http://www.kernel.org/doc/Documentation/rtc.txt

Este método no sólo es más simple que el acceso via ioctl, sino que
además permite que cualquier usuario lea el RTC, sin comprometer la
seguridad del sistema.

Autores:
    Naranjo Manuel Francisco 
    Sanchez Gonzalo Daniel 
'''

import os
from os import path

SYS_CLASS_RTC = path.join(path.sep, 'sys', 'class', 'rtc')

class RTC():
    def __init__(self, rtc=None):
        '''
        Inicializa el acceso al RTC, chequea que el acceso sea
        valido
        '''
        if not rtc:
            rtc = self.encontrarRTC()
        if not path.isdir(rtc):
            raise Exception("RTC invalido")
        self.rtc = rtc
        self.__date = path.join(self.rtc, 'date')
        self.__time = path.join(self.rtc, 'time')
        self.__epoch = path.join(self.rtc, 'since_epoch')

    def encontrarRTC(self):
        '''
            Esta funcion trata de encontrar el RTC por defecto provisto
            en cualquier sistema compatible con x86 o con acceso ACPI
        '''
        return path.join(SYS_CLASS_RTC, os.listdir('/sys/class/rtc/')[0])
    
    def __leer(self, arg):
        '''
        Función genérica que lee el contenido provisto por el RTC
        '''
        return open(arg, 'r').readline().strip()

    def leerDia(self):
        '''
        Devuelve el día según lo que indica el RTC
        '''
        return self.__leer(self.__date)

    def leerHora(self):
        '''
        Devuelve la hora según lo que indica el RTC
        '''
        return self.__leer(self.__time)

    def leerEpoch(self):
        '''
        Devuelve la cantidad de segundos desde las 00:00:00 UTC del 
        1ero de Enero de 1970 día
        '''
        return self.__leer(self.__epoch)

    def __str__(self):
        '''
        Generar representacion lejible de este objeto
        '''
        return '%12s|%10s|%10s' % \
            (self.leerEpoch(), self.leerDia(), self.leerHora())

if __name__ == '__main__':
    # se ejecuta sólo cuando se ejecuta la aplicación
    import time
    try:
        # instanciar objeto
        rtc = RTC()

        #imprimir formato
        print "%-12s|%-10s|%-10s" %("Desde 1-1-70", "dia", "hora")

        while 1:
            print "%s" % rtc # forzar conversion a string
            time.sleep(.1) # esperar 100 millisegundos
    except KeyboardInterrupt:
        print "Chau"

El código se debe bajar a un archivo (no es necesaria la extensión .py) y darle permisos de ejecución.

La salida del mismo resulta

[manuel@localhost:tmp]$ ./leerrtc
Desde 1-1-70|dia |hora
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899932|2010-11-27| 23:18:52
1290899932|2010-11-27| 23:18:52
1290899932|2010-11-27| 23:18:52
^CChau

Advertisements
This entry was posted in facultad, python. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s