This commit is contained in:
Tom Fifield 2024-12-15 09:50:08 +11:00
parent c09434b77e
commit 9721d980a9
13 changed files with 21 additions and 403 deletions

View File

@ -1,73 +0,0 @@
#pragma once
#include <memory>
#include <mutex>
#include <queue>
#ifdef BLOCKING_PACKET_QUEUE
#include <condition_variable>
#endif
/**
* Generic platform independent and re-entrant queue wrapper that can be used to
* safely pass (generic) movable objects between threads.
*/
template <typename T> class PacketQueue
{
public:
PacketQueue() {}
PacketQueue(PacketQueue const &other) = delete;
/**
* Push movable object into queue
*/
void push(T &&packet)
{
std::lock_guard<std::mutex> lock(mutex);
queue.push(packet.move());
#ifdef BLOCKING_PACKET_QUEUE
cond.notify_one();
#endif
}
#ifdef BLOCKING_PACKET_QUEUE
/**
* Pop movable object from queue (blocking)
*/
std::unique_ptr<T> pop(void)
{
std::unique_lock<std::mutex> lock(mutex);
cond.wait(lock, [this] { return !queue.empty(); });
T packet = queue.front()->move();
queue.pop();
return packet;
}
#endif
/**
* Pop movable object from queue (non-blocking)
*/
std::unique_ptr<T> try_pop()
{
std::lock_guard<std::mutex> lock(mutex);
if (queue.empty())
return {nullptr};
auto packet = queue.front()->move();
queue.pop();
return packet;
}
uint32_t size() const
{
std::lock_guard<std::mutex> lock(mutex);
return queue.size();
}
private:
mutable std::mutex mutex;
std::queue<std::unique_ptr<T>> queue;
#ifdef BLOCKING_PACKET_QUEUE
std::condition_variable cond;
#endif
};

View File

@ -1148,11 +1148,6 @@ void setup()
initApiServer(TCPPort); initApiServer(TCPPort);
#endif #endif
#ifdef USE_PACKET_API
MeshPacketServer::init();
PacketClient::init();
#endif
// Start airtime logger thread. // Start airtime logger thread.
airTime = new AirTime(); airTime = new AirTime();

View File

@ -148,11 +148,6 @@ class PhoneAPI
*/ */
virtual void onNowHasData(uint32_t fromRadioNum) {} virtual void onNowHasData(uint32_t fromRadioNum) {}
/**
* Subclasses can use this to find out when a client drops the link
*/
virtual void handleDisconnect();
/// begin a new connection /// begin a new connection
void handleStartConfig(); void handleStartConfig();

View File

@ -1,62 +0,0 @@
#pragma once
#include <memory>
/**
* Polymorphic packets that can be moved into and out of packet queues.
*/
class Packet
{
public:
using PacketPtr = std::unique_ptr<Packet>;
Packet(int packetId) : id(packetId) {}
// virtual move constructor
virtual PacketPtr move() { return PacketPtr(new Packet(std::move(*this))); }
// Disable copying
Packet(const Packet &) = delete;
Packet &operator=(const Packet &) = delete;
virtual ~Packet() {}
int getPacketId() const { return id; }
protected:
// Enable moving
Packet(Packet &&) = default;
Packet &operator=(Packet &&) = default;
private:
int id;
};
/**
* generic packet type class
*/
template <typename PacketType> class DataPacket : public Packet
{
public:
template <typename... Args> DataPacket(int id, Args &&...args) : Packet(id), data(new PacketType(std::forward<Args>(args)...))
{
}
PacketPtr move() override { return PacketPtr(new DataPacket(std::move(*this))); }
// Disable copying
DataPacket(const DataPacket &) = delete;
DataPacket &operator=(const DataPacket &) = delete;
virtual ~DataPacket() {}
const PacketType &getData() const { return *data; }
protected:
// Enable moving
DataPacket(DataPacket &&) = default;
DataPacket &operator=(DataPacket &&) = default;
private:
std::unique_ptr<PacketType> data;
};

