From f7080fd21a297d0a8e9fa70c1ec5eb860f4cd512 Mon Sep 17 00:00:00 2001 From: wke67 Date: Tue, 17 Mar 2026 13:33:43 +0100 Subject: [PATCH 01/10] Do not release the lines requested at every GPIO action. Instead create the the Line_Request object once, and use it for all future actions. issues #38, #39 --- LoRaRF/base.py | 54 +++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/LoRaRF/base.py b/LoRaRF/base.py index 3c328a0..d83c60c 100644 --- a/LoRaRF/base.py +++ b/LoRaRF/base.py @@ -34,36 +34,44 @@ def __init__(self, chip: int, offset: int): self.chip = "/dev/gpiochip" + str(chip) self.offset = offset self.seqno = 0 + self.request = None def output(self, value: Value): - with gpiod.request_lines( - self.chip, - consumer="LoRaGpio", - config={self.offset: gpiod.LineSettings(direction=Direction.OUTPUT)} - ) as request: - request.set_value(self.offset, value) + if self.request is None: + self.request = gpiod.request_lines( + self.chip, + consumer="LoRaGpio", + config={self.offset: gpiod.LineSettings(direction=Direction.OUTPUT)} + ) + self.request.set_value(self.offset, value) def input(self): - with gpiod.request_lines( - self.chip, - consumer="LoRaGpio", - config={self.offset: gpiod.LineSettings(direction=Direction.INPUT)} - ) as request: - return request.get_value(self.offset) + if self.request is None: + self.request = gpiod.request_lines( + self.chip, + consumer="LoRaGpio", + config={self.offset: gpiod.LineSettings(direction=Direction.INPUT)} + ) + return self.request.get_value(self.offset) def monitor(self, callback, timeout: float): t = time.time() - with gpiod.request_lines( - self.chip, - consumer="LoRaGpio", - config={self.offset: gpiod.LineSettings(edge_detection=Edge.RISING)} - ) as request: - while (time.time() - t) < timeout or timeout == 0: - for event in request.read_edge_events(): - if event.line_seqno != self.seqno: - self.seqno = event.line_seqno - callback() - return + if self.request is None: + self.request = gpiod.request_lines( + self.chip, + consumer="LoRaGpio", + config={self.offset: gpiod.LineSettings(edge_detection=Edge.RISING)} + ) + while (time.time() - t) < timeout or timeout == 0: + for event in self.request.read_edge_events(): + if event.line_seqno != self.seqno: + self.seqno = event.line_seqno + callback() + return + + def monitor_continuous(self, callback, timeout: float): + while True: + self.monitor(callback, timeout) class BaseLoRa : From 405ca6561a8f14a2aa5b6bd91975f213c93daaef Mon Sep 17 00:00:00 2001 From: wke67 Date: Tue, 17 Mar 2026 17:11:11 +0100 Subject: [PATCH 02/10] updated dependencies --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 6005098..9fc8cd0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,4 +24,4 @@ packages = python_requires = >=2.7 install_requires = spidev - RPi.GPIO + gpiod >=2.0.2 From 52aab19880e90596179f6bc2edaadf67e84c5a1b Mon Sep 17 00:00:00 2001 From: wke67 Date: Tue, 17 Mar 2026 17:18:35 +0100 Subject: [PATCH 03/10] /dev/spidevx.y often has a dedicated cs pin, allow (LoRaGpio.)cs = None --- LoRaRF/SX127x.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LoRaRF/SX127x.py b/LoRaRF/SX127x.py index be96c6b..7360309 100644 --- a/LoRaRF/SX127x.py +++ b/LoRaRF/SX127x.py @@ -803,9 +803,9 @@ def readRegister(self, address: int) -> int : def _transfer(self, address: int, data: int) -> int : buf = [address, data] - self._cs.output(LoRaGpio.LOW) + if self._cs is not None: self._cs.output(LoRaGpio.LOW) feedback = self._spi.transfer(buf) - self._cs.output(LoRaGpio.HIGH) + if self._cs is not None: self._cs.output(LoRaGpio.HIGH) if (len(feedback) == 2) : return int(feedback[1]) return -1 From 253a74aa0106c49c8d325888ff56ae49698a613b Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 21:54:36 +0100 Subject: [PATCH 04/10] Update README.md --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6b6bcdc..b0262cc 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ This readme is written for quick start guide. Visit this [link](https://github.c Theoritically all LoRa modules using SX126x series (SX1261, SX1262, SX1268), SX127x series (SX1272, SX1276, SX1277, SX1278, SX1279), or LLCC68 will compatible using this library. Some LoRa module which already tested and confirmed compatible are: * Ebyte: E22-400M22S, E22-900M22S, E22-400M30S, E22-900M30S +* generic RFM 95 Currently only Raspberry pi zero, zero W, 3A, 3B, 3B+, 4A, and 4B supported as host controller. Support for other single board computer will be added in the future. The Linux distro already tested using this library are: * Raspberry pi OS @@ -51,16 +52,22 @@ pip install LoRaRF ## Initialization -To work with the library, first you must import `SX126x` or `SX127x` python module depending LoRa module you use. Then initialize the module by creating an object. +To work with the library, first you must import `SX126x` or `SX127x` depending LoRa module you use and the LoRaSpi and LoRaGpio. Before the module initialization, you need to create the SPI, RESET, CS pin objects. Then initialize the module by creating an object. ```python +from LoRaRF import LoRaSpi, LoRaGpio +spi = LoRaSpi(1, 0) # /dev/spidev1.0 +cs = LoRaGpio(1, 8) # /dev/gpiochp1 line #8 +reset = LoRaGpio(1, 2) # /dev/gpiochp1 line #2 +... + # for SX126x series or LLCC68 from LoRaRF import SX126x -LoRa = SX126x() +LoRa = SX126x(spi, cs, reset, irq: Optional[LoRaGpio]=None, txen: Optional[LoRaGpio]=None, rxen: Optional[LoRaGpio]=None) # for SX127x series from LoRaRF import SX127x -LoRa = SX127x() +LoRa = SX127x(spi, cs, reset, irq: Optional[LoRaGpio]=None, txen: Optional[LoRaGpio]=None, rxen: Optional[LoRaGpio]=None) ``` Before calling any configuration methods, doing transmit or receive operation you must call `begin()` method. @@ -93,21 +100,16 @@ The default SPI port is using bus id 0 and cs id 0. The default GPIO pins used f ### SPI Port Configuration -To configure SPI port or SPI frequency call `setSPI()` method before `begin()` method. +To configure SPI port or SPI frequency call `setSPI()` method. ```python -# set to use SPI with bus id 0 and cs id 1 and speed 7.8 Mhz -LoRa.setSPI(0, 0, 7800000) -LoRa.begin() +# set to use SPI speed 7.8 Mhz +LoRa.setSPI(7800000) ``` ### I/O Pins Configuration -To configure I/O pins (NSS, RESET, BUSY, IRQ, TXEN, RXEN pin) call `setPins()` before `begin()` method. -```python -# set RESET->22, BUSY->23, DIO1->26, TXEN->5, RXEN->25 -LoRa.setPins(22, 23, 26, 5, 25) -LoRa.begin() -``` +Other I/O pins (NSS, RESET, BUSY, IRQ, TXEN, RXEN pin) need to be created before the creation of the SX12xy object. + ## Modem Configuration From 1f1344478621089daadb45c66948cbd78584f406 Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 22:09:04 +0100 Subject: [PATCH 05/10] version 2.0.0, python >3.9 libgpiod >2.0.2 requires pyhton3 > 3.9 --- setup.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 9fc8cd0..8a4d9e8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = LoRaRF -version = 1.4.0 +version = 2.0.0 author = Chandra Wijaya Sentosa author_email = chandra.w.sentosa@gmail.com description = Python library used for basic transmitting and receiving data using LoRa modem @@ -10,7 +10,6 @@ url = https://github.com/chandrawi/LoRaRF-Python project_urls = Bug Tracker = https://github.com/chandrawi/LoRaRF-Python/issues classifiers = - Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 License :: OSI Approved :: MIT License Operating System :: POSIX :: Linux @@ -21,7 +20,7 @@ classifiers = include_package_data = True packages = LoRaRF -python_requires = >=2.7 +python_requires = >=3.9 install_requires = spidev gpiod >=2.0.2 From 49842c00f24b32ddbed29b2af7711c3bc69a452a Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 22:11:48 +0100 Subject: [PATCH 06/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b0262cc..64fcda4 100644 --- a/README.md +++ b/README.md @@ -203,5 +203,5 @@ See examples for [SX126x](https://github.com/chandrawi/LoRaRF-Python/tree/main/e [Chandra Wijaya Sentosa](https://github.com/chandrawi) <> -### Upcoming features... -Base class will allow for python3-libgpiod package +### New features... +Base class supports python3-libgpiod package, no longer compatible to libgpiod < 2.0 From e233a4f67aeeddfe7adb716c04d47ba75ac74120 Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 22:12:50 +0100 Subject: [PATCH 07/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64fcda4..75bec83 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ To work with the library, first you must import `SX126x` or `SX127x` depending L ```python from LoRaRF import LoRaSpi, LoRaGpio spi = LoRaSpi(1, 0) # /dev/spidev1.0 -cs = LoRaGpio(1, 8) # /dev/gpiochp1 line #8 -reset = LoRaGpio(1, 2) # /dev/gpiochp1 line #2 +cs = LoRaGpio(1, 8) # /dev/gpiochip1 line #8 +reset = LoRaGpio(1, 2) # /dev/gpiochip1 line #2 ... # for SX126x series or LLCC68 From 24a3f4e64623bf32cf22ac74329196dac236078b Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 23:30:31 +0100 Subject: [PATCH 08/10] MIT license now SPDX conform --- setup.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 8a4d9e8..ddc9c6a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,11 +7,10 @@ description = Python library used for basic transmitting and receiving data usin long_description = file: README.md long_description_content_type = text/markdown url = https://github.com/chandrawi/LoRaRF-Python -project_urls = - Bug Tracker = https://github.com/chandrawi/LoRaRF-Python/issues +project_urls = Bug Tracker = https://github.com/chandrawi/LoRaRF-Python/issues +license = MIT classifiers = Programming Language :: Python :: 3 - License :: OSI Approved :: MIT License Operating System :: POSIX :: Linux Topic :: System :: Hardware Topic :: System :: Hardware :: Hardware Drivers From 9c3531bc350c4981ca586dad77b1c6eb077b3d28 Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 23:32:18 +0100 Subject: [PATCH 09/10] update .whl --- dist/LoRaRF-1.4.0-py3-none-any.whl | Bin 23309 -> 0 bytes dist/lorarf-2.0.0-py3-none-any.whl | Bin 0 -> 23817 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dist/LoRaRF-1.4.0-py3-none-any.whl create mode 100644 dist/lorarf-2.0.0-py3-none-any.whl diff --git a/dist/LoRaRF-1.4.0-py3-none-any.whl b/dist/LoRaRF-1.4.0-py3-none-any.whl deleted file mode 100644 index d21bf0188b9908206cc7619496b9f55e47deb9a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23309 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 diff --git a/dist/lorarf-2.0.0-py3-none-any.whl b/dist/lorarf-2.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..ed6059c5a692c36cc1fbe5ea8e83472f9f6c1af8 GIT binary patch literal 23817 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 literal 0 HcmV?d00001 From c86d2f8f762ad0f25f74b4dda4100eeb1546b8a7 Mon Sep 17 00:00:00 2001 From: wke67 Date: Wed, 18 Mar 2026 23:38:57 +0100 Subject: [PATCH 10/10] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75bec83..93dfc12 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,8 @@ reset = LoRaGpio(1, 2) # /dev/gpiochip1 line #2 # for SX126x series or LLCC68 from LoRaRF import SX126x -LoRa = SX126x(spi, cs, reset, irq: Optional[LoRaGpio]=None, txen: Optional[LoRaGpio]=None, rxen: Optional[LoRaGpio]=None) +busy = LoRaGpio(1,3) +LoRa = SX126x(spi, cs, reset, busy, irq: Optional[LoRaGpio]=None, txen: Optional[LoRaGpio]=None, rxen: Optional[LoRaGpio]=None) # for SX127x series from LoRaRF import SX127x