Разрешённые конфликты (12 файлов, из них 4 companion взяты из upstream целиком): - examples/companion_radio/*: взят upstream, companion в форке не собирается - examples/simple_repeater/MyMesh.cpp: убрана наша интеграция вентилятора (setFanPostTxHoldMs/setFanMode) — upstream 1.18.0 сам грузит настройки вентилятора через attachDynamicPrefs, а его CLI (get fan, set fan auto|on|off, set fan.lo/hi) доступен через board.handleCommand из CommonCLI; удалён наш дублирующий блок get fan/set fan. Оставлена наша сигнатура format*StatsReply(char*, size_t) - examples/simple_repeater/MyMesh.h: оставлены наши WebSensorSnapshot/BlacklistEntry/ ChanNameFilter и getCLI() (нужен мастеру настройки), добавлен upstream isHiddenNode(); FIRMWARE_VERSION по умолчанию — v1.18.0 - src/helpers/CommonCLI.h: оставлены наши FanPrefs (совместимость NVS) и добавлен upstream DynamicConfigSerializer custom (getCustom() нужен attachDynamicPrefs) - src/helpers/ESP32Board.h: время восстанавливается сначала из NVS (наша надстройка, переживает отключение питания), затем из RTC-памяти upstream, иначе опорная дата; deep sleep по-прежнему не трогаем - src/helpers/sensors/EnvironmentSensorManager.cpp: взята логика upstream (detected[], один драйвер на тип), поверх возвращено определение адреса платой (boardDetectedI2CSensorAddress) - variants/lilygo_tbeam_1w/*: взят upstream (задача вентилятора, NTC, гистерезис, CLI и сохранение настроек), наши правки перенесены как делегирование его API - README.md: оставлен наш
134 lines
4.7 KiB
C++
134 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <math.h>
|
|
|
|
#define MAX_HASH_SIZE 8
|
|
#define PUB_KEY_SIZE 32
|
|
#define PRV_KEY_SIZE 64
|
|
#define SEED_SIZE 32
|
|
#define SIGNATURE_SIZE 64
|
|
#define MAX_ADVERT_DATA_SIZE 32
|
|
#define CIPHER_KEY_SIZE 16
|
|
#define CIPHER_BLOCK_SIZE 16
|
|
|
|
// V1
|
|
#define CIPHER_MAC_SIZE 2
|
|
#define PATH_HASH_SIZE 1
|
|
|
|
#define MAX_PACKET_PAYLOAD 184
|
|
#define MAX_GROUP_DATA_LENGTH (MAX_PACKET_PAYLOAD - CIPHER_BLOCK_SIZE - 3)
|
|
#define MAX_PATH_SIZE 64
|
|
#define MAX_TRANS_UNIT 255
|
|
|
|
#if MESH_DEBUG && ARDUINO
|
|
#include <Arduino.h>
|
|
#define MESH_DEBUG_PRINT(F, ...) Serial.printf("DEBUG: " F, ##__VA_ARGS__)
|
|
#define MESH_DEBUG_PRINTLN(F, ...) Serial.printf("DEBUG: " F "\n", ##__VA_ARGS__)
|
|
#else
|
|
#define MESH_DEBUG_PRINT(...) {}
|
|
#define MESH_DEBUG_PRINTLN(...) {}
|
|
#endif
|
|
|
|
#if BRIDGE_DEBUG && ARDUINO
|
|
#define BRIDGE_DEBUG_PRINTLN(F, ...) Serial.printf("%s BRIDGE: " F, getLogDateTime(), ##__VA_ARGS__)
|
|
#else
|
|
#define BRIDGE_DEBUG_PRINTLN(...) {}
|
|
#endif
|
|
|
|
namespace mesh {
|
|
|
|
#define BD_STARTUP_NORMAL 0 // getStartupReason() codes
|
|
#define BD_STARTUP_RX_PACKET 1
|
|
|
|
class MainBoard {
|
|
public:
|
|
virtual uint16_t getBattMilliVolts() = 0;
|
|
virtual int getBatteryPercent() { return -1; }
|
|
virtual uint16_t getBatteryMinMilliVolts() const { return 3000; }
|
|
virtual uint16_t getBatteryMaxMilliVolts() const { return 4200; }
|
|
virtual bool isCharging() { return false; }
|
|
virtual bool isVbusPresent() { return false; }
|
|
virtual float getMCUTemperature() { return NAN; }
|
|
virtual bool setAdcMultiplier(float multiplier) { return false; };
|
|
virtual float getAdcMultiplier() const { return 0.0f; }
|
|
virtual const char* getManufacturerName() const = 0;
|
|
virtual void onBeforeTransmit() { }
|
|
virtual void onAfterTransmit() { }
|
|
virtual void reboot() = 0;
|
|
virtual void powerOff() { /* no op */ }
|
|
// Called by example setup() functions to signal that boot is complete.
|
|
// Boards may override to stop a boot-indicator LED sequence or similar.
|
|
// Default no-op: boards that don't care need not implement anything.
|
|
virtual void onBootComplete() { /* no op */ }
|
|
virtual uint32_t getIRQGpio() { return -1; } // not supported. Returns DIO1 (SX1262) and DIO0 (SX127x)
|
|
virtual void sleep(uint32_t secs) { /* no op */ }
|
|
virtual uint32_t getGpio() { return 0; }
|
|
virtual void setGpio(uint32_t values) {}
|
|
virtual uint8_t getStartupReason() const = 0;
|
|
virtual bool getBootloaderVersion(char* version, size_t max_len) { return false; }
|
|
virtual bool startOTAUpdate(const char* id, char reply[]) { return false; } // not supported
|
|
|
|
// Power management interface (boards with power management override these)
|
|
virtual bool isPwrMgtInitialised() const { return false; }
|
|
virtual bool isExternalPowered() { return false; }
|
|
// True while a board can identify an active battery-charging source.
|
|
virtual bool isChargerActive() { return false; }
|
|
|
|
// Optional, source-specific power detection. Boards that can distinguish a USB
|
|
// supply from a solar charger override these; defaults keep every other board
|
|
// unaffected (the generic CLI prints "n/a" when a capability is absent).
|
|
virtual bool hasUsbPowerDetect() const { return false; }
|
|
virtual bool isUsbPowered() { return false; }
|
|
virtual bool hasSolarChargerDetect() const { return false; }
|
|
virtual bool isSolarChargerActive() { return false; }
|
|
virtual uint16_t getBootVoltage() { return 0; }
|
|
virtual bool getWakeLpcompSupported() const { return false; }
|
|
virtual uint32_t getResetReason() const { return 0; }
|
|
virtual const char* getResetReasonString(uint32_t reason) { return "Not available"; }
|
|
virtual uint8_t getShutdownReason() const { return 0; }
|
|
virtual const char* getShutdownReasonString(uint8_t reason) { return "Not available"; }
|
|
|
|
virtual bool handleCommand(const char* command, uint32_t sender_timestamp, char* reply) { return false; }
|
|
|
|
// Called from the example main loops. Lets a board feed its watchdog and
|
|
// run periodic housekeeping. Default no-op.
|
|
virtual void loop() { /* no op */ }
|
|
};
|
|
|
|
/**
|
|
* An abstraction of the device's Realtime Clock.
|
|
*/
|
|
class RTCClock {
|
|
uint32_t last_unique;
|
|
protected:
|
|
RTCClock() { last_unique = 0; }
|
|
|
|
public:
|
|
/**
|
|
* \returns the current time. in UNIX epoch seconds.
|
|
*/
|
|
virtual uint32_t getCurrentTime() = 0;
|
|
|
|
/**
|
|
* \param time current time in UNIX epoch seconds.
|
|
*/
|
|
virtual void setCurrentTime(uint32_t time) = 0;
|
|
|
|
/**
|
|
* override in classes that need to periodically update internal state
|
|
*/
|
|
virtual void tick() { /* no op */}
|
|
|
|
uint32_t getCurrentTimeUnique() {
|
|
uint32_t t = getCurrentTime();
|
|
if (t <= last_unique) {
|
|
return ++last_unique;
|
|
}
|
|
return last_unique = t;
|
|
}
|
|
};
|
|
|
|
}
|