LoRa-Workshop/micropython/uPyLora/controller.py

127 lines
3.8 KiB
Python

from time import sleep
class Controller:
class Mock:
pass
ON_BOARD_LED_PIN_NO = None
ON_BOARD_LED_HIGH_IS_ON = True
GPIO_PINS = []
PIN_ID_FOR_LORA_RESET = None
PIN_ID_FOR_LORA_SS = None
PIN_ID_SCK = None
PIN_ID_MOSI = None
PIN_ID_MISO = None
PIN_ID_FOR_LORA_DIO0 = None
PIN_ID_FOR_LORA_DIO1 = None
PIN_ID_FOR_LORA_DIO2 = None
PIN_ID_FOR_LORA_DIO3 = None
PIN_ID_FOR_LORA_DIO4 = None
PIN_ID_FOR_LORA_DIO5 = None
def __init__(self,
pin_id_led = ON_BOARD_LED_PIN_NO,
on_board_led_high_is_on = ON_BOARD_LED_HIGH_IS_ON,
pin_id_reset = PIN_ID_FOR_LORA_RESET,
blink_on_start = (2, 0.5, 0.5)):
self.pin_led = self.prepare_pin(pin_id_led)
self.on_board_led_high_is_on = on_board_led_high_is_on
self.pin_reset = self.prepare_pin(pin_id_reset)
self.reset_pin(self.pin_reset)
self.transceivers = {}
self.blink_led(*blink_on_start)
def add_transceiver(self,
transceiver,
pin_id_ss = PIN_ID_FOR_LORA_SS,
pin_id_RxDone = PIN_ID_FOR_LORA_DIO0,
pin_id_RxTimeout = PIN_ID_FOR_LORA_DIO1,
pin_id_ValidHeader = PIN_ID_FOR_LORA_DIO2,
pin_id_CadDone = PIN_ID_FOR_LORA_DIO3,
pin_id_CadDetected = PIN_ID_FOR_LORA_DIO4,
pin_id_PayloadCrcError = PIN_ID_FOR_LORA_DIO5):
transceiver.blink_led = self.blink_led
transceiver.pin_ss = self.prepare_pin(pin_id_ss)
transceiver.pin_RxDone = self.prepare_irq_pin(pin_id_RxDone)
transceiver.pin_RxTimeout = self.prepare_irq_pin(pin_id_RxTimeout)
transceiver.pin_ValidHeader = self.prepare_irq_pin(pin_id_ValidHeader)
transceiver.pin_CadDone = self.prepare_irq_pin(pin_id_CadDone)
transceiver.pin_CadDetected = self.prepare_irq_pin(pin_id_CadDetected)
transceiver.pin_PayloadCrcError = self.prepare_irq_pin(pin_id_PayloadCrcError)
self.spi = self.prepare_spi(self.get_spi())
transceiver.transfer = self.spi.transfer
transceiver.init()
self.transceivers[transceiver.name] = transceiver
return transceiver
def prepare_pin(self, pin_id, in_out = None):
reason = '''
# a pin should provide:
# .pin_id
# .low()
# .high()
# .value() # read input.
# .irq() # (ESP8266/ESP32 only) ref to the irq function of real pin object.
'''
raise NotImplementedError(reason)
def prepare_irq_pin(self, pin_id):
reason = '''
# a irq_pin should provide:
# .set_handler_for_irq_on_rising_edge() # to set trigger and handler.
# .detach_irq()
'''
raise NotImplementedError(reason)
def get_spi(self):
reason = '''
# initialize SPI interface
'''
raise NotImplementedError(reason)
def prepare_spi(self, spi):
reason = '''
# a spi should provide:
# .close()
# .transfer(pin_ss, address, value = 0x00)
'''
raise NotImplementedError(reason)
def led_on(self, on = True):
self.pin_led.high() if self.on_board_led_high_is_on == on else self.pin_led.low()
def blink_led(self, times = 1, on_seconds = 0.1, off_seconds = 0.1):
for i in range(times):
self.led_on(True)
sleep(on_seconds)
self.led_on(False)
sleep(off_seconds)
def reset_pin(self, pin, duration_low = 0.05, duration_high = 0.05):
pin.low()
sleep(duration_low)
pin.high()
sleep(duration_high)
def __exit__(self):
self.spi.close()