You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.6 KiB
161 lines
4.6 KiB
3 years ago
|
// ArduinoJson - https://arduinojson.org
|
||
|
// Copyright Benoit Blanchon 2014-2021
|
||
|
// MIT License
|
||
|
//
|
||
|
// This example shows how to store your project configuration in a file.
|
||
|
// It uses the SD library but can be easily modified for any other file-system.
|
||
|
//
|
||
|
// The file contains a JSON document with the following content:
|
||
|
// {
|
||
|
// "hostname": "examples.com",
|
||
|
// "port": 2731
|
||
|
// }
|
||
|
//
|
||
|
// To run this program, you need an SD card connected to the SPI bus as follows:
|
||
|
// * MOSI <-> pin 11
|
||
|
// * MISO <-> pin 12
|
||
|
// * CLK <-> pin 13
|
||
|
// * CS <-> pin 4
|
||
|
//
|
||
|
// https://arduinojson.org/v6/example/config/
|
||
|
|
||
|
#include <ArduinoJson.h>
|
||
|
#include <SD.h>
|
||
|
#include <SPI.h>
|
||
|
|
||
|
// Our configuration structure.
|
||
|
//
|
||
|
// Never use a JsonDocument to store the configuration!
|
||
|
// A JsonDocument is *not* a permanent storage; it's only a temporary storage
|
||
|
// used during the serialization phase. See:
|
||
|
// https://arduinojson.org/v6/faq/why-must-i-create-a-separate-config-object/
|
||
|
struct Config {
|
||
|
char hostname[64];
|
||
|
int port;
|
||
|
};
|
||
|
|
||
|
const char *filename = "/config.txt"; // <- SD library uses 8.3 filenames
|
||
|
Config config; // <- global configuration object
|
||
|
|
||
|
// Loads the configuration from a file
|
||
|
void loadConfiguration(const char *filename, Config &config) {
|
||
|
// Open file for reading
|
||
|
File file = SD.open(filename);
|
||
|
|
||
|
// Allocate a temporary JsonDocument
|
||
|
// Don't forget to change the capacity to match your requirements.
|
||
|
// Use https://arduinojson.org/v6/assistant to compute the capacity.
|
||
|
StaticJsonDocument<512> doc;
|
||
|
|
||
|
// Deserialize the JSON document
|
||
|
DeserializationError error = deserializeJson(doc, file);
|
||
|
if (error)
|
||
|
Serial.println(F("Failed to read file, using default configuration"));
|
||
|
|
||
|
// Copy values from the JsonDocument to the Config
|
||
|
config.port = doc["port"] | 2731;
|
||
|
strlcpy(config.hostname, // <- destination
|
||
|
doc["hostname"] | "example.com", // <- source
|
||
|
sizeof(config.hostname)); // <- destination's capacity
|
||
|
|
||
|
// Close the file (Curiously, File's destructor doesn't close the file)
|
||
|
file.close();
|
||
|
}
|
||
|
|
||
|
// Saves the configuration to a file
|
||
|
void saveConfiguration(const char *filename, const Config &config) {
|
||
|
// Delete existing file, otherwise the configuration is appended to the file
|
||
|
SD.remove(filename);
|
||
|
|
||
|
// Open file for writing
|
||
|
File file = SD.open(filename, FILE_WRITE);
|
||
|
if (!file) {
|
||
|
Serial.println(F("Failed to create file"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Allocate a temporary JsonDocument
|
||
|
// Don't forget to change the capacity to match your requirements.
|
||
|
// Use https://arduinojson.org/assistant to compute the capacity.
|
||
|
StaticJsonDocument<256> doc;
|
||
|
|
||
|
// Set the values in the document
|
||
|
doc["hostname"] = config.hostname;
|
||
|
doc["port"] = config.port;
|
||
|
|
||
|
// Serialize JSON to file
|
||
|
if (serializeJson(doc, file) == 0) {
|
||
|
Serial.println(F("Failed to write to file"));
|
||
|
}
|
||
|
|
||
|
// Close the file
|
||
|
file.close();
|
||
|
}
|
||
|
|
||
|
// Prints the content of a file to the Serial
|
||
|
void printFile(const char *filename) {
|
||
|
// Open file for reading
|
||
|
File file = SD.open(filename);
|
||
|
if (!file) {
|
||
|
Serial.println(F("Failed to read file"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Extract each characters by one by one
|
||
|
while (file.available()) {
|
||
|
Serial.print((char)file.read());
|
||
|
}
|
||
|
Serial.println();
|
||
|
|
||
|
// Close the file
|
||
|
file.close();
|
||
|
}
|
||
|
|
||
|
void setup() {
|
||
|
// Initialize serial port
|
||
|
Serial.begin(9600);
|
||
|
while (!Serial) continue;
|
||
|
|
||
|
// Initialize SD library
|
||
|
const int chipSelect = 4;
|
||
|
while (!SD.begin(chipSelect)) {
|
||
|
Serial.println(F("Failed to initialize SD library"));
|
||
|
delay(1000);
|
||
|
}
|
||
|
|
||
|
// Should load default config if run for the first time
|
||
|
Serial.println(F("Loading configuration..."));
|
||
|
loadConfiguration(filename, config);
|
||
|
|
||
|
// Create configuration file
|
||
|
Serial.println(F("Saving configuration..."));
|
||
|
saveConfiguration(filename, config);
|
||
|
|
||
|
// Dump config file
|
||
|
Serial.println(F("Print config file..."));
|
||
|
printFile(filename);
|
||
|
}
|
||
|
|
||
|
void loop() {
|
||
|
// not used in this example
|
||
|
}
|
||
|
|
||
|
// Performance issue?
|
||
|
// ------------------
|
||
|
//
|
||
|
// File is an unbuffered stream, which is not optimal for ArduinoJson.
|
||
|
// See: https://arduinojson.org/v6/how-to/improve-speed/
|
||
|
|
||
|
// See also
|
||
|
// --------
|
||
|
//
|
||
|
// https://arduinojson.org/ contains the documentation for all the functions
|
||
|
// used above. It also includes an FAQ that will help you solve any
|
||
|
// serialization or deserialization problem.
|
||
|
//
|
||
|
// The book "Mastering ArduinoJson" contains a case study of a project that has
|
||
|
// a complex configuration with nested members.
|
||
|
// Contrary to this example, the project in the book uses the SPIFFS filesystem.
|
||
|
// Learn more at https://arduinojson.org/book/
|
||
|
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤
|