Skip to content
Snippets Groups Projects
Commit 26ba88ae authored by Thomas's avatar Thomas
Browse files

Updates; PinePhone Backplate doesn't work yet

parent 1a4365e4
No related branches found
No related tags found
No related merge requests found
build
\ No newline at end of file
build
pinePhoneBuild
pinePhoneBuild~
\ No newline at end of file
......@@ -2,18 +2,31 @@ project(pinedio-lora-driver CXX)
set(CMAKE_BUILD_TYPE Debug)
set(THREADS_PREFER_PTHREAD_FLAG ON)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
add_subdirectory(usb-adapter)
option(PP "Compile for the PinePhone Backcover")
if(PP)
add_subdirectory(pinephone)
add_compile_definitions(PP)
else()
add_subdirectory(usb-adapter)
endif(PP)
find_package(Threads REQUIRED)
add_library(pinedio-lora-driver SHARED
PinedioLoraRadio.h
Exceptions.h
../libs/sx126x_driver/SX126x.hpp
UsbAdapter.h
PinedioLoraRadio.cpp
)
target_link_libraries(pinedio-lora-driver PUBLIC
sx126x_driver pinedio-lora-driver-usb "pthread" ${CMAKE_THREAD_LIBS_INIT}
)
\ No newline at end of file
if(PP)
target_link_libraries(pinedio-lora-driver PUBLIC
sx126x_driver pinedio-lora-driver-pinephone "pthread" ${CMAKE_THREAD_LIBS_INIT}
)
else()
target_link_libraries(pinedio-lora-driver PUBLIC
sx126x_driver pinedio-lora-driver-usb "pthread" ${CMAKE_THREAD_LIBS_INIT}
)
endif(PP)
unset(PP CACHE)
#include "PinedioLoraRadio.h"
#ifdef PP
#include "PinephoneBackplate.h"
#else
#include "UsbAdapter.h"
#endif
#include <queue>
#include <sx126x_driver/SX126x.hpp>
......@@ -11,9 +15,14 @@
#include <memory>
#include "mutexed_queue.class.cpp"
#include <functional>
#include <stdio.h>
#include <time.h>
#include <stdint.h>
using namespace PineDio::LoRa;
#define CONTINUOUS_RX_BUFFER 4
std::unique_ptr<SX126x> radio;
SX126x::ModulationParams_t modulationParams; //WON'T be modifyable during runtime
SX126x::PacketParams_t packetParams; //WON'T be modifyable during runtime
......@@ -22,9 +31,17 @@ mutexed_queue<std::vector<uint8_t>> transmitBuffer;
std::atomic<bool> stop(true);
std::atomic<bool> txInProgress(false);
std::thread loop;
std::function<void(std::vector<uint8_t>)> appRxCallback; //will be called from another thread
time_t lastRx=0;
typedef struct {
std::vector<uint8_t> data;
int8_t RssiPkt;
int8_t SnrPkt;
int8_t SignalRssiPkt;
} rxPkg;
std::function<void(std::vector<uint8_t>, int8_t, int8_t, int8_t)> appRxCallback; //will be called from another thread
std::thread RxConsumerThread;
mutexed_queue<std::vector<uint8_t>> rxBuffer;
mutexed_queue<rxPkg> rxBuffer;
/*
I am doing something very crazy here: I don't quite understand the wait&notify-mechanism here, so I use a mutex. locking is waiting (the mutex stays locked during the whole execution and while waiting for the next execution), unlocking is wakeup. In my head I found no possible race condition ... Should probably be done properly for the final version
......@@ -37,31 +54,35 @@ void RxConsumer() {
wakeupRxConsumer.lock(); //wait for wakeup
while(!rxBuffer.empty()) {
appRxCallback(rxBuffer.pop()); //handles all the code in the callback-function
rxPkg p = rxBuffer.pop();
appRxCallback(p.data, p.RssiPkt, p.SnrPkt, p.SignalRssiPkt); //handles all the code in the callback-function
}
}
}
void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>)> appRxCallback_) {
void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>, int8_t, int8_t, int8_t)> appRxCallback_) {
std::cout << "[PinedioLoraRadio] Initialize()" << std::endl;
appRxCallback = appRxCallback_;
modulationParams.PacketType = SX126x::RadioPacketTypes_t::PACKET_TYPE_LORA;
modulationParams.Params.LoRa.LowDatarateOptimize = 0;
modulationParams.Params.LoRa.Bandwidth = SX126x::RadioLoRaBandwidths_t::LORA_BW_125;
modulationParams.Params.LoRa.CodingRate = SX126x::RadioLoRaCodingRates_t::LORA_CR_4_7;
modulationParams.Params.LoRa.SpreadingFactor = SX126x::RadioLoRaSpreadingFactors_t::LORA_SF9;
modulationParams.Params.LoRa.LowDatarateOptimize = 1;
modulationParams.Params.LoRa.Bandwidth = SX126x::RadioLoRaBandwidths_t::LORA_BW_500;
modulationParams.Params.LoRa.CodingRate = SX126x::RadioLoRaCodingRates_t::LORA_CR_4_8;
modulationParams.Params.LoRa.SpreadingFactor = SX126x::RadioLoRaSpreadingFactors_t::LORA_SF12;
packetParams.PacketType = SX126x::RadioPacketTypes_t::PACKET_TYPE_LORA;;
packetParams.Params.LoRa.HeaderType = SX126x::RadioLoRaPacketLengthsMode_t::LORA_PACKET_IMPLICIT;
packetParams.Params.LoRa.InvertIQ = SX126x::RadioLoRaIQModes_t::LORA_IQ_INVERTED;
packetParams.Params.LoRa.InvertIQ = SX126x::RadioLoRaIQModes_t::LORA_IQ_NORMAL;
packetParams.Params.LoRa.CrcMode = SX126x::RadioLoRaCrcModes_t::LORA_CRC_OFF;
packetParams.Params.LoRa.PayloadLength = 255; //only implemented for 255 at the moment - otherwise send and receive-Length needs to be alternated; 255 seems to be the max even though the buffer seems to be 256 Bytes big
packetParams.Params.LoRa.PreambleLength = 8;
//seems to be radio.reset(new pinephoneBackplate("/dev/i2c-2")); for the PInePhone - untested
#ifdef PP
radio.reset(new PineDio::LoRa::PinephoneBackplate("/dev/i2c-2"));
#else
radio.reset(new PineDio::LoRa::UsbAdapter());
#endif
radio->SetDeviceType(SX126x::SX1262);
radio->Init();
......@@ -70,7 +91,7 @@ void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>)> appRxC
radio->SetRegulatorMode(SX126x::RadioRegulatorMode_t::USE_DCDC);
radio->SetBufferBaseAddresses(0,0);
radio->SetTxParams(22, SX126x::RadioRampTimes_t::RADIO_RAMP_3400_US);
radio->SetTxParams(10, SX126x::RadioRampTimes_t::RADIO_RAMP_3400_US);
radio->SetDioIrqParams(0xffff, 0x0001, 0x0000, 0x0000);
radio->SetRfFrequency(433500000);
......@@ -85,13 +106,18 @@ void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>)> appRxC
radio->SetRx(0xffffffff);
radio->callbacks.rxDone = [](){
uint8_t size = 255; //make it dfinitly big enough
uint8_t size = 255; //make it definitly big enough
SX126x::PacketStatus_t status;
radio->GetPacketStatus(&status);
std::vector<uint8_t> pkg(size); //a to big array isn't a problem :)
pkg.resize(size);
radio->GetPayload(&pkg[0], &size, size);
rxPkg pkg = {.data{size}, .RssiPkt = status.Params.LoRa.RssiPkt, .SnrPkt = status.Params.LoRa.SnrPkt, .SignalRssiPkt = status.Params.LoRa.SignalRssiPkt};
pkg.data.resize(size);
radio->GetPayload(&pkg.data[0], &size, size);
rxBuffer.push(pkg);
lastRx = time(NULL);
//I'm doing really hacky stuff here - see comment for wakeupRxConsumer
wakeupRxConsumer.try_lock(); //make sure the mutex is locked - it should be
wakeupRxConsumer.unlock(); //wakeup consumer
......@@ -116,9 +142,9 @@ void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>)> appRxC
stop.store(false);
}
void PinedioLoraRadioInitialize(void (*appRxCallback_)(uint8_t[])) {
PinedioLoraRadioInitialize([appRxCallback_](std::vector<uint8_t> param){
appRxCallback_(param.data());
void PinedioLoraRadioInitialize(void (*appRxCallback_)(uint8_t[], int8_t, int8_t, int8_t)) {
PinedioLoraRadioInitialize([appRxCallback_](std::vector<uint8_t> param, int8_t RssiPkt, int8_t SnrPkt, int8_t SignalRssiPkt){
appRxCallback_(param.data(), RssiPkt, SnrPkt, SignalRssiPkt);
//The content of param.data() will be deleted here
});
}
......@@ -148,7 +174,8 @@ void LoRaStateMachine() {
while(!stop.load()) {
radio->ProcessIrqs(); //calls received-callback if something is received
while(!txInProgress.load() && !transmitBuffer.empty()) {
//TODO: proper Channel-Activityy Detection - CAD - see https://lupyuen.github.io/articles/usb#cad-done ; RadioLib SX126x::scanChannel()
while(!txInProgress.load() && (difftime(time(NULL), lastRx) > CONTINUOUS_RX_BUFFER) && !transmitBuffer.empty()) {
std::vector<uint8_t> pkg = transmitBuffer.pop(); //mutexed_queue::pop differs from STLs queue::pop
std::cout << "SEND " << std::to_string(pkg.size()) << std::endl;
......@@ -166,4 +193,4 @@ void LoRaStateMachine() {
void PinedioLoraRadioStart() {
loop = std::thread(LoRaStateMachine);
RxConsumerThread = std::thread(RxConsumer);
}
\ No newline at end of file
}
......@@ -12,7 +12,7 @@
//void PinedioLoraRadioInitialize(std::function<void(std::vector<uint8_t>)> appRxCallback_);
//void PinedioLoraRadioSend(const std::vector<uint8_t> data);
extern "C" {
void PinedioLoraRadioInitialize(void (*appRxCallback_)(uint8_t[])); //callback: needs to be thread-safe and immideately deepcopy the byte array
void PinedioLoraRadioInitialize(void (*appRxCallback_)(uint8_t[], int8_t, int8_t, int8_t)); //callback: needs to be thread-safe and immideately deepcopy the byte array
void PinedioLoraRadioSend(const uint8_t[]);
void PinedioLoraRadioStart();
void PinedioLoraRadioStop() __attribute__((destructor (9999)));
......
......@@ -4,16 +4,10 @@ set(PINEDIO_LORA_DRIVER_SOURCE_FILES
PinephoneBackplate.cpp
)
set(PINEDIO_LORA_DRIVER_PUBLIC_HEADERS
../PinedioLoraRadio.h
../PinephoneBackplate.h
)
add_library(pinedio-lora-driver-pinephone
${PINEDIO_LORA_DRIVER_PUBLIC_HEADERS}
${PINEDIO_LORA_DRIVER_SOURCE_FILES}
)
target_link_libraries(pinedio-lora-driver-pinephone PUBLIC
pinedio-lora-driver
sx126x_driver
)
\ No newline at end of file
......@@ -5,7 +5,6 @@ set(PINEDIO_LORA_DRIVER_SOURCE_FILES
)
add_library(pinedio-lora-driver-usb
${PINEDIO_LORA_DRIVER_PUBLIC_HEADERS}
${PINEDIO_LORA_DRIVER_SOURCE_FILES}
)
......
......@@ -8,6 +8,20 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)
add_executable(testapp
main.cpp)
add_executable(Rx
Rx.cpp)
add_executable(Tx
Tx.cpp)
target_link_libraries(testapp
"pthread" ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT}
)
target_link_libraries(Rx
"pthread" ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT}
)
target_link_libraries(Tx
"pthread" ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT}
)
\ No newline at end of file
//#include "../src/UsbAdapter.h"
//#include "../src/Exceptions.h"
//#include "../src/PinedioLoraRadio.h"
#include <iostream>
#include <signal.h>
#include <future>
#include <algorithm>
#include <atomic>
#include <vector>
#include <thread>
#include <dlfcn.h>
void (*PinedioLoraRadioInitialize)(void (*appRxCallback_)(uint8_t[], int8_t, int8_t, int8_t));
void (*PinedioLoraRadioStart)();
void (*PinedioLoraRadioSend)(const uint8_t[]);
void (*PinedioLoraRadioStop)();
int main() {
void* lib_handle = dlopen("libpinedio-lora-driver.so", RTLD_LAZY);
PinedioLoraRadioInitialize = (void (*)(void (*)(uint8_t[], int8_t, int8_t, int8_t)))dlsym(lib_handle, "PinedioLoraRadioInitialize");
PinedioLoraRadioStart = (void (*)())dlsym(lib_handle, "PinedioLoraRadioStart");
PinedioLoraRadioSend = (void (*)(const uint8_t[]))dlsym(lib_handle, "PinedioLoraRadioSend");
PinedioLoraRadioStop = (void (*)())dlsym(lib_handle, "PinedioLoraRadioStop");
PinedioLoraRadioInitialize([](uint8_t data[], int8_t RssiPkt, int8_t SnrPkt, int8_t SignalRssiPkt) {for(int i=0;i<255;i++)printf("%x",data[i]);});
PinedioLoraRadioStart();
std::vector<uint8_t> data({'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4'});
while(true) {
PinedioLoraRadioSend(data.data());
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
PinedioLoraRadioStop();//*/
return 0;
}
\ No newline at end of file
......@@ -10,19 +10,19 @@
#include <thread>
#include <dlfcn.h>
void (*PinedioLoraRadioInitialize)(void (*appRxCallback_)(uint8_t[]));
void (*PinedioLoraRadioInitialize)(void (*appRxCallback_)(uint8_t[], int8_t, int8_t, int8_t));
void (*PinedioLoraRadioStart)();
void (*PinedioLoraRadioSend)(const uint8_t[]);
void (*PinedioLoraRadioStop)();
int main() {
void* lib_handle = dlopen("libpinedio-lora-driver.so", RTLD_LAZY);
PinedioLoraRadioInitialize = (void (*)(void (*)(uint8_t[])))dlsym(lib_handle, "PinedioLoraRadioInitialize");
PinedioLoraRadioInitialize = (void (*)(void (*)(uint8_t[], int8_t, int8_t, int8_t)))dlsym(lib_handle, "PinedioLoraRadioInitialize");
PinedioLoraRadioStart = (void (*)())dlsym(lib_handle, "PinedioLoraRadioStart");
PinedioLoraRadioSend = (void (*)(const uint8_t[]))dlsym(lib_handle, "PinedioLoraRadioSend");
PinedioLoraRadioStop = (void (*)())dlsym(lib_handle, "PinedioLoraRadioStop");
PinedioLoraRadioInitialize([](uint8_t data[]) {for(int i=0;i<255;i++)printf("%x",data[i]);});
PinedioLoraRadioInitialize([](uint8_t data[], int8_t, int8_t, int8_t) {for(int i=0;i<255;i++)printf("%x",data[i]);});
PinedioLoraRadioStart();
std::vector<uint8_t> data({'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment