Programmazione su più back-end

2

Il mio attuale progetto è un pacchetto di astrazione di alto livello per la programmazione GPIO su quei simpatici piccoli computer SoC (Raspberry Pi, Cubieboard, Beaglebone Black, Pandaboard ecc.). Uno dei miei obiettivi è rendere possibile l'esecuzione dello stesso codice su schede diverse utilizzando come supporto moduli GPIO diversi, come RPi.GPIO sul Raspberry Pi o SUNXI_GPIO sulla Cubieboard.

Al momento ho un codice come questo:

class Pin(object):
    def __init__(self, gpio, direction, pud=None):
        self.gpio = gpio
        self.direction = direction
        self.pud = pud
        _GPIO_BACKEND.setuppin(self.gpio, self.direction, self.pud)

    def __str__(self):
        return self.gpio

class InputPin(Pin):
    """docstring for InputPin"""
    def read(self):
        _GPIO_BACKEND.read(self.gpio)

class OutputPin(Pin):
    """docstring for OutputPin"""
    def high(self):
        _GPIO_BACKEND.high(self.gpio)

    def low(self):
        _GPIO_BACKEND.low(self.gpio)

Mi piacerebbe _GPIO_BACKEND per ottenere l'installazione da un gestore di contesto che carica il back-end. Lo stesso Backend ha questo aspetto (esempio RPi.GPIO):

from RPi import GPIO as _GPIO

def init(numberscheme='bcm'):
    """docstring for init"""
    if numberscheme.lower() == 'bcm':
        _GPIO.setup(_GPIO.BCM)
    elif numberscheme.upper() == 'board':
        _GPIO.setup(_GPIO.BOARD)

def setuppin(id, direction, pullupdown=None):
    """docstring for setuppin"""
    if direction.lower() == 'in':
        dir = _GPIO.IN
    elif direction.lower() == 'out':
        dir = _GPIO.OUT
    else:
        raise ValueError

    if pullupdown is None:
        pud = _GPIO.PUD_ # TODO
    elif pullupdown.lower() == 'up':
        pud = _GPIO.PUD_UP
    elif pullupdown.lower() == 'down':
        pud = _GPIO.PUD_DOWN
    else:
        raise ValueError

    _GPIO.setmode(id, dir, pud)

def cleanup():
    """docstring for cleanup"""
    _GPIO.cleanup()

def high(id):
    """docstring for high"""
    _GPIO.output(id, _GPIO.HIGH)

def low(id):
    """docstring for low"""
    _GPIO.output(id, _GPIO.LOW)

def read(id):
    """docstring for read"""
    return _GPIO.input(id)

Ciò che non mi piace di questo è l'affidamento su una variabile globale pseudoinvisibile (_GPIO_BACKEND).

Quale è un modo buono, corretto e pitonioso di programmare su più backend come questo?

    
posta yggdrasil 06.06.2015 - 21:43
fonte

1 risposta

1

Non saresti in grado di gestirlo con concetti classici orientati agli oggetti? Ad esempio, ogni backend potrebbe essere implementato come una classe con un'interfaccia comune e le classi InputPin e OutputPin le utilizzerebbero in un modo composto.

    
risposta data 20.07.2015 - 20:31
fonte

Leggi altre domande sui tag