|
|
|
""" Defines the BOARD class that contains the board pin mappings and RF module HF/LF info. """
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
# Copyright 2015-2018 Mayer Analytics Ltd.
|
|
|
|
#
|
|
|
|
# This file is part of pySX127x.
|
|
|
|
#
|
|
|
|
# pySX127x is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public
|
|
|
|
# License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
|
|
|
|
# version.
|
|
|
|
#
|
|
|
|
# pySX127x is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
|
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
|
|
# details.
|
|
|
|
#
|
|
|
|
# You can be released from the requirements of the license by obtaining a commercial license. Such a license is
|
|
|
|
# mandatory as soon as you develop commercial activities involving pySX127x without disclosing the source code of your
|
|
|
|
# own applications, or shipping pySX127x with a closed source product.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License along with pySX127. If not, see
|
|
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
|
|
import RPi.GPIO as GPIO
|
|
|
|
import spidev
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
|
|
class BOARD:
|
|
|
|
""" Board initialisation/teardown and pin configuration is kept here.
|
|
|
|
Also, information about the RF module is kept here.
|
|
|
|
This is the Raspberry Pi board with one LED and a modtronix inAir9B.
|
|
|
|
"""
|
|
|
|
# Note that the BCOM numbering for the GPIOs is used.
|
|
|
|
DIO0 = 5 # RaspPi GPIO 5
|
|
|
|
DIO1 = 23 # RaspPi GPIO 23
|
|
|
|
DIO2 = 24 # RaspPi GPIO 24
|
|
|
|
DIO3 = 25 # RaspPi GPIO 25
|
|
|
|
LED = 18 # RaspPi GPIO 18 connects to the LED on the proto shield
|
|
|
|
SWITCH = 4 # RaspPi GPIO 4 connects to a switch
|
|
|
|
|
|
|
|
# The spi object is kept here
|
|
|
|
spi = None
|
|
|
|
|
|
|
|
# tell pySX127x here whether the attached RF module uses low-band (RF*_LF pins) or high-band (RF*_HF pins).
|
|
|
|
# low band (called band 1&2) are 137-175 and 410-525
|
|
|
|
# high band (called band 3) is 862-1020
|
|
|
|
low_band = True
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def setup():
|
|
|
|
""" Configure the Raspberry GPIOs
|
|
|
|
:rtype : None
|
|
|
|
"""
|
|
|
|
GPIO.setmode(GPIO.BCM)
|
|
|
|
# LED
|
|
|
|
GPIO.setup(BOARD.LED, GPIO.OUT)
|
|
|
|
GPIO.output(BOARD.LED, 0)
|
|
|
|
# switch
|
|
|
|
GPIO.setup(BOARD.SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
|
|
|
# DIOx
|
|
|
|
for gpio_pin in [BOARD.DIO0, BOARD.DIO1, BOARD.DIO2, BOARD.DIO3]:
|
|
|
|
GPIO.setup(gpio_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
|
|
|
|
# blink 2 times to signal the board is set up
|
|
|
|
BOARD.blink(.1, 2)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def teardown():
|
|
|
|
""" Cleanup GPIO and SpiDev """
|
|
|
|
GPIO.cleanup()
|
|
|
|
BOARD.spi.close()
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def SpiDev(spi_bus=0, spi_cs=0):
|
|
|
|
""" Init and return the SpiDev object
|
|
|
|
:return: SpiDev object
|
|
|
|
:param spi_bus: The RPi SPI bus to use: 0 or 1
|
|
|
|
:param spi_cs: The RPi SPI chip select to use: 0 or 1
|
|
|
|
:rtype: SpiDev
|
|
|
|
"""
|
|
|
|
BOARD.spi = spidev.SpiDev()
|
|
|
|
BOARD.spi.open(spi_bus, spi_cs)
|
|
|
|
BOARD.spi.max_speed_hz = 5000000 # SX127x can go up to 10MHz, pick half that to be safe
|
|
|
|
return BOARD.spi
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def add_event_detect(dio_number, callback):
|
|
|
|
""" Wraps around the GPIO.add_event_detect function
|
|
|
|
:param dio_number: DIO pin 0...5
|
|
|
|
:param callback: The function to call when the DIO triggers an IRQ.
|
|
|
|
:return: None
|
|
|
|
"""
|
|
|
|
GPIO.add_event_detect(dio_number, GPIO.RISING, callback=callback)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def add_events(cb_dio0, cb_dio1, cb_dio2, cb_dio3, cb_dio4, cb_dio5, switch_cb=None):
|
|
|
|
BOARD.add_event_detect(BOARD.DIO0, callback=cb_dio0)
|
|
|
|
BOARD.add_event_detect(BOARD.DIO1, callback=cb_dio1)
|
|
|
|
BOARD.add_event_detect(BOARD.DIO2, callback=cb_dio2)
|
|
|
|
BOARD.add_event_detect(BOARD.DIO3, callback=cb_dio3)
|
|
|
|
# the modtronix inAir9B does not expose DIO4 and DIO5
|
|
|
|
if switch_cb is not None:
|
|
|
|
GPIO.add_event_detect(BOARD.SWITCH, GPIO.RISING, callback=switch_cb, bouncetime=300)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def led_on(value=1):
|
|
|
|
""" Switch the proto shields LED
|
|
|
|
:param value: 0/1 for off/on. Default is 1.
|
|
|
|
:return: value
|
|
|
|
:rtype : int
|
|
|
|
"""
|
|
|
|
GPIO.output(BOARD.LED, value)
|
|
|
|
return value
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def led_off():
|
|
|
|
""" Switch LED off
|
|
|
|
:return: 0
|
|
|
|
"""
|
|
|
|
GPIO.output(BOARD.LED, 0)
|
|
|
|
return 0
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def blink(time_sec, n_blink):
|
|
|
|
if n_blink == 0:
|
|
|
|
return
|
|
|
|
BOARD.led_on()
|
|
|
|
for i in range(n_blink):
|
|
|
|
time.sleep(time_sec)
|
|
|
|
BOARD.led_off()
|
|
|
|
time.sleep(time_sec)
|
|
|
|
BOARD.led_on()
|
|
|
|
BOARD.led_off()
|