@@ -73,7 +73,7 @@ class ADCBoard {
7373 int cs_pin;
7474 int data_ready_pin;
7575 int reset_pin;
76- int conversion_times[NUM_CHANNELS_PER_ADC_BOARD] ;
76+ int board_idx ;
7777 PeripheralCommsController commsController;
7878
7979 void waitDataReady () {
@@ -90,8 +90,8 @@ class ADCBoard {
9090 public:
9191 bool data_ready = false ;
9292
93- ADCBoard (int cs_pin, int data_ready_pin, int reset_pin)
94- : cs_pin(cs_pin), data_ready_pin(data_ready_pin), reset_pin(reset_pin), commsController(cs_pin) {}
93+ ADCBoard (int cs_pin, int data_ready_pin, int reset_pin, int board_idx )
94+ : cs_pin(cs_pin), data_ready_pin(data_ready_pin), reset_pin(reset_pin), board_idx(board_idx), commsController(cs_pin) {}
9595
9696 void setup () {
9797 pinMode (reset_pin, OUTPUT);
@@ -173,6 +173,11 @@ class ADCBoard {
173173 uint32_t zeroScaleCalibrations[NUM_CHANNELS_PER_ADC_BOARD];
174174 uint32_t fullScaleCalibrations[NUM_CHANNELS_PER_ADC_BOARD];
175175
176+ float conversion_times[NUM_CHANNELS_PER_ADC_BOARD];
177+ for (int i = 0 ; i < NUM_CHANNELS_PER_ADC_BOARD; i++) {
178+ conversion_times[i] = getConversionTime (i);
179+ }
180+
176181 for (int i = 0 ; i<NUM_CHANNELS_PER_ADC_BOARD; i++) {
177182 zeroScaleCalibrations[i] = getZeroScaleCalibration (i);
178183 fullScaleCalibrations[i] = getFullScaleCalibration (i);
@@ -190,6 +195,7 @@ class ADCBoard {
190195 }
191196
192197 int getDataReadyPin () const { return data_ready_pin; }
198+ int getBoardIndex () const { return board_idx; }
193199
194200 void setReadyFlag () { data_ready = true ; }
195201 void clearReadyFlag () { data_ready = false ; }
@@ -353,6 +359,28 @@ class ADCBoard {
353359 return (status & (1 << adc_channel)) != 0 ;
354360 }
355361
362+ void hardReset () {
363+ digitalWrite (reset_pin, HIGH);
364+ digitalWrite (reset_pin, LOW);
365+ delay (5 );
366+ digitalWrite (reset_pin, HIGH);
367+
368+ for (int i = 0 ; i < NUM_CHANNELS_PER_ADC_BOARD; i++) {
369+ idleMode (i);
370+ }
371+ }
372+
373+ void restoreCalibrationFromFlash () {
374+ CalibrationData data;
375+ m4ReceiveCalibrationData (data);
376+ int boardIndex = getBoardIndex ();
377+
378+ for (int i = 0 ; i < NUM_CHANNELS_PER_ADC_BOARD; i++) {
379+ setZeroScaleCalibration (i, data.adc_offset [NUM_CHANNELS_PER_ADC_BOARD * boardIndex + i]);
380+ setFullScaleCalibration (i, data.adc_gain [NUM_CHANNELS_PER_ADC_BOARD * boardIndex + i]);
381+ }
382+ }
383+
356384 void reset () {
357385 digitalWrite (reset_pin, HIGH);
358386 digitalWrite (reset_pin, LOW);
@@ -372,6 +400,8 @@ class ADCBoard {
372400 data[0 ] = WRITE | ADDR_IO;
373401 data[1 ] = 0b00010001 ;
374402 commsController.transferADC (data, 2 );
403+
404+ restoreCalibrationFromFlash ();
375405 }
376406
377407 uint8_t talkADC (byte command) {
@@ -412,8 +442,6 @@ class ADCBoard {
412442 // could've done the calculation with user-given values but it's good to check
413443 float time_us = getConversionTime (channel, moreThanOneChannelActive);
414444
415- conversion_times[channel] = time_us;
416-
417445 delayMicroseconds (100 );
418446
419447 return time_us;
@@ -503,6 +531,17 @@ class ADCBoard {
503531 #endif
504532 commsController.transferADC (data, 2 );
505533 waitDataReady ();
534+
535+ // wait for the data ready flag to be set then store the calibration data in flash
536+ int boardIndex = getBoardIndex ();
537+
538+ uint32_t zeroScaleCalibration = getZeroScaleCalibration (channel);
539+
540+ CalibrationData calibrationData;
541+ m4ReceiveCalibrationData (calibrationData);
542+ calibrationData.adc_offset [NUM_CHANNELS_PER_ADC_BOARD * boardIndex + channel] = zeroScaleCalibration;
543+ m4SendCalibrationData (calibrationData);
544+
506545 }
507546
508547 void fullScaleChannelSystemSelfCalibration (int channel) {
@@ -514,6 +553,16 @@ class ADCBoard {
514553 #endif
515554 commsController.transferADC (data, 2 );
516555 waitDataReady ();
556+
557+ // wait for the data ready flag to be set then store the calibration data in flash
558+ int boardIndex = getBoardIndex ();
559+
560+ uint32_t fullScaleCalibration = getFullScaleCalibration (channel);
561+
562+ CalibrationData calibrationData;
563+ m4ReceiveCalibrationData (calibrationData);
564+ calibrationData.adc_gain [NUM_CHANNELS_PER_ADC_BOARD * boardIndex + channel] = fullScaleCalibration;
565+ m4SendCalibrationData (calibrationData);
517566 }
518567};
519568
0 commit comments