Skip to content

Commit c2a2e42

Browse files
committed
[SD] Refactor and make pins dynaically allocated for sdcard
1 parent 45d2365 commit c2a2e42

File tree

8 files changed

+37
-58
lines changed

8 files changed

+37
-58
lines changed

src/Wippersnapper_Boards.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
#define STATUS_NEOPIXEL_PIN 46
5959
#define STATUS_NEOPIXEL_NUM 1
6060
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
61-
#define SD_CS_PIN SS
6261
#elif defined(ARDUINO_MAGTAG29_ESP32S2)
6362
#define BOARD_ID "magtag"
6463
#define USE_TINYUSB
@@ -72,7 +71,6 @@
7271
#define USE_STATUS_NEOPIXEL
7372
#define STATUS_NEOPIXEL_PIN 33
7473
#define STATUS_NEOPIXEL_NUM 1
75-
#define SD_CS_PIN 33
7674
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
7775
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_TFT)
7876
#define BOARD_ID "feather-esp32s2-tft"
@@ -81,69 +79,59 @@
8179
#define STATUS_NEOPIXEL_PIN 33
8280
#define STATUS_NEOPIXEL_NUM 1
8381
#define PIN_I2C_POWER_INVERTED 7
84-
#define SD_CS_PIN 33
8582
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
8683
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_REVTFT)
8784
#define BOARD_ID "feather-esp32s2-reverse-tft"
8885
#define USE_TINYUSB
8986
#define USE_STATUS_NEOPIXEL
9087
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
9188
#define STATUS_NEOPIXEL_NUM NEOPIXEL_NUM
92-
#define SD_CS_PIN 33
9389
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
9490
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S3_NOPSRAM)
9591
#define BOARD_ID "feather-esp32s3"
9692
#define USE_TINYUSB
9793
#define USE_STATUS_NEOPIXEL
9894
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
9995
#define STATUS_NEOPIXEL_NUM NEOPIXEL_NUM
100-
#define SD_CS_PIN 33
10196
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S3)
10297
#define BOARD_ID "feather-esp32s3-4mbflash-2mbpsram"
10398
#define USE_TINYUSB
10499
#define USE_STATUS_NEOPIXEL
105100
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
106101
#define STATUS_NEOPIXEL_NUM NEOPIXEL_NUM
107-
#define SD_CS_PIN 33
108102
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
109103
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S3_TFT)
110104
#define BOARD_ID "feather-esp32s3-tft"
111105
#define USE_TINYUSB
112106
#define USE_STATUS_NEOPIXEL
113107
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
114108
#define STATUS_NEOPIXEL_NUM NEOPIXEL_NUM
115-
#define SD_CS_PIN 33
116109
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
117110
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S3_REVTFT)
118111
#define BOARD_ID "feather-esp32s3-reverse-tft"
119112
#define USE_TINYUSB
120113
#define USE_STATUS_NEOPIXEL
121114
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
122115
#define STATUS_NEOPIXEL_NUM NEOPIXEL_NUM
123-
#define SD_CS_PIN 33
124116
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
125117
#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2)
126118
#define BOARD_ID "qtpy-esp32s2"
127119
#define USE_TINYUSB
128120
#define USE_STATUS_NEOPIXEL
129121
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
130122
#define STATUS_NEOPIXEL_NUM 1
131-
#define SD_CS_PIN 33
132123
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
133124
#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM)
134125
#define BOARD_ID "qtpy-esp32s3"
135126
#define USE_TINYUSB
136127
#define USE_STATUS_NEOPIXEL
137128
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
138-
#define STATUS_NEOPIXEL_NUM 1
139-
#define SD_CS_PIN 33
140129
#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_N4R2)
141130
#define BOARD_ID "qtpy-esp32s3-n4r2"
142131
#define USE_TINYUSB
143132
#define USE_STATUS_NEOPIXEL
144133
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
145134
#define STATUS_NEOPIXEL_NUM 1
146-
#define SD_CS_PIN 33
147135
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
148136
#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32C3)
149137
#define BOARD_ID "qtpy-esp32c3"
@@ -156,41 +144,35 @@
156144
#define USE_LITTLEFS
157145
#define USE_STATUS_LED
158146
#define STATUS_LED_PIN 0
159-
#define SD_CS_PIN 15
160147
#elif defined(ARDUINO_ADAFRUIT_ITSYBITSY_ESP32)
161148
#define BOARD_ID "itsybitsy-esp32"
162149
#define USE_LITTLEFS
163150
#define USE_STATUS_NEOPIXEL
164151
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
165152
#define STATUS_NEOPIXEL_NUM 1
166-
#define SD_CS_PIN 33
167153
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
168154
#elif defined(ARDUINO_FEATHER_ESP32)
169155
#define BOARD_ID "feather-esp32"
170156
#define USE_LITTLEFS
171157
#define USE_STATUS_LED
172158
#define STATUS_LED_PIN 13
173-
#define SD_CS_PIN 33
174159
#elif defined(ARDUINO_ESP32_DEV) || defined(ESP32_DEV)
175160
#define BOARD_ID "feather-esp32"
176161
#define USE_STATUS_LED
177162
#define STATUS_LED_PIN 13
178-
#define SD_CS_PIN 15
179163
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32_V2)
180164
#define BOARD_ID "feather-esp32-v2"
181165
#define USE_LITTLEFS
182166
#define USE_STATUS_NEOPIXEL
183167
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
184168
#define STATUS_NEOPIXEL_NUM 1
185-
#define SD_CS_PIN 33
186169
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
187170
#elif defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO)
188171
#define BOARD_ID "qtpy-esp32"
189172
#define USE_LITTLEFS
190173
#define USE_STATUS_NEOPIXEL
191174
#define STATUS_NEOPIXEL_PIN PIN_NEOPIXEL
192175
#define STATUS_NEOPIXEL_NUM 1
193-
#define SD_CS_PIN 33
194176
#define USE_PSRAM ///< Board has PSRAM, use it for dynamic memory allocation
195177
#elif defined(ARDUINO_SAMD_NANO_33_IOT)
196178
#define BOARD_ID "nano-33-iot"
@@ -205,13 +187,11 @@
205187
#define USE_TINYUSB
206188
#define USE_STATUS_LED
207189
#define STATUS_LED_PIN 32
208-
#define SD_CS_PIN 17
209190
#elif defined(ARDUINO_RASPBERRY_PI_PICO_2)
210191
#define BOARD_ID "rpi-pico-2"
211192
#define USE_TINYUSB
212193
#define USE_STATUS_LED
213194
#define STATUS_LED_PIN LED_BUILTIN
214-
#define SD_CS_PIN 17
215195
#else
216196
#warning "Board type not identified within Wippersnapper_Boards.h!"
217197
#endif