View File

@ -1,55 +0,0 @@
#include "sharedMem/PacketServer.h"
#include "api/PacketAPI.h"
#include "sharedMem/SharedQueue.h"
#include <assert.h>
const uint32_t max_packet_queue_size = 50;
SharedQueue *sharedQueue = nullptr;
PacketServer *packetServer = nullptr;
PacketServer::PacketServer() : queue(nullptr) {}
void PacketServer::init(void)
{
packetServer = new PacketServer;
packetAPI = new PacketAPI(packetServer);
sharedQueue = new SharedQueue;
packetServer->begin(sharedQueue);
}
void PacketServer::begin(SharedQueue *_queue)
{
queue = _queue;
}
Packet::PacketPtr PacketServer::receivePacket(void)
{
assert(queue);
if (queue->clientQueueSize() == 0)
return {nullptr};
return queue->serverReceive();
}
bool PacketServer::sendPacket(Packet &&p)
{
assert(queue);
if (queue->serverQueueSize() >= max_packet_queue_size) {
return false;
}
queue->serverSend(std::move(p));
return true;
}
bool PacketServer::hasData() const
{
assert(queue);
return queue->clientQueueSize() > 0;
}
bool PacketServer::available() const
{
assert(queue);
return queue->serverQueueSize() < max_packet_queue_size;
}

View File

@ -1,28 +0,0 @@
#pragma once
#include "concurrency/PacketQueue.h"
#include "sharedMem/Packet.h"
class SharedQueue;
/**
* Generic server implementation (base class) for bidirectional task communication
* Uses a queue that is shared with the client
*/
class PacketServer
{
public:
PacketServer();
static void init(void);
virtual void begin(SharedQueue *_queue);
virtual bool sendPacket(Packet &&p);
virtual Packet::PacketPtr receivePacket(void);
// template variant with typed return values
// template<> Packet::PacketPtr receivePacket<Packet::PacketPtr>()
// template<typename T> T receivePacket();
virtual bool hasData() const;
virtual bool available() const;
private:
SharedQueue *queue;
};

View File

@ -1,37 +0,0 @@
#include "sharedMem/SharedQueue.h"
SharedQueue::SharedQueue() {}
SharedQueue::~SharedQueue() {}
bool SharedQueue::serverSend(Packet &&p)
{
serverQueue.push(std::move(p));
return true;
}
Packet::PacketPtr SharedQueue::serverReceive()
{
return clientQueue.try_pop();
}
size_t SharedQueue::serverQueueSize() const
{
return serverQueue.size();
}
bool SharedQueue::clientSend(Packet &&p)
{
clientQueue.push(std::move(p));
return true;
}
Packet::PacketPtr SharedQueue::clientReceive()
{
return serverQueue.try_pop();
}
size_t SharedQueue::clientQueueSize() const
{
return clientQueue.size();
}

View File

@ -1,35 +0,0 @@
#pragma once
#include "concurrency/PacketQueue.h"
#include "sharedMem/Packet.h"
/**
* @brief Queue wrapper that aggregates two thread queues (namely client and server)
* for bidirectional packet transfer between two threads or processes.
*
* This queue may also be created in shared memory (e.g. in Linux for inter-process communication)
*/
class SharedQueue
{
public:
SharedQueue();
virtual ~SharedQueue();
// server methods
virtual bool serverSend(Packet &&p);
virtual Packet::PacketPtr serverReceive();
virtual size_t serverQueueSize() const;
// client methods
virtual bool clientSend(Packet &&p);
virtual Packet::PacketPtr clientReceive();
virtual size_t clientQueueSize() const;
private:
// the server pushes into serverQueue and the client pushes into clientQueue
// receiving is done from the opposite queue, respectively
PacketQueue<Packet> serverQueue;
PacketQueue<Packet> clientQueue;
};
extern SharedQueue *sharedQueue;

View File

