1
1
#include " EslovHandler.h"
2
2
3
- #define ESLOV_DELAY (10 )
3
+ #define ESLOV_DELAY (1 )
4
4
5
5
EslovHandler::EslovHandler () :
6
6
_rxIndex(0 ),
@@ -70,8 +70,6 @@ void EslovHandler::update()
70
70
dump ();
71
71
72
72
_rxIndex = 0 ;
73
-
74
- delay (ESLOV_DELAY);
75
73
76
74
Serial.write (ack);
77
75
}
@@ -86,9 +84,15 @@ void EslovHandler::update()
86
84
87
85
SensorDataPacket sensorData;
88
86
while (availableData) {
89
- // delay(ESLOV_DELAY);
90
87
requestSensorData (sensorData);
91
- delay (ESLOV_DELAY);
88
+ /*
89
+ This delay is needed because the synchronization mechanism over the Eslov Int Pin
90
+ may not apply for the requests from the host board to Nicla.
91
+ It may happen that the onRequest callback on Nicla side is serviced after a certain delay.
92
+ We need to add this delay of 10ms to avoid that a second request is issued before
93
+ the first one is handled.
94
+ */
95
+ delay (10 );
92
96
Serial.write ((uint8_t *)&sensorData, sizeof (SensorDataPacket));
93
97
availableData--;
94
98
}
@@ -107,7 +111,7 @@ void EslovHandler::update()
107
111
while (availableData) {
108
112
// delay(ESLOV_DELAY);
109
113
requestSensorLongData (sensorData);
110
- delay (ESLOV_DELAY );
114
+ delay (10 );
111
115
Serial.write ((uint8_t *)&sensorData, sizeof (SensorLongDataPacket));
112
116
availableData--;
113
117
}
@@ -180,31 +184,28 @@ void EslovHandler::writeDfuPacket(uint8_t *data, uint8_t length)
180
184
181
185
void EslovHandler::writeStateChange (EslovState state)
182
186
{
183
- delay (ESLOV_DELAY);
184
187
while (!digitalRead (_eslovIntPin)) {}
185
188
uint8_t packet[2 ] = {ESLOV_SENSOR_STATE_OPCODE, state};
186
189
Wire.beginTransmission (ESLOV_DEFAULT_ADDRESS);
187
190
Wire.write ((uint8_t *)packet, sizeof (packet));
188
191
Wire.endTransmission ();
189
- delay (ESLOV_DELAY);
190
192
_eslovState = state;
191
193
}
192
194
193
195
void EslovHandler::writeConfigPacket (SensorConfigurationPacket& config)
194
196
{
195
- delay (ESLOV_DELAY);
197
+ while (! digitalRead (_eslovIntPin)) {}
196
198
uint8_t packet[sizeof (SensorConfigurationPacket) + 1 ];
197
199
packet[0 ] = ESLOV_SENSOR_CONFIG_OPCODE;
198
200
memcpy (&packet[1 ], &config, sizeof (SensorConfigurationPacket));
199
201
Wire.beginTransmission (ESLOV_DEFAULT_ADDRESS);
200
202
Wire.write (packet, sizeof (SensorConfigurationPacket) + 1 );
201
203
Wire.endTransmission ();
202
- delay (ESLOV_DELAY);
203
204
}
204
205
205
206
uint8_t EslovHandler::requestPacketAck ()
206
- {
207
- delay (ESLOV_DELAY);
207
+ {
208
+ while (! digitalRead (_eslovIntPin)) {}
208
209
uint8_t ret = 0 ;
209
210
while (!ret) {
210
211
ret = Wire.requestFrom (ESLOV_DEFAULT_ADDRESS, 1 );
@@ -223,7 +224,6 @@ uint8_t EslovHandler::requestAvailableData()
223
224
uint8_t ret = Wire.requestFrom (ESLOV_DEFAULT_ADDRESS, 1 );
224
225
if (!ret) return 0 ;
225
226
return Wire.read ();
226
- delay (ESLOV_DELAY);
227
227
}
228
228
229
229
uint8_t EslovHandler::requestAvailableLongData ()
@@ -240,9 +240,8 @@ bool EslovHandler::requestSensorData(SensorDataPacket &sData)
240
240
{
241
241
if (_eslovState != ESLOV_READ_SENSOR_STATE) {
242
242
writeStateChange (ESLOV_READ_SENSOR_STATE);
243
- while (!digitalRead (_eslovIntPin)) {}
244
243
}
245
- // uint8_t ret = Wire.requestFrom(ESLOV_DEFAULT_ADDRESS, sizeof(SensorDataPacket));
244
+ while (! digitalRead (_eslovIntPin)) {}
246
245
uint8_t ret = Wire.requestFrom (ESLOV_DEFAULT_ADDRESS, sizeof (SensorDataPacket));
247
246
if (!ret) return false ;
248
247
@@ -257,8 +256,8 @@ bool EslovHandler::requestSensorLongData(SensorLongDataPacket &sData)
257
256
{
258
257
if (_eslovState != ESLOV_READ_LONG_SENSOR_STATE) {
259
258
writeStateChange (ESLOV_READ_LONG_SENSOR_STATE);
260
- while (!digitalRead (_eslovIntPin)) {}
261
259
}
260
+ while (!digitalRead (_eslovIntPin)) {}
262
261
uint8_t ret = Wire.requestFrom (ESLOV_DEFAULT_ADDRESS, sizeof (SensorLongDataPacket));
263
262
if (!ret) return false ;
264
263
0 commit comments