Skip to content

Commit d3d78ab

Browse files
authored
Merge branch 'master' into add-use-staging-pr
2 parents ffc5fa9 + a0076cc commit d3d78ab

File tree

8 files changed

+544
-209
lines changed

8 files changed

+544
-209
lines changed

src/Wippersnapper.cpp

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -563,12 +563,12 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field,
563563
is_success = false;
564564
}
565565

566-
// Pack I2CResponse message
566+
// Fill I2CResponse
567567
msgi2cResponse.which_payload =
568568
wippersnapper_signal_v1_I2CRequest_req_i2c_init_tag;
569569
msgi2cResponse.payload.resp_i2c_init.is_initialized = is_success;
570570

571-
// Encode I2CResponse message
571+
// Encode I2CResponse
572572
if (!encodeI2CResponse(&msgi2cResponse)) {
573573
return false;
574574
}
@@ -605,15 +605,14 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field,
605605
WS_DEBUG_PRINT("\t# of addresses found on bus: ");
606606
WS_DEBUG_PRINTLN(scanResp.addresses_found_count);
607607

608-
// Pack I2CResponse
608+
// Fill I2CResponse
609609
msgi2cResponse.which_payload =
610610
wippersnapper_signal_v1_I2CResponse_resp_i2c_scan_tag;
611611
memcpy(msgi2cResponse.payload.resp_i2c_scan.addresses_found,
612612
scanResp.addresses_found, sizeof(scanResp.addresses_found));
613613
msgi2cResponse.payload.resp_i2c_scan.addresses_found_count =
614614
scanResp.addresses_found_count;
615-
616-
// Encode I2C Response
615+
// Encode I2CResponse
617616
if (!encodeI2CResponse(&msgi2cResponse)) {
618617
return false;
619618
}
@@ -629,30 +628,57 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field,
629628
WS_DEBUG_PRINTLN("ERROR: Could not decode I2CDeviceInitRequest message.");
630629
return false; // fail out if we can't decode
631630
}
632-
// Attach device to I2C port
633-
bool deviceInitSuccess = false;
631+
632+
// Create response
633+
msgi2cResponse = wippersnapper_signal_v1_I2CResponse_init_zero;
634+
msgi2cResponse.which_payload =
635+
wippersnapper_signal_v1_I2CResponse_resp_i2c_device_init_tag;
636+
637+
// Initialize device and fill response
634638
if (msgI2CDeviceInitRequest.i2c_port_number == 0 &&
635639
WS._i2cPort0->isInitialized() == true) {
636-
deviceInitSuccess =
637-
WS._i2cPort0->attachI2CDevice(&msgI2CDeviceInitRequest);
640+
msgi2cResponse.payload.resp_i2c_device_init.is_success =
641+
WS._i2cPort0->initI2CDevice(&msgI2CDeviceInitRequest);
638642
} else if (msgI2CDeviceInitRequest.i2c_port_number == 1 &&
639643
WS._i2cPort1->isInitialized() == true) {
640-
deviceInitSuccess =
641-
WS._i2cPort1->attachI2CDevice(&msgI2CDeviceInitRequest);
644+
msgi2cResponse.payload.resp_i2c_device_init.is_success =
645+
WS._i2cPort1->initI2CDevice(&msgI2CDeviceInitRequest);
642646
}
643-
// Create response
647+
648+
// Encode response
649+
if (!encodeI2CResponse(&msgi2cResponse)) {
650+
return false;
651+
}
652+
653+
} else if (field->tag ==
654+
wippersnapper_signal_v1_I2CRequest_req_i2c_device_deinit_tag) {
655+
WS_DEBUG_PRINTLN("NEW COMMAND: I2C Device De-init");
656+
// Decode stream into an I2CDeviceDeinitRequest
657+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest msgI2CDeviceDeinitRequest =
658+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest_init_zero;
659+
// Decode stream into struct, msgI2CDeviceDeinitRequest
660+
if (!pb_decode(stream, wippersnapper_i2c_v1_I2CDeviceDeinitRequest_fields,
661+
&msgI2CDeviceDeinitRequest)) {
662+
WS_DEBUG_PRINTLN(
663+
"ERROR: Could not decode I2CDeviceDeinitRequest message.");
664+
return false; // fail out if we can't decode
665+
}
666+
667+
// Empty I2C response to fill out
644668
msgi2cResponse = wippersnapper_signal_v1_I2CResponse_init_zero;
645669
msgi2cResponse.which_payload =
646-
wippersnapper_signal_v1_I2CResponse_resp_i2c_device_init_tag;
647-
msgi2cResponse.payload.resp_i2c_device_init.is_success = deviceInitSuccess;
648-
// Encode message
649-
memset(WS._buffer_outgoing, 0, sizeof(WS._buffer_outgoing));
650-
pb_ostream_t ostream = pb_ostream_from_buffer(WS._buffer_outgoing,
651-
sizeof(WS._buffer_outgoing));
652-
if (!pb_encode(&ostream, wippersnapper_signal_v1_I2CResponse_fields,
653-
&msgi2cResponse)) {
654-
WS_DEBUG_PRINTLN("ERROR: Unable to encode I2C response message");
655-
return false; // fail out if we cant encode
670+
wippersnapper_signal_v1_I2CResponse_resp_i2c_device_deinit_tag;
671+
672+
// Delete device from I2C bus
673+
if (msgI2CDeviceDeinitRequest.i2c_port_number == 0 &&
674+
WS._i2cPort0->isInitialized() == true) {
675+
msgi2cResponse.payload.resp_i2c_device_deinit.is_success =
676+
WS._i2cPort0->deinitI2CDevice(&msgI2CDeviceDeinitRequest);
677+
}
678+
679+
// Encode response
680+
if (!encodeI2CResponse(&msgi2cResponse)) {
681+
return false;
656682
}
657683
} else {
658684
WS_DEBUG_PRINTLN("ERROR: Undefined I2C message tag");
@@ -1500,7 +1526,6 @@ ws_status_t Wippersnapper::run() {
15001526
WS._mqtt->processPackets(10);
15011527
feedWDT();
15021528

1503-
// TODO: Loop thru components
15041529
// Process digital inputs, digitalGPIO module
15051530
WS._digitalGPIO->processDigitalInputs();
15061531
feedWDT();
@@ -1509,5 +1534,9 @@ ws_status_t Wippersnapper::run() {
15091534
WS._analogIO->processAnalogInputs();
15101535
feedWDT();
15111536

1537+
// Process I2C sensor events
1538+
// WS._i2cPort0->update();
1539+
// feedWDT();
1540+
15121541
return WS_NET_CONNECTED; // TODO: Make this funcn void!
15131542
}

src/Wippersnapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
#include "Adafruit_SleepyDog.h"
5555
#endif
5656

57+
5758
#ifdef USE_TINYUSB
5859
#include "provisioning/tinyusb/Wippersnapper_FS.h"
5960
#endif
@@ -63,7 +64,7 @@
6364
#endif
6465

6566
#define WS_VERSION \
66-
"1.0.0-beta.14" ///< WipperSnapper app. version (semver-formatted)
67+
"1.0.0-beta.15" ///< WipperSnapper app. version (semver-formatted)
6768

6869
// Reserved Adafruit IO MQTT topics
6970
#define TOPIC_IO_THROTTLE "/throttle" ///< Adafruit IO Throttle MQTT Topic

src/components/i2c/WipperSnapper_I2C.cpp

Lines changed: 109 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -113,49 +113,125 @@ WipperSnapper_Component_I2C::scanAddresses() {
113113

114114
/*******************************************************************************/
115115
/*!
116-
@brief Initializes I2C device driver and attaches its object to the "bus"
116+
@brief Initializes I2C device driver.
117117
@param msgDeviceInitReq
118118
A decoded I2CDevice initialization request message.
119119
@returns True if I2C device is initialized and attached, False otherwise.
120120
*/
121121
/*******************************************************************************/
122-
bool WipperSnapper_Component_I2C::attachI2CDevice(
122+
bool WipperSnapper_Component_I2C::initI2CDevice(
123123
wippersnapper_i2c_v1_I2CDeviceInitRequest *msgDeviceInitReq) {
124-
bool attachSuccess = false;
125-
// Determine which sensor-specific callback to utilize
126124

127-
// AHTX0 Sensor
125+
uint16_t i2cAddress = (uint16_t)msgDeviceInitReq->i2c_address;
126+
// Determine which sensor-specific callback to utilize
128127
if (msgDeviceInitReq->has_aht_init) {
129-
// TODO: Implement handling in future release
130-
/* uint16_t addr = (uint16_t)msgDeviceInitReq->aht_init.address;
131-
WS_DEBUG_PRINTLN("Requesting to initialize AHTx sensor");
132-
WS_DEBUG_PRINT("\tSensor Addr: ");
133-
WS_DEBUG_PRINTLN(addr, HEX);
134-
WS_DEBUG_PRINT("\tTemperature sensor enabled? ");
135-
WS_DEBUG_PRINTLN(msgDeviceInitReq->aht_init.enable_temperature);
136-
WS_DEBUG_PRINT("\tHumidity sensor enabled? ");
137-
WS_DEBUG_PRINTLN(msgDeviceInitReq->aht_init.enable_humidity);
138-
139-
// TODO: Create I2C Driver using the an AHT driver sub-class!
140-
I2C_Driver *aht = new I2C_Driver(addr, this->_i2c);
141-
// Attempt to initialize the sensor driver
142-
if (!aht->initAHTX0()) {
143-
attachSuccess = false;
144-
return attachSuccess;
145-
}
146-
// Initialize device-specific sensors
147-
if (msgDeviceInitReq->aht_init.enable_temperature == true) {
148-
aht->enableAHTX0Temperature();
149-
}
150-
if (msgDeviceInitReq->aht_init.enable_humidity == true) {
151-
aht->enableAHTX0Humidity();
152-
}
153-
// Push to vector for sensor drivers
154-
activeDrivers.push_back(aht); */
155-
attachSuccess = true;
128+
// Initialize new AHTX0 sensor
129+
_ahtx0 = new WipperSnapper_I2C_Driver_AHTX0(this->_i2c, i2cAddress);
130+
131+
// Did we initialize successfully?
132+
if (!_ahtx0->getInitialized()) {
133+
WS_DEBUG_PRINTLN("ERROR: Failed to initialize AHTX0 chip!");
134+
return false;
135+
}
136+
WS_DEBUG_PRINTLN("AHTX0 Initialized Successfully!");
137+
138+
// Configure AHTX0 sensor
139+
if (msgDeviceInitReq->aht_init.enable_temperature) {
140+
_ahtx0->enableTemperatureSensor();
141+
_ahtx0->setTemperatureSensorPeriod(
142+
msgDeviceInitReq->aht_init.period_temperature);
143+
WS_DEBUG_PRINTLN("Enabled AHTX0 Temperature Sensor, [Returns every: ");
144+
WS_DEBUG_PRINT(msgDeviceInitReq->aht_init.period_temperature);
145+
WS_DEBUG_PRINTLN("seconds]");
146+
}
147+
if (msgDeviceInitReq->aht_init.enable_humidity) {
148+
_ahtx0->enableHumiditySensor();
149+
_ahtx0->setHumiditySensorPeriod(
150+
msgDeviceInitReq->aht_init.period_humidity);
151+
WS_DEBUG_PRINTLN("Enabled AHTX0 Humidity Sensor, [Returns every: ");
152+
WS_DEBUG_PRINT(msgDeviceInitReq->aht_init.period_humidity);
153+
WS_DEBUG_PRINTLN("seconds]");
154+
}
155+
drivers.push_back(_ahtx0);
156156
} else {
157157
WS_DEBUG_PRINTLN("ERROR: Sensor not found")
158158
}
159159
WS_DEBUG_PRINTLN("Successfully initialized AHTX0 sensor!");
160-
return attachSuccess;
160+
return true;
161+
}
162+
163+
/*******************************************************************************/
164+
/*!
165+
@brief Updates the properties of an I2C device driver.
166+
@param msgDeviceUpdateReq
167+
A decoded I2CDeviceUpdateRequest.
168+
@returns True if I2C device is was successfully updated, False otherwise.
169+
*/
170+
/*******************************************************************************/
171+
bool WipperSnapper_Component_I2C::updateI2CDevice(
172+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest *msgDeviceUpdateReq) {
173+
// TODO!! //
174+
}
175+
176+
/*******************************************************************************/
177+
/*!
178+
@brief Deinitializes an I2C device driver.
179+
@param msgDeviceDeinitReq
180+
A decoded I2CDeviceDeinitRequest.
181+
@returns True if I2C device is found and de-initialized, False otherwise.
182+
*/
183+
/*******************************************************************************/
184+
bool WipperSnapper_Component_I2C::deinitI2CDevice(
185+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest *msgDeviceDeinitReq) {
186+
uint16_t deviceAddr = (uint16_t)msgDeviceDeinitReq->i2c_address;
187+
// Loop thru vector of drivers
188+
for (int i = 0; i < drivers.size(); i++) {
189+
if (drivers[i]->getSensorAddress() == deviceAddr) {
190+
// Check driver type
191+
if (drivers[i]->getDriverType() == AHTX0) {
192+
// Should we delete the driver entirely, or just update?
193+
if ((msgDeviceDeinitReq->aht.disable_temperature &&
194+
drivers[i]->getHumidSensorPeriod() == -1L) ||
195+
(msgDeviceDeinitReq->aht.disable_humidity &&
196+
drivers[i]->getTempSensorPeriod() == -1L) ||
197+
(msgDeviceDeinitReq->aht.disable_temperature &&
198+
msgDeviceDeinitReq->aht.disable_humidity)) {
199+
// delete the driver and remove from list so we dont attempt to
200+
// update() it
201+
delete _ahtx0;
202+
drivers.erase(drivers.begin() + i);
203+
return true;
204+
WS_DEBUG_PRINTLN("AHTX0 Deleted");
205+
}
206+
207+
// Disable the device's temperature sensor
208+
else if (msgDeviceDeinitReq->aht.disable_temperature) {
209+
drivers[i]->disableTemperatureSensor();
210+
return true;
211+
WS_DEBUG_PRINTLN("AHTX0 Temperature Sensor Disabled");
212+
}
213+
214+
// Disable the device's humidity sensor
215+
else if (msgDeviceDeinitReq->aht.disable_humidity) {
216+
drivers[i]->disableHumiditySensor();
217+
WS_DEBUG_PRINTLN("AHTX0 Humidity Sensor Disabled");
218+
return true;
219+
}
220+
} else {
221+
WS_DEBUG_PRINTLN("ERROR: Driver type unspecified");
222+
}
223+
}
224+
}
225+
// Driver was not erased or not found
226+
return false;
227+
}
228+
229+
/*******************************************************************************/
230+
/*!
231+
@brief Queries all I2C device drivers for new values. Fills and sends an
232+
I2CSensorEvent with the sensor event data.
233+
*/
234+
/*******************************************************************************/
235+
void WipperSnapper_Component_I2C::update() {
236+
// TODO
161237
}

src/components/i2c/WipperSnapper_I2C.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
#include "Wippersnapper.h"
2020
#include <Wire.h>
2121

22-
#include "drivers/I2C_Driver.h"
22+
#include "drivers/WipperSnapper_I2C_Driver.h"
23+
#include "drivers/WipperSnapper_I2C_Driver_AHTX0.h"
2324

2425
// forward decl.
2526
class Wippersnapper;
26-
class I2C_Driver;
2727

2828
/**************************************************************************/
2929
/*!
@@ -35,16 +35,27 @@ class WipperSnapper_Component_I2C {
3535
WipperSnapper_Component_I2C(
3636
wippersnapper_i2c_v1_I2CBusInitRequest *msgInitRequest);
3737
~WipperSnapper_Component_I2C();
38+
bool isInitialized();
39+
3840
wippersnapper_i2c_v1_I2CBusScanResponse scanAddresses();
3941
bool
40-
attachI2CDevice(wippersnapper_i2c_v1_I2CDeviceInitRequest *msgDeviceInitReq);
41-
bool isInitialized();
42+
initI2CDevice(wippersnapper_i2c_v1_I2CDeviceInitRequest *msgDeviceInitReq);
43+
// TODO: Update Implementation
44+
// THIS NEEDS AN UPDATE REQUEST
45+
bool updateI2CDevice(
46+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest *msgDeviceUpdateReq);
47+
bool deinitI2CDevice(
48+
wippersnapper_i2c_v1_I2CDeviceDeinitRequest *msgDeviceDeinitReq);
49+
50+
void update();
4251

4352
private:
4453
bool _isInit;
4554
int32_t _portNum;
46-
TwoWire *_i2c = NULL;
47-
std::vector<I2C_Driver *> activeDrivers;
55+
TwoWire *_i2c = nullptr;
56+
std::vector<WipperSnapper_I2C_Driver *> drivers;
57+
// Sensor drivers
58+
WipperSnapper_I2C_Driver_AHTX0 *_ahtx0 = nullptr;
4859
};
4960
extern Wippersnapper WS;
5061

0 commit comments

Comments
 (0)