@@ -812,71 +812,115 @@ class God {
812812
813813
814814 static OperationResult AWGBufferRampWrapper (std::vector<float > args) {
815- // Expected argument order:
816- // [numDacChannels, numAdcChannels, numLoops, numDacStepsPerLoop, numAdcAverages, dac_interval_us, dac_settling_time_us, <dacChannels...>, <adcChannels...>, <dacVoltageLists...>]
817- // The number of DAC and ADC channels determines how many channel indices and voltage lists to expect .
815+ // AWG_BUFFER_RAMP,<dacN>,<numSteps>,<dacInterval_us>,<dacPorts...>,<voltages...>
816+ //
817+ // Voltages are channel-major: all points for DAC0, then all points for DAC1, .. .
818818
819- if (args.size () < 7 ) {
820- return OperationResult::Failure (" Insufficient arguments for AWGBufferRampWrapper " );
819+ if (args.size () < 3 ) {
820+ return OperationResult::Failure (" Insufficient arguments for AWG_BUFFER_RAMP " );
821821 }
822822
823- int idx = 0 ;
824- int numDacChannels = static_cast <int >(args[idx++]);
825- int numAdcChannels = static_cast <int >(args[idx++]);
826- int numLoops = static_cast <int >(args[idx++]);
827- int numDacStepsPerLoop = static_cast <int >(args[idx++]);
828- int numAdcAverages = static_cast <int >(args[idx++]);
829- uint32_t dac_interval_us = static_cast <uint32_t >(args[idx++]);
823+ const int dacN = static_cast <int >(args[0 ]);
824+ const int numSteps = static_cast <int >(args[1 ]);
825+ const uint32_t dac_interval_us = static_cast <uint32_t >(args[2 ]);
830826
831- // Check for valid channel counts
832- if (numDacChannels < 1 || numAdcChannels < 1 || numLoops < 1 || numDacStepsPerLoop < 1 || numAdcAverages < 1 ) {
833- return OperationResult::Failure (" Invalid channel or loop/step/average count" );
827+ if (dacN < 1 || numSteps < 1 ) {
828+ return OperationResult::Failure (" Invalid number of channels or steps" );
834829 }
835830
836- // Check if enough arguments for channel indices
837- if (args.size () < idx + numDacChannels + numAdcChannels) {
838- return OperationResult::Failure (" Insufficient arguments for channel indices" );
831+ const size_t expected =
832+ 3u + static_cast <size_t >(dacN) +
833+ static_cast <size_t >(dacN) * static_cast <size_t >(numSteps);
834+
835+ if (args.size () != expected) {
836+ return OperationResult::Failure (" Invalid argument count for AWG_BUFFER_RAMP" );
839837 }
840838
841- // Parse DAC channel indices
842- int dacChannels[numDacChannels ];
843- for (int i = 0 ; i < numDacChannels ; ++i) {
839+ int idx = 3 ;
840+ int dacChannels[dacN ];
841+ for (int i = 0 ; i < dacN ; ++i) {
844842 dacChannels[i] = static_cast <int >(args[idx++]);
845843 }
846844
847- // Parse ADC channel indices
848- int adcChannels[numAdcChannels];
849- for (int i = 0 ; i < numAdcChannels; ++i) {
850- adcChannels[i] = static_cast <int >(args[idx++]);
851- }
845+ const float * voltages = &args[idx];
846+ return AWGDacOnlyRampBase (dacN, numSteps, dac_interval_us, dacChannels, voltages);
847+ }
852848
853- // Now, expect numDacChannels blocks of numDacStepsPerLoop floats for the DAC voltage lists
854- int expectedVoltageListSize = numDacChannels * numDacStepsPerLoop;
855- if (args.size () < idx + expectedVoltageListSize) {
856- return OperationResult::Failure (" Insufficient arguments for DAC voltage lists" );
849+ static OperationResult AWGDacOnlyRampBase (
850+ int numDacChannels,
851+ int numSteps,
852+ uint32_t dac_interval_us,
853+ int * dacChannels,
854+ const float * channelMajorVoltages) {
855+ if (dac_interval_us < 1 ) {
856+ return OperationResult::Failure (" Invalid dac interval" );
857+ }
858+ if (numDacChannels < 1 || numSteps < 1 ) {
859+ return OperationResult::Failure (" Invalid number of channels or steps" );
857860 }
858861
859- // Allocate and fill DAC voltage lists
860- float * dacVoltageLists[numDacChannels];
861- for (int i = 0 ; i < numDacChannels; ++i) {
862- dacVoltageLists[i] = new float [numDacStepsPerLoop];
863- for (int j = 0 ; j < numDacStepsPerLoop; ++j) {
864- dacVoltageLists[i][j] = args[idx++];
862+ // Bounds check before starting
863+ for (int i = 0 ; i < numDacChannels; i++) {
864+ int ch = dacChannels[i];
865+ float lowerBound = DACController::getLowerBound (ch);
866+ float upperBound = DACController::getUpperBound (ch);
867+ const float * vlist = &channelMajorVoltages[static_cast <size_t >(i) * static_cast <size_t >(numSteps)];
868+ for (int j = 0 ; j < numSteps; j++) {
869+ float v = vlist[j];
870+ if (v < lowerBound || v > upperBound) {
871+ return OperationResult::Failure (" DAC " + String (ch) +
872+ " voltage[" + String (j) + " ] = " + String (v, 6 ) +
873+ " V out of bounds [" + String (lowerBound, 6 ) +
874+ " , " + String (upperBound, 6 ) + " ]" );
875+ }
865876 }
866877 }
867878
868- // Call the base function
869- OperationResult result = AWGBufferRampBase (
870- numDacChannels, numAdcChannels, numLoops, numDacStepsPerLoop, numAdcAverages,
871- dac_interval_us, dacChannels, dacVoltageLists, adcChannels
872- );
879+ setStopFlag (false );
880+ PeripheralCommsController::dataLedOn ();
873881
874- // Clean up allocated memory
875- for (int i = 0 ; i < numDacChannels; ++i) {
876- delete[] dacVoltageLists[i];
882+ // Apply initial step immediately; first LDAC edge will latch these values.
883+ for (int i = 0 ; i < numDacChannels; i++) {
884+ const float v0 = channelMajorVoltages[static_cast <size_t >(i) * static_cast <size_t >(numSteps)];
885+ DACController::setVoltageNoTransactionNoLdac (dacChannels[i], v0);
877886 }
878887
879- return result;
888+ TimingUtil::setupTimerOnlyDac (dac_interval_us);
889+ TimingUtil::dacFlag = false ;
890+
891+ // Run continuously (repeat waveform) until STOP is requested.
892+ int step = 1 ; // step 0 already written
893+ while (!getStopFlag ()) {
894+ __WFE ();
895+ if (TimingUtil::dacFlag) {
896+ #if !defined(__NEW_SHIELD__)
897+ PeripheralCommsController::beginDacTransaction ();
898+ #endif
899+ for (int i = 0 ; i < numDacChannels; i++) {
900+ const float v = channelMajorVoltages[static_cast <size_t >(i) * static_cast <size_t >(numSteps) +
901+ static_cast <size_t >(step)];
902+ DACController::setVoltageNoTransactionNoLdac (dacChannels[i], v);
903+ }
904+ #if !defined(__NEW_SHIELD__)
905+ PeripheralCommsController::endTransaction ();
906+ #endif
907+ TimingUtil::dacFlag = false ;
908+ step++;
909+ if (step >= numSteps) {
910+ step = 0 ;
911+ }
912+ }
913+ }
914+
915+ TimingUtil::disableDacInterrupt ();
916+ TimingUtil::dacFlag = false ;
917+ PeripheralCommsController::dataLedOff ();
918+
919+ if (getStopFlag ()) {
920+ setStopFlag (false );
921+ return OperationResult::Failure (" RAMPING_STOPPED" );
922+ }
923+ return OperationResult::Success ();
880924 }
881925
882926
0 commit comments