11typedef TinyWire TwoWire;
14#include "helper/mup_i2c_registers.h"
101 String GDK101_VERSION =
"0.1.0";
107 double gamma10minavgValue, gamma1minavgValue;
110 enum GDKSensorState { UNAVAILABLE,
113 WAIT_NEXT_MEASUREMENT };
123 GDKSensorState sensorState;
125 unsigned long errs = 0;
126 unsigned long oks = 0;
127 unsigned long basePollRateUs = 50000;
128 unsigned long pollRateMs = 2000;
129 uint32_t lastPollMs = 0;
130 time_t watchdogTime = 0;
131 bool watchdogActive =
true;
132 uint32_t watchdogTimeoutSec = 900;
133 uint32_t watchdogStartupTimeoutSec = 180;
135 enum FilterMode { FAST,
138 String firmwareVersion;
139 FilterMode filterMode;
141 ustd::sensorprocessor gamma10minavgSensor = ustd::sensorprocessor(4, 600, 0.005);
142 ustd::sensorprocessor gamma1minavgSensor = ustd::sensorprocessor(4, 600, 0.005);
143 bool bActive =
false;
145 GammaGDK101(String name, FilterMode filterMode = FilterMode::FAST, uint8_t i2cAddress = 0x18)
146 : name(name), filterMode(filterMode), i2cAddress(i2cAddress) {
152 sensorState = GDKSensorState::UNAVAILABLE;
154 setFilterMode(filterMode,
true);
167 return gamma10minavgValue;
174 return gamma1minavgValue;
177 void begin(Scheduler *_pSched, TwoWire *_pWire = &Wire, uint32_t _pollRateMs = 2000L,
bool forceSlowClock =
false,
bool watchdog =
true) {
180 pollRateMs = _pollRateMs;
181 watchdogActive = watchdog;
183 if (watchdogActive) {
188 if (forceSlowClock) {
189 pWire->setClock(100000L);
192 pI2C =
new I2CRegisters(pWire, i2cAddress);
193 auto ft = [=]() { this->loop(); };
194 tID = pSched->add(ft, name, basePollRateUs);
196 auto fnall = [=](String topic, String msg, String originator) {
197 this->subsMsg(topic, msg, originator);
199 pSched->subscribe(tID, name +
"/sensor/#", fnall);
204 bActive = resetGDKSensor();
206 firmwareVersion = getGDKFirmwareVersion();
210 void setFilterMode(FilterMode mode,
bool silent =
false) {
214 gamma10minavgSensor.update(1, 2, 0.05);
215 gamma1minavgSensor.update(1, 2, 0.1);
219 gamma10minavgSensor.update(4, 30, 0.1);
220 gamma1minavgSensor.update(4, 30, 0.5);
224 filterMode = LONGTERM;
225 gamma10minavgSensor.update(10, 600, 0.1);
226 gamma1minavgSensor.update(10, 600, 0.5);
234 void publishGamma10minavg() {
236 sprintf(buf,
"%6.3f", gamma10minavgValue);
237 pSched->publish(name +
"/sensor/gamma10minavg", buf);
240 void publishGamma1minavg() {
242 sprintf(buf,
"%6.3f", gamma1minavgValue);
243 pSched->publish(name +
"/sensor/gamma1minavg", buf);
246 void publishError(String errMsg) {
247 pSched->publish(name +
"/sensor/error", errMsg);
250 void publishFirmwareVersion() {
251 pSched->publish(name +
"/sensor/firmwareVersion", firmwareVersion);
254 void publishFilterMode() {
255 switch (filterMode) {
256 case FilterMode::FAST:
257 pSched->publish(name +
"/sensor/mode",
"FAST");
259 case FilterMode::MEDIUM:
260 pSched->publish(name +
"/sensor/mode",
"MEDIUM");
262 case FilterMode::LONGTERM:
263 pSched->publish(name +
"/sensor/mode",
"LONGTERM");
268 String getGDKFirmwareVersion() {
270 if (!pI2C->readRegisterWord(0xb4, &data,
true, disIrq)) {
272 Serial.print(
"Failed to read version GDK101 at address 0x");
273 Serial.print(i2cAddress, HEX);
274 Serial.print(
" data: ");
275 Serial.print(data, HEX);
276 Serial.print(
" lasterr: ");
277 Serial.println(pI2C->lastError, HEX);
281 uint8_t h = data >> 8;
282 uint8_t l = data & 0xff;
284 sprintf(buf,
"V%d.%d", h, l);
285 Serial.print(
"Firmware version GTK ");
291 bool resetGDKSensor() {
293 if (!pI2C->readRegisterWord(0xa0, &data,
true, disIrq)) {
295 Serial.print(
"Failed to reset GDK101 at address 0x");
296 Serial.print(i2cAddress, HEX);
297 Serial.print(
" data: ");
298 Serial.print(data, HEX);
299 Serial.print(
" lasterr: ");
300 Serial.println(pI2C->lastError, HEX);
302 pSched->publish(
"dbg/1",
"RESFAIL");
306 if ((data >> 8) == 1) {
309 Serial.print(
"GDK101 sensor found at address 0x");
310 Serial.print(i2cAddress, HEX);
311 Serial.print(
". Reset returned: ");
312 Serial.println(data, HEX);
315 Serial.print(
"Failed to reset GDK101 at address 0x");
316 Serial.print(i2cAddress, HEX);
317 Serial.print(
" data: ");
318 Serial.print(data, HEX);
319 Serial.print(
" lasterr: ");
320 Serial.println(pI2C->lastError, HEX);
327 bool readGDKSensorMeasurement(uint8_t reg,
double *pMeas) {
330 if (!pI2C->readRegisterWord(reg, &data,
true, disIrq)) {
332 Serial.print(
"Failed to read GDK101 at address 0x");
333 Serial.print(i2cAddress, HEX);
334 Serial.print(
" data: ");
335 Serial.print(data, HEX);
336 Serial.print(
" lasterr: ");
337 Serial.println(pI2C->lastError, HEX);
341 double ms = (double)(data >> 8) + (double)(data & 0xff) / 100.0;
344 Serial.println(
"GDK101 Measurement: " + String(ms));
350 bool readGDKSensor(
double *pGamma10minavgVal,
double *pGamma1minavgVal) {
351 *pGamma10minavgVal = 0.0;
352 *pGamma1minavgVal = 0.0;
353 if (!readGDKSensorMeasurement(0xb2, pGamma10minavgVal))
return false;
354 if (!readGDKSensorMeasurement(0xb3, pGamma1minavgVal))
return false;
358 void resetWatchdog() {
359 watchdogTime = time(
nullptr);
363 if (timeDiff(lastPollMs, millis()) > pollRateMs) {
364 lastPollMs = millis();
365 double gamma10minavgVal, gamma1minavgVal;
367 if (readGDKSensor(&gamma10minavgVal, &gamma1minavgVal)) {
368 if (gamma10minavgVal != 0 || gamma1minavgVal != 0) {
371 if (watchdogActive) {
372 if (timeDiff(watchdogTime, time(
nullptr)) > watchdogTimeoutSec) {
373 publishError(
"Watchdog timeout, resetting sensor");
378 if (gamma10minavgSensor.filter(&gamma10minavgVal)) {
379 gamma10minavgValue = gamma10minavgVal;
380 publishGamma10minavg();
382 if (gamma1minavgSensor.filter(&gamma1minavgVal)) {
383 gamma1minavgValue = gamma1minavgVal;
384 publishGamma1minavg();
388 if (watchdogActive) {
389 if (timeDiff(watchdogTime, time(
nullptr)) > watchdogStartupTimeoutSec) {
390 publishError(
"Watchdog timeout during startup, resetting sensor");
392 bActive = resetGDKSensor();
399 void subsMsg(String topic, String msg, String originator) {
400 if (topic == name +
"/sensor/gamma10minavg/get") {
401 publishGamma10minavg();
402 }
else if (topic == name +
"/sensor/gamma1minavg/get") {
403 publishGamma1minavg();
404 }
else if (topic == name +
"/sensor/mode/get") {
406 }
else if (topic == name +
"/sensor/mode/set") {
407 if (msg ==
"fast" || msg ==
"FAST") {
408 setFilterMode(FilterMode::FAST);
410 if (msg ==
"medium" || msg ==
"MEDIUM") {
411 setFilterMode(FilterMode::MEDIUM);
413 setFilterMode(FilterMode::LONGTERM);
416 }
else if (topic == name +
"/sensor/firmwareversion/get") {
417 publishFirmwareVersion();
mupplet-sensor temperature and pressure with GDK101
Definition: mup_gamma_gdk101.h:99
GDKSampleMode
Definition: mup_gamma_gdk101.h:116
@ STANDARD
4 samples, pressure resolution 18bit / 0.66 Pa, rec temperature oversampling: x1
Definition: mup_gamma_gdk101.h:119
@ ULTRA_LOW_POWER
1 samples, pressure resolution 16bit / 2.62 Pa, rec temperature oversampling: x1
Definition: mup_gamma_gdk101.h:117
@ HIGH_RESOLUTION
8 samples, pressure resolution 19bit / 0.33 Pa, rec temperature oversampling: x1
Definition: mup_gamma_gdk101.h:120
@ ULTRA_HIGH_RESOLUTION
16 samples, pressure resolution 20bit / 0.16 Pa, rec temperature oversampling: x2
Definition: mup_gamma_gdk101.h:121
@ LOW_POWER
2 samples, pressure resolution 17bit / 1.31 Pa, rec temperature oversampling: x1
Definition: mup_gamma_gdk101.h:118
double getGamma1minavt()
Definition: mup_gamma_gdk101.h:170
GammaGDK101(String name, FilterMode filterMode=FilterMode::FAST, uint8_t i2cAddress=0x18)
Definition: mup_gamma_gdk101.h:145
double getGamma10minavt()
Definition: mup_gamma_gdk101.h:163