@ -1,101 +1,19 @@
// ST7789 TFT LCD ; LilyGo T-Deck
#define ST7789_CS 12 [env:t-deck]
#define ST7789_RS 11 // DC extends = esp32s3_base
#define ST7789_SDA 41 // MOSI board = t-deck
#define ST7789_SCK 40 board_check = true
#define ST7789_RESET -1 upload_protocol = esptool
#define ST7789_MISO 38 #upload_port = COM29
#define ST7789_BUSY -1
#define ST7789_BL 42
#define ST7789_SPI_HOST SPI2_HOST
#define TFT_BL 42
#define SPI_FREQUENCY 40000000
#define SPI_READ_FREQUENCY 16000000
#define TFT_HEIGHT 320
#define TFT_WIDTH 240
#define TFT_OFFSET_X 0
#define TFT_OFFSET_Y 0
#define TFT_OFFSET_ROTATION 0
#define SCREEN_ROTATE
#define SCREEN_TRANSITION_FRAMERATE 5
#define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness
#define HAS_TOUCHSCREEN 1 build_flags = ${esp32_base.build_flags}
#define SCREEN_TOUCH_INT 16 -DT_DECK
#define TOUCH_I2C_PORT 0 -DBOARD_HAS_PSRAM
#define TOUCH_SLAVE_ADDRESS 0x5D // GT911 -DMAX_THREADS=40
-DGPS_POWER_TOGGLE
-Ivariants/t-deck
#define SLEEP_TIME 120 lib_deps = ${esp32s3_base.lib_deps}
lovyan03/LovyanGFX@^1.1.9
#define BUTTON_PIN 0 earlephilhower/ESP8266Audio@^1.9.9
// #define BUTTON_NEED_PULLUP earlephilhower/ESP8266SAM@^1.0.1
#define GPS_DEFAULT_NOT_PRESENT 1
#define GPS_RX_PIN 44
#define GPS_TX_PIN 43
// Have SPI interface SD card slot
#define HAS_SDCARD 1
#define SPI_MOSI (41)
#define SPI_SCK (40)
#define SPI_MISO (38)
#define SPI_CS (39)
#define SDCARD_CS SPI_CS
#define BATTERY_PIN 4 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
// ratio of voltage divider = 2.0 (RD2=100k, RD3=100k)
#define ADC_MULTIPLIER 2.11 // 2.0 + 10% for correction of display undervoltage.
#define ADC_CHANNEL ADC1_GPIO4_CHANNEL
// keyboard
#define I2C_SDA 18 // I2C pins for this board
#define I2C_SCL 8
#define KB_POWERON 10 // must be set to HIGH
#define KB_SLAVE_ADDRESS TDECK_KB_ADDR // 0x55
#define KB_BL_PIN 46 // not used for now
#define CANNED_MESSAGE_MODULE_ENABLE 1
// trackball
#define HAS_TRACKBALL 1
#define TB_UP 3
#define TB_DOWN 15
#define TB_LEFT 1
#define TB_RIGHT 2
#define TB_PRESS BUTTON_PIN
// microphone
#define ES7210_SCK 47
#define ES7210_DIN 14
#define ES7210_LRCK 21
#define ES7210_MCLK 48
// dac / amp
#define HAS_I2S
#define DAC_I2S_BCK 7
#define DAC_I2S_WS 5
#define DAC_I2S_DOUT 6
#define DAC_I2S_MCLK 21 // GPIO lrck mic
// LoRa
#define USE_SX1262
#define USE_SX1268
#define LORA_SCK 40
#define LORA_MISO 38
#define LORA_MOSI 41
#define LORA_CS 9
#define LORA_DIO0 -1 // a No connect on the SX1262 module
#define LORA_RESET 17
#define LORA_DIO1 45 // SX1262 IRQ
#define LORA_DIO2 13 // SX1262 BUSY
#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
#define SX126X_CS LORA_CS // FIXME - we really should define LORA_CS instead
#define SX126X_DIO1 LORA_DIO1
#define SX126X_BUSY LORA_DIO2
#define SX126X_RESET LORA_RESET
// Not really an E22 but TTGO seems to be trying to clone that
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
// code)