Skip to content

Commit 63d03ac

Browse files
committed
Use different queues and functions to handle short and long sensor payloads
1 parent 2799823 commit 63d03ac

File tree

4 files changed

+80
-18
lines changed

4 files changed

+80
-18
lines changed

src/Arduino_BHY2Host.cpp

+20-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,16 @@ void Arduino_BHY2Host::update()
4949
} else {
5050
uint8_t available = availableSensorData();
5151
for (int i = 0; i < available; i++) {
52-
SensorLongDataPacket data;
52+
SensorDataPacket data;
5353
readSensorData(data);
54+
SensorLongDataPacket longData;
55+
memcpy(&longData, &data, sizeof(SensorDataPacket));
56+
sensorManager.process(longData);
57+
}
58+
uint8_t availableLong = availableSensorLongData();
59+
for (int i = 0; i < available; i++) {
60+
SensorLongDataPacket data;
61+
readSensorLongData(data);
5462
sensorManager.process(data);
5563
}
5664
}
@@ -99,11 +107,21 @@ uint8_t Arduino_BHY2Host::availableSensorData()
99107
return eslovHandler.requestAvailableData();
100108
}
101109

102-
bool Arduino_BHY2Host::readSensorData(SensorLongDataPacket &data)
110+
uint8_t Arduino_BHY2Host::availableSensorLongData()
111+
{
112+
return eslovHandler.requestAvailableLongData();
113+
}
114+
115+
bool Arduino_BHY2Host::readSensorData(SensorDataPacket &data)
103116
{
104117
return eslovHandler.requestSensorData(data);
105118
}
106119

