Skip to content

Commit c902ae6

Browse files
authored
LibMCCore/scanlabsmc: add digital output control API and integrate into job execution lifecycle (#43)
- SDK bindings (`libmcdriver_scanlabsmc_sdk.*`): - Added bindings for `slsc_ctrl_write_digital_x`, `slsc_ctrl_write_digital_mask_x`, `slsc_job_write_digital_x` and `slsc_job_write_digital_mask_x`. - Introduced new enum `slsc_DigitalOutput` to address digital output channels. - Added wrapper functions with logging support for journaling/tracing. - Job instance (`libmcdriver_scanlabsmc_smcjobinstance.cpp`): - Digital output is now explicitly initialized to `0` before a job starts. - Output is set to `1` immediately after `slsc_job_begin` to signal job activation. - On finalization, output is set back to `0` before stopping the recorder. - Recording start/stop has been fully enabled to capture digital transitions. Signed-off-by: Yury Rodzikau <y.rodzikau@c1-technologies.com>
1 parent 34f2252 commit c902ae6

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_sdk.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ CScanLabSMCSDK::CScanLabSMCSDK(const std::string& sDLLNameUTF8, const std::strin
245245
this->ptr_slsc_ctrl_exec_init_laser_sequence = (PScanLabSMCPtr_slsc_ctrl_exec_init_laser_sequence)_loadScanLabSMCAddress(hLibrary, "slsc_ctrl_exec_init_laser_sequence");
246246
this->ptr_slsc_ctrl_exec_shutdown_laser_sequence = (PScanLabSMCPtr_slsc_ctrl_exec_shutdown_laser_sequence)_loadScanLabSMCAddress(hLibrary, "slsc_ctrl_exec_shutdown_laser_sequence");
247247
this->ptr_slsc_job_write_analog_x = (PScanLabSMCPtr_slsc_job_write_analog_x)_loadScanLabSMCAddress(hLibrary, "slsc_job_write_analog_x");
248+
249+
this->ptr_slsc_ctrl_write_digital_x = (PScanLabSMCPtr_slsc_ctrl_write_digital_x)_loadScanLabSMCAddress(hLibrary, "slsc_ctrl_write_digital_x");
250+
this->ptr_slsc_ctrl_write_digital_mask_x = (PScanLabSMCPtr_slsc_ctrl_write_digital_mask_x)_loadScanLabSMCAddress(hLibrary, "slsc_ctrl_write_digital_mask_x");
251+
252+
this->ptr_slsc_job_write_digital_x = (PScanLabSMCPtr_slsc_job_write_digital_x)_loadScanLabSMCAddress(hLibrary, "slsc_job_write_digital_x");
253+
this->ptr_slsc_job_write_digital_mask_x = (PScanLabSMCPtr_slsc_job_write_digital_mask_x)_loadScanLabSMCAddress(hLibrary, "slsc_job_write_digital_mask_x");
248254

249255
m_LibraryHandle = (void*) hLibrary;
250256
}
@@ -657,6 +663,38 @@ slscReturnValue CScanLabSMCSDK::slsc_job_write_analog_x(size_t Handle, slsc_Anal
657663
return this->ptr_slsc_job_write_analog_x(Handle, Channel, Value, TimeDelay);
658664
}
659665

666+
slscReturnValue CScanLabSMCSDK::slsc_ctrl_write_digital_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Value)
667+
{
668+
if (m_pLogJournal.get() != nullptr)
669+
m_pLogJournal->logCall("slsc_ctrl_write_digital_x", std::to_string(Handle) + ", " + std::to_string((uint32_t)Channel) + ", " + std::to_string(Value));
670+
671+
return this->ptr_slsc_ctrl_write_digital_x(Handle, Channel, Value);
672+
}
673+
674+
slscReturnValue CScanLabSMCSDK::slsc_ctrl_write_digital_mask_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value)
675+
{
676+
if (m_pLogJournal.get() != nullptr)
677+
m_pLogJournal->logCall("slsc_ctrl_write_digital_mask_x", std::to_string(Handle) + ", " + std::to_string((uint32_t)Channel) + ", " + std::to_string(Mask) + ", " + std::to_string(Value));
678+
679+
return this->ptr_slsc_ctrl_write_digital_mask_x(Handle, Channel, Mask, Value);
680+
}
681+
682+
slscReturnValue CScanLabSMCSDK::slsc_job_write_digital_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Value, double TimeDelay)
683+
{
684+
if (m_pLogJournal.get() != nullptr)
685+
m_pLogJournal->logCall("slsc_job_write_digital_x", std::to_string(Handle) + ", " + std::to_string((uint32_t)Channel) + ", " + std::to_string(Value) + ", " + std::to_string(TimeDelay));
686+
687+
return this->ptr_slsc_job_write_digital_x(Handle, Channel, Value, TimeDelay);
688+
}
689+
690+
slscReturnValue CScanLabSMCSDK::slsc_job_write_digital_mask_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value, double TimeDelay)
691+
{
692+
if (m_pLogJournal.get() != nullptr)
693+
m_pLogJournal->logCall("slsc_job_write_digital_mask_x", std::to_string(Handle) + ", " + std::to_string((uint32_t)Channel) + ", " + std::to_string(Mask) + ", " + std::to_string(Value) + ", " + std::to_string(TimeDelay));
694+
695+
return this->ptr_slsc_job_write_digital_mask_x(Handle, Channel, Mask, Value, TimeDelay);
696+
}
697+
660698
void CScanLabSMCSDK::setJournal(PScanLabSMCSDKJournal pLogJournal)
661699
{
662700
m_pLogJournal = pLogJournal;

Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_sdk.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,11 @@ namespace LibMCDriver_ScanLabSMC {
202202
slsc_AnalogOutput_2 = 1
203203
};
204204

205+
enum class slsc_DigitalOutput : uint8_t
206+
{
207+
slsc_DigitalOutput_1 = 0,
208+
slsc_DigitalOutput_2 = 1,
209+
};
205210

206211
typedef struct _slsc_PolylineOptions slsc_PolylineOptions;
207212
typedef struct _slsc_VersionInfo slsc_VersionInfo;
@@ -250,6 +255,11 @@ namespace LibMCDriver_ScanLabSMC {
250255

251256
typedef slscReturnValue(SCANLABSMC_CALLINGCONVENTION* PScanLabSMCPtr_slsc_job_write_analog_x) (size_t Handle, slsc_AnalogOutput Channel, double Value, double TimeDelay);
252257

258+
typedef slscReturnValue(SCANLABSMC_CALLINGCONVENTION* PScanLabSMCPtr_slsc_ctrl_write_digital_x) (size_t Handle, slsc_DigitalOutput Channel, uint16_t Value);
259+
typedef slscReturnValue(SCANLABSMC_CALLINGCONVENTION* PScanLabSMCPtr_slsc_ctrl_write_digital_mask_x) (size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value);
260+
typedef slscReturnValue(SCANLABSMC_CALLINGCONVENTION* PScanLabSMCPtr_slsc_job_write_digital_x) (size_t Handle, slsc_DigitalOutput Channel, uint16_t Value, double TimeDelay);
261+
typedef slscReturnValue(SCANLABSMC_CALLINGCONVENTION* PScanLabSMCPtr_slsc_job_write_digital_mask_x) (size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value, double TimeDelay);
262+
253263
class CScanLabSMCSDKJournal {
254264
private:
255265
std::map<std::string, uint32_t> m_DefinedVariables;
@@ -336,6 +346,10 @@ namespace LibMCDriver_ScanLabSMC {
336346
PScanLabSMCPtr_slsc_ctrl_exec_init_laser_sequence ptr_slsc_ctrl_exec_init_laser_sequence = nullptr;
337347
PScanLabSMCPtr_slsc_ctrl_exec_shutdown_laser_sequence ptr_slsc_ctrl_exec_shutdown_laser_sequence = nullptr;
338348
PScanLabSMCPtr_slsc_job_write_analog_x ptr_slsc_job_write_analog_x = nullptr;
349+
PScanLabSMCPtr_slsc_ctrl_write_digital_x ptr_slsc_ctrl_write_digital_x = nullptr;
350+
PScanLabSMCPtr_slsc_ctrl_write_digital_mask_x ptr_slsc_ctrl_write_digital_mask_x = nullptr;
351+
PScanLabSMCPtr_slsc_job_write_digital_x ptr_slsc_job_write_digital_x = nullptr;
352+
PScanLabSMCPtr_slsc_job_write_digital_mask_x ptr_slsc_job_write_digital_mask_x = nullptr;
339353

340354
public:
341355

@@ -393,6 +407,11 @@ namespace LibMCDriver_ScanLabSMC {
393407

394408
slscReturnValue slsc_job_write_analog_x(size_t Handle, slsc_AnalogOutput Channel, double Value, double TimeDelay);
395409

410+
slscReturnValue slsc_ctrl_write_digital_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Value);
411+
slscReturnValue slsc_ctrl_write_digital_mask_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value);
412+
413+
slscReturnValue slsc_job_write_digital_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Value, double TimeDelay);
414+
slscReturnValue slsc_job_write_digital_mask_x(size_t Handle, slsc_DigitalOutput Channel, uint16_t Mask, uint16_t Value, double TimeDelay);
396415

397416
};
398417

Drivers/ScanLabSMC/Implementation/libmcdriver_scanlabsmc_smcjobinstance.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,20 @@ CSMCJobInstance::CSMCJobInstance(PSMCContextHandle pContextHandle, double dStart
7777
m_pSDK = m_pContextHandle->getSDK();
7878

7979
auto contextHandle = m_pContextHandle->getHandle();
80+
81+
// Initialize digital output to 0
82+
m_pSDK->checkError(contextHandle, m_pSDK->slsc_ctrl_write_digital_x(contextHandle, slsc_DigitalOutput::slsc_DigitalOutput_1, 0));
83+
84+
// Begin job
8085
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_begin(contextHandle, &m_JobID));
8186

87+
// Set digital output to 1
88+
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_write_digital_x(contextHandle, slsc_DigitalOutput::slsc_DigitalOutput_1, 1, 0 ) );
8289

