9static UserConfiguration loadedConfig = {};
11#ifdef TEST_USER_CONFIG
12const static UserConfiguration testConfig = {
15 .Upload_method = Uploadmethod_WiFi,
16 .Upload_interval = 10,
17 .enabled_sensors_count = 2,
18 .enabled_sensors = {EnabledSensor_Voltage, EnabledSensor_Current},
20 .Voltage_Slope = -0.00039326,
21 .Voltage_Offset = 4.92916378e-05,
22 .Current_Slope = -1.18693164e-10,
23 .Current_Offset = 4.14518594e-05,
24 .WiFi_SSID =
"HARE_Lab",
26 .API_Endpoint_URL =
"http://dirtviz.jlab.ucsc.edu/api/sensor/",
28 .API_Endpoint_Port = 80};
80#ifdef TEST_USER_CONFIG
83 uint8_t length_buf[2];
92 *length = (length_buf[0] << 8) | length_buf[1];
99 if (*length > UserConfiguration_size) {
125#ifdef TEST_USER_CONFIG
129 uint8_t
buffer[UserConfiguration_size] = {};
130 uint16_t data_length = 0;
152#ifdef TEST_USER_CONFIG
155 return &loadedConfig;
160 if (config == NULL) {
164 uint8_t encoded_data[UserConfiguration_size];
166 if (encoded_length == 0) {
171 uint8_t length_buf[2] = {(encoded_length >> 8) & 0xFF, encoded_length & 0xFF};
190 printf(
"Logger ID: %lu\r\n", config->logger_id);
191 printf(
"Cell ID: %lu\r\n", config->cell_id);
193 if (config->Upload_method == 0) {
194 printf(
"Upload Method: %u \"LoRa\"\r\n", config->Upload_method);
196 printf(
"Upload Method: %u \"WiFi\"\r\n", config->Upload_method);
199 printf(
"Upload Interval: %lu\r\n", config->Upload_interval);
201 for (
int i = 0;
i < config->enabled_sensors_count;
i++) {
202 const char* sensor_name = NULL;
203 switch (config->enabled_sensors[
i]) {
204 case EnabledSensor_Voltage:
205 sensor_name =
"Voltage";
207 case EnabledSensor_Current:
208 sensor_name =
"Current";
210 case EnabledSensor_Teros12:
211 sensor_name =
"Teros12";
213 case EnabledSensor_Teros21:
214 sensor_name =
"Teros21";
216 case EnabledSensor_BME280:
217 sensor_name =
"BME280";
219 case EnabledSensor_Phytos31:
220 sensor_name =
"Phytos31";
222 case EnabledSensor_SEN0308:
223 sensor_name =
"SEN0308";
225 case EnabledSensor_SEN0257:
226 sensor_name =
"SEN0257";
228 case EnabledSensor_YFS210C:
229 sensor_name =
"YFS210C";
231 case EnabledSensor_PCAP02:
232 sensor_name =
"PCAP02";
235 sensor_name =
"Unknown Sensor";
237 printf(
"Enabled Sensor %d: %s\r\n",
i + 1, sensor_name);
242 snprintf(float_str,
sizeof(float_str),
"%e", config->Voltage_Slope);
243 printf(
"Calibration V Slope: %s\r\n", float_str);
245 snprintf(float_str,
sizeof(float_str),
"%e", config->Voltage_Offset);
246 printf(
"Calibration V Offset: %s\r\n", float_str);
248 snprintf(float_str,
sizeof(float_str),
"%e", config->Current_Slope);
249 printf(
"Calibration I Slope: %s\r\n", float_str);
251 snprintf(float_str,
sizeof(float_str),
"%e", config->Current_Offset);
252 printf(
"Calibration I Offset: %s\r\n", float_str);
254 printf(
"WiFi SSID: %s\r\n", config->WiFi_SSID);
256 printf(
"WiFi Password: %s\r\n", config->WiFi_Password);
258 printf(
"API Endpoint URL: %s\r\n", config->API_Endpoint_URL);
260 printf(
"API Port: %lu\r\n", config->API_Endpoint_Port);
271 const uint8_t length[2] = {};
272 const uint8_t empty[UserConfiguration_size] = {};
Storage interface for onboard FRAM chips.
fram_status fram_write(fram_addr addr, const uint8_t *data, size_t len)
Write bytes at the given address.
fram_status fram_read(fram_addr addr, size_t len, uint8_t *data)
Read bytes at the given address.
int DecodeUserConfiguration(const uint8_t *data, const size_t len, UserConfiguration *config)
Decodes user configuration data.
size_t EncodeUserConfiguration(const UserConfiguration *config, uint8_t *buffer)
Encodes user configuration data.
#define USER_CONFIG_START_ADDRESS
UserConfigStatus UserConfigBytes(uint8_t *buffer, uint16_t *length)
Gets encoded bytes from userconfig.
UserConfigStatus UserConfigClear(void)
Clears the user configuration stored in FRAM.
void UserConfigPrintAny(const UserConfiguration *config)
Prints arbitrary user config over serial.
UserConfigStatus UserConfigSave(const UserConfiguration *config)
Saves the configuration to FRAM.
void UserConfigPrint(void)
Prints the current user configuration over serial.
UserConfigStatus UserConfigLoad(void)
Loads user configuration data from FRAM to RAM.
#define USER_CONFIG_LEN_ADDR
const UserConfiguration * UserConfigGet(void)
Gets a reference to the loaded user configuration data in RAM.
UserConfigStatus UserConfigLoadBytes(uint8_t *buffer, uint16_t length)
Load user config from bytes.
@ USERCONFIG_ENCODE_ERROR
@ USERCONFIG_DECODE_ERROR
@ USERCONFIG_EMPTY_CONFIG
Controls the user config webserver.
Library for encoding/decoding protobuf messages.
UserConfigStatus UserConfig_ReadFromFRAM(uint16_t addr, uint16_t length, uint8_t *data)
Reads user configuration data from FRAM.
UserConfigStatus UserConfig_WriteToFRAM(uint16_t addr, uint8_t *data, uint16_t length)
Writes user configuration data to FRAM.