From 9ce25819425ceb4c18afe6d5ae6d14d182f1f8d2 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 7 May 2023 08:19:14 +0200 Subject: [PATCH] Added CI autotest file --- extras/test/SX126x/.gitignore | 1 + extras/test/SX126x/CMakeLists.txt | 21 ++++ extras/test/SX126x/PiHal.h | 153 ++++++++++++++++++++++++++++++ extras/test/SX126x/build.sh | 8 ++ extras/test/SX126x/clean.sh | 3 + extras/test/SX126x/main.cpp | 21 ++++ 6 files changed, 207 insertions(+) create mode 100644 extras/test/SX126x/.gitignore create mode 100644 extras/test/SX126x/CMakeLists.txt create mode 100644 extras/test/SX126x/PiHal.h create mode 100644 extras/test/SX126x/build.sh create mode 100644 extras/test/SX126x/clean.sh create mode 100644 extras/test/SX126x/main.cpp diff --git a/extras/test/SX126x/.gitignore b/extras/test/SX126x/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/extras/test/SX126x/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/extras/test/SX126x/CMakeLists.txt b/extras/test/SX126x/CMakeLists.txt new file mode 100644 index 00000000..e708c0a3 --- /dev/null +++ b/extras/test/SX126x/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.18) + +# create the project +project(rpi-sx1261) + +# when using debuggers such as gdb, the following line can be used +#set(CMAKE_BUILD_TYPE Debug) + +# 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) + +# link both libraries +target_link_libraries(${PROJECT_NAME} RadioLib pigpio) + +# you can also specify RadioLib compile-time flags here +#target_compile_definitions(${PROJECT_NAME} PUBLIC RADIOLIB_DEBUG RADIOLIB_VERBOSE) diff --git a/extras/test/SX126x/PiHal.h b/extras/test/SX126x/PiHal.h new file mode 100644 index 00000000..4c9c7bef --- /dev/null +++ b/extras/test/SX126x/PiHal.h @@ -0,0 +1,153 @@ +#ifndef PI_HAL_H +#define PI_HAL_H + +// include RadioLib +#include + +// 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(); + + // pull the enable pin low + gpioSetMode(18, PI_OUTPUT); + gpioWrite(18, PI_LOW); + + // finally, stop the pigpio library + gpioTerminate(); + } + + // 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/extras/test/SX126x/build.sh b/extras/test/SX126x/build.sh new file mode 100644 index 00000000..a46bbdf4 --- /dev/null +++ b/extras/test/SX126x/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e +mkdir -p build +cd build +cmake -G "CodeBlocks - Unix Makefiles" .. +make -j4 +cd .. diff --git a/extras/test/SX126x/clean.sh b/extras/test/SX126x/clean.sh new file mode 100644 index 00000000..27cfe264 --- /dev/null +++ b/extras/test/SX126x/clean.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +rm -rf ./build diff --git a/extras/test/SX126x/main.cpp b/extras/test/SX126x/main.cpp new file mode 100644 index 00000000..2d15c994 --- /dev/null +++ b/extras/test/SX126x/main.cpp @@ -0,0 +1,21 @@ +// this is an autotest file for the SX126x +// runs on Raspberry Pi with Waveshare LoRaWAN hat + +#include +#include "PiHal.h" + +PiHal* hal = new PiHal(1); +SX1261 radio = new Module(hal, 7, 17, 22, 4); + +// the entry point for the program +int main(int argc, char** argv) { + int state = RADIOLIB_ERR_UNKNOWN; + + state = radio.begin(); + printf("[SX1261] Test:begin() = %d\n", state); + + state = radio.transmit("Hello World!"); + printf("[SX1261] Test:transmit() = %d\n", state); + + return(0); +}