Skip to content

Commit dfc9829

Browse files
authored
Merge pull request #66 from freidt/master
WIP: Adding timeout to the implicit locking for SWT and SCA
2 parents f769f96 + 69b26c8 commit dfc9829

File tree

9 files changed

+51
-31
lines changed

9 files changed

+51
-31
lines changed

include/Alf/Lla.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class LlaSession
3333
LlaSession(std::shared_ptr<lla::Session> llaSession);
3434
LlaSession(std::string sessionName, roc::SerialId serialId);
3535
~LlaSession();
36-
void start();
36+
void start(int timeout=0);
3737
void stop();
3838

3939
private:

include/Alf/Sca.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,21 @@ class Sca : public ScBase
8686
/// Executes an SCA command
8787
/// \param commandData SCA command, data pair
8888
/// \param lock Boolean enabling implicit locking
89+
/// \param lockTimeout timeout (in ms) for aquiring the lock
8990
/// \throws o2::lla::LlaException on lock fail,
9091
/// o2::alf::ScaException on SCA error
91-
CommandData executeCommand(CommandData commandData, bool lock = false)
92+
CommandData executeCommand(CommandData commandData, bool lock = false, int lockTimeout = 0)
9293
{
93-
return executeCommand(commandData.command, commandData.data, lock);
94+
return executeCommand(commandData.command, commandData.data, lock, lockTimeout);
9495
}
9596
/// Executes an SCA command
9697
/// \param command SCA command
9798
/// \param data SCA data
9899
/// \param lock Boolean enabling implicit locking
100+
/// \param lockTimeout timeout (in ms) for aquiring the lock
99101
/// \throws o2::lla::LlaException on lock fail
100102
/// o2::alf::ScaException on SCA error
101-
CommandData executeCommand(uint32_t command, uint32_t data, bool lock = false);
103+
CommandData executeCommand(uint32_t command, uint32_t data, bool lock = false, int lockTimeout = 0);
102104

103105
/// Executes an SCA sequence
104106
/// \param operations A vector of Operation and Data pairs
@@ -108,15 +110,15 @@ class Sca : public ScBase
108110
/// WaitTime for Waits
109111
/// std::string for Errors
110112
/// \throws o2::lla::LlaException on lock fail
111-
std::vector<std::pair<Operation, Data>> executeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock = false);
113+
std::vector<std::pair<Operation, Data>> executeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock = false, int lockTimeout = 0);
112114

113115
/// Executes an SCA sequence for the ALF Server
114116
/// \param operations A vector of Data and Operation pairs
115117
/// \param lock Boolean enabling implicit locking
116118
/// \return A string of newline separated results;
117119
/// \throws o2::lla::LlaException on lock fail
118120
/// o2::alf::ScaException on invalid operation or error
119-
std::string writeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock = false);
121+
std::string writeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock = false, int lockTimeout = 0);
120122

121123
static std::string ScaOperationToString(Operation op);
122124
static Sca::Operation StringToScaOperation(std::string op);

include/Alf/Swt.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,24 @@ class Swt : public ScBase
9292

9393
/// Executes an SWT sequence
9494
/// \param sequence A vector of Operation and Data pairs
95+
/// \param lock Boolean enabling implicit locking
96+
/// \param lockTimeout timeout (in ms) for aquiring the lock
9597
/// \return A vector of Operation and resulting Data pairs
9698
/// Write -> Echoes written data
9799
/// Read -> The SwtWord read
98100
/// Reset -> Empty Data
99101
/// Error -> Error message in std::string
100102
/// \throws o2:lla::LlaException on lock fail
101-
std::vector<std::pair<Operation, Data>> executeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock = false);
103+
std::vector<std::pair<Operation, Data>> executeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock = false, int lockTimeout = 0);
102104

103105
/// Executes an SWT sequence for the ALF server
104106
/// \param sequence A vector of Data and Operation pairs
107+
/// \param lock Boolean enabling implicit locking
108+
/// \param lockTimeout timeout (in ms) for aquiring the lock
105109
/// \return A string of newline separated results;
106110
/// \throws o2:lla::LlaException on lock fail
107111
/// o2::alf::SwtException on invalid operation or error
108-
std::string writeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock = false);
112+
std::string writeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock = false, int lockTimeout = 0);
109113

110114
static std::string SwtOperationToString(Operation op);
111115
static Operation StringToSwtOperation(std::string op);