120+
bool Arduino_BHY2Host::readSensorLongData(SensorLongDataPacket &data)
121+
{
122+
return eslovHandler.requestSensorLongData(data);
123+
}
124+
107125
void Arduino_BHY2Host::parse(SensorDataPacket& data, DataXYZ& vector)
108126
{
109127
DataParser::parse3DVector(data, vector);

src/Arduino_BHY2Host.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ class Arduino_BHY2Host {
4141
void configureSensor(uint8_t sensorId, float sampleRate, uint32_t latency);
4242
uint8_t requestAck();
4343
uint8_t availableSensorData();
44-
bool readSensorData(SensorLongDataPacket &data);
44+
uint8_t availableSensorLongData();
45+
bool readSensorData(SensorDataPacket &data);
46+
bool readSensorLongData(SensorLongDataPacket &data);
4547

4648
void parse(SensorDataPacket& data, DataXYZ& vector);
4749
void parse(SensorDataPacket& data, DataOrientation& vector);

src/EslovHandler.cpp

+48-11
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,31 @@ void EslovHandler::update()
9090
uint8_t availableData = requestAvailableData();
9191
Serial.write(availableData);
9292

93-
SensorLongDataPacket sensorData;
93+
SensorDataPacket sensorData;
9494
while (availableData) {
9595
//delay(ESLOV_DELAY);
9696
requestSensorData(sensorData);
9797
delay(ESLOV_DELAY);
98-
if (sensorData.sensorId == 115 || sensorData.sensorId == 171) {
99-
Serial.write((uint8_t*)&sensorData, sizeof(SensorLongDataPacket));
100-
} else {
101-
Serial.write((uint8_t*)&sensorData, sizeof(SensorDataPacket));
102-
}
98+
Serial.write((uint8_t*)&sensorData, sizeof(SensorDataPacket));
99+
availableData--;
100+
}
101+
102+
_rxIndex = 0;
103+
104+
} else if (_rxBuffer[0] == HOST_READ_LONG_SENSOR_OPCODE) {
105+
106+
if (_debug) {
107+
_debug->print("received read sensor opcode\r\n");
108+
}
109+
uint8_t availableData = requestAvailableLongData();
110+
Serial.write(availableData);
111+
112+
SensorLongDataPacket sensorData;
113+
while (availableData) {
114+
//delay(ESLOV_DELAY);
115+
requestSensorLongData(sensorData);
116+
delay(ESLOV_DELAY);
117+
Serial.write((uint8_t*)&sensorData, sizeof(SensorLongDataPacket));
103118
availableData--;
104119
}
105120

@@ -218,23 +233,45 @@ uint8_t EslovHandler::requestAvailableData()
218233
delay(ESLOV_DELAY);
219234
}
220235

221-
bool EslovHandler::requestSensorData(SensorLongDataPacket &sData)
236+
uint8_t EslovHandler::requestAvailableLongData()
237+
{
238+
writeStateChange(ESLOV_AVAILABLE_LONG_SENSOR_STATE);
239+
while(!digitalRead(_eslovIntPin)) {}
240+
uint8_t ret = Wire.requestFrom(ESLOV_DEFAULT_ADDRESS, 1);
241+
if (!ret) return 0;
242+
return Wire.read();
243+
delay(ESLOV_DELAY);
244+
}
245+
246+
bool EslovHandler::requestSensorData(SensorDataPacket &sData)
222247
{
223248
if (_eslovState != ESLOV_READ_SENSOR_STATE) {
224249
writeStateChange(ESLOV_READ_SENSOR_STATE);
225250
while(!digitalRead(_eslovIntPin)) {}
226251
}
252+
//uint8_t ret = Wire.requestFrom(ESLOV_DEFAULT_ADDRESS, sizeof(SensorDataPacket));
227253
uint8_t ret = Wire.requestFrom(ESLOV_DEFAULT_ADDRESS, sizeof(SensorDataPacket));
228254
if (!ret) return false;
229255

230256
uint8_t *data = (uint8_t*)&sData;
231257
for (uint8_t i = 0; i < sizeof(SensorDataPacket); i++) {
232258
data[i] = Wire.read();
233259
}
234-
if (data[0] == 115 || data[0] == 171) {
235-
for (uint8_t i = sizeof(SensorDataPacket); i < (sizeof(SensorLongDataPacket) - sizeof(SensorDataPacket)); i++) {
236-
data[i] = Wire.read();
237-
}
260+
return true;
261+
}
262+
263+
bool EslovHandler::requestSensorLongData(SensorLongDataPacket &sData)
264+
{
265+
if (_eslovState != ESLOV_READ_LONG_SENSOR_STATE) {
266+
writeStateChange(ESLOV_READ_LONG_SENSOR_STATE);
267+
while(!digitalRead(_eslovIntPin)) {}
268+
}
269+
uint8_t ret = Wire.requestFrom(ESLOV_DEFAULT_ADDRESS, sizeof(SensorLongDataPacket));
270+
if (!ret) return false;
271+
272+
uint8_t *data = (uint8_t*)&sData;
273+
for (uint8_t i = 0; i < sizeof(SensorLongDataPacket); i++) {
274+
data[i] = Wire.read();
238275
}
239276
return true;
240277
}

src/EslovHandler.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@ enum HostOpcode {
2424
HOST_DFU_INTERNAL_OPCODE = ESLOV_DFU_INTERNAL_OPCODE,
2525
HOST_DFU_EXTERNAL_OPCODE = ESLOV_DFU_EXTERNAL_OPCODE,
2626
HOST_READ_SENSOR_OPCODE,
27-
HOST_CONFIG_SENSOR_OPCODE
27+
HOST_CONFIG_SENSOR_OPCODE,
28+
HOST_READ_LONG_SENSOR_OPCODE
2829
};
2930

3031
enum EslovState {
3132
ESLOV_AVAILABLE_SENSOR_STATE = 0x00,
3233
ESLOV_READ_SENSOR_STATE = 0x01,
3334
ESLOV_DFU_ACK_STATE = 0x02,
34-
ESLOV_SENSOR_ACK_STATE = 0x03
35+
ESLOV_SENSOR_ACK_STATE = 0x03,
36+
ESLOV_AVAILABLE_LONG_SENSOR_STATE = 0x04,
37+
ESLOV_READ_LONG_SENSOR_STATE = 0x05
3538

3639
};
3740

@@ -47,8 +50,10 @@ class EslovHandler {
4750
void writeStateChange(EslovState state);
4851
void writeConfigPacket(SensorConfigurationPacket& config);
4952
uint8_t requestPacketAck();
50-
uint8_t requestAvailableData() ;
51-
bool requestSensorData(SensorLongDataPacket &sData);
53+
uint8_t requestAvailableData();
54+
uint8_t requestAvailableLongData();
55+
bool requestSensorData(SensorDataPacket &sData);
56+
bool requestSensorLongData(SensorLongDataPacket &sData);
5257
void toggleEslovIntPin();
5358

5459
protected:

0 commit comments

Comments
 (0)