Skip to content

Commit 6bc9f08

Browse files
committed
Added VL53L0XState to peristantly store sensor configuration.
1 parent bf5adc3 commit 6bc9f08

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
@@ -116,6 +116,13 @@ typedef enum _meshtastic_TelemetrySensorType {
116116
meshtastic_TelemetrySensorType_VL53L0X = 50
117117
} meshtastic_TelemetrySensorType;
118118

119+
typedef enum _meshtastic_VL53L0XState_RangingMode {
120+
meshtastic_VL53L0XState_RangingMode_Default = 0,
121+
meshtastic_VL53L0XState_RangingMode_LongRange = 1,
122+
meshtastic_VL53L0XState_RangingMode_HighSpeed = 2,
123+
meshtastic_VL53L0XState_RangingMode_HighAccuracy = 3
124+
} meshtastic_VL53L0XState_RangingMode;
125+
119126
/* Struct definitions */
120127
/* Key native device metrics such as battery level */
121128
typedef struct _meshtastic_DeviceMetrics {
@@ -484,6 +491,11 @@ typedef struct _meshtastic_SEN5XState {
484491
uint64_t voc_state_array;
485492
} meshtastic_SEN5XState;
486493

494+
typedef struct _meshtastic_VL53L0XState {
495+
/* Current Ranging Mode */
496+
meshtastic_VL53L0XState_RangingMode mode;
497+
} meshtastic_VL53L0XState;
498+
487499

488500
#ifdef __cplusplus
489501
extern "C" {
@@ -494,6 +506,10 @@ extern "C" {
494506
#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_VL53L0X
495507
#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_VL53L0X+1))
496508

509+
#define _meshtastic_VL53L0XState_RangingMode_MIN meshtastic_VL53L0XState_RangingMode_Default
510+
#define _meshtastic_VL53L0XState_RangingMode_MAX meshtastic_VL53L0XState_RangingMode_HighAccuracy
511+
#define _meshtastic_VL53L0XState_RangingMode_ARRAYSIZE ((meshtastic_VL53L0XState_RangingMode)(meshtastic_VL53L0XState_RangingMode_HighAccuracy+1))
512+
497513

498514

499515

@@ -505,6 +521,8 @@ extern "C" {
505521

506522

507523

524+
#define meshtastic_VL53L0XState_mode_ENUMTYPE meshtastic_VL53L0XState_RangingMode
525+
508526

509527
/* Initializer values for message structs */
510528
#define meshtastic_DeviceMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0}
@@ -518,6 +536,7 @@ extern "C" {
518536
#define meshtastic_Telemetry_init_default {0, 0, {meshtastic_DeviceMetrics_init_default}}
519537
#define meshtastic_Nau7802Config_init_default {0, 0}
520538
#define meshtastic_SEN5XState_init_default {0, 0, 0, false, 0, false, 0, false, 0}
539+
#define meshtastic_VL53L0XState_init_default {_meshtastic_VL53L0XState_RangingMode_MIN}
521540
#define meshtastic_DeviceMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0}
522541
#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}
523542
#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}
@@ -529,6 +548,7 @@ extern "C" {
529548
#define meshtastic_Telemetry_init_zero {0, 0, {meshtastic_DeviceMetrics_init_zero}}
530549
#define meshtastic_Nau7802Config_init_zero {0, 0}
531550
#define meshtastic_SEN5XState_init_zero {0, 0, 0, false, 0, false, 0, false, 0}
551+
#define meshtastic_VL53L0XState_init_zero {_meshtastic_VL53L0XState_RangingMode_MIN}
532552

533553
/* Field tags (for use in manual encoding/decoding) */
534554
#define meshtastic_DeviceMetrics_battery_level_tag 1
@@ -650,6 +670,7 @@ extern "C" {
650670
#define meshtastic_SEN5XState_voc_state_time_tag 4
651671
#define meshtastic_SEN5XState_voc_state_valid_tag 5
652672
#define meshtastic_SEN5XState_voc_state_array_tag 6
673+
#define meshtastic_VL53L0XState_mode_tag 1
653674

654675
/* Struct field encoding specification for nanopb */
655676
#define meshtastic_DeviceMetrics_FIELDLIST(X, a) \
@@ -823,6 +844,11 @@ X(a, STATIC, OPTIONAL, FIXED64, voc_state_array, 6)
823844
#define meshtastic_SEN5XState_CALLBACK NULL
824845
#define meshtastic_SEN5XState_DEFAULT NULL
825846

847+
#define meshtastic_VL53L0XState_FIELDLIST(X, a) \
848+
X(a, STATIC, SINGULAR, UENUM, mode, 1)
849+
#define meshtastic_VL53L0XState_CALLBACK NULL
850+
#define meshtastic_VL53L0XState_DEFAULT NULL
851+
826852
extern const pb_msgdesc_t meshtastic_DeviceMetrics_msg;
827853
extern const pb_msgdesc_t meshtastic_EnvironmentMetrics_msg;
828854
extern const pb_msgdesc_t meshtastic_PowerMetrics_msg;
@@ -834,6 +860,7 @@ extern const pb_msgdesc_t meshtastic_HostMetrics_msg;
834860
extern const pb_msgdesc_t meshtastic_Telemetry_msg;
835861
extern const pb_msgdesc_t meshtastic_Nau7802Config_msg;
836862
extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
863+
extern const pb_msgdesc_t meshtastic_VL53L0XState_msg;
837864

838865
/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
839866
#define meshtastic_DeviceMetrics_fields &meshtastic_DeviceMetrics_msg
@@ -847,6 +874,7 @@ extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
847874
#define meshtastic_Telemetry_fields &meshtastic_Telemetry_msg
848875
#define meshtastic_Nau7802Config_fields &meshtastic_Nau7802Config_msg
849876
#define meshtastic_SEN5XState_fields &meshtastic_SEN5XState_msg
877+
#define meshtastic_VL53L0XState_fields &meshtastic_VL53L0XState_msg
850878

851879
/* Maximum encoded size of messages (where known) */
852880
#define MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_MAX_SIZE meshtastic_Telemetry_size
@@ -861,6 +889,7 @@ extern const pb_msgdesc_t meshtastic_SEN5XState_msg;
861889
#define meshtastic_SEN5XState_size 27
862890
#define meshtastic_Telemetry_size 272
863891
#define meshtastic_TrafficManagementStats_size 42
892+
#define meshtastic_VL53L0XState_size 2
864893

865894
#ifdef __cplusplus
866895
} /* 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)