From 32cef2699d7e606e21d3037d1d828057687e9160 Mon Sep 17 00:00:00 2001
From: jgromes <jan.gromes@gmail.com>
Date: Sat, 6 May 2023 18:34:41 +0100
Subject: [PATCH] Update Raspberry example

---
 examples/NonArduino/Raspberry/CMakeLists.txt |   7 +-
 examples/NonArduino/Raspberry/PiHal.h        | 153 ++++++++++++++++++
 examples/NonArduino/Raspberry/main.cpp       | 155 +------------------
 3 files changed, 162 insertions(+), 153 deletions(-)
 create mode 100644 examples/NonArduino/Raspberry/PiHal.h

diff --git a/examples/NonArduino/Raspberry/CMakeLists.txt b/examples/NonArduino/Raspberry/CMakeLists.txt
index 5853fe9e..e708c0a3 100644
--- a/examples/NonArduino/Raspberry/CMakeLists.txt
+++ b/examples/NonArduino/Raspberry/CMakeLists.txt
@@ -6,9 +6,10 @@ project(rpi-sx1261)
 # when using debuggers such as gdb, the following line can be used
 #set(CMAKE_BUILD_TYPE Debug)
 
-# add the RadioLib source directory
-# this is a bit of a hack because the example is being built within a library
-add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../../../../RadioLib" "${CMAKE_CURRENT_BINARY_DIR}/RadioLib")
+# if you did not build RadioLib as shared library (see README),
+# you will have to add it as source directory
+# the following is just an example, yours will likely be different
+#add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../../../../RadioLib" "${CMAKE_CURRENT_BINARY_DIR}/RadioLib")
 
 # add the executable
 add_executable(${PROJECT_NAME} main.cpp)
