Skip to content

Commit

Permalink
outp:state now works on multiple channels
Browse files Browse the repository at this point in the history
  • Loading branch information
mvladic committed Mar 30, 2020
1 parent b96d11a commit 9718e4a
Show file tree
Hide file tree
Showing 14 changed files with 301 additions and 181 deletions.
4 changes: 2 additions & 2 deletions src/eez/modules/bp3c/io_exp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
#include <cmsis_os.h>
#endif

#include <scpi/scpi.h>

#include <eez/system.h>

// TODO
Expand All @@ -36,6 +34,8 @@
#include <eez/modules/psu/channel.h>
#include <eez/modules/psu/io_pins.h>

#include <scpi/scpi.h>

#ifdef EEZ_PLATFORM_STM32

#if EEZ_BP3C_REVISION_R1B1
Expand Down
83 changes: 50 additions & 33 deletions src/eez/modules/psu/channel_dispatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1110,11 +1110,38 @@ void outputEnable(Channel &channel, bool enable) {
syncOutputEnable();
}

bool outputEnable(Channel &channel, bool enable, int *err) {
void outputEnableOnNextSync(Channel &channel, bool enable) {
if (channel.channelIndex < 2 && (g_couplingType == COUPLING_TYPE_SERIES || g_couplingType == COUPLING_TYPE_PARALLEL)) {
Channel::get(0).flags.doOutputEnableOnNextSync = 1;
Channel::get(0).flags.outputEnabledValueOnNextSync = enable;

Channel::get(1).flags.doOutputEnableOnNextSync = 1;
Channel::get(1).flags.outputEnabledValueOnNextSync = enable;
} else if (channel.flags.trackingEnabled) {
for (int i = 0; i < CH_NUM; ++i) {
Channel &trackingChannel = Channel::get(i);
if (trackingChannel.flags.trackingEnabled) {
trackingChannel.flags.doOutputEnableOnNextSync = 1;
trackingChannel.flags.outputEnabledValueOnNextSync = enable;
}
}
} else {
channel.flags.doOutputEnableOnNextSync = 1;
channel.flags.outputEnabledValueOnNextSync = enable;
}
}

void syncOutputEnable() {
if (osThreadGetId() != g_psuTaskHandle) {
osMessagePut(g_psuMessageQueueId, PSU_QUEUE_MESSAGE(PSU_QUEUE_SYNC_OUTPUT_ENABLE, 0), osWaitForever);
} else {
Channel::syncOutputEnable();
}
}

bool testOutputEnable(Channel &channel, bool enable, bool &callTriggerAbort, int *err) {
if (enable != channel.isOutputEnabled()) {
bool triggerModeEnabled =
channel_dispatcher::getVoltageTriggerMode(channel) != TRIGGER_MODE_FIXED ||
channel_dispatcher::getCurrentTriggerMode(channel) != TRIGGER_MODE_FIXED;
bool triggerModeEnabled = getVoltageTriggerMode(channel) != TRIGGER_MODE_FIXED || getCurrentTriggerMode(channel) != TRIGGER_MODE_FIXED;

if (channel.isOutputEnabled()) {
if (calibration::isEnabled()) {
Expand All @@ -1125,12 +1152,10 @@ bool outputEnable(Channel &channel, bool enable, int *err) {
}

if (triggerModeEnabled && !trigger::isIdle()) {
trigger::abort();
} else {
channel_dispatcher::outputEnable(channel, false);
callTriggerAbort = true;
}
} else {
if (channel_dispatcher::isTripped(channel)) {
if (isTripped(channel)) {
if (err) {
*err = SCPI_ERROR_CANNOT_EXECUTE_BEFORE_CLEARING_PROTECTION;
}
Expand All @@ -1139,51 +1164,43 @@ bool outputEnable(Channel &channel, bool enable, int *err) {

if (triggerModeEnabled && !trigger::isIdle()) {
if (trigger::isInitiated()) {
trigger::abort();
callTriggerAbort = true;
} else {
if (err) {
*err = SCPI_ERROR_CANNOT_CHANGE_TRANSIENT_TRIGGER;
}
return false;
}
}

channel_dispatcher::outputEnable(channel, true);
}
}

return true;
}

void outputEnableOnNextSync(Channel &channel, bool enable) {
if (channel.channelIndex < 2 && (g_couplingType == COUPLING_TYPE_SERIES || g_couplingType == COUPLING_TYPE_PARALLEL)) {
Channel::get(0).flags.doOutputEnableOnNextSync = 1;
Channel::get(0).flags.outputEnabledValueOnNextSync = enable;
bool outputEnable(uint32_t channels, bool enable, int *err) {
bool callTriggerAbort = false;

Channel::get(1).flags.doOutputEnableOnNextSync = 1;
Channel::get(1).flags.outputEnabledValueOnNextSync = enable;
} else if (channel.flags.trackingEnabled) {
for (int i = 0; i < CH_NUM; ++i) {
Channel &trackingChannel = Channel::get(i);
if (trackingChannel.flags.trackingEnabled) {
trackingChannel.flags.doOutputEnableOnNextSync = 1;
trackingChannel.flags.outputEnabledValueOnNextSync = enable;
for (int channelIndex = 0; channelIndex < CH_NUM; channelIndex++) {
if ((channels & (1 << channelIndex)) != 0) {
if (!testOutputEnable(Channel::get(channelIndex), enable, callTriggerAbort, err)) {
return false;
}
}
} else {
channel.flags.doOutputEnableOnNextSync = 1;
channel.flags.outputEnabledValueOnNextSync = enable;
}

syncOutputEnable();
}

void syncOutputEnable() {
if (osThreadGetId() != g_psuTaskHandle) {
osMessagePut(g_psuMessageQueueId, PSU_QUEUE_MESSAGE(PSU_QUEUE_SYNC_OUTPUT_ENABLE, 0), osWaitForever);
if (callTriggerAbort) {
trigger::abort();
} else {
Channel::syncOutputEnable();
for (int channelIndex = 0; channelIndex < CH_NUM; channelIndex++) {
if ((channels & (1 << channelIndex)) != 0) {
outputEnableOnNextSync(Channel::get(channelIndex), enable);
}
}
syncOutputEnable();
}

return true;
}

void disableOutputForAllChannels() {
Expand Down
2 changes: 1 addition & 1 deletion src/eez/modules/psu/channel_dispatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@ void setOppLevel(Channel &channel, float level);
void setOppDelay(Channel &channel, float delay);

void outputEnable(Channel &channel, bool enable);
bool outputEnable(Channel &channel, bool enable, int *err);
void outputEnableOnNextSync(Channel &channel, bool enable);
void syncOutputEnable();
bool outputEnable(uint32_t channels, bool enable, int *err);
void disableOutputForAllChannels();
void disableOutputForAllTrackingChannels();

Expand Down
30 changes: 20 additions & 10 deletions src/eez/modules/psu/scpi/cal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,10 @@ scpi_result_t scpi_cmd_calibrationClear(scpi_t *context) {
return SCPI_RES_ERR;
}

scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

if (!calibration::clear(channel)) {
SCPI_ErrorPush(context, SCPI_ERROR_EXECUTION_ERROR);
Expand Down Expand Up @@ -152,8 +154,10 @@ scpi_result_t scpi_cmd_calibrationMode(scpi_t *context) {
return SCPI_RES_ERR;
}

scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

if (channel->channelIndex < 2 && channel_dispatcher::getCouplingType() != channel_dispatcher::COUPLING_TYPE_NONE) {
SCPI_ErrorPush(context, SCPI_ERROR_EXECUTE_ERROR_CHANNELS_ARE_COUPLED);
Expand Down Expand Up @@ -264,8 +268,10 @@ scpi_result_t scpi_cmd_calibrationRemarkQ(scpi_t *context) {
if (calibration::isEnabled()) {
remark = calibration::getRemark();
} else {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}
remark = channel->cal_conf.calibration_remark;
}

Expand Down Expand Up @@ -295,8 +301,10 @@ scpi_result_t scpi_cmd_calibrationState(scpi_t *context) {
return SCPI_RES_ERR;
}

scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

if (channel->channelIndex < 2 && channel_dispatcher::getCouplingType() != channel_dispatcher::COUPLING_TYPE_NONE) {
SCPI_ErrorPush(context, SCPI_ERROR_EXECUTE_ERROR_CHANNELS_ARE_COUPLED);
Expand Down Expand Up @@ -329,8 +337,10 @@ scpi_result_t scpi_cmd_calibrationState(scpi_t *context) {
}

scpi_result_t scpi_cmd_calibrationStateQ(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

SCPI_ResultBool(context, channel->isCalibrationEnabled());

Expand Down
12 changes: 8 additions & 4 deletions src/eez/modules/psu/scpi/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,10 @@ scpi_result_t scpi_cmd_debugCsvQ(scpi_t *context) {

scpi_result_t scpi_cmd_debugIoexp(scpi_t *context) {
#if defined(DEBUG) && defined(EEZ_PLATFORM_STM32)
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}
if (!channel->isInstalled()) {
SCPI_ErrorPush(context, SCPI_ERROR_HARDWARE_MISSING);
return SCPI_RES_ERR;
Expand Down Expand Up @@ -367,8 +369,10 @@ scpi_result_t scpi_cmd_debugIoexp(scpi_t *context) {

scpi_result_t scpi_cmd_debugIoexpQ(scpi_t *context) {
#if defined(DEBUG) && defined(EEZ_PLATFORM_STM32)
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}
if (!channel->isInstalled()) {
SCPI_ErrorPush(context, SCPI_ERROR_HARDWARE_MISSING);
return SCPI_RES_ERR;
Expand Down
54 changes: 36 additions & 18 deletions src/eez/modules/psu/scpi/inst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ scpi_choice_def_t traceValueChoice[] = {

////////////////////////////////////////////////////////////////////////////////

static void select_channel(scpi_t *context, uint8_t channelIndex) {
static void selectChannel(scpi_t *context, uint8_t channelIndex) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
psu_context->selected_channel_index = channelIndex;
psu_context->selectedChannels = 1 << channelIndex;
}

////////////////////////////////////////////////////////////////////////////////
Expand All @@ -71,17 +71,21 @@ scpi_result_t scpi_cmd_instrumentSelect(scpi_t *context) {
return SCPI_RES_ERR;
}

select_channel(context, channel->channelIndex);
selectChannel(context, channel->channelIndex);

return SCPI_RES_OK;
}

scpi_result_t scpi_cmd_instrumentSelectQ(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;

char buffer[256] = { 0 };
sprintf(buffer, "CH%d", (int)(psu_context->selected_channel_index + 1));
SCPI_ResultCharacters(context, buffer, strlen(buffer));
for (int channelIndex = 0; channelIndex < CH_NUM; channelIndex++) {
if ((psu_context->selectedChannels & (1 << channelIndex)) != 0) {
char buffer[10];
sprintf(buffer, "CH%d", channelIndex + 1);
SCPI_ResultCharacters(context, buffer, strlen(buffer));
}
}

return SCPI_RES_OK;
}
Expand All @@ -103,15 +107,19 @@ scpi_result_t scpi_cmd_instrumentNselect(scpi_t *context) {
return SCPI_RES_ERR;
}

select_channel(context, channelIndex);
selectChannel(context, channelIndex);

return SCPI_RES_OK;
}

scpi_result_t scpi_cmd_instrumentNselectQ(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;

SCPI_ResultInt(context, psu_context->selected_channel_index + 1);
for (int channelIndex = 0; channelIndex < CH_NUM; channelIndex++) {
if ((psu_context->selectedChannels & (1 << channelIndex)) != 0) {
SCPI_ResultInt(context, channelIndex + 1);
}
}

return SCPI_RES_OK;
}
Expand Down Expand Up @@ -153,8 +161,10 @@ scpi_result_t scpi_cmd_instrumentCoupleTrackingQ(scpi_t *context) {
}

scpi_result_t scpi_cmd_instrumentDisplayTrace(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

int32_t traceNumber;
SCPI_CommandNumbers(context, &traceNumber, 1, 1);
Expand Down Expand Up @@ -188,8 +198,10 @@ scpi_result_t scpi_cmd_instrumentDisplayTrace(scpi_t *context) {
}

scpi_result_t scpi_cmd_instrumentDisplayTraceQ(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

int32_t traceNumber;
SCPI_CommandNumbers(context, &traceNumber, 1, 1);
Expand Down Expand Up @@ -221,17 +233,21 @@ scpi_result_t scpi_cmd_instrumentDisplayTraceQ(scpi_t *context) {
}

scpi_result_t scpi_cmd_instrumentDisplayTraceSwap(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

channel_dispatcher::setDisplayViewSettings(*channel, channel->flags.displayValue2, channel->flags.displayValue1, channel->ytViewRate);

return SCPI_RES_OK;
}

scpi_result_t scpi_cmd_instrumentDisplayYtRate(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

float ytViewRate;
if (!get_duration_param(context, ytViewRate, GUI_YT_VIEW_RATE_MIN, GUI_YT_VIEW_RATE_MAX,
Expand All @@ -245,8 +261,10 @@ scpi_result_t scpi_cmd_instrumentDisplayYtRate(scpi_t *context) {
}

scpi_result_t scpi_cmd_instrumentDisplayYtRateQ(scpi_t *context) {
scpi_psu_t *psu_context = (scpi_psu_t *)context->user_context;
Channel *channel = &Channel::get(psu_context->selected_channel_index);
Channel *channel = getSelectedChannel(context);
if (!channel) {
return SCPI_RES_ERR;
}

SCPI_ResultFloat(context, channel->ytViewRate);

Expand Down
Loading

0 comments on commit 9718e4a

Please sign in to comment.