8390
slsc_RecordSet eRecordSetA = slsc_RecordSet::slsc_RecordSet_SetPositions;
8491
slsc_RecordSet eRecordSetB = slsc_RecordSet::slsc_RecordSet_LaserSwitches;
8592

86-
//m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_start_record(contextHandle, eRecordSetA, eRecordSetB));
93+
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_start_record(contextHandle, eRecordSetA, eRecordSetB));
8794

8895
if (dMaxPowerInWatts < SCANLABSMC_MIN_MAXPOWERINWATTS || dMaxPowerInWatts > SCANLABSMC_MAX_MAXPOWERINWATTS)
8996
throw ELibMCDriver_ScanLabSMCInterfaceException(LIBMCDRIVER_SCANLABSMC_ERROR_INVALIDMAXPOWERVALUE);
@@ -106,7 +113,11 @@ void CSMCJobInstance::Finalize()
106113

107114
auto contextHandle = m_pContextHandle->getHandle();
108115

109-
//m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_stop_record(contextHandle));
116+
// Set digital output to 0
117+
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_write_digital_x(contextHandle, slsc_DigitalOutput::slsc_DigitalOutput_1, 0, 0));
118+
119+
// Stop recording
120+
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_stop_record(contextHandle));
110121

111122
m_pSDK->checkError(contextHandle, m_pSDK->slsc_job_end(contextHandle));
112123
m_bIsFinalized = true;

0 commit comments

Comments
 (0)