diff --git a/examples/NonArduino/Raspberry/PiHal.h b/examples/NonArduino/Raspberry/PiHal.h
new file mode 100644
index 00000000..7929138e
--- /dev/null
+++ b/examples/NonArduino/Raspberry/PiHal.h
@@ -0,0 +1,153 @@
+#ifndef PI_HAL_H
+#define PI_HAL_H
+
+// include RadioLib
+#include <RadioLib/RadioLib.h>
+
+// include the library for Raspberry GPIO pins
+#include "pigpio.h"
+
+// create a new Raspberry Pi hardware abstraction layer
+// using the pigpio library
+// the HAL must inherit from the base RadioLibHal class
+// and implement all of its virtual methods
+class PiHal : public RadioLibHal {
+  public:
+    // default constructor - initializes the base HAL and any needed private members
+    PiHal(uint8_t spiChannel, uint32_t spiSpeed = 2000000)
+      : RadioLibHal(PI_INPUT, PI_OUTPUT, PI_LOW, PI_HIGH, RISING_EDGE, FALLING_EDGE), 
+      _spiChannel(spiChannel),
+      _spiSpeed(spiSpeed) {
+    }
+
+    void init() override {
+      // first initialise pigpio library
+      gpioInitialise();
+
+      // now the SPI
+      spiBegin();
+
+      // Waveshare LoRaWAN Hat also needs pin 18 to be pulled high to enable the radio
+      gpioSetMode(18, PI_OUTPUT);
+      gpioWrite(18, PI_HIGH);
+    }
+
+    void term() override {
+      // stop the SPI
+      spiEnd();
+
+      // and now the pigpio library
+      gpioTerminate();
+
+      // finally, pull the enable pin low
+      gpioSetMode(18, PI_OUTPUT);
+      gpioWrite(18, PI_LOW);
+    }
+
+    // GPIO-related methods (pinMode, digitalWrite etc.) should check
+    // RADIOLIB_NC as an alias for non-connected pins
+    void pinMode(uint32_t pin, uint32_t mode) override {
+      if(pin == RADIOLIB_NC) {
+        return;
+      }
+
+      gpioSetMode(pin, mode);
+    }
+
+    void digitalWrite(uint32_t pin, uint32_t value) override {
+      if(pin == RADIOLIB_NC) {
+        return;
+      }
+
+      gpioWrite(pin, value);
+    }
+
+    uint32_t digitalRead(uint32_t pin) override {
+      if(pin == RADIOLIB_NC) {
+        return(0);
+      }
+
+      return(gpioRead(pin));
+    }
+
+    void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), uint32_t mode) override {
+      if(interruptNum == RADIOLIB_NC) {
+        return;
+      }
+
+      gpioSetISRFunc(interruptNum, mode, 0, (gpioISRFunc_t)interruptCb);
+    }
+
+    void detachInterrupt(uint32_t interruptNum) override {
+      if(interruptNum == RADIOLIB_NC) {
+        return;
+      }
+
+      gpioSetISRFunc(interruptNum, 0, 0, NULL);
+    }
+
+    void delay(unsigned long ms) override {
+      gpioDelay(ms * 1000);
+    }
+
+    void delayMicroseconds(unsigned long us) override {
+      gpioDelay(us);
+    }
+
+    unsigned long millis() override {
+      return(gpioTick() / 1000);
+    }
+
+    unsigned long micros() override {
+      return(gpioTick());
+    }
+
+    long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override {
+      if(pin == RADIOLIB_NC) {
+        return(0);
+      }
+
+      gpioSetMode(pin, PI_INPUT);
+      uint32_t start = gpioTick();
+      uint32_t curtick = gpioTick();
+
+      while(gpioRead(pin) == state) {
+        if((gpioTick() - curtick) > timeout) {
+          return(0);
+        }
+      }
+
+      return(gpioTick() - start);
+    }
+
+   void spiBegin() {
+      if(_spiHandle < 0) {
+        _spiHandle = spiOpen(_spiChannel, _spiSpeed, 0);
+      }
+    }
+
+    void spiBeginTransaction() {}
+
+    uint8_t spiTransfer(uint8_t b) {
+      char ret;
+      spiXfer(_spiHandle, (char*)&b, &ret, 1);
+      return(ret);
+    }
+
+    void spiEndTransaction() {}
+
+    void spiEnd() {
+      if(_spiHandle >= 0) {
+        spiClose(_spiHandle);
+        _spiHandle = -1;
+      }
+    }
+
+  private:
+    // the HAL can contain any additional private members
+    const unsigned int _spiSpeed;
+    const uint8_t _spiChannel;
+    int _spiHandle = -1;
+};
+
+#endif
diff --git a/examples/NonArduino/Raspberry/main.cpp b/examples/NonArduino/Raspberry/main.cpp
index a7e59c15..ec28a312 100644
--- a/examples/NonArduino/Raspberry/main.cpp
+++ b/examples/NonArduino/Raspberry/main.cpp
@@ -14,153 +14,10 @@
 */
 
 // include the library
-#include <RadioLib.h>
+#include <RadioLib/RadioLib.h>
 
