Skip to content

Commit

Permalink
added time series adc read
Browse files Browse the repository at this point in the history
markzakharyan committed Jan 28, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 14fe533 commit 63fdfa6
Showing 1 changed file with 77 additions and 0 deletions.
77 changes: 77 additions & 0 deletions m4/src/Peripherals/ADC/ADCController.h
Original file line number Diff line number Diff line change
@@ -8,6 +8,8 @@
#include "FunctionRegistry/FunctionRegistryHelpers.h"
#include "Peripherals/ADC/ADCBoard.h"
#include "Peripherals/OperationResult.h"
#include "Utils/TimingUtil.h"

class ADCController {
private:
inline static std::vector<ADCBoard> adc_boards;
@@ -58,6 +60,7 @@ class ADCController {
"ADC_CH_ZERO_SC_CAL");
registerMemberFunction(adcChannelSystemFullScaleCal,
"ADC_CH_FULL_SC_CAL");
registerMemberFunctionVector(timeSeriesAdcRead, "TIME_SERIES_ADC_READ");
}

inline static void addBoard(int cs_pin, int data_ready,
@@ -98,6 +101,80 @@ class ADCController {
getChannelIndexFromGlobalIndex(channel_index));
}

// args: num_channels, channel_indexes, total_duration_us
// ex: TIME_SERIES_ADC_READ 2,0,1,1000000
inline static OperationResult timeSeriesAdcRead(const std::vector<float>& args) {
if (args.size() < 2) {
return OperationResult::Failure("Not enough arguments provided");
}

int numAdcChannels = static_cast<int>(args[0]);
if (args.size() != static_cast<size_t>(numAdcChannels + 2)) {
return OperationResult::Failure("Incorrect number of arguments");
}
std::vector<int> adcChannels;
for (int i = 0; i < numAdcChannels; ++i) {
adcChannels.push_back(static_cast<int>(args[i + 1]));
}

uint32_t totalDuration = static_cast<uint32_t>(args[numAdcChannels + 1]);
if (totalDuration < 82) {
return OperationResult::Failure("Invalid total duration");
}

int x = 0;

float adcConversionTime = getConversionTimeFloat(adcChannels[0]);

for (int i = 1; i < numAdcChannels; i++) {
if (getConversionTimeFloat(adcChannels[i]) != adcConversionTime) {
return OperationResult::Failure("All channels must have the same "
"conversion time for time series read");
}
}

const int saved_data_size = totalDuration / adcConversionTime;

setStopFlag(false);
PeripheralCommsController::dataLedOn();

for (int i = 0; i < numAdcChannels; i++) {
ADCController::startContinuousConversion(adcChannels[i]);
}
TimingUtil::setupTimersTimeSeries(10000, adcConversionTime);


while (x < saved_data_size && !getStopFlag()) {
if (TimingUtil::adcFlag) {
float packets[numAdcChannels];
for (int i = 0; i < numAdcChannels; i++) {
float v =
getVoltageDataNoTransaction(adcChannels[i]);
packets[i] = v;
}
m4SendFloat(packets, numAdcChannels);
x++;
TimingUtil::adcFlag = false;
}
}

TimingUtil::disableDacInterrupt();
TimingUtil::disableAdcInterrupt();

for (int i = 0; i < numAdcChannels; i++) {
ADCController::idleMode(adcChannels[i]);
}

PeripheralCommsController::dataLedOff();

if (getStopFlag()) {
setStopFlag(false);
return OperationResult::Failure("RAMPING_STOPPED");
}

return OperationResult::Success();
}

inline static uint32_t getConversionData(int adc_channel) {
return adc_boards[getBoardIndexFromGlobalIndex(adc_channel)]
.getConversionData(getChannelIndexFromGlobalIndex(adc_channel));

0 comments on commit 63fdfa6

Please sign in to comment.