fix: sd card shares the radio SPI object
This commit is contained in:
@@ -35,12 +35,16 @@ const char* cardTypeName(uint8_t type) {
|
||||
|
||||
} // namespace
|
||||
|
||||
#if defined(ESP32)
|
||||
SPIClass* getBoardSharedArchiveSPI() __attribute__((weak));
|
||||
#endif
|
||||
|
||||
ArchiveStorage::ArchiveStorage()
|
||||
: _attempted(false), _mounted(false), _mount_failed(false), _supported(false), _card_type(0), _spi_bus(HSPI),
|
||||
_cs_pin(0xFF), _sck_pin(0xFF),
|
||||
_miso_pin(0xFF), _mosi_pin(0xFF), _card_size_bytes(0), _total_bytes(0), _used_bytes(0)
|
||||
#if defined(ESP32)
|
||||
, _spi(nullptr)
|
||||
, _spi(nullptr), _owns_spi(false)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
@@ -88,11 +92,15 @@ void ArchiveStorage::begin() {
|
||||
static_cast<unsigned>(_miso_pin),
|
||||
static_cast<unsigned>(_mosi_pin));
|
||||
|
||||
_spi = new SPIClass(_spi_bus);
|
||||
_spi = getBoardSharedArchiveSPI();
|
||||
_owns_spi = (_spi == nullptr);
|
||||
if (_spi == nullptr) {
|
||||
_mount_failed = true;
|
||||
ARCHIVE_LOG("mount failed: SPI alloc failed");
|
||||
return;
|
||||
_spi = new SPIClass(_spi_bus);
|
||||
if (_spi == nullptr) {
|
||||
_mount_failed = true;
|
||||
ARCHIVE_LOG("mount failed: SPI alloc failed");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mountArchiveSd(_spi, _spi_bus, _cs_pin, _sck_pin, _miso_pin, _mosi_pin)) {
|
||||
@@ -130,7 +138,9 @@ bool ArchiveStorage::recover() {
|
||||
|
||||
ARCHIVE_LOG("recover begin bus=%u cs=%u", static_cast<unsigned>(_spi_bus), static_cast<unsigned>(_cs_pin));
|
||||
SD.end();
|
||||
_spi->end();
|
||||
if (_owns_spi) {
|
||||
_spi->end();
|
||||
}
|
||||
_mounted = false;
|
||||
_mount_failed = false;
|
||||
_card_size_bytes = 0;
|
||||
|
||||
@@ -55,5 +55,6 @@ private:
|
||||
|
||||
#if defined(ESP32)
|
||||
SPIClass* _spi;
|
||||
bool _owns_spi;
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -93,7 +93,13 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
||||
if (file.available() >= (int)sizeof(_prefs->rx_boosted_gain)) {
|
||||
file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291
|
||||
}
|
||||
// next: 292
|
||||
if (file.available() >= (int)sizeof(_prefs->fan_mode)) {
|
||||
file.read((uint8_t *)&_prefs->fan_mode, sizeof(_prefs->fan_mode)); // 292
|
||||
}
|
||||
if (file.available() >= (int)sizeof(_prefs->fan_timeout_secs)) {
|
||||
file.read((uint8_t *)&_prefs->fan_timeout_secs, sizeof(_prefs->fan_timeout_secs)); // 293
|
||||
}
|
||||
// next: 295
|
||||
|
||||
// sanitise bad pref values
|
||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||
@@ -124,6 +130,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
||||
|
||||
// sanitise settings
|
||||
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
|
||||
_prefs->fan_mode = constrain(_prefs->fan_mode, 0, 2);
|
||||
_prefs->fan_timeout_secs = constrain(_prefs->fan_timeout_secs, 0, 600);
|
||||
|
||||
file.close();
|
||||
}
|
||||
@@ -186,7 +194,9 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||
file.write((uint8_t *)&_prefs->battery_reporting_enabled, sizeof(_prefs->battery_reporting_enabled)); // 290
|
||||
file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291
|
||||
// next: 292
|
||||
file.write((uint8_t *)&_prefs->fan_mode, sizeof(_prefs->fan_mode)); // 292
|
||||
file.write((uint8_t *)&_prefs->fan_timeout_secs, sizeof(_prefs->fan_timeout_secs)); // 293
|
||||
// next: 295
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
@@ -62,6 +62,8 @@ struct NodePrefs { // persisted to file
|
||||
uint8_t rx_boosted_gain; // power settings
|
||||
uint8_t path_hash_mode; // which path mode to use when sending
|
||||
uint8_t loop_detect;
|
||||
uint8_t fan_mode;
|
||||
uint16_t fan_timeout_secs;
|
||||
};
|
||||
|
||||
class CommonCLICallbacks {
|
||||
|
||||
Reference in New Issue
Block a user