mirror of https://github.com/meshcore-dev/MeshCore
46 changed files with 4492 additions and 174 deletions
@ -0,0 +1 @@ |
|||||
|
use nix |
||||
@ -1,6 +1,8 @@ |
|||||
|
.direnv |
||||
.pio |
.pio |
||||
.vscode/.browse.c_cpp.db* |
.vscode/.browse.c_cpp.db* |
||||
.vscode/c_cpp_properties.json |
.vscode/c_cpp_properties.json |
||||
.vscode/launch.json |
.vscode/launch.json |
||||
.vscode/ipch |
.vscode/ipch |
||||
out/ |
out/ |
||||
|
.direnv/ |
||||
|
|||||
@ -0,0 +1,10 @@ |
|||||
|
{ pkgs ? import <nixpkgs> {} }: |
||||
|
let |
||||
|
in |
||||
|
pkgs.mkShell { |
||||
|
buildInputs = [ |
||||
|
pkgs.platformio |
||||
|
# optional: needed as a programmer i.e. for esp32 |
||||
|
pkgs.avrdude |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,79 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
|
||||
|
#include <Wire.h> |
||||
|
#include <Arduino.h> |
||||
|
#include "XPowersLib.h" |
||||
|
|
||||
|
#define XPOWERS_CHIP_AXP192 |
||||
|
|
||||
|
// LoRa radio module pins for TBeam
|
||||
|
#define P_LORA_DIO_1 33 // SX1262 IRQ pin
|
||||
|
#define P_LORA_NSS 18 |
||||
|
#define P_LORA_RESET 23 |
||||
|
#define P_LORA_BUSY 32 // SX1262 Busy pin
|
||||
|
#define P_LORA_SCLK 5 |
||||
|
#define P_LORA_MISO 19 |
||||
|
#define P_LORA_MOSI 27 |
||||
|
|
||||
|
#include "ESP32Board.h" |
||||
|
|
||||
|
#include <driver/rtc_io.h> |
||||
|
|
||||
|
class TBeamBoardSX1262 : public ESP32Board { |
||||
|
XPowersAXP192 power; |
||||
|
|
||||
|
public: |
||||
|
void begin() { |
||||
|
ESP32Board::begin(); |
||||
|
|
||||
|
power.setLDO2Voltage(3300); |
||||
|
power.enableLDO2(); |
||||
|
|
||||
|
power.enableBattVoltageMeasure(); |
||||
|
|
||||
|
pinMode(38, INPUT_PULLUP); |
||||
|
|
||||
|
esp_reset_reason_t reason = esp_reset_reason(); |
||||
|
if (reason == ESP_RST_DEEPSLEEP) { |
||||
|
long wakeup_source = esp_sleep_get_ext1_wakeup_status(); |
||||
|
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
||||
|
startup_reason = BD_STARTUP_RX_PACKET; |
||||
|
} |
||||
|
|
||||
|
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); |
||||
|
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { |
||||
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
||||
|
|
||||
|
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
||||
|
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); |
||||
|
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); |
||||
|
|
||||
|
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); |
||||
|
|
||||
|
if (pin_wake_btn < 0) { |
||||
|
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
||||
|
} else { |
||||
|
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
||||
|
} |
||||
|
|
||||
|
if (secs > 0) { |
||||
|
esp_sleep_enable_timer_wakeup(secs * 1000000); |
||||
|
} |
||||
|
|
||||
|
// Finally set ESP32 into sleep
|
||||
|
esp_deep_sleep_start(); // CPU halts here and never returns!
|
||||
|
} |
||||
|
|
||||
|
uint16_t getBattMilliVolts() override { |
||||
|
return power.getBattVoltage(); |
||||
|
} |
||||
|
|
||||
|
const char* getManufacturerName() const override { |
||||
|
return "LilyGo T-Beam SX1262"; |
||||
|
} |
||||
|
}; |
||||
@ -0,0 +1,42 @@ |
|||||
|
#include <Arduino.h> |
||||
|
#include "PicoWBoard.h" |
||||
|
|
||||
|
//#include <bluefruit.h>
|
||||
|
#include <Wire.h> |
||||
|
|
||||
|
//static BLEDfu bledfu;
|
||||
|
|
||||
|
static void connect_callback(uint16_t conn_handle) { |
||||
|
(void)conn_handle; |
||||
|
MESH_DEBUG_PRINTLN("BLE client connected"); |
||||
|
} |
||||
|
|
||||
|
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) { |
||||
|
(void)conn_handle; |
||||
|
(void)reason; |
||||
|
|
||||
|
MESH_DEBUG_PRINTLN("BLE client disconnected"); |
||||
|
} |
||||
|
|
||||
|
void PicoWBoard::begin() { |
||||
|
// for future use, sub-classes SHOULD call this from their begin()
|
||||
|
startup_reason = BD_STARTUP_NORMAL; |
||||
|
pinMode(PIN_VBAT_READ, INPUT); |
||||
|
#ifdef PIN_USER_BTN |
||||
|
pinMode(PIN_USER_BTN, INPUT_PULLUP); |
||||
|
#endif |
||||
|
|
||||
|
#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) |
||||
|
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL); |
||||
|
#endif |
||||
|
|
||||
|
Wire.begin(); |
||||
|
|
||||
|
//pinMode(SX126X_POWER_EN, OUTPUT);
|
||||
|
//digitalWrite(SX126X_POWER_EN, HIGH);
|
||||
|
delay(10); // give sx1262 some time to power up
|
||||
|
} |
||||
|
|
||||
|
bool PicoWBoard::startOTAUpdate(const char* id, char reply[]) { |
||||
|
return false; |
||||
|
} |
||||
@ -0,0 +1,64 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include <MeshCore.h> |
||||
|
#include <Arduino.h> |
||||
|
|
||||
|
// LoRa radio module pins for PicoW
|
||||
|
#define P_LORA_DIO_1 20 |
||||
|
#define P_LORA_NSS 3 |
||||
|
#define P_LORA_RESET 15 |
||||
|
#define P_LORA_BUSY 2 |
||||
|
#define P_LORA_SCLK 10 |
||||
|
#define P_LORA_MISO 12 |
||||
|
#define P_LORA_MOSI 11 |
||||
|
//#define SX126X_POWER_EN ??? // Not Sure
|
||||
|
|
||||
|
#define SX126X_DIO2_AS_RF_SWITCH true |
||||
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 |
||||
|
|
||||
|
// built-ins
|
||||
|
#define PIN_VBAT_READ 26 |
||||
|
#define ADC_MULTIPLIER (3.1 * 3.3 * 1000) // MT Uses 3.1
|
||||
|
#define PIN_LED_BUILTIN LED_BUILTIN |
||||
|
|
||||
|
class PicoWBoard : public mesh::MainBoard { |
||||
|
protected: |
||||
|
uint8_t startup_reason; |
||||
|
|
||||
|
public: |
||||
|
void begin(); |
||||
|
uint8_t getStartupReason() const override { return startup_reason; } |
||||
|
|
||||
|
void onBeforeTransmit() override { |
||||
|
digitalWrite(LED_BUILTIN, HIGH); // turn TX LED on
|
||||
|
} |
||||
|
|
||||
|
void onAfterTransmit() override { |
||||
|
digitalWrite(LED_BUILTIN, LOW); // turn TX LED off
|
||||
|
} |
||||
|
|
||||
|
#define BATTERY_SAMPLES 8 |
||||
|
|
||||
|
uint16_t getBattMilliVolts() override { |
||||
|
analogReadResolution(12); |
||||
|
|
||||
|
uint32_t raw = 0; |
||||
|
for (int i = 0; i < BATTERY_SAMPLES; i++) { |
||||
|
raw += analogRead(PIN_VBAT_READ); |
||||
|
} |
||||
|
raw = raw / BATTERY_SAMPLES; |
||||
|
|
||||
|
return (ADC_MULTIPLIER * raw) / 4096; |
||||
|
} |
||||
|
|
||||
|
const char* getManufacturerName() const override { |
||||
|
return "Pico W"; |
||||
|
} |
||||
|
|
||||
|
void reboot() override { |
||||
|
//NVIC_SystemReset();
|
||||
|
rp2040.reboot(); |
||||
|
} |
||||
|
|
||||
|
bool startOTAUpdate(const char* id, char reply[]) override; |
||||
|
}; |
||||
File diff suppressed because it is too large
@ -0,0 +1,395 @@ |
|||||
|
/**
|
||||
|
* The MIT License (MIT) |
||||
|
* |
||||
|
* Copyright (c) 2018 by ThingPulse, Daniel Eichhorn |
||||
|
* Copyright (c) 2018 by Fabrice Weinberg |
||||
|
* Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de |
||||
|
* |
||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
* of this software and associated documentation files (the "Software"), to deal |
||||
|
* in the Software without restriction, including without limitation the rights |
||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
* copies of the Software, and to permit persons to whom the Software is |
||||
|
* furnished to do so, subject to the following conditions: |
||||
|
* |
||||
|
* The above copyright notice and this permission notice shall be included in all |
||||
|
* copies or substantial portions of the Software. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
* SOFTWARE. |
||||
|
* |
||||
|
* ThingPulse invests considerable time and money to develop these open source libraries. |
||||
|
* Please support us by buying our products (and not the clones) from |
||||
|
* https://thingpulse.com
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#ifndef OLEDDISPLAY_h |
||||
|
#define OLEDDISPLAY_h |
||||
|
|
||||
|
#include <cstdarg> |
||||
|
|
||||
|
#ifdef ARDUINO |
||||
|
#include <Arduino.h> |
||||
|
#elif __MBED__ |
||||
|
#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) |
||||
|
|
||||
|
#include <mbed.h> |
||||
|
#define delay(x) wait_ms(x) |
||||
|
#define yield() void() |
||||
|
|
||||
|
/*
|
||||
|
* This is a little Arduino String emulation to keep the OLEDDisplay |
||||
|
* library code in common between Arduino and mbed-os |
||||
|
*/ |
||||
|
class String { |
||||
|
public: |
||||
|
String(const char *s) { _str = s; }; |
||||
|
int length() { return strlen(_str); }; |
||||
|
const char *c_str() { return _str; }; |
||||
|
void toCharArray(char *buf, unsigned int bufsize, unsigned int index = 0) const { |
||||
|
memcpy(buf, _str + index, std::min(bufsize, strlen(_str))); |
||||
|
}; |
||||
|
private: |
||||
|
const char *_str; |
||||
|
}; |
||||
|
|
||||
|
#else |
||||
|
#error "Unkown operating system" |
||||
|
#endif |
||||
|
|
||||
|
#include "OLEDDisplayFonts.h" |
||||
|
|
||||
|
//#define DEBUG_OLEDDISPLAY(...) Serial.printf( __VA_ARGS__ )
|
||||
|
//#define DEBUG_OLEDDISPLAY(...) dprintf("%s", __VA_ARGS__ )
|
||||
|
|
||||
|
#ifndef DEBUG_OLEDDISPLAY |
||||
|
#define DEBUG_OLEDDISPLAY(...) |
||||
|
#endif |
||||
|
|
||||
|
// Use DOUBLE BUFFERING by default
|
||||
|
#ifndef OLEDDISPLAY_REDUCE_MEMORY |
||||
|
#define OLEDDISPLAY_DOUBLE_BUFFER |
||||
|
#endif |
||||
|
|
||||
|
// Header Values
|
||||
|
#define JUMPTABLE_BYTES 4 |
||||
|
|
||||
|
#define JUMPTABLE_LSB 1 |
||||
|
#define JUMPTABLE_SIZE 2 |
||||
|
#define JUMPTABLE_WIDTH 3 |
||||
|
#define JUMPTABLE_START 4 |
||||
|
|
||||
|
#define WIDTH_POS 0 |
||||
|
#define HEIGHT_POS 1 |
||||
|
#define FIRST_CHAR_POS 2 |
||||
|
#define CHAR_NUM_POS 3 |
||||
|
|
||||
|
|
||||
|
// Display commands
|
||||
|
#define CHARGEPUMP 0x8D |
||||
|
#define COLUMNADDR 0x21 |
||||
|
#define COMSCANDEC 0xC8 |
||||
|
#define COMSCANINC 0xC0 |
||||
|
#define DISPLAYALLON 0xA5 |
||||
|
#define DISPLAYALLON_RESUME 0xA4 |
||||
|
#define DISPLAYOFF 0xAE |
||||
|
#define DISPLAYON 0xAF |
||||
|
#define EXTERNALVCC 0x1 |
||||
|
#define INVERTDISPLAY 0xA7 |
||||
|
#define MEMORYMODE 0x20 |
||||
|
#define NORMALDISPLAY 0xA6 |
||||
|
#define PAGEADDR 0x22 |
||||
|
#define SEGREMAP 0xA0 |
||||
|
#define SETCOMPINS 0xDA |
||||
|
#define SETCONTRAST 0x81 |
||||
|
#define SETDISPLAYCLOCKDIV 0xD5 |
||||
|
#define SETDISPLAYOFFSET 0xD3 |
||||
|
#define SETHIGHCOLUMN 0x10 |
||||
|
#define SETLOWCOLUMN 0x00 |
||||
|
#define SETMULTIPLEX 0xA8 |
||||
|
#define SETPRECHARGE 0xD9 |
||||
|
#define SETSEGMENTREMAP 0xA1 |
||||
|
#define SETSTARTLINE 0x40 |
||||
|
#define SETVCOMDETECT 0xDB |
||||
|
#define SWITCHCAPVCC 0x2 |
||||
|
|
||||
|
#ifndef _swap_int16_t |
||||
|
#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } |
||||
|
#endif |
||||
|
|
||||
|
enum OLEDDISPLAY_COLOR { |
||||
|
BLACK = 0, |
||||
|
WHITE = 1, |
||||
|
INVERSE = 2 |
||||
|
}; |
||||
|
|
||||
|
enum OLEDDISPLAY_TEXT_ALIGNMENT { |
||||
|
TEXT_ALIGN_LEFT = 0, |
||||
|
TEXT_ALIGN_RIGHT = 1, |
||||
|
TEXT_ALIGN_CENTER = 2, |
||||
|
TEXT_ALIGN_CENTER_BOTH = 3 |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
enum OLEDDISPLAY_GEOMETRY { |
||||
|
GEOMETRY_128_64 = 0, |
||||
|
GEOMETRY_128_32 = 1, |
||||
|
GEOMETRY_64_48 = 2, |
||||
|
GEOMETRY_64_32 = 3, |
||||
|
GEOMETRY_RAWMODE = 4, |
||||
|
GEOMETRY_128_128 = 5 |
||||
|
}; |
||||
|
|
||||
|
enum HW_I2C { |
||||
|
I2C_ONE, |
||||
|
I2C_TWO |
||||
|
}; |
||||
|
|
||||
|
typedef char (*FontTableLookupFunction)(const uint8_t ch); |
||||
|
char DefaultFontTableLookup(const uint8_t ch); |
||||
|
|
||||
|
|
||||
|
#ifdef ARDUINO |
||||
|
class OLEDDisplay : public Print { |
||||
|
#elif __MBED__ |
||||
|
class OLEDDisplay : public Stream { |
||||
|
#else |
||||
|
#error "Unkown operating system" |
||||
|
#endif |
||||
|
|
||||
|
public: |
||||
|
OLEDDisplay(); |
||||
|
virtual ~OLEDDisplay(); |
||||
|
|
||||
|
uint16_t width(void) const { return displayWidth; }; |
||||
|
uint16_t height(void) const { return displayHeight; }; |
||||
|
|
||||
|
// Use this to resume after a deep sleep without resetting the display (what init() would do).
|
||||
|
// Returns true if connection to the display was established and the buffer allocated, false otherwise.
|
||||
|
bool allocateBuffer(); |
||||
|
|
||||
|
// Allocates the buffer and initializes the driver & display. Resets the display!
|
||||
|
// Returns false if buffer allocation failed, true otherwise.
|
||||
|
bool init(); |
||||
|
|
||||
|
// Free the memory used by the display
|
||||
|
void end(); |
||||
|
|
||||
|
// Cycle through the initialization
|
||||
|
void resetDisplay(void); |
||||
|
|
||||
|
/* Drawing functions */ |
||||
|
// Sets the color of all pixel operations
|
||||
|
void setColor(OLEDDISPLAY_COLOR color); |
||||
|
|
||||
|
// Returns the current color.
|
||||
|
OLEDDISPLAY_COLOR getColor(); |
||||
|
|
||||
|
// Draw a pixel at given position
|
||||
|
void setPixel(int16_t x, int16_t y); |
||||
|
|
||||
|
// Draw a pixel at given position and color
|
||||
|
void setPixelColor(int16_t x, int16_t y, OLEDDISPLAY_COLOR color); |
||||
|
|
||||
|
// Clear a pixel at given position FIXME: INVERSE is untested with this function
|
||||
|
void clearPixel(int16_t x, int16_t y); |
||||
|
|
||||
|
// Draw a line from position 0 to position 1
|
||||
|
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); |
||||
|
|
||||
|
// Draw the border of a rectangle at the given location
|
||||
|
void drawRect(int16_t x, int16_t y, int16_t width, int16_t height); |
||||
|
|
||||
|
// Fill the rectangle
|
||||
|
void fillRect(int16_t x, int16_t y, int16_t width, int16_t height); |
||||
|
|
||||
|
// Draw the border of a circle
|
||||
|
void drawCircle(int16_t x, int16_t y, int16_t radius); |
||||
|
|
||||
|
// Draw all Quadrants specified in the quads bit mask
|
||||
|
void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads); |
||||
|
|
||||
|
// Fill circle
|
||||
|
void fillCircle(int16_t x, int16_t y, int16_t radius); |
||||
|
|
||||
|
// Draw an empty triangle i.e. only the outline
|
||||
|
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2); |
||||
|
|
||||
|
// Draw a solid triangle i.e. filled
|
||||
|
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2); |
||||
|
|
||||
|
// Draw a line horizontally
|
||||
|
void drawHorizontalLine(int16_t x, int16_t y, int16_t length); |
||||
|
|
||||
|
// Draw a line vertically
|
||||
|
void drawVerticalLine(int16_t x, int16_t y, int16_t length); |
||||
|
|
||||
|
// Draws a rounded progress bar with the outer dimensions given by width and height. Progress is
|
||||
|
// a unsigned byte value between 0 and 100
|
||||
|
void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress); |
||||
|
|
||||
|
// Draw a bitmap in the internal image format
|
||||
|
void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image); |
||||
|
|
||||
|
// Draw a XBM
|
||||
|
void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *xbm); |
||||
|
|
||||
|
// Draw icon 16x16 xbm format
|
||||
|
void drawIco16x16(int16_t x, int16_t y, const uint8_t *ico, bool inverse = false); |
||||
|
|
||||
|
/* Text functions */ |
||||
|
|
||||
|
// Draws a string at the given location, returns how many chars have been written
|
||||
|
uint16_t drawString(int16_t x, int16_t y, const String &text); |
||||
|
|
||||
|
// Draws a formatted string (like printf) at the given location
|
||||
|
void drawStringf(int16_t x, int16_t y, char* buffer, String format, ... ); |
||||
|
|
||||
|
// Draws a String with a maximum width at the given location.
|
||||
|
// If the given String is wider than the specified width
|
||||
|
// The text will be wrapped to the next line at a space or dash
|
||||
|
// returns 0 if everything fits on the screen or the numbers of characters in the
|
||||
|
// first line if not
|
||||
|
uint16_t drawStringMaxWidth(int16_t x, int16_t y, uint16_t maxLineWidth, const String &text); |
||||
|
|
||||
|
// Returns the width of the const char* with the current
|
||||
|
// font settings
|
||||
|
uint16_t getStringWidth(const char* text, uint16_t length, bool utf8 = false); |
||||
|
|
||||
|
// Convencience method for the const char version
|
||||
|
uint16_t getStringWidth(const String &text); |
||||
|
|
||||
|
// Specifies relative to which anchor point
|
||||
|
// the text is rendered. Available constants:
|
||||
|
// TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH
|
||||
|
void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment); |
||||
|
|
||||
|
// Sets the current font. Available default fonts
|
||||
|
// ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24
|
||||
|
void setFont(const uint8_t *fontData); |
||||
|
|
||||
|
// Set the function that will convert utf-8 to font table index
|
||||
|
void setFontTableLookupFunction(FontTableLookupFunction function); |
||||
|
|
||||
|
/* Display functions */ |
||||
|
|
||||
|
// Turn the display on
|
||||
|
void displayOn(void); |
||||
|
|
||||
|
// Turn the display offs
|
||||
|
void displayOff(void); |
||||
|
|
||||
|
// Inverted display mode
|
||||
|
void invertDisplay(void); |
||||
|
|
||||
|
// Normal display mode
|
||||
|
void normalDisplay(void); |
||||
|
|
||||
|
// Set display contrast
|
||||
|
// really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0
|
||||
|
// normal brightness & contrast: contrast = 100
|
||||
|
void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64); |
||||
|
|
||||
|
// Convenience method to access
|
||||
|
virtual void setBrightness(uint8_t); |
||||
|
|
||||
|
// Reset display rotation or mirroring
|
||||
|
void resetOrientation(); |
||||
|
|
||||
|
// Turn the display upside down
|
||||
|
void flipScreenVertically(); |
||||
|
|
||||
|
// Mirror the display (to be used in a mirror or as a projector)
|
||||
|
void mirrorScreen(); |
||||
|
|
||||
|
// Write the buffer to the display memory
|
||||
|
virtual void display(void) = 0; |
||||
|
|
||||
|
// Clear the local pixel buffer
|
||||
|
void clear(void); |
||||
|
|
||||
|
// Log buffer implementation
|
||||
|
|
||||
|
// This will define the lines and characters you can
|
||||
|
// print to the screen. When you exeed the buffer size (lines * chars)
|
||||
|
// the output may be truncated due to the size constraint.
|
||||
|
bool setLogBuffer(uint16_t lines, uint16_t chars); |
||||
|
|
||||
|
// Draw the log buffer at position (x, y)
|
||||
|
void drawLogBuffer(uint16_t x, uint16_t y); |
||||
|
|
||||
|
// Get screen geometry
|
||||
|
uint16_t getWidth(void); |
||||
|
uint16_t getHeight(void); |
||||
|
|
||||
|
// Implement needed function to be compatible with Print class
|
||||
|
size_t write(uint8_t c); |
||||
|
size_t write(const char* s); |
||||
|
|
||||
|
// Implement needed function to be compatible with Stream class
|
||||
|
#ifdef __MBED__ |
||||
|
int _putc(int c); |
||||
|
int _getc() { return -1; }; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
uint8_t *buffer; |
||||
|
|
||||
|
#ifdef OLEDDISPLAY_DOUBLE_BUFFER |
||||
|
uint8_t *buffer_back; |
||||
|
#endif |
||||
|
|
||||
|
// Set the correct height, width and buffer for the geometry
|
||||
|
void setGeometry(OLEDDISPLAY_GEOMETRY g, uint16_t width = 0, uint16_t height = 0); |
||||
|
|
||||
|
protected: |
||||
|
|
||||
|
OLEDDISPLAY_GEOMETRY geometry; |
||||
|
|
||||
|
uint16_t displayWidth; |
||||
|
uint16_t displayHeight; |
||||
|
uint16_t displayBufferSize; |
||||
|
|
||||
|
OLEDDISPLAY_TEXT_ALIGNMENT textAlignment; |
||||
|
OLEDDISPLAY_COLOR color; |
||||
|
|
||||
|
const uint8_t *fontData; |
||||
|
|
||||
|
// State values for logBuffer
|
||||
|
uint16_t logBufferSize; |
||||
|
uint16_t logBufferFilled; |
||||
|
uint16_t logBufferLine; |
||||
|
uint16_t logBufferMaxLines; |
||||
|
char *logBuffer; |
||||
|
|
||||
|
|
||||
|
// the header size of the buffer used, e.g. for the SPI command header
|
||||
|
int BufferOffset; |
||||
|
virtual int getBufferOffset(void) = 0; |
||||
|
|
||||
|
// Send a command to the display (low level function)
|
||||
|
virtual void sendCommand(uint8_t com) {(void)com;}; |
||||
|
|
||||
|
// Connect to the display
|
||||
|
virtual bool connect() { return false; }; |
||||
|
|
||||
|
// Send all the init commands
|
||||
|
virtual void sendInitCommands(); |
||||
|
|
||||
|
// converts utf8 characters to extended ascii
|
||||
|
char* utf8ascii(const String &s); |
||||
|
|
||||
|
void inline drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) __attribute__((always_inline)); |
||||
|
|
||||
|
uint16_t drawStringInternal(int16_t xMove, int16_t yMove, const char* text, uint16_t textLength, uint16_t textWidth, bool utf8); |
||||
|
|
||||
|
FontTableLookupFunction fontTableLookupFunction; |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
File diff suppressed because it is too large
@ -0,0 +1,13 @@ |
|||||
|
#ifndef OLEDDISPLAYFONTS_h |
||||
|
#define OLEDDISPLAYFONTS_h |
||||
|
|
||||
|
#ifdef ARDUINO |
||||
|
#include <Arduino.h> |
||||
|
#elif __MBED__ |
||||
|
#define PROGMEM |
||||
|
#endif |
||||
|
|
||||
|
extern const uint8_t ArialMT_Plain_10[] PROGMEM; |
||||
|
extern const uint8_t ArialMT_Plain_16[] PROGMEM; |
||||
|
extern const uint8_t ArialMT_Plain_24[] PROGMEM; |
||||
|
#endif |
||||
@ -0,0 +1,461 @@ |
|||||
|
/**
|
||||
|
* The MIT License (MIT) |
||||
|
* |
||||
|
* Copyright (c) 2018 by ThingPulse, Daniel Eichhorn |
||||
|
* Copyright (c) 2018 by Fabrice Weinberg |
||||
|
* Copyright (c) 2024 by Heltec AutoMation |
||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
* of this software and associated documentation files (the "Software"), to deal |
||||
|
* in the Software without restriction, including without limitation the rights |
||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
* copies of the Software, and to permit persons to whom the Software is |
||||
|
* furnished to do so, subject to the following conditions: |
||||
|
* |
||||
|
* The above copyright notice and this permission notice shall be included in all |
||||
|
* copies or substantial portions of the Software. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
* SOFTWARE. |
||||
|
* |
||||
|
* ThingPulse invests considerable time and money to develop these open source libraries. |
||||
|
* Please support us by buying our products (and not the clones) from |
||||
|
* https://thingpulse.com
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#ifndef ST7789Spi_h |
||||
|
#define ST7789Spi_h |
||||
|
|
||||
|
#include "OLEDDisplay.h" |
||||
|
#include <SPI.h> |
||||
|
|
||||
|
|
||||
|
#define ST_CMD_DELAY 0x80 // special signifier for command lists
|
||||
|
|
||||
|
#define ST77XX_NOP 0x00 |
||||
|
#define ST77XX_SWRESET 0x01 |
||||
|
#define ST77XX_RDDID 0x04 |
||||
|
#define ST77XX_RDDST 0x09 |
||||
|
|
||||
|
#define ST77XX_SLPIN 0x10 |
||||
|
#define ST77XX_SLPOUT 0x11 |
||||
|
#define ST77XX_PTLON 0x12 |
||||
|
#define ST77XX_NORON 0x13 |
||||
|
|
||||
|
#define ST77XX_INVOFF 0x20 |
||||
|
#define ST77XX_INVON 0x21 |
||||
|
#define ST77XX_DISPOFF 0x28 |
||||
|
#define ST77XX_DISPON 0x29 |
||||
|
#define ST77XX_CASET 0x2A |
||||
|
#define ST77XX_RASET 0x2B |
||||
|
#define ST77XX_RAMWR 0x2C |
||||
|
#define ST77XX_RAMRD 0x2E |
||||
|
|
||||
|
#define ST77XX_PTLAR 0x30 |
||||
|
#define ST77XX_TEOFF 0x34 |
||||
|
#define ST77XX_TEON 0x35 |
||||
|
#define ST77XX_MADCTL 0x36 |
||||
|
#define ST77XX_COLMOD 0x3A |
||||
|
|
||||
|
#define ST77XX_MADCTL_MY 0x80 |
||||
|
#define ST77XX_MADCTL_MX 0x40 |
||||
|
#define ST77XX_MADCTL_MV 0x20 |
||||
|
#define ST77XX_MADCTL_ML 0x10 |
||||
|
#define ST77XX_MADCTL_RGB 0x00 |
||||
|
|
||||
|
#define ST77XX_RDID1 0xDA |
||||
|
#define ST77XX_RDID2 0xDB |
||||
|
#define ST77XX_RDID3 0xDC |
||||
|
#define ST77XX_RDID4 0xDD |
||||
|
|
||||
|
// Some ready-made 16-bit ('565') color settings:
|
||||
|
#define ST77XX_BLACK 0x0000 |
||||
|
#define ST77XX_WHITE 0xFFFF |
||||
|
#define ST77XX_RED 0xF800 |
||||
|
#define ST77XX_GREEN 0x07E0 |
||||
|
#define ST77XX_BLUE 0x001F |
||||
|
#define ST77XX_CYAN 0x07FF |
||||
|
#define ST77XX_MAGENTA 0xF81F |
||||
|
#define ST77XX_YELLOW 0xFFE0 |
||||
|
#define ST77XX_ORANGE 0xFC00 |
||||
|
|
||||
|
#define LED_A_ON LOW |
||||
|
|
||||
|
#ifdef ESP_PLATFORM |
||||
|
#undef LED_A_ON |
||||
|
#define LED_A_ON HIGH |
||||
|
#define rtos_free free |
||||
|
#define rtos_malloc malloc |
||||
|
//SPIClass SPI1(HSPI);
|
||||
|
#endif |
||||
|
class ST7789Spi : public OLEDDisplay { |
||||
|
private: |
||||
|
uint8_t _rst; |
||||
|
uint8_t _dc; |
||||
|
uint8_t _cs; |
||||
|
uint8_t _ledA; |
||||
|
int _miso; |
||||
|
int _mosi; |
||||
|
int _clk; |
||||
|
SPIClass * _spi; |
||||
|
SPISettings _spiSettings; |
||||
|
uint16_t _RGB=0xFFFF; |
||||
|
uint8_t _buffheight; |
||||
|
public: |
||||
|
/* pass _cs as -1 to indicate "do not use CS pin", for cases where it is hard wired low */ |
||||
|
ST7789Spi(SPIClass *spiClass,uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_RAWMODE,uint16_t width=240,uint16_t height=135,int mosi=-1,int miso=-1,int clk=-1) { |
||||
|
this->_spi = spiClass; |
||||
|
this->_rst = _rst; |
||||
|
this->_dc = _dc; |
||||
|
this->_cs = _cs; |
||||
|
this->_mosi=mosi; |
||||
|
this->_miso=miso; |
||||
|
this->_clk=clk; |
||||
|
//this->_ledA = _ledA;
|
||||
|
_spiSettings = SPISettings(40000000, MSBFIRST, SPI_MODE0); |
||||
|
setGeometry(g,width,height); |
||||
|
} |
||||
|
|
||||
|
bool connect(){ |
||||
|
this->_buffheight=displayHeight / 8; |
||||
|
this->_buffheight+=displayHeight % 8 ? 1:0; |
||||
|
pinMode(_cs, OUTPUT); |
||||
|
pinMode(_dc, OUTPUT); |
||||
|
//pinMode(_ledA, OUTPUT);
|
||||
|
if (_cs != (uint8_t) -1) { |
||||
|
pinMode(_cs, OUTPUT); |
||||
|
} |
||||
|
pinMode(_rst, OUTPUT); |
||||
|
|
||||
|
#ifdef ESP_PLATFORM |
||||
|
_spi->begin(_clk,_miso,_mosi,-1); |
||||
|
#else |
||||
|
_spi->begin(); |
||||
|
#endif |
||||
|
_spi->setClockDivider (SPI_CLOCK_DIV2); |
||||
|
|
||||
|
// Pulse Reset low for 10ms
|
||||
|
digitalWrite(_rst, HIGH); |
||||
|
delay(1); |
||||
|
digitalWrite(_rst, LOW); |
||||
|
delay(10); |
||||
|
digitalWrite(_rst, HIGH); |
||||
|
_spi->begin (); |
||||
|
//digitalWrite(_ledA, LED_A_ON);
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
void display(void) { |
||||
|
#ifdef OLEDDISPLAY_DOUBLE_BUFFER |
||||
|
|
||||
|
uint16_t minBoundY = UINT16_MAX; |
||||
|
uint16_t maxBoundY = 0; |
||||
|
|
||||
|
uint16_t minBoundX = UINT16_MAX; |
||||
|
uint16_t maxBoundX = 0; |
||||
|
|
||||
|
uint16_t x, y; |
||||
|
|
||||
|
// Calculate the Y bounding box of changes
|
||||
|
// and copy buffer[pos] to buffer_back[pos];
|
||||
|
for (y = 0; y < _buffheight; y++) { |
||||
|
for (x = 0; x < displayWidth; x++) { |
||||
|
//Serial.printf("x %d y %d\r\n",x,y);
|
||||
|
uint16_t pos = x + y * displayWidth; |
||||
|
if (buffer[pos] != buffer_back[pos]) { |
||||
|
minBoundY = min(minBoundY, y); |
||||
|
maxBoundY = max(maxBoundY, y); |
||||
|
minBoundX = min(minBoundX, x); |
||||
|
maxBoundX = max(maxBoundX, x); |
||||
|
} |
||||
|
buffer_back[pos] = buffer[pos]; |
||||
|
} |
||||
|
yield(); |
||||
|
} |
||||
|
|
||||
|
// If the minBoundY wasn't updated
|
||||
|
// we can savely assume that buffer_back[pos] == buffer[pos]
|
||||
|
// holdes true for all values of pos
|
||||
|
if (minBoundY == UINT16_MAX) return; |
||||
|
|
||||
|
set_CS(LOW); |
||||
|
_spi->beginTransaction(_spiSettings); |
||||
|
|
||||
|
for (y = minBoundY; y <= maxBoundY; y++) |
||||
|
{ |
||||
|
for(int temp = 0; temp<8;temp++) |
||||
|
{ |
||||
|
//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
|
||||
|
setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1); |
||||
|
//setAddrWindow(y*8+temp,minBoundX,1,maxBoundX-minBoundX+1);
|
||||
|
uint32_t const pixbufcount = maxBoundX-minBoundX+1; |
||||
|
uint16_t *pixbuf = (uint16_t *)rtos_malloc(2 * pixbufcount); |
||||
|
for (x = minBoundX; x <= maxBoundX; x++) |
||||
|
{ |
||||
|
pixbuf[x-minBoundX] = ((buffer[x + y * displayWidth]>>temp)&0x01)==1?_RGB:0; |
||||
|
} |
||||
|
#ifdef ESP_PLATFORM |
||||
|
_spi->transferBytes((uint8_t *)pixbuf, NULL, 2 * pixbufcount); |
||||
|
#else |
||||
|
_spi->transfer(pixbuf, NULL, 2 * pixbufcount); |
||||
|
#endif |
||||
|
rtos_free(pixbuf); |
||||
|
} |
||||
|
} |
||||
|
_spi->endTransaction(); |
||||
|
set_CS(HIGH); |
||||
|
|
||||
|
#else |
||||
|
set_CS(LOW); |
||||
|
_spi->beginTransaction(_spiSettings); |
||||
|
uint8_t x, y; |
||||
|
for (y = 0; y < _buffheight; y++) |
||||
|
{ |
||||
|
for(int temp = 0; temp<8;temp++) |
||||
|
{ |
||||
|
//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
|
||||
|
//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
|
||||
|
setAddrWindow(y*8+temp,0,1,displayWidth); |
||||
|
uint32_t const pixbufcount = displayWidth; |
||||
|
uint16_t *pixbuf = (uint16_t *)rtos_malloc(2 * pixbufcount); |
||||
|
for (x = 0; x < displayWidth; x++) |
||||
|
{ |
||||
|
pixbuf[x] = ((buffer[x + y * displayWidth]>>temp)&0x01)==1?_RGB:0; |
||||
|
} |
||||
|
#ifdef ESP_PLATFORM |
||||
|
_spi->transferBytes((uint8_t *)pixbuf, NULL, 2 * pixbufcount); |
||||
|
#else |
||||
|
_spi->transfer(pixbuf, NULL, 2 * pixbufcount); |
||||
|
#endif |
||||
|
rtos_free(pixbuf); |
||||
|
} |
||||
|
} |
||||
|
_spi->endTransaction(); |
||||
|
set_CS(HIGH); |
||||
|
|
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
virtual void resetOrientation() { |
||||
|
uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MV|ST77XX_MADCTL_MX; |
||||
|
sendCommand(ST77XX_MADCTL); |
||||
|
WriteData(madctl); |
||||
|
delay(10); |
||||
|
} |
||||
|
|
||||
|
virtual void flipScreenVertically() { |
||||
|
uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MV|ST77XX_MADCTL_MY; |
||||
|
sendCommand(ST77XX_MADCTL); |
||||
|
WriteData(madctl); |
||||
|
delay(10); |
||||
|
} |
||||
|
|
||||
|
virtual void mirrorScreen() { |
||||
|
uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MV|ST77XX_MADCTL_MX|ST77XX_MADCTL_MY; |
||||
|
sendCommand(ST77XX_MADCTL); |
||||
|
WriteData(madctl); |
||||
|
delay(10); |
||||
|
} |
||||
|
|
||||
|
virtual void landscapeScreen() { |
||||
|
|
||||
|
|
||||
|
uint8_t madctl = ST77XX_MADCTL_RGB; |
||||
|
sendCommand(ST77XX_MADCTL); |
||||
|
WriteData(madctl); |
||||
|
delay(10); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void setRGB(uint16_t c) |
||||
|
{ |
||||
|
|
||||
|
this->_RGB=0x00|c>>8|c<<8&0xFF00; |
||||
|
} |
||||
|
|
||||
|
void displayOn(void) { |
||||
|
//sendCommand(DISPLAYON);
|
||||
|
} |
||||
|
|
||||
|
void displayOff(void) { |
||||
|
//sendCommand(DISPLAYOFF);
|
||||
|
} |
||||
|
|
||||
|
void drawBitmap(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm) { |
||||
|
int16_t widthInXbm = (width + 7) / 8; |
||||
|
uint8_t data = 0; |
||||
|
|
||||
|
for(int16_t y = 0; y < height; y++) { |
||||
|
for(int16_t x = 0; x < width; x++ ) { |
||||
|
if (x & 7) { |
||||
|
data <<= 1; // Move a bit
|
||||
|
} else { // Read new data every 8 bit
|
||||
|
data = pgm_read_byte(xbm + (x / 8) + y * widthInXbm); |
||||
|
} |
||||
|
// if there is a bit draw it
|
||||
|
if (data & 0x80) { |
||||
|
setPixel(xMove + x, yMove + y); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//#define ST77XX_MADCTL_MY 0x80
|
||||
|
//#define ST77XX_MADCTL_MX 0x40
|
||||
|
//#define ST77XX_MADCTL_MV 0x20
|
||||
|
//#define ST77XX_MADCTL_ML 0x10
|
||||
|
protected: |
||||
|
// Send all the init commands
|
||||
|
virtual void sendInitCommands() |
||||
|
{ |
||||
|
sendCommand(ST77XX_SWRESET); // 1: Software reset, no args, w/delay
|
||||
|
delay(150); |
||||
|
|
||||
|
sendCommand(ST77XX_SLPOUT); // 2: Out of sleep mode, no args, w/delay
|
||||
|
delay(10); |
||||
|
|
||||
|
sendCommand(ST77XX_COLMOD); // 3: Set color mode, 16-bit color
|
||||
|
WriteData(0x55); |
||||
|
delay(10); |
||||
|
|
||||
|
sendCommand(ST77XX_MADCTL); // 4: Mem access ctrl (directions), Row/col addr, bottom-top refresh
|
||||
|
WriteData(0x08); |
||||
|
|
||||
|
sendCommand(ST77XX_CASET); // 5: Column addr set,
|
||||
|
WriteData(0x00); |
||||
|
WriteData(0x00); // XSTART = 0
|
||||
|
WriteData(0x00); |
||||
|
WriteData(240); // XEND = 240
|
||||
|
|
||||
|
sendCommand(ST77XX_RASET); // 6: Row addr set,
|
||||
|
WriteData(0x00); |
||||
|
WriteData(0x00); // YSTART = 0
|
||||
|
WriteData(320>>8); |
||||
|
WriteData(320&0xFF); // YSTART = 320
|
||||
|
|
||||
|
sendCommand(ST77XX_SLPOUT); // 7: hack
|
||||
|
delay(10); |
||||
|
|
||||
|
sendCommand(ST77XX_NORON); // 8: Normal display on, no args, w/delay
|
||||
|
delay(10); |
||||
|
|
||||
|
sendCommand(ST77XX_DISPON); // 9: Main screen turn on, no args, delay
|
||||
|
delay(10); |
||||
|
|
||||
|
sendCommand(ST77XX_INVON); // 10: invert
|
||||
|
delay(10); |
||||
|
|
||||
|
//uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MX;
|
||||
|
uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MV|ST77XX_MADCTL_MX; |
||||
|
sendCommand(ST77XX_MADCTL); |
||||
|
WriteData(madctl); |
||||
|
delay(10); |
||||
|
setRGB(ST77XX_GREEN); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private: |
||||
|
|
||||
|
void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { |
||||
|
x += (320-displayWidth)/2; |
||||
|
y += (240-displayHeight)/2; |
||||
|
uint32_t xa = ((uint32_t)x << 16) | (x + w - 1); |
||||
|
uint32_t ya = ((uint32_t)y << 16) | (y + h - 1); |
||||
|
|
||||
|
writeCommand(ST77XX_CASET); // Column addr set
|
||||
|
SPI_WRITE32(xa); |
||||
|
|
||||
|
writeCommand(ST77XX_RASET); // Row addr set
|
||||
|
SPI_WRITE32(ya); |
||||
|
|
||||
|
writeCommand(ST77XX_RAMWR); // write to RAM
|
||||
|
} |
||||
|
int getBufferOffset(void) { |
||||
|
return 0; |
||||
|
} |
||||
|
inline void set_CS(bool level) { |
||||
|
if (_cs != (uint8_t) -1) { |
||||
|
digitalWrite(_cs, level); |
||||
|
} |
||||
|
}; |
||||
|
inline void sendCommand(uint8_t com) __attribute__((always_inline)){ |
||||
|
set_CS(HIGH); |
||||
|
digitalWrite(_dc, LOW); |
||||
|
set_CS(LOW); |
||||
|
_spi->beginTransaction(_spiSettings); |
||||
|
_spi->transfer(com); |
||||
|
_spi->endTransaction(); |
||||
|
set_CS(HIGH); |
||||
|
digitalWrite(_dc, HIGH); |
||||
|
} |
||||
|
|
||||
|
inline void WriteData(uint8_t data) __attribute__((always_inline)){ |
||||
|
digitalWrite(_cs, LOW); |
||||
|
_spi->beginTransaction(_spiSettings); |
||||
|
_spi->transfer(data); |
||||
|
_spi->endTransaction(); |
||||
|
digitalWrite(_cs, HIGH); |
||||
|
} |
||||
|
void SPI_WRITE32(uint32_t l) |
||||
|
{ |
||||
|
_spi->transfer(l >> 24); |
||||
|
_spi->transfer(l >> 16); |
||||
|
_spi->transfer(l >> 8); |
||||
|
_spi->transfer(l); |
||||
|
} |
||||
|
void writeCommand(uint8_t cmd) { |
||||
|
digitalWrite(_dc, LOW); |
||||
|
_spi->transfer(cmd); |
||||
|
digitalWrite(_dc, HIGH); |
||||
|
} |
||||
|
|
||||
|
// Private functions
|
||||
|
void setGeometry(OLEDDISPLAY_GEOMETRY g, uint16_t width, uint16_t height) { |
||||
|
this->geometry = g; |
||||
|
|
||||
|
switch (g) { |
||||
|
case GEOMETRY_128_128: |
||||
|
this->displayWidth = 128; |
||||
|
this->displayHeight = 128; |
||||
|
break; |
||||
|
case GEOMETRY_128_64: |
||||
|
this->displayWidth = 128; |
||||
|
this->displayHeight = 64; |
||||
|
break; |
||||
|
case GEOMETRY_128_32: |
||||
|
this->displayWidth = 128; |
||||
|
this->displayHeight = 32; |
||||
|
break; |
||||
|
case GEOMETRY_64_48: |
||||
|
this->displayWidth = 64; |
||||
|
this->displayHeight = 48; |
||||
|
break; |
||||
|
case GEOMETRY_64_32: |
||||
|
this->displayWidth = 64; |
||||
|
this->displayHeight = 32; |
||||
|
break; |
||||
|
case GEOMETRY_RAWMODE: |
||||
|
this->displayWidth = width > 0 ? width : 128; |
||||
|
this->displayHeight = height > 0 ? height : 64; |
||||
|
break; |
||||
|
} |
||||
|
uint8_t tmp=displayHeight % 8; |
||||
|
uint8_t _buffheight=displayHeight / 8; |
||||
|
|
||||
|
if(tmp!=0) |
||||
|
_buffheight++; |
||||
|
this->displayBufferSize = displayWidth * _buffheight ; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,66 @@ |
|||||
|
[Generic_E22] |
||||
|
extends = esp32_base |
||||
|
board = esp32doit-devkit-v1 |
||||
|
build_flags = |
||||
|
${esp32_base.build_flags} |
||||
|
-I variants/generic-e22 |
||||
|
-D GENERIC_E22 |
||||
|
-D P_LORA_TX_LED=2 |
||||
|
-D PIN_VBAT_READ=35 |
||||
|
-D P_LORA_DIO_1=33 |
||||
|
-D P_LORA_NSS=18 |
||||
|
-D P_LORA_RESET=RADIOLIB_NC |
||||
|
-D P_LORA_BUSY=32 |
||||
|
-D P_LORA_SCLK=5 |
||||
|
-D P_LORA_MOSI=27 |
||||
|
-D P_LORA_MISO=19 |
||||
|
-D SX126X_TXEN=13 |
||||
|
-D SX126X_RXEN=14 |
||||
|
-D PIN_BOARD_SDA=21 |
||||
|
-D PIN_BOARD_SCL=22 |
||||
|
-D SX126X_DIO2_AS_RF_SWITCH=true |
||||
|
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 |
||||
|
-D SX126X_CURRENT_LIMIT=130.0f ; for best TX power! |
||||
|
build_src_filter = ${esp32_base.build_src_filter} |
||||
|
+<../variants/generic-e22> |
||||
|
lib_deps = |
||||
|
${esp32_base.lib_deps} |
||||
|
adafruit/Adafruit SSD1306 @ ^2.5.13 |
||||
|
|
||||
|
[env:Generic_E22_sx1262_repeater] |
||||
|
extends = Generic_E22 |
||||
|
build_src_filter = ${Generic_E22.build_src_filter} |
||||
|
+<../examples/simple_repeater/main.cpp> |
||||
|
build_flags = |
||||
|
${Generic_E22.build_flags} |
||||
|
-D RADIO_CLASS=CustomSX1262 |
||||
|
-D WRAPPER_CLASS=CustomSX1262Wrapper |
||||
|
-D LORA_TX_POWER=22 |
||||
|
-D ADVERT_NAME='"E22 Repeater"' |
||||
|
-D ADVERT_LAT=0.0 |
||||
|
-D ADVERT_LON=0.0 |
||||
|
-D ADMIN_PASSWORD='"password"' |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
lib_deps = |
||||
|
${Generic_E22.lib_deps} |
||||
|
${esp32_ota.lib_deps} |
||||
|
|
||||
|
[env:Generic_E22_sx1268_repeater] |
||||
|
extends = Generic_E22 |
||||
|
build_src_filter = ${Generic_E22.build_src_filter} |
||||
|
+<../examples/simple_repeater/main.cpp> |
||||
|
build_flags = |
||||
|
${Generic_E22.build_flags} |
||||
|
-D RADIO_CLASS=CustomSX1268 |
||||
|
-D WRAPPER_CLASS=CustomSX1268Wrapper |
||||
|
-D LORA_TX_POWER=22 |
||||
|
-D ADVERT_NAME='"E22 Repeater"' |
||||
|
-D ADVERT_LAT=0.0 |
||||
|
-D ADVERT_LON=0.0 |
||||
|
-D ADMIN_PASSWORD='"password"' |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
lib_deps = |
||||
|
${Generic_E22.lib_deps} |
||||
|
${esp32_ota.lib_deps} |
||||
@ -0,0 +1,79 @@ |
|||||
|
#include <Arduino.h> |
||||
|
#include "target.h" |
||||
|
|
||||
|
ESP32Board board; |
||||
|
|
||||
|
#if defined(P_LORA_SCLK) |
||||
|
static SPIClass spi; |
||||
|
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); |
||||
|
#else |
||||
|
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); |
||||
|
#endif |
||||
|
|
||||
|
WRAPPER_CLASS radio_driver(radio, board); |
||||
|
|
||||
|
ESP32RTCClock fallback_clock; |
||||
|
AutoDiscoverRTCClock rtc_clock(fallback_clock); |
||||
|
|
||||
|
#ifndef LORA_CR |
||||
|
#define LORA_CR 5 |
||||
|
#endif |
||||
|
|
||||
|
bool radio_init() { |
||||
|
fallback_clock.begin(); |
||||
|
rtc_clock.begin(Wire); |
||||
|
|
||||
|
#ifdef SX126X_DIO3_TCXO_VOLTAGE |
||||
|
float tcxo = SX126X_DIO3_TCXO_VOLTAGE; |
||||
|
#else |
||||
|
float tcxo = 1.6f; |
||||
|
#endif |
||||
|
|
||||
|
#if defined(P_LORA_SCLK) |
||||
|
spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); |
||||
|
#endif |
||||
|
int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo); |
||||
|
if (status != RADIOLIB_ERR_NONE) { |
||||
|
Serial.print("ERROR: radio init failed: "); |
||||
|
Serial.println(status); |
||||
|
return false; // fail
|
||||
|
} |
||||
|
|
||||
|
radio.setCRC(1); |
||||
|
|
||||
|
#if defined(SX126X_RXEN) && defined(SX126X_TXEN) |
||||
|
radio.setRfSwitchPins(SX126X_RXEN, SX126X_TXEN); |
||||
|
#endif |
||||
|
|
||||
|
#ifdef SX126X_CURRENT_LIMIT |
||||
|
radio.setCurrentLimit(SX126X_CURRENT_LIMIT); |
||||
|
#endif |
||||
|
#ifdef SX126X_DIO2_AS_RF_SWITCH |
||||
|
radio.setDio2AsRfSwitch(SX126X_DIO2_AS_RF_SWITCH); |
||||
|
#endif |
||||
|
#ifdef SX126X_RX_BOOSTED_GAIN |
||||
|
radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN); |
||||
|
#endif |
||||
|
|
||||
|
return true; // success
|
||||
|
} |
||||
|
|
||||
|
uint32_t radio_get_rng_seed() { |
||||
|
return radio.random(0x7FFFFFFF); |
||||
|
} |
||||
|
|
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { |
||||
|
radio.setFrequency(freq); |
||||
|
radio.setSpreadingFactor(sf); |
||||
|
radio.setBandwidth(bw); |
||||
|
radio.setCodingRate(cr); |
||||
|
} |
||||
|
|
||||
|
void radio_set_tx_power(uint8_t dbm) { |
||||
|
radio.setOutputPower(dbm); |
||||
|
} |
||||
|
|
||||
|
mesh::LocalIdentity radio_new_identity() { |
||||
|
RadioNoiseListener rng(radio); |
||||
|
return mesh::LocalIdentity(&rng); // create new random identity
|
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#define RADIOLIB_STATIC_ONLY 1 |
||||
|
#include <RadioLib.h> |
||||
|
#include <helpers/RadioLibWrappers.h> |
||||
|
#include <helpers/ESP32Board.h> |
||||
|
#include <helpers/CustomSX1262Wrapper.h> |
||||
|
#include <helpers/CustomSX1268Wrapper.h> |
||||
|
#include <helpers/AutoDiscoverRTCClock.h> |
||||
|
|
||||
|
extern ESP32Board board; |
||||
|
extern WRAPPER_CLASS radio_driver; |
||||
|
extern AutoDiscoverRTCClock rtc_clock; |
||||
|
|
||||
|
bool radio_init(); |
||||
|
uint32_t radio_get_rng_seed(); |
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
||||
|
void radio_set_tx_power(uint8_t dbm); |
||||
|
mesh::LocalIdentity radio_new_identity(); |
||||
@ -0,0 +1,44 @@ |
|||||
|
// For OLED LCD
|
||||
|
#define I2C_SDA 21 |
||||
|
#define I2C_SCL 22 |
||||
|
|
||||
|
// For GPS, 'undef's not needed
|
||||
|
#define GPS_TX_PIN 15 |
||||
|
#define GPS_RX_PIN 12 |
||||
|
#define PIN_GPS_EN 4 |
||||
|
#define GPS_POWER_TOGGLE // Moved definition from platformio.ini to here
|
||||
|
|
||||
|
#define BUTTON_PIN 39 // The middle button GPIO on the T-Beam
|
||||
|
#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
|
||||
|
#define ADC_CHANNEL ADC1_GPIO35_CHANNEL |
||||
|
#define ADC_MULTIPLIER 1.85 // (R1 = 470k, R2 = 680k)
|
||||
|
#define EXT_PWR_DETECT 4 // Pin to detect connected external power source for LILYGO® TTGO T-Energy T18 and other DIY boards
|
||||
|
#define EXT_NOTIFY_OUT 12 // Overridden default pin to use for Ext Notify Module (#975).
|
||||
|
#define LED_PIN 2 // add status LED (compatible with core-pcb and DIY targets)
|
||||
|
|
||||
|
// Radio
|
||||
|
#define USE_SX1262 // E22-900M30S uses SX1262
|
||||
|
#define USE_SX1268 // E22-400M30S uses SX1268
|
||||
|
#define SX126X_MAX_POWER 22 // Outputting 22dBm from SX1262 results in ~30dBm E22-900M30S output (module only uses last stage of the YP2233W PA)
|
||||
|
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 // E22 series TCXO reference voltage is 1.8V
|
||||
|
|
||||
|
#define SX126X_CS 18 // EBYTE module's NSS pin
|
||||
|
#define SX126X_SCK 5 // EBYTE module's SCK pin
|
||||
|
#define SX126X_MOSI 27 // EBYTE module's MOSI pin
|
||||
|
#define SX126X_MISO 19 // EBYTE module's MISO pin
|
||||
|
#define SX126X_RESET 23 // EBYTE module's NRST pin
|
||||
|
#define SX126X_BUSY 32 // EBYTE module's BUSY pin
|
||||
|
#define SX126X_DIO1 33 // EBYTE module's DIO1 pin
|
||||
|
|
||||
|
// The E22's TXEN pin is connected to MCU pin, E22's RXEN pin is connected to MCU pin (allows for ramping up PA before transmission
|
||||
|
// Don't define DIO2_AS_RF_SWITCH because we only use DIO2 or an MCU pin mutually exclusively to connect to E22's TXEN (to prevent
|
||||
|
// a short if they are both connected at the same time and there's a slight non-neglibible delay and/or voltage difference between
|
||||
|
// DIO2 and TXEN).
|
||||
|
#define SX126X_TXEN 13 // Schematic connects EBYTE module's TXEN pin to MCU
|
||||
|
#define SX126X_RXEN 14 // Schematic connects EBYTE module's RXEN pin to MCU
|
||||
|
|
||||
|
#define LORA_CS SX126X_CS // Compatibility with variant file configuration structure
|
||||
|
#define LORA_SCK SX126X_SCK // Compatibility with variant file configuration structure
|
||||
|
#define LORA_MOSI SX126X_MOSI // Compatibility with variant file configuration structure
|
||||
|
#define LORA_MISO SX126X_MISO // Compatibility with variant file configuration structure
|
||||
|
#define LORA_DIO1 SX126X_DIO1 // Compatibility with variant file configuration structure
|
||||
@ -0,0 +1,68 @@ |
|||||
|
[LilyGo_TBeam_SX1262] |
||||
|
extends = esp32_base |
||||
|
board = ttgo-t-beam |
||||
|
build_flags = |
||||
|
${esp32_base.build_flags} |
||||
|
-I variants/lilygo_tbeam_SX1262 |
||||
|
-D LILYGO_TBEAM_SX1262 |
||||
|
-D SX126X_DIO2_AS_RF_SWITCH=true |
||||
|
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 |
||||
|
-D SX126X_CURRENT_LIMIT=140 |
||||
|
-D SX126X_RX_BOOSTED_GAIN=1 |
||||
|
-D RADIO_CLASS=CustomSX1262 |
||||
|
-D WRAPPER_CLASS=CustomSX1262Wrapper |
||||
|
-D LORA_TX_POWER=22 |
||||
|
-D P_LORA_TX_LED=4 |
||||
|
-D PIN_BOARD_SDA=21 |
||||
|
-D PIN_BOARD_SCL=22 |
||||
|
-D PIN_USER_BTN=38 |
||||
|
build_src_filter = ${esp32_base.build_src_filter} |
||||
|
+<../variants/lilygo_tbeam_SX1262> |
||||
|
board_build.partitions = min_spiffs.csv ; get around 4mb flash limit |
||||
|
lib_deps = |
||||
|
${esp32_base.lib_deps} |
||||
|
lewisxhe/XPowersLib@^0.2.7 |
||||
|
adafruit/Adafruit SSD1306 @ ^2.5.13 |
||||
|
|
||||
|
[env:Tbeam_SX1262_companion_radio_ble] |
||||
|
extends = LilyGo_TBeam_SX1262 |
||||
|
board_build.upload.maximum_ram_size=2000000 |
||||
|
build_flags = |
||||
|
${LilyGo_TBeam_SX1262.build_flags} |
||||
|
-D DISPLAY_CLASS=SSD1306Display |
||||
|
-D MAX_CONTACTS=100 |
||||
|
-D MAX_GROUP_CHANNELS=8 |
||||
|
-D BLE_PIN_CODE=123456 |
||||
|
; -D BLE_DEBUG_LOGGING=1 |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
; -D RADIOLIB_DEBUG_BASIC=1 |
||||
|
; -D ENABLE_PRIVATE_KEY_IMPORT=1 |
||||
|
; -D ENABLE_PRIVATE_KEY_EXPORT=1 |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
build_src_filter = ${LilyGo_TBeam_SX1262.build_src_filter} |
||||
|
+<helpers/esp32/*.cpp> |
||||
|
+<helpers/ui/SSD1306Display.cpp> |
||||
|
+<../examples/companion_radio> |
||||
|
lib_deps = |
||||
|
${LilyGo_TBeam_SX1262.lib_deps} |
||||
|
densaugeo/base64 @ ~1.4.0 |
||||
|
|
||||
|
[env:Tbeam_SX1262_repeater] |
||||
|
extends = LilyGo_TBeam_SX1262 |
||||
|
build_flags = |
||||
|
${LilyGo_TBeam_SX1262.build_flags} |
||||
|
-D DISPLAY_CLASS=SSD1306Display |
||||
|
-D ADVERT_NAME='"Tbeam SX1262 Repeater"' |
||||
|
-D ADVERT_LAT=0.0 |
||||
|
-D ADVERT_LON=0.0 |
||||
|
-D ADMIN_PASSWORD='"password"' |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
build_src_filter = ${LilyGo_TBeam_SX1262.build_src_filter} |
||||
|
+<helpers/ui/SSD1306Display.cpp> |
||||
|
+<../examples/simple_repeater> |
||||
|
lib_deps = |
||||
|
${LilyGo_TBeam_SX1262.lib_deps} |
||||
|
${esp32_ota.lib_deps} |
||||
@ -0,0 +1,65 @@ |
|||||
|
#include <Arduino.h> |
||||
|
#include "target.h" |
||||
|
|
||||
|
TBeamBoardSX1262 board; |
||||
|
|
||||
|
#if defined(P_LORA_SCLK) |
||||
|
static SPIClass spi; |
||||
|
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); |
||||
|
#else |
||||
|
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); |
||||
|
#endif |
||||
|
|
||||
|
WRAPPER_CLASS radio_driver(radio, board); |
||||
|
|
||||
|
ESP32RTCClock fallback_clock; |
||||
|
AutoDiscoverRTCClock rtc_clock(fallback_clock); |
||||
|
|
||||
|
#ifndef LORA_CR |
||||
|
#define LORA_CR 5 |
||||
|
#endif |
||||
|
|
||||
|
bool radio_init() { |
||||
|
fallback_clock.begin(); |
||||
|
rtc_clock.begin(Wire); |
||||
|
|
||||
|
#ifdef SX126X_DIO3_TCXO_VOLTAGE |
||||
|
float tcxo = SX126X_DIO3_TCXO_VOLTAGE; |
||||
|
#else |
||||
|
float tcxo = 1.6f; |
||||
|
#endif |
||||
|
|
||||
|
#if defined(P_LORA_SCLK) |
||||
|
spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); |
||||
|
#endif |
||||
|
int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo); |
||||
|
if (status != RADIOLIB_ERR_NONE) { |
||||
|
Serial.print("ERROR: radio init failed: "); |
||||
|
Serial.println(status); |
||||
|
return false; // fail
|
||||
|
} |
||||
|
|
||||
|
radio.setCRC(1); |
||||
|
|
||||
|
return true; // success
|
||||
|
} |
||||
|
|
||||
|
uint32_t radio_get_rng_seed() { |
||||
|
return radio.random(0x7FFFFFFF); |
||||
|
} |
||||
|
|
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { |
||||
|
radio.setFrequency(freq); |
||||
|
radio.setSpreadingFactor(sf); |
||||
|
radio.setBandwidth(bw); |
||||
|
radio.setCodingRate(cr); |
||||
|
} |
||||
|
|
||||
|
void radio_set_tx_power(uint8_t dbm) { |
||||
|
radio.setOutputPower(dbm); |
||||
|
} |
||||
|
|
||||
|
mesh::LocalIdentity radio_new_identity() { |
||||
|
RadioNoiseListener rng(radio); |
||||
|
return mesh::LocalIdentity(&rng); // create new random identity
|
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#define RADIOLIB_STATIC_ONLY 1 |
||||
|
#include <RadioLib.h> |
||||
|
#include <helpers/RadioLibWrappers.h> |
||||
|
#include <helpers/TBeamBoardSX1262.h> |
||||
|
#include <helpers/CustomSX1262Wrapper.h> |
||||
|
#include <helpers/AutoDiscoverRTCClock.h> |
||||
|
|
||||
|
extern TBeamBoardSX1262 board; |
||||
|
extern WRAPPER_CLASS radio_driver; |
||||
|
extern AutoDiscoverRTCClock rtc_clock; |
||||
|
|
||||
|
bool radio_init(); |
||||
|
uint32_t radio_get_rng_seed(); |
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
||||
|
void radio_set_tx_power(uint8_t dbm); |
||||
|
mesh::LocalIdentity radio_new_identity(); |
||||
@ -0,0 +1,103 @@ |
|||||
|
[picow] |
||||
|
extends = rp2040_base |
||||
|
platform = https://github.com/maxgerhardt/platform-raspberrypi.git |
||||
|
board = rpipicow |
||||
|
board_build.core = earlephilhower |
||||
|
board_build.filesystem_size = 0.5m |
||||
|
build_flags = ${rp2040_base.build_flags} |
||||
|
-I variants/picow |
||||
|
; -D PICOW |
||||
|
; -D HW_SPI1_DEVICE |
||||
|
-D SX126X_CURRENT_LIMIT=130 |
||||
|
-D RADIO_CLASS=CustomSX1262 |
||||
|
-D WRAPPER_CLASS=CustomSX1262Wrapper |
||||
|
-D LORA_TX_POWER=22 |
||||
|
-D SX126X_RX_BOOSTED_GAIN=1 |
||||
|
build_src_filter = ${rp2040_base.build_src_filter} |
||||
|
+<helpers/rp2040/*.cpp> |
||||
|
+<../variants/picow> |
||||
|
lib_deps = ${rp2040_base.lib_deps} |
||||
|
|
||||
|
[env:PicoW_Repeater] |
||||
|
extends = picow |
||||
|
build_flags = ${picow.build_flags} |
||||
|
-D ADVERT_NAME='"PicoW Repeater"' |
||||
|
-D ADVERT_LAT=0.0 |
||||
|
-D ADVERT_LON=0.0 |
||||
|
-D ADMIN_PASSWORD='"password"' |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
build_src_filter = ${picow.build_src_filter} |
||||
|
+<../examples/simple_repeater> |
||||
|
|
||||
|
[env:PicoW_room_server] |
||||
|
extends = picow |
||||
|
build_flags = ${picow.build_flags} |
||||
|
-D ADVERT_NAME='"Test Room"' |
||||
|
-D ADVERT_LAT=0.0 |
||||
|
-D ADVERT_LON=0.0 |
||||
|
-D ADMIN_PASSWORD='"password"' |
||||
|
-D ROOM_PASSWORD='"hello"' |
||||
|
; -D MESH_PACKET_LOGGING=1 |
||||
|
; -D MESH_DEBUG=1 |
||||
|
build_src_filter = ${picow.build_src_filter} |
||||
|
+<../examples/simple_room_server> |
||||
|
|
||||
|
[env:PicoW_companion_radio_usb] |
||||
|
extends = picow |
||||
|
build_flags = ${picow.build_flags} |
||||
|
-D MAX_CONTACTS=100 |
||||
|
-D MAX_GROUP_CHANNELS=8 |
||||
|
; -D ENABLE_PRIVATE_KEY_IMPORT=1 |
||||
|
; -D ENABLE_PRIVATE_KEY_EXPORT=1 |
||||
|
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 |
||||
|
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 |
||||
|
build_src_filter = ${picow.build_src_filter} |
||||
|
+<../examples/companion_radio> |
||||
|
lib_deps = ${picow.lib_deps} |
||||
|
densaugeo/base64 @ ~1.4.0 |
||||
|
|
||||
|
; [env:PicoW_companion_radio_ble] |
||||
|
; extends = picow |
||||
|
; build_flags = ${picow.build_flags} |
||||
|
; -D MAX_CONTACTS=100 |
||||
|
; -D MAX_GROUP_CHANNELS=8 |
||||
|
; -D BLE_PIN_CODE=123456 |
||||
|
; -D BLE_DEBUG_LOGGING=1 |
||||
|
; ; -D ENABLE_PRIVATE_KEY_IMPORT=1 |
||||
|
; ; -D ENABLE_PRIVATE_KEY_EXPORT=1 |
||||
|
; ; -D MESH_PACKET_LOGGING=1 |
||||
|
; ; -D MESH_DEBUG=1 |
||||
|
; build_src_filter = ${picow.build_src_filter} |
||||
|
; +<../examples/companion_radio> |
||||
|
; lib_deps = ${picow.lib_deps} |
||||
|
; densaugeo/base64 @ ~1.4.0 |
||||
|
|
||||
|
; [env:PicoW_companion_radio_wifi] |
||||
|
; extends = picow |
||||
|
; build_flags = ${picow.build_flags} |
||||
|
; -D MAX_CONTACTS=100 |
||||
|
; -D MAX_GROUP_CHANNELS=8 |
||||
|
; -D WIFI_DEBUG_LOGGING=1 |
||||
|
; -D WIFI_SSID='"myssid"' |
||||
|
; -D WIFI_PWD='"mypwd"' |
||||
|
; ; -D ENABLE_PRIVATE_KEY_IMPORT=1 |
||||
|
; ; -D ENABLE_PRIVATE_KEY_EXPORT=1 |
||||
|
; ; -D MESH_PACKET_LOGGING=1 |
||||
|
; ; -D MESH_DEBUG=1 |
||||
|
; build_src_filter = ${picow.build_src_filter} |
||||
|
; +<../examples/companion_radio> |
||||
|
; lib_deps = ${picow.lib_deps} |
||||
|
; densaugeo/base64 @ ~1.4.0 |
||||
|
|
||||
|
[env:PicoW_terminal_chat] |
||||
|
extends = picow |
||||
|
build_flags = ${picow.build_flags} |
||||
|
-D MAX_CONTACTS=100 |
||||
|
-D MAX_GROUP_CHANNELS=1 |
||||
|
-D MESH_PACKET_LOGGING=1 |
||||
|
-D MESH_DEBUG=1 |
||||
|
build_src_filter = ${picow.build_src_filter} |
||||
|
+<../examples/simple_secure_chat/main.cpp> |
||||
|
lib_deps = ${picow.lib_deps} |
||||
|
densaugeo/base64 @ ~1.4.0 |
||||
@ -0,0 +1,73 @@ |
|||||
|
#include <Arduino.h> |
||||
|
#include "target.h" |
||||
|
#include <helpers/ArduinoHelpers.h> |
||||
|
|
||||
|
PicoWBoard board; |
||||
|
|
||||
|
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI1); |
||||
|
|
||||
|
WRAPPER_CLASS radio_driver(radio, board); |
||||
|
|
||||
|
VolatileRTCClock fallback_clock; |
||||
|
AutoDiscoverRTCClock rtc_clock(fallback_clock); |
||||
|
|
||||
|
#ifndef LORA_CR |
||||
|
#define LORA_CR 5 |
||||
|
#endif |
||||
|
|
||||
|
bool radio_init() { |
||||
|
rtc_clock.begin(Wire); |
||||
|
|
||||
|
#ifdef SX126X_DIO3_TCXO_VOLTAGE |
||||
|
float tcxo = SX126X_DIO3_TCXO_VOLTAGE; |
||||
|
#else |
||||
|
float tcxo = 1.6f; |
||||
|
#endif |
||||
|
|
||||
|
SPI1.setMISO(P_LORA_MISO); |
||||
|
//SPI1.setCS(P_LORA_NSS); // Setting CS results in freeze
|
||||
|
SPI1.setSCK(P_LORA_SCLK); |
||||
|
SPI1.setMOSI(P_LORA_MOSI); |
||||
|
|
||||
|
SPI1.begin(); |
||||
|
int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8, tcxo); |
||||
|
if (status != RADIOLIB_ERR_NONE) { |
||||
|
Serial.print("ERROR: radio init failed: "); |
||||
|
Serial.println(status); |
||||
|
return false; // fail
|
||||
|
} |
||||
|
|
||||
|
radio.setCRC(1); |
||||
|
|
||||
|
#ifdef SX126X_CURRENT_LIMIT |
||||
|
radio.setCurrentLimit(SX126X_CURRENT_LIMIT); |
||||
|
#endif |
||||
|
#ifdef SX126X_DIO2_AS_RF_SWITCH |
||||
|
radio.setDio2AsRfSwitch(SX126X_DIO2_AS_RF_SWITCH); |
||||
|
#endif |
||||
|
#ifdef SX126X_RX_BOOSTED_GAIN |
||||
|
radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN); |
||||
|
#endif |
||||
|
|
||||
|
return true; // success
|
||||
|
} |
||||
|
|
||||
|
uint32_t radio_get_rng_seed() { |
||||
|
return radio.random(0x7FFFFFFF); |
||||
|
} |
||||
|
|
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { |
||||
|
radio.setFrequency(freq); |
||||
|
radio.setSpreadingFactor(sf); |
||||
|
radio.setBandwidth(bw); |
||||
|
radio.setCodingRate(cr); |
||||
|
} |
||||
|
|
||||
|
void radio_set_tx_power(uint8_t dbm) { |
||||
|
radio.setOutputPower(dbm); |
||||
|
} |
||||
|
|
||||
|
mesh::LocalIdentity radio_new_identity() { |
||||
|
RadioNoiseListener rng(radio); |
||||
|
return mesh::LocalIdentity(&rng); // create new random identity
|
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#define RADIOLIB_STATIC_ONLY 1 |
||||
|
#include <RadioLib.h> |
||||
|
#include <helpers/RadioLibWrappers.h> |
||||
|
#include <helpers/rp2040/PicoWBoard.h> |
||||
|
#include <helpers/CustomSX1262Wrapper.h> |
||||
|
#include <helpers/AutoDiscoverRTCClock.h> |
||||
|
|
||||
|
extern PicoWBoard board; |
||||
|
extern WRAPPER_CLASS radio_driver; |
||||
|
extern AutoDiscoverRTCClock rtc_clock; |
||||
|
|
||||
|
bool radio_init(); |
||||
|
uint32_t radio_get_rng_seed(); |
||||
|
void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); |
||||
|
void radio_set_tx_power(uint8_t dbm); |
||||
|
mesh::LocalIdentity radio_new_identity(); |
||||
Loading…
Reference in new issue