@@ -13,6 +13,10 @@ class ADS1115Provider extends ChangeNotifier {
1313
1414 ADS1115 ? _ads1115;
1515 Timer ? _dataTimer;
16+
17+ bool _isDisposed = false ;
18+ bool _isFetching = false ;
19+
1620 double _voltage = 0.0 ;
1721 String _currentGain = "GAIN_ONE" ;
1822 String _currentChannel = "UNI_0" ;
@@ -82,7 +86,7 @@ class ADS1115Provider extends ChangeNotifier {
8286
8387 _ads1115 = await ADS1115 .create (i2c, scienceLab);
8488 _updateCurrentSettings ();
85- notifyListeners ();
89+ if ( ! _isDisposed) notifyListeners ();
8690 } catch (e) {
8791 logger.e ('Error initializing ADS1115: $e ' );
8892 }
@@ -100,23 +104,23 @@ class ADS1115Provider extends ChangeNotifier {
100104 if (_ads1115 != null ) {
101105 _ads1115! .setGain (gain);
102106 _currentGain = gain;
103- notifyListeners ();
107+ if ( ! _isDisposed) notifyListeners ();
104108 }
105109 }
106110
107111 void setChannel (String channel) {
108112 if (_ads1115 != null ) {
109113 _ads1115! .setChannel (channel);
110114 _currentChannel = channel;
111- notifyListeners ();
115+ if ( ! _isDisposed) notifyListeners ();
112116 }
113117 }
114118
115119 void setRate (int rate) {
116120 if (_ads1115 != null ) {
117121 _ads1115! .setDataRate (rate);
118122 _currentRate = rate;
119- notifyListeners ();
123+ if ( ! _isDisposed) notifyListeners ();
120124 }
121125 }
122126
@@ -133,8 +137,13 @@ class ADS1115Provider extends ChangeNotifier {
133137
134138 _isRunning = true ;
135139 _collectedReadings = 0 ;
140+ _isFetching = false ;
141+
136142 _dataTimer =
137143 Timer .periodic (Duration (milliseconds: _timegapMs), (timer) async {
144+ if (_isFetching || _isDisposed) return ;
145+ _isFetching = true ;
146+
138147 try {
139148 await _fetchSensorData ();
140149 _collectedReadings++ ;
@@ -147,29 +156,36 @@ class ADS1115Provider extends ChangeNotifier {
147156 _removeOldestDataPoints ();
148157 }
149158 } catch (e) {
150- logger.e ('Error fetching sensor data: $e ' );
159+ String errorMsg = e.toString ();
160+ if (errorMsg.contains ("Expected" )) {
161+ logger.w ('ADS1115 dropped a frame. Skipping gracefully...' );
162+ } else {
163+ logger.e ('Error fetching sensor data: $e ' );
164+ }
165+ } finally {
166+ _isFetching = false ;
151167 }
152168 });
153- notifyListeners ();
169+ if ( ! _isDisposed) notifyListeners ();
154170 }
155171
156172 void _stopDataCollection () {
157173 _isRunning = false ;
158174 _dataTimer? .cancel ();
159175 _dataTimer = null ;
160- notifyListeners ();
176+ if ( ! _isDisposed) notifyListeners ();
161177 }
162178
163179 Future <void > _fetchSensorData () async {
164- if (_ads1115 == null ) return ;
180+ if (_ads1115 == null || _isDisposed ) return ;
165181
166182 try {
167183 final rawData = await _ads1115! .getRawData ();
168184 _voltage = rawData['voltage' ] ?? 0.0 ;
169185 _currentTime += _timegapMs / 1000.0 ;
170186
171187 _addDataPoint (_voltageData, _voltage);
172- notifyListeners ();
188+ if ( ! _isDisposed) notifyListeners ();
173189 } catch (e) {
174190 logger.e ('Error in _fetchSensorData: $e ' );
175191 rethrow ;
@@ -193,32 +209,31 @@ class ADS1115Provider extends ChangeNotifier {
193209
194210 void toggleLooping () {
195211 _isLooping = ! _isLooping;
196- notifyListeners ();
212+ if ( ! _isDisposed) notifyListeners ();
197213 }
198214
199215 void setTimegap (int timegapMs) {
200- if (_timegapMs == timegapMs) {
201- return ;
202- }
216+ if (_timegapMs == timegapMs) return ;
217+
203218 _timegapMs = timegapMs;
204219 if (_isRunning) {
205220 _stopDataCollection ();
206221 _startDataCollection ();
207222 }
208- notifyListeners ();
223+ if ( ! _isDisposed) notifyListeners ();
209224 }
210225
211226 void setNumberOfReadings (int numberOfReadings) {
212227 _numberOfReadings = numberOfReadings;
213- notifyListeners ();
228+ if ( ! _isDisposed) notifyListeners ();
214229 }
215230
216231 void clearData () {
217232 _voltageData.clear ();
218233 _voltage = 0.0 ;
219234 _currentTime = 0.0 ;
220235 _collectedReadings = 0 ;
221- notifyListeners ();
236+ if ( ! _isDisposed) notifyListeners ();
222237 }
223238
224239 bool get isCollectionComplete {
@@ -227,6 +242,7 @@ class ADS1115Provider extends ChangeNotifier {
227242
228243 @override
229244 void dispose () {
245+ _isDisposed = true ;
230246 _stopDataCollection ();
231247 super .dispose ();
232248 }
0 commit comments