src/Wippersnapper_V2.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*
2424
* @section author Author
2525
*
26-
* Copyright (c) Brent Rubell 2020-2023 for Adafruit Industries.
26+
* Copyright (c) Brent Rubell 2020-2025 for Adafruit Industries.
2727
*
2828
* @section license License
2929
*
@@ -105,6 +105,7 @@ void Wippersnapper_V2::provisionV2() {
105105
#endif
106106

107107
// Are we using sd-card/offline mode?
108+
WsV2._fileSystemV2->GetSDCSPin(); // TODO: Implement this for LittleFS TOO
108109
if (WsV2._sdCardV2->InitSDCard())
109110
return;
110111

src/Wippersnapper_V2.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ class Wippersnapper_V2 {
255255
///< otherwise.
256256
std::vector<std::vector<uint8_t>>
257257
_sharedConfigBuffers; ///< Shared JSON config buffers for offline mode
258+
259+
260+
uint8_t pin_sd_cs; ///< SD card chip select pin
258261
private:
259262
void _initV2();
260263

@@ -268,7 +271,6 @@ class Wippersnapper_V2 {
268271
Adafruit_MQTT_Subscribe *_subscribeB2d;
269272
Adafruit_MQTT_Subscribe *_subscribeError;
270273
Adafruit_MQTT_Subscribe *_subscribeThrottle;
271-
272274
protected:
273275
ws_status_t _statusV2 = WS_IDLE; ///< Wippersnapper status
274276

src/provisioning/sdcard/ws_sdcard.cpp

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@
2020
*/
2121
/**************************************************************************/
2222
ws_sdcard::ws_sdcard() {
23-
is_mode_offline = false;
24-
#ifdef OFFLINE_MODE_WOKWI
25-
_is_using_wokwi = true;
26-
#else
27-
_is_using_wokwi = false;
28-
#endif
2923
_use_test_data = false;
3024
_sz_log_file = 0;
3125
}
@@ -43,12 +37,13 @@ ws_sdcard::~ws_sdcard() {
4337
}
4438

4539
bool ws_sdcard::InitSDCard() {
46-
#ifdef SD_CS_PIN
47-
// Attempt to initialize the SD card
48-
if (_sd.begin(SD_CS_PIN)) {
49-
is_mode_offline = true;
40+
is_mode_offline = false;
41+
if (WsV2.pin_sd_cs == 255) { // No SD card CS pin defined
42+
return is_mode_offline;
43+
} else { // SD card CS pin defined
44+
if (_sd.begin(WsV2.pin_sd_cs))
45+
is_mode_offline = true;
5046
}
51-
#endif
5247
return is_mode_offline;
5348
}
5449

@@ -504,19 +499,12 @@ bool ws_sdcard::parseConfigFile() {
504499
WS_DEBUG_PRINTLN("[SD] Successfully deserialized JSON config file!");
505500

506501
// Calculate the 8-bit checksum of the JSON file to ensure it is valid data
507-
if (! ValidateChecksum(doc)) {
508-
WS_DEBUG_PRINTLN("[SD] Checksum mismatch, file has been modified from its original state!");
502+
if (!ValidateChecksum(doc)) {
503+
WS_DEBUG_PRINTLN("[SD] Checksum mismatch, file has been modified from its "
504+
"original state!");
509505
}
510506
WS_DEBUG_PRINTLN("[SD] JSON checksum OK!");
511507

512-
// NOTE: This is only used by the CI runner, production builds do not run
513-
// this!
514-
// TODO: Do we even need this anymore? We switched to a compile-time constant instead
515-
const char *exportedBy = doc["exportedBy"];
516-
if (strcmp(exportedBy, "wokwi") == 0) {
517-
_is_using_wokwi = true;
518-
}
519-
520508
// Parse the exportedFromDevice array
521509
JsonObject exportedFromDevice = doc["exportedFromDevice"];
522510
if (exportedFromDevice.isNull()) {
@@ -788,7 +776,8 @@ bool ws_sdcard::LogJSONDoc(JsonDocument &doc) {
788776
File32 file;
789777
file = _sd.open(_log_filename, FILE_WRITE);
790778
if (!file) {
791-
WS_DEBUG_PRINTLN("[SD] FATAL Error - Unable to open the log file for writing!");
779+
WS_DEBUG_PRINTLN(
780+
"[SD] FATAL Error - Unable to open the log file for writing!");
792781
return false;
793782
}
794783
BufferingPrint bufferedFile(file, 64); // Add buffering to the file
@@ -936,13 +925,6 @@ bool ws_sdcard::waitForSerialConfig() {
936925
// 2. Provide a JSON string via the hardware's serial input
937926
// 3. Use a test JSON string - for debugging purposes ONLY
938927

939-
// TODO: Redundant conditional - should this just be enabled within the class
940-
// ctor?
941-
if (_is_using_wokwi)
942-
_use_test_data = false;
943-
else
944-
_use_test_data = true;
945-
946928
json_test_data = "{"
947929
"\"exportVersion\": \"1.0.0\","
948930
"\"exportedBy\": \"tester\","

src/provisioning/sdcard/ws_sdcard.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,12 @@ class ws_sdcard {
5757
bool ValidateJSONKey(const char *key, const char *error_msg);
5858
void CheckIn(uint8_t max_digital_pins, uint8_t max_analog_pins,
5959
float ref_voltage);
60-
6160
bool ConfigureRTC(const char *rtc_type);
6261
uint32_t GetTimestamp();
6362
bool InitDS1307();
6463
bool InitDS3231();
6564
bool InitPCF8523();
6665
bool InitSoftRTC();
67-
6866
wippersnapper_sensor_SensorType ParseSensorType(const char *sensor_type);
6967
bool ParseDigitalIOAdd(wippersnapper_digitalio_DigitalIOAdd &msg_DigitalIOAdd,
7068
const char *pin, float period, bool value,
@@ -76,15 +74,13 @@ class ws_sdcard {
7674
const char *pin, int resolution, float period,
7775
int num_sensors, const char *sensor_type_1,
7876
const char *sensor_type_2);
79-
8077
void BuildJSONDoc(JsonDocument &doc, uint8_t pin, float value,
8178
wippersnapper_sensor_SensorType read_type);
8279
void BuildJSONDoc(JsonDocument &doc, uint8_t pin, uint16_t value,
8380
wippersnapper_sensor_SensorType read_type);
8481
void BuildJSONDoc(JsonDocument &doc, uint8_t pin, bool value,
8582
wippersnapper_sensor_SensorType read_type);
8683
bool LogJSONDoc(JsonDocument &doc);
87-
8884
bool
8985
PushSignalToSharedBuffer(wippersnapper_signal_BrokerToDevice &msg_signal);
9086
SdFat _sd; ///< SD object from Adafruit SDFat library
@@ -97,9 +93,7 @@ class ws_sdcard {
9793
RTC_DS1307 *_rtc_ds1307 = nullptr; ///< DS1307 RTC object
9894
RTC_PCF8523 *_rtc_pcf8523 = nullptr; ///< PCF8523 RTC object
9995
RTC_Millis *_rtc_soft = nullptr; ///< Software RTC object
100-
// Testing
101-
bool _use_test_data; ///< True if sample data is being used for testing
102-
bool _is_using_wokwi; ///< True if `exportedBy` key is "wokwi"
96+
bool _use_test_data; ///< True if sample data is being used for testing
10397
};
10498
extern Wippersnapper_V2 WsV2;
10599
#endif // WS_SDCARD_H

src/provisioning/tinyusb/Wippersnapper_FS_V2.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,24 @@ Wippersnapper_FS_V2::~Wippersnapper_FS_V2() {
162162
wipperFatFs_v2.end();
163163
}
164164

165+
void GetSDCSPin() {
166+
File32 file_cfg = wipperFatFs_v2.open("/config.json");
167+
if (!file_cfg) {
168+
WsV2.pin_sd_cs = 255;
169+
return;
170+
}
171+
DeserializationError error = deserializeJson(doc, file_cfg);
172+
// failed to deserialize the config file, bail out
173+
if (error) {
174+
file_cfg.close();
175+
WsV2.pin_sd_cs = 255;
176+
return;
177+
}
178+
JsonObject exportedFromDevice = doc["exportedFromDevice"];
179+
WsV2.pin_sd_cs = exportedFromDevice["sd_cs_pin"] | 255;
180+
file_cfg.close();
181+
}
182+
165183
/**************************************************************************/
166184
/*!
167185
@brief Writes files to the filesystem to disable macOS from indexing.

src/provisioning/tinyusb/Wippersnapper_FS_V2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class Wippersnapper_FS_V2 {
5959
bool getSecretsFile();
6060
void parseSecrets();
6161

62+
void GetSDCSPin();
63+
6264
#ifdef ARDUINO_FUNHOUSE_ESP32S2
6365
void parseDisplayConfig(displayConfig &displayFile);
6466
void createDisplayConfig();

tests/bin/offline/firmware.elf

-1.77 KB
Binary file not shown.

0 commit comments

Comments
 (0)