Skip to content

Commit 2f2b333

Browse files
committed
very long awg commands
1 parent 67ddd50 commit 2f2b333

File tree

6 files changed

+463
-112
lines changed

6 files changed

+463
-112
lines changed

dac_adc_giga.code-workspace

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
},
66
{
77
"path": "m7"
8+
},
9+
{
10+
"path": "../../afyservers-py3"
811
}
912
],
1013
"settings": {

m4/src/Peripherals/God.h

Lines changed: 89 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)