src/AlfServer.cxx

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,14 @@ std::pair<Sca::Operation, Sca::Data> AlfServer::stringToScaPair(const std::strin
245245

246246
if (scaPair[scaPair.size() - 1] == "lock") {
247247
operation = Sca::Operation::Lock;
248-
if (scaPair.size() != 1) {
249-
BOOST_THROW_EXCEPTION(
250-
AlfException() << ErrorInfo::Message("Too many arguments for LOCK operation"));
248+
if (scaPair.size() == 2) {
249+
try {
250+
data = std::stoi(scaPair[0]);
251+
} catch (const std::exception& e) {
252+
BOOST_THROW_EXCEPTION(SwtException() << ErrorInfo::Message("SCA lock WaitTime provided cannot be converted to int"));
253+
}
254+
} else {
255+
data = 0;
251256
}
252257
} else if (scaPair[scaPair.size() - 1] == "wait") {
253258
operation = Sca::Operation::Wait;
@@ -315,12 +320,18 @@ std::pair<Swt::Operation, Swt::Data> AlfServer::stringToSwtPair(const std::strin
315320
}
316321

317322
Swt::Operation operation;
323+
Swt::Data data;
318324

319325
if (swtPair[swtPair.size() - 1] == "lock") {
320326
operation = Swt::Operation::Lock;
321327
if (swtPair.size() == 2) {
322-
BOOST_THROW_EXCEPTION(
323-
AlfException() << ErrorInfo::Message("Too many arguments for LOCK operation"));
328+
try {
329+
data = std::stoi(swtPair[0]);
330+
} catch (const std::exception& e) {
331+
BOOST_THROW_EXCEPTION(SwtException() << ErrorInfo::Message("SWT lock WaitTime provided cannot be converted to int"));
332+
}
333+
} else {
334+
data = 0;
324335
}
325336
} else if (swtPair[swtPair.size() - 1] == "read") {
326337
operation = Swt::Operation::Read;
@@ -342,8 +353,6 @@ std::pair<Swt::Operation, Swt::Data> AlfServer::stringToSwtPair(const std::strin
342353
BOOST_THROW_EXCEPTION(std::out_of_range("Parameter for SWT operation unkown"));
343354
}
344355

345-
Swt::Data data;
346-
347356
if (operation == Swt::Operation::Write) {
348357
SwtWord word;
349358
word.setSize(swtWordSize);

src/Lla.cxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,16 @@ LlaSession::~LlaSession()
4141
stop();
4242
}
4343

44-
void LlaSession::start()
44+
void LlaSession::start(int timeout)
4545
{
4646
if (!mSession) {
4747
mParams = lla::SessionParameters::makeParameters(mSessionName, mSerialId);
4848
mSession = std::make_shared<lla::Session>(mParams);
4949
}
5050

5151
if (!mSession->isStarted()) {
52-
if (!mSession->start()) {
52+
bool started = (timeout==0) ? mSession->start() : mSession->timedStart(timeout);
53+
if (!started) {
5354
BOOST_THROW_EXCEPTION(lla::LlaException()
5455
<< lla::ErrorInfo::Message("Couldn't start session")); // couldn't grab the lock
5556
}

src/Sca.cxx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ void Sca::svlConnect()
7676
barWrite(sc_regs::SCA_WR_CTRL.index, 0x0);
7777
}
7878

79-
Sca::CommandData Sca::executeCommand(uint32_t command, uint32_t data, bool lock)
79+
Sca::CommandData Sca::executeCommand(uint32_t command, uint32_t data, bool lock, int lockTimeout)
8080
{
8181
if (lock) {
82-
mLlaSession->start();
82+
mLlaSession->start(lockTimeout);
8383
}
8484

8585
checkChannelSet();
@@ -221,10 +221,10 @@ void Sca::waitOnBusyClear()
221221
<< ErrorInfo::Message("Exceeded timeout on busy wait"));
222222
}
223223

224-
std::vector<std::pair<Sca::Operation, Sca::Data>> Sca::executeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock)
224+
std::vector<std::pair<Sca::Operation, Sca::Data>> Sca::executeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock, int lockTimeout)
225225
{
226226
if (lock) {
227-
mLlaSession->start();
227+
mLlaSession->start(lockTimeout);
228228
}
229229

230230
try {
@@ -295,10 +295,10 @@ std::vector<std::pair<Sca::Operation, Sca::Data>> Sca::executeSequence(const std
295295
return ret;
296296
}
297297

298-
std::string Sca::writeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock)
298+
std::string Sca::writeSequence(const std::vector<std::pair<Operation, Data>>& operations, bool lock, int lockTimeout)
299299
{
300300
std::stringstream resultBuffer;
301-
auto out = executeSequence(operations, lock);
301+
auto out = executeSequence(operations, lock, lockTimeout);
302302
for (const auto& it : out) {
303303
Operation operation = it.first;
304304
Data data = it.second;

src/ScaPythonInterface.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ auto sScaSequenceDoc =
8888
8989
lock: boolean to execute the sequence within an LLA session
9090
91+
lockTimeout: maximum wait time to aquire the LLA session lock in ms
92+
9193
Returns:
9294
sequence: A list of tuples made up of:
9395
operation: The operation carried out (string, same as input)
@@ -188,14 +190,14 @@ class ScaInterface
188190
return mSca->executeCommand(cmd, data);
189191
}
190192

191-
std::vector<std::pair<Sca::Operation, Sca::Data>> sequence(std::vector<ScaArgsVariant> sequence, bool lock = false)
193+
std::vector<std::pair<Sca::Operation, Sca::Data>> sequence(std::vector<ScaArgsVariant> sequence, bool lock = false, int lockTimeout = 0)
192194
{
193195
ScopedGILRelease s; // enable boost::python multi-threading
194196
std::vector<std::pair<Sca::Operation, Sca::Data>> scaSequence;
195197
for (const auto& v : sequence) {
196198
scaSequence.push_back(boost::apply_visitor(ScaArgsVariantVisitor(), v));
197199
}
198-
return mSca->executeSequence(scaSequence, lock);
200+
return mSca->executeSequence(scaSequence, lock, lockTimeout);
199201
}
200202

201203
std::vector<std::pair<Sca::Operation, Sca::Data>> sequenceDefault(std::vector<ScaArgsVariant> scaSeq)

src/Swt.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ void Swt::write(const SwtWord& swtWord)
120120
//return barRead(sc_regs::SWT_MON.index);
121121
}
122122

123-
std::vector<std::pair<Swt::Operation, Swt::Data>> Swt::executeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock)
123+
std::vector<std::pair<Swt::Operation, Swt::Data>> Swt::executeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock, int lockTimeout)
124124
{
125125
if (lock) {
126-
mLlaSession->start();
126+
mLlaSession->start(lockTimeout);
127127
}
128128

129129
try {
@@ -199,10 +199,10 @@ std::vector<std::pair<Swt::Operation, Swt::Data>> Swt::executeSequence(std::vect
199199
return ret;
200200
}
201201

202-
std::string Swt::writeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock)
202+
std::string Swt::writeSequence(std::vector<std::pair<Operation, Data>> sequence, bool lock, int lockTimeout)
203203
{
204204
std::stringstream resultBuffer;
205-
auto out = executeSequence(sequence, lock);
205+
auto out = executeSequence(sequence, lock, lockTimeout);
206206
for (const auto& it : out) {
207207
Operation operation = it.first;
208208
Data data = it.second;

src/SwtPythonInterface.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ auto sSwtSequenceDoc =
8787
8888
lock: boolean to execute the sequence within an LLA session
8989
90+
lockTimeout: maximum wait time to aquire the LLA session lock in ms
91+
9092
Returns:
9193
sequence: A list of tuples made up of:
9294
operation: The operation carried out (string, same as input)
@@ -178,15 +180,15 @@ class SwtInterface
178180
return readDefault();
179181
}
180182

181-
std::vector<std::pair<Swt::Operation, Swt::Data>> sequence(std::vector<SwtArgsVariant> sequence, bool lock = false)
183+
std::vector<std::pair<Swt::Operation, Swt::Data>> sequence(std::vector<SwtArgsVariant> sequence, bool lock = false, int lockTimeout = 0)
182184
{
183185
ScopedGILRelease s; // enable boost::python multi-threading
184186
std::vector<std::pair<Swt::Operation, Swt::Data>> swtSequence;
185187
for (const auto& v : sequence) {
186188
swtSequence.push_back(boost::apply_visitor(SwtArgsVariantVisitor(), v));
187189
}
188190

189-
auto out = mSwt->executeSequence(swtSequence, lock);
191+
auto out = mSwt->executeSequence(swtSequence, lock, lockTimeout);
190192
return out;
191193
}
192194

0 commit comments

Comments
 (0)