def __init__(self, iniciar_hw=True): self._mesa = None self.apertura = None self._tmp_apertura = None self.recuento = None self.interna = None self.impresora = None self.lector = None # para poder iluminar de rojo en el recuento self.logger = get_logger(MODULO_SUFRAGIO) self.salt = "" if iniciar_hw: from dbus.exceptions import DBusException from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) retries = 3 while retries: try: self.impresora = DbusPrintController() retries = 0 except DBusException as error: msg = "Hubo un problema para inicializar la impresora" self.logger.error(msg) self.logger.error(error) retries -= 1 sleep(5) self.lector = DbusLectorController() self.powermanager = DbusPowerManagerController() self.backlight = DbusBacklightController() self.agent = DbusAgentController() self.fancoolers = DbusFanCoolersController() self.pir = DbusPIRController() self.locutor = None
# coding: utf-8 from __future__ import absolute_import import dbus from json import loads from base64 import b64encode, b64decode from gi.repository.GObject import timeout_add from msa.core.ipc.settings import DBUS_BUSNAME_RFID, DBUS_LECTOR_PATH from msa.core.logging import get_logger from msa.core.rfid.constants import CLASE_ICODE, CLASE_ICODE2, CLASE_MIFARE logger = get_logger("lector_client") class DbusLectorController(): def __init__(self, loop=None): self.bus = dbus.SessionBus(mainloop=loop) self._signal_tag = None def _get_lector(self, loop=None): try: lector = self.bus.get_object(DBUS_BUSNAME_RFID, DBUS_LECTOR_PATH) except dbus.exceptions.DBusException: lector = None return lector def enable_events(self): """ Habilita la notificación de eventos para uso automático,
""" Clases bases para el manejo del sistema de plugins de la aplicacion. """ from importlib import import_module from inspect import getmembers from msa.modulos.constants import PATH_MODULOS, MODULOS_PLUGINS from msa.core.logging import get_logger logger = get_logger("plugin_manager") # variable de modulo que contiene los plugins habilitados _enabled_plugins = {} class PluginManager(): """Maneja los plugins de la aplicacion.""" @classmethod def enabled(cls, nombre): """Nos dice si un plugin esta habilitado o no. Argumentos: nombre -- nombre del plugin. """ return nombre in _enabled_plugins @classmethod def get_plugin(self, nombre): """Devuelve la instancia del plugin registrado. Argumentos:
""" Clases bases para el manejo del sistema de plugins de la aplicacion. """ from importlib import import_module from inspect import getmembers from msa.modulos.constants import PATH_MODULOS, MODULOS_PLUGINS from msa.core.logging import get_logger logger = get_logger("plugin_manager") # variable de modulo que contiene los plugins habilitados _enabled_plugins = {} class PluginManager(): """Maneja los plugins de la aplicacion.""" @classmethod def enabled(cls, nombre): """Nos dice si un plugin esta habilitado o no. Argumentos: nombre -- nombre del plugin. """ return nombre in _enabled_plugins @classmethod def get_plugin(self, nombre): """Devuelve la instancia del plugin registrado. Argumentos: nombre -- nombre del plugin.
# coding: utf-8 from __future__ import absolute_import import dbus from base64 import b64encode from json import loads from tempfile import NamedTemporaryFile from msa.core.imaging.helpers import get_dpi_boletas from msa.core.ipc.settings import DBUS_BUSNAME_PRINTER, DBUS_IMPRESORA_PATH from msa.core.logging import get_logger from msa.core.settings import COMPRESION_IMPRESION logger = get_logger("dbus_client") class DbusPrintController(): def __init__(self): self.bus = dbus.SessionBus() self.printer = self._get_printer() self.tiene_papel = self._estado_inicial_tarjeta() self._callback_tarjeta = None self._signal_paper = self.registrar_estado_papel() self._signal_insertando = None self._signal_autofeed = None self._callback_expulsada = None self.printer.connect_to_signal("boleta_expulsada", self.boleta_expulsada)
""" audioplayer.py Módulo para reproducción de archivos de sonido vía ALSA """ # Importante para el cálculo del sleep en run() import time from alsaaudio import PCM, Mixer, ALSAAudioError, MIXER_CHANNEL_ALL from datetime import datetime from threading import Thread from wave import open as waveOpen from msa.core.logging import get_logger from msa.core.audio.settings import SPEECH_PAUSE from msa.core.audio.constants import VALORES_VOLUMEN, MIXER_PRIO logger = get_logger("core") class WavData: def __init__(self, nchannels, frate, nframes, data): self.nchannels = nchannels self.frate = frate self.data = data self.nframes = nframes class WavPlayer(Thread): """ Un thread que ejecuta archivos de sonido.
import sensors from msa.core.hardware.constants import (FAN_THRESHOLD_HIGH, FAN_THRESHOLD_LOW, MAX_FAN_SPEED, MIN_FAN_SPEED) from msa.core.logging import get_logger logger = get_logger("temperature") def get_fan_speed(temp): if temp > FAN_THRESHOLD_HIGH: new_speed = MAX_FAN_SPEED elif temp < FAN_THRESHOLD_LOW: new_speed = 0 else: new_speed = (((temp - FAN_THRESHOLD_LOW) / (FAN_THRESHOLD_HIGH - FAN_THRESHOLD_LOW)) * (MAX_FAN_SPEED - MIN_FAN_SPEED)) + MIN_FAN_SPEED return int(new_speed) def get_temp(): sensors.init() temp = 0 try: for chip in sensors.ChipIterator(): for feature in sensors.FeatureIterator(chip): subs = list(sensors.SubFeatureIterator(chip, feature)) try: sensor_temp = sensors.get_value(chip, subs[0].number)
# coding: utf-8 from __future__ import absolute_import import dbus from base64 import b64encode from json import loads from tempfile import NamedTemporaryFile from msa.core.imaging.helpers import get_dpi_boletas from msa.core.ipc.settings import DBUS_BUSNAME_PRINTER, DBUS_IMPRESORA_PATH from msa.core.logging import get_logger from msa.core.settings import COMPRESION_IMPRESION logger = get_logger("dbus_client") class DbusPrintController(): def __init__(self): self.bus = dbus.SessionBus() self.printer = self._get_printer() self.tiene_papel = self._estado_inicial_tarjeta() self._callback_tarjeta = None self._signal_paper = self.registrar_estado_papel() self._signal_insertando = None self._signal_autofeed = None self._callback_expulsada = None self.printer.connect_to_signal("boleta_expulsada", self.boleta_expulsada) def _get_printer(self):
from msa.core.data.candidaturas import Candidatura, Categoria, Lista, Partido from msa.core.hardware.constants import FAN_THRESHOLD_OFF from msa.core.hardware.settings import (DEFAULT_BRIGHTNESS, ITERACIONES_APAGADO, RFID_POWER, USAR_FAN, USAR_PIR) from msa.core.hardware.temperature import get_fan_speed, get_temp from msa.core.i18n import levantar_locales from msa.core.ipc.server.armve_controller import ARMVEController from msa.core.ipc.server.dbus_service import MSADbusService from msa.core.ipc.settings import DBUS_ARMVE_PATH, DBUS_BUSNAME_ARMVE from msa.core.logging import get_logger, StreamToLogger from msa.core.logging.settings import LOG_CAPTURE_STDOUT levantar_locales() logger = get_logger("armve_service") if LOG_CAPTURE_STDOUT: sys.stdout = StreamToLogger(logger, INFO) sys.stderr = StreamToLogger(logger, ERROR) class ARMVEDBus(MSADbusService): """Server de DBus para ARMVE.""" def __init__(self): """Constructor""" self.object_path = DBUS_ARMVE_PATH self.bus_name = DBUS_BUSNAME_ARMVE self._conn = False
from msa.core.documentos.actas import Apertura, Autoridad, Recuento from msa.core.documentos.boletas import Seleccion from msa.core.imaging.imagen_prueba import ImagenPrueba from msa.core.logging import get_logger from msa.core.rfid.constants import (NO_TAG, TAGS_ADMIN, TAG_ADMIN, TAG_DATOS, TAG_COLISION, TAG_VACIO, CLASE_ICODE2, TIPOS_TAGS, TIPOS_TAGS_REV, COD_TAG_DESCONOCIDO, TAG_VOTO, TAG_RECUENTO, COD_TAG_RECUENTO, COD_TAG_INICIO, COD_TAG_ADDENDUM) from msa.core.settings import TOKEN, COMPROBAR_TOKEN from msa.settings import QUEMA from six.moves import range logger = get_logger("armve_controller") class ARMVEController(object): """Controlador para el ARMVEService.""" def __init__(self, parent): """Constructor para el Controlador. Argumentos: parent -- el servicio. """ self.parent = parent self._getting_tag_data = False self._buffering = False
from base64 import encodestring from msa.core.config_manager import Config from msa.core.imaging.helpers import init_jinja, xml2pil from msa.core.logging import get_logger logger = get_logger("imaging") jinja_env = init_jinja() class Imagen(object): """Clase base para las imagenes del modulo.""" def generate_data(self): """Genera la data para enviar al template.""" raise NotImplementedError("You must implement on subclass") def render_template(self): self.rendered_template = jinja_env.get_template(self.template) def render_svg(self): """Renderiza el SVG.""" data = self.generate_data() xml = self.rendered_template.render(**data) return xml def render_image(self): """Renderiza la imagen.""" xml = self.render_svg() return xml2pil(xml, self.data['width'], self.data['height']) def _get_img_b64(self, img_path):
import sensors from msa.core.hardware.constants import (FAN_THRESHOLD_HIGH, FAN_THRESHOLD_LOW, MAX_FAN_SPEED, MIN_FAN_SPEED) from msa.core.logging import get_logger logger = get_logger("temperature") def get_fan_speed(temp): if temp > FAN_THRESHOLD_HIGH: new_speed = MAX_FAN_SPEED elif temp < FAN_THRESHOLD_LOW: new_speed = 0 else: new_speed = (((temp - FAN_THRESHOLD_LOW) / (FAN_THRESHOLD_HIGH - FAN_THRESHOLD_LOW)) * (MAX_FAN_SPEED - MIN_FAN_SPEED)) + MIN_FAN_SPEED return int(new_speed) def get_temp(): sensors.init() temp = 0 try: for chip in sensors.ChipIterator(): for feature in sensors.FeatureIterator(chip): subs = list(sensors.SubFeatureIterator(chip, feature)) try:
# -*- coding: utf-8 -*- import os import time from hashlib import sha1 from threading import Thread from msa.constants import PATH_TTS from msa.core.audio.player import WavPlayer from msa.core.audio.settings import VOLUMEN_GENERAL from msa.core.data.settings import JUEGO_DE_DATOS from msa.core.logging import get_logger logger = get_logger("speech") _audio_player = None class Locutor(Thread): def __init__(self): Thread.__init__(self) global _audio_player if _audio_player is None or not _audio_player.is_alive(): _audio_player = WavPlayer() _audio_player.start() _audio_player.set_volume(VOLUMEN_GENERAL) self.reset() self.setDaemon(True) def run(self): while True:
encodear_string_apertura) from msa.core.documentos.structs import (struct_apertura, struct_recuento, struct_recuento_dni) from msa.core.documentos.tabulacion import Pizarra from msa.core.exceptions import (MesaNoEncontrada, QRMalformado, SerialRepetido, TagMalformado, TipoQrErroneo) from msa.core.i18n.decorators import forzar_idioma from msa.core.i18n.settings import DEFAULT_LOCALE from msa.core.imaging.acta import ImagenActa from msa.core.imaging.qr import crear_qr from msa.core.logging import get_logger from msa.core.packing.settings import SMART_PACKING from msa.core.settings import TOKEN from six.moves import range, zip logger = get_logger("core_documentos_actas") if SMART_PACKING: from msa.core.packing.smart_numpacker import pack, unpack, MAXBITS else: from msa.core.packing.numpacker import pack, unpack from msa.core.packing.numpacker import pack_slow, unpack_slow class Acta(): def _encode_qr(self, qr): output = BytesIO() qr.save(output, format='PNG') qr_img_data = output.getvalue() output.close()
from msa.core.armve.helpers import array_to_printable_string from msa.core.documentos.actas import Apertura, Autoridad, Recuento from msa.core.documentos.boletas import Seleccion from msa.core.imaging.imagen_prueba import ImagenPrueba from msa.core.logging import get_logger from msa.core.rfid.constants import (NO_TAG, TAGS_ADMIN, TAG_ADMIN, TAG_DATOS, TAG_COLISION, TAG_VACIO, CLASE_ICODE2, TIPOS_TAGS, TIPOS_TAGS_REV, COD_TAG_DESCONOCIDO, TAG_VOTO, TAG_RECUENTO, COD_TAG_RECUENTO, COD_TAG_INICIO, COD_TAG_ADDENDUM) from msa.core.settings import TOKEN, COMPROBAR_TOKEN from msa.settings import QUEMA from six.moves import range logger = get_logger("armve_controller") class ARMVEController(object): """Controlador para el ARMVEService.""" def __init__(self, parent): """Constructor para el Controlador. Argumentos: parent -- el servicio. """ self.parent = parent self._getting_tag_data = False self._buffering = False self._print_on_finish = False
from msa.core.data import TemplateImpresion, TemplateMap, Ubicacion from msa.core.data.candidaturas import Candidatura, Categoria, Lista, Partido from msa.core.hardware.constants import FAN_THRESHOLD_OFF from msa.core.hardware.settings import (DEFAULT_BRIGHTNESS, ITERACIONES_APAGADO, RFID_POWER, USAR_FAN, USAR_PIR) from msa.core.hardware.temperature import get_fan_speed, get_temp from msa.core.i18n import levantar_locales from msa.core.ipc.server.armve_controller import ARMVEController from msa.core.ipc.server.dbus_service import MSADbusService from msa.core.ipc.settings import DBUS_ARMVE_PATH, DBUS_BUSNAME_ARMVE from msa.core.logging import get_logger, StreamToLogger from msa.core.logging.settings import LOG_CAPTURE_STDOUT levantar_locales() logger = get_logger("armve_service") if LOG_CAPTURE_STDOUT: sys.stdout = StreamToLogger(logger, INFO) sys.stderr = StreamToLogger(logger, ERROR) class ARMVEDBus(MSADbusService): """Server de DBus para ARMVE.""" def __init__(self): """Constructor""" self.object_path = DBUS_ARMVE_PATH self.bus_name = DBUS_BUSNAME_ARMVE self._conn = False self.buffer = None self.printing = False
encodear_string_apertura) from msa.core.documentos.structs import (struct_apertura, struct_recuento, struct_recuento_dni) from msa.core.documentos.tabulacion import Pizarra from msa.core.exceptions import (MesaNoEncontrada, QRMalformado, SerialRepetido, TagMalformado, TipoQrErroneo) from msa.core.i18n.decorators import forzar_idioma from msa.core.i18n.settings import DEFAULT_LOCALE from msa.core.imaging.acta import ImagenActa from msa.core.imaging.qr import crear_qr from msa.core.logging import get_logger from msa.core.packing.settings import SMART_PACKING from msa.core.settings import TOKEN from six.moves import range, zip logger = get_logger("core_documentos_actas") if SMART_PACKING: from msa.core.packing.smart_numpacker import pack, unpack, MAXBITS else: from msa.core.packing.numpacker import pack, unpack from msa.core.packing.numpacker import pack_slow, unpack_slow class Acta(): def _encode_qr(self, qr): output = BytesIO() qr.save(output, format='PNG') qr_img_data = output.getvalue()
from base64 import encodestring from msa.core.config_manager import Config from msa.core.imaging.helpers import init_jinja, xml2pil from msa.core.logging import get_logger logger = get_logger("imaging") jinja_env = init_jinja() class Imagen(object): """Clase base para las imagenes del modulo.""" def generate_data(self): """Genera la data para enviar al template.""" raise NotImplementedError("You must implement on subclass") def render_template(self): self.rendered_template = jinja_env.get_template(self.template) def render_svg(self): """Renderiza el SVG.""" data = self.generate_data() xml = self.rendered_template.render(**data) return xml def render_image(self): """Renderiza la imagen.""" xml = self.render_svg()