-// include the library for Raspberry GPIO pins
-#include "pigpio.h"
-
-// create a new Raspberry Pi hardware abstraction layer
-// using the pigpio library
-// the HAL must inherit from the base RadioLibHal class
-// and implement all of its virtual methods
-class PiHal : public RadioLibHal {
-  public:
-    // default constructor - initializes the base HAL and any needed private members
-    PiHal(uint8_t spiChannel, uint32_t spiSpeed = 2000000)
-      : RadioLibHal(PI_INPUT, PI_OUTPUT, PI_LOW, PI_HIGH, RISING_EDGE, FALLING_EDGE), 
-      _spiChannel(spiChannel),
-      _spiSpeed(spiSpeed) {
-    }
-
-    void init() override {
-      // first initialise pigpio library
-      gpioInitialise();
-
-      // now the SPI
-      spiBegin();
-
-      // Waveshare LoRaWAN Hat also needs pin 18 to be pulled high to enable the radio
-      gpioSetMode(18, PI_OUTPUT);
-      gpioWrite(18, PI_HIGH);
-    }
-
-    void term() override {
-      // stop the SPI
-      spiEnd();
-
-      // and now the pigpio library
-      gpioTerminate();
-
-      // finally, pull the enable pin low
-      gpioSetMode(18, PI_OUTPUT);
-      gpioWrite(18, PI_LOW);
-    }
-
-    // GPIO-related methods (pinMode, digitalWrite etc.) should check
-    // RADIOLIB_NC as an alias for non-connected pins
-    void pinMode(uint32_t pin, uint32_t mode) override {
-      if(pin == RADIOLIB_NC) {
-        return;
-      }
-
-      gpioSetMode(pin, mode);
-    }
-
-    void digitalWrite(uint32_t pin, uint32_t value) override {
-      if(pin == RADIOLIB_NC) {
-        return;
-      }
-
-      gpioWrite(pin, value);
-    }
-
-    uint32_t digitalRead(uint32_t pin) override {
-      if(pin == RADIOLIB_NC) {
-        return(0);
-      }
-
-      return(gpioRead(pin));
-    }
-
-    void attachInterrupt(uint32_t interruptNum, void (*interruptCb)(void), uint32_t mode) override {
-      if(interruptNum == RADIOLIB_NC) {
-        return;
-      }
-
-      gpioSetISRFunc(interruptNum, mode, 0, (gpioISRFunc_t)interruptCb);
-    }
-
-    void detachInterrupt(uint32_t interruptNum) override {
-      if(interruptNum == RADIOLIB_NC) {
-        return;
-      }
-
-      gpioSetISRFunc(interruptNum, NULL, NULL, nullptr);
-    }
-
-    void delay(unsigned long ms) override {
-      gpioDelay(ms * 1000);
-    }
-
-    void delayMicroseconds(unsigned long us) override {
-      gpioDelay(us);
-    }
-
-    unsigned long millis() override {
-      return(gpioTick() / 1000);
-    }
-
-    unsigned long micros() override {
-      return(gpioTick());
-    }
-
-    long pulseIn(uint32_t pin, uint32_t state, unsigned long timeout) override {
-      if(pin == RADIOLIB_NC) {
-        return(0);
-      }
-
-      gpioSetMode(pin, PI_INPUT);
-      uint32_t start = gpioTick();
-      uint32_t curtick = gpioTick();
-
-      while(gpioRead(pin) == state) {
-        if((gpioTick() - curtick) > timeout) {
-          return(0);
-        }
-      }
-
-      return(gpioTick() - start);
-    }
-
-   void spiBegin() {
-      if(_spiHandle < 0) {
-        _spiHandle = spiOpen(_spiChannel, _spiSpeed, 0);
-      }
-    }
-
-    void spiBeginTransaction() {}
-
-    uint8_t spiTransfer(uint8_t b) {
-      char ret;
-      spiXfer(_spiHandle, (char*)&b, &ret, 1);
-      return(ret);
-    }
-
-    void spiEndTransaction() {}
-
-    void spiEnd() {
-      if(_spiHandle >= 0) {
-        spiClose(_spiHandle);
-        _spiHandle = -1;
-      }
-    }
-
-  private:
-    // the HAL can contain any additional private members
-    const unsigned int _spiSpeed;
-    const uint8_t _spiChannel;
-    int _spiHandle = -1;
-};
+// include the hardware abstraction layer
+#include "PiHal.h"
 
 // create a new instance of the HAL class
 // use SPI channel 1, because on Waveshare LoRaWAN Hat,
@@ -168,8 +25,6 @@ class PiHal : public RadioLibHal {
 PiHal* hal = new PiHal(1);
 
 // now we can create the radio module
-// the first argument is a new instance of the HAL class defined above
-// the others are pin numbers
 // pinout corresponds to the Waveshare LoRaWAN Hat
 // NSS pin:   7
 // DIO1 pin:  17
@@ -199,12 +54,12 @@ int main(int argc, char** argv) {
 
       // wait for a second before transmitting again
       hal->delay(1000);
-    
+
     } else {
       printf("failed, code %d\n", state);
 
     }
-  
+
   }
 
   return(0);