Skip to content

Commit 34abb40

Browse files
committed
Added VL53L0XState to peristantly store sensor configuration.
1 parent 42ff180 commit 34abb40

File tree

4 files changed

+116
-3
lines changed

4 files changed

+116
-3
lines changed

src/mesh/generated/meshtastic/telemetry.pb.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ PB_BIND(meshtastic_Nau7802Config, meshtastic_Nau7802Config, AUTO)
3939
PB_BIND(meshtastic_SEN5XState, meshtastic_SEN5XState, AUTO)
4040

4141

42+
PB_BIND(meshtastic_VL53L0XState, meshtastic_VL53L0XState, AUTO)
43+
44+
45+
46+
4247

4348

4449

src/mesh/generated/meshtastic/telemetry.pb.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ typedef enum _meshtastic_TelemetrySensorType {
118118
meshtastic_TelemetrySensorType_VL53L0X = 50
119119
} meshtastic_TelemetrySensorType;
120120

121+
typedef enum _meshtastic_VL53L0XState_RangingMode {
122+
meshtastic_VL53L0XState_RangingMode_Default = 0,
123+
meshtastic_VL53L0XState_RangingMode_LongRange = 1,
124+
meshtastic_VL53L0XState_RangingMode_HighSpeed = 2,
125+
meshtastic_VL53L0XState_RangingMode_HighAccuracy = 3
126+
} meshtastic_VL53L0XState_RangingMode;
127+
121128
/* Struct definitions */
122129
/* Key native device metrics such as battery level */
123130
typedef struct _meshtastic_DeviceMetrics {
@@ -486,6 +493,11 @@ typedef struct _meshtastic_SEN5XState {
486493
uint64_t voc_state_array;
487494
} meshtastic_SEN5XState;
488495

496+
typedef struct _meshtastic_VL53L0XState {
497+
/* Current Ranging Mode */
498+
meshtastic_VL53L0XState_RangingMode mode;
499+
} meshtastic_VL53L0XState;
500+
489501

490502
#ifdef __cplusplus
491503
extern "C" {
@@ -496,6 +508,10 @@ extern "C" {
496508
#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_VL53L0X
497509
#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_VL53L0X+1))
498510

511+
#define _meshtastic_VL53L0XState_RangingMode_MIN meshtastic_VL53L0XState_RangingMode_Default
512+
#define _meshtastic_VL53L0XState_RangingMode_MAX meshtastic_VL53L0XState_RangingMode_HighAccuracy
513+
#define _meshtastic_VL53L0XState_RangingMode_ARRAYSIZE ((meshtastic_VL53L0XState_RangingMode)(meshtastic_VL53L0XState_RangingMode_HighAccuracy+1))
514+
499515

500516

501517

@@ -507,6 +523,8 @@ extern "C" {
507523

508524

509525

526+
#define meshtastic_VL53L0XState_mode_ENUMTYPE meshtastic_VL53L0XState_RangingMode
527+
510528

511529
/* Initializer values for message structs */
512530
#define meshtastic_DeviceMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0}
@@ -520,6 +538,7 @@ extern "C" {
520538
#define meshtastic_Telemetry_init_default {0, 0, {meshtastic_DeviceMetrics_init_default}}
521539
#define meshtastic_Nau7802Config_init_default {0, 0}
522540
#define meshtastic_SEN5XState_init_default {0, 0, 0, false, 0, false, 0, false, 0}
541+
#define meshtastic_VL53L0XState_init_default {_meshtastic_VL53L0XState_RangingMode_MIN}
523542
#define meshtastic_DeviceMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0}
524543
#define meshtastic_EnvironmentMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
525544
#define meshtastic_PowerMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
@@ -531,6 +550,7 @@ extern "C" {
531550
#define meshtastic_Telemetry_init_zero {0, 0, {meshtastic_DeviceMetrics_init_zero}}
532551
#define meshtastic_Nau7802Config_init_zero {0, 0}
533552
#define meshtastic_SEN5XState_init_zero {0, 0, 0, false, 0, false, 0, false, 0}
553+
#define meshtastic_VL53L0XState_init_zero {_meshtastic_VL53L0XState_RangingMode_MIN}
534554

535555
/* Field tags (for use in manual encoding/decoding) */
536556
#define meshtastic_DeviceMetrics_battery_level_tag 1
@@ -652,6 +672,7 @@ extern "C" {
652672
#define meshtastic_SEN5XState_voc_state_time_tag 4
653673
#define meshtastic_SEN5XState_voc_state_valid_tag 5
654674
#define meshtastic_SEN5XState_voc_state_array_tag 6
675+
#define meshtastic_VL53L0XState_mode_tag 1
655676

656677
/* Struct field encoding specification for nanopb */
657678
#define meshtastic_DeviceMetrics_FIELDLIST(X, a) \
@@ -825,6 +846,11 @@ X(a, STATIC, OPTIONAL, FIXED64, voc_state_array, 6)
825846
#define meshtastic_SEN5XState_CALLBACK NULL
826847
#define meshtastic_SEN5XState_DEFAULT NULL
827848

849+
#define meshtastic_VL53L0XState_FIELDLIST(X, a) \
850+
X(a, STATIC, SINGULAR, UENUM, mode, 1)
851+
#define meshtastic_VL53L0XState_CALLBACK NULL
852+
#define meshtastic_VL53L0XState_DEFAULT NULL
853+
828854
extern const pb_msgdesc_t meshtastic_DeviceMetrics_msg;
829855
extern const pb_msgdesc_t meshtastic_EnvironmentMetrics_msg;
830856
extern const pb_msgdesc_t meshtastic_PowerMetrics_msg;
@@ -836,6 +862,7 @@ extern const pb_msgdesc_t meshtastic_HostMetrics_msg;
836862
extern const pb_msgdesc_t meshtastic_Telemetry_msg;
837863
extern const pb_msgdesc_t meshtastic_Nau7802Config_msg;
838864
extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
865+
extern const pb_msgdesc_t meshtastic_VL53L0XState_msg;
839866

840867
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
841868
#define meshtastic_DeviceMetrics_fields &meshtastic_DeviceMetrics_msg
@@ -849,6 +876,7 @@ extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
849876
#define meshtastic_Telemetry_fields &meshtastic_Telemetry_msg
850877
#define meshtastic_Nau7802Config_fields &meshtastic_Nau7802Config_msg
851878
#define meshtastic_SEN5XState_fields &meshtastic_SEN5XState_msg
879+
#define meshtastic_VL53L0XState_fields &meshtastic_VL53L0XState_msg
852880

853881
/* Maximum encoded size of messages (where known) */
854882
#define MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_MAX_SIZE meshtastic_Telemetry_size
@@ -863,6 +891,7 @@ extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
863891
#define meshtastic_SEN5XState_size 27
864892
#define meshtastic_Telemetry_size 272
865893
#define meshtastic_TrafficManagementStats_size 42
894+
#define meshtastic_VL53L0XState_size 2
866895

867896
#ifdef __cplusplus
868897
} /* extern "C" */

src/modules/Telemetry/Sensor/VL53L0XSensor.cpp

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,91 @@
11
#include "configuration.h"
2-
#include <memory>
32

43
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(<Adafruit_VL53L0X.h>)
54

65
#include "../mesh/generated/meshtastic/telemetry.pb.h"
7-
#include "TelemetrySensor.h"
6+
#include <memory>
7+
8+
9+
10+
#include "../mesh/generated/meshtastic/telemetry.pb.h"
11+
#include "FSCommon.h"
812
#include "VL53L0XSensor.h"
13+
#include "SPILock.h"
14+
#include "SafeFile.h"
15+
#include "TelemetrySensor.h"
916

1017
#include <Adafruit_VL53L0X.h>
1118
#include <typeinfo>
19+
#include <pb_decode.h>
20+
#include <pb_encode.h>
21+
22+
23+
bool VL53L0XSensor::loadState()
24+
{
25+
#ifdef FSCom
26+
spiLock->lock();
27+
auto file = FSCom.open(VL53L0XStateFileName, FILE_O_READ);
28+
bool okay = false;
29+
if (file) {
30+
LOG_INFO("%s state read from %s", sensorName, VL53L0XStateFileName);
31+
pb_istream_t stream = {&readcb, &file, meshtastic_VL53L0XState_size};
32+
33+
if (!pb_decode(&stream, &meshtastic_VL53L0XState_msg, &vl53state)) {
34+
LOG_ERROR("Error: can't decode protobuf %s", PB_GET_ERROR(&stream));
35+
} else {
36+
mode = (Adafruit_VL53L0X::VL53L0X_Sense_config_t)vl53state.mode;
37+
okay = true;
38+
}
39+
file.close();
40+
} else {
41+
LOG_INFO("No %s state found (File: %s)", sensorName, VL53L0XStateFileName);
42+
}
43+
spiLock->unlock();
44+
return okay;
45+
#else
46+
LOG_ERROR("%s: ERROR - Filesystem not implemented", sensorName);
47+
#endif
48+
}
49+
50+
bool VL53L0XSensor::saveState()
51+
{
52+
#ifdef FSCom
53+
auto file = SafeFile(VL53L0XStateFileName);
54+
55+
vl53state.mode = (meshtastic_VL53L0XState_RangingMode)mode;
56+
57+
bool okay = false;
58+
59+
LOG_INFO("%s: state write to %s", sensorName, VL53L0XStateFileName);
60+
pb_ostream_t stream = {&writecb, static_cast<Print *>(&file), meshtastic_VL53L0XState_size};
61+
62+
if (!pb_encode(&stream, &meshtastic_VL53L0XState_msg, &vl53state)) {
63+
LOG_ERROR("Error: can't encode protobuf %s", PB_GET_ERROR(&stream));
64+
} else {
65+
okay = true;
66+
}
67+
68+
okay &= file.close();
69+
70+
if (okay)
71+
LOG_INFO("%s: state write to %s successful", sensorName, VL53L0XStateFileName);
72+
73+
return okay;
74+
#else
75+
LOG_ERROR("%s: ERROR - Filesystem not implemented", sensorName);
76+
#endif
77+
}
1278

1379
VL53L0XSensor::VL53L0XSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_VL53L0X, "VL53L0X") {}
1480

1581
bool VL53L0XSensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev)
1682
{
1783
LOG_INFO("Init sensor: %s", sensorName);
18-
status = vl53l0x.begin(VL53L0X_I2C_ADDR, false, bus);
84+
85+
loadState();
86+
87+
status = vl53l0x.begin(VL53L0X_I2C_ADDR, false, bus, mode);
88+
1989
if (!status) {
2090
return status;
2191
}

src/modules/Telemetry/Sensor/VL53L0XSensor.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ class VL53L0XSensor : public TelemetrySensor
1212

1313
Adafruit_VL53L0X vl53l0x;
1414

15+
protected:
16+
const char *VL53L0XStateFileName = "/prefs/vl53l0x.dat";
17+
meshtastic_VL53L0XState vl53state = meshtastic_VL53L0XState_init_zero;
18+
19+
Adafruit_VL53L0X::VL53L0X_Sense_config_t mode;
20+
21+
bool loadState();
22+
bool saveState();
23+
1524
public:
1625
VL53L0XSensor();
1726
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;

0 commit comments

Comments
 (0)