Skip to content

Commit a6e5eb9

Browse files
committed
[sca] Add wait operation
1 parent 9454ec4 commit a6e5eb9

File tree

8 files changed

+92
-36
lines changed

8 files changed

+92
-36
lines changed

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,16 @@ The services are DIM RPC services. Every RPC is called with a string and expects
6868

6969
#### SCA_SEQUENCE
7070
* Parameters:
71-
* Sequence of SCA command and data pairs
71+
* Sequence of SCA operations as follows:
72+
* Operations may be:
73+
* An SCA command and data pair (e.g. `0x0000f00d,0x0000cafe`)
74+
* A wait operation (e.g. `30,wait`)
7275
* Returns:
73-
* Sequence of SCA command, and SCA read pairs
76+
* Sequence of SCA command and SCA read pairs, and wait confirmations
7477

7578
* Example:
76-
* DIM input: `0x00000010,0x00000011\n0x000000020,0x00000021`
77-
* DIM output: `0x00000010,0x00000111\n0x00000020,0x00000221\n`
79+
* DIM input: `0x00000010,0x00000011\n3\n0x000000020,0x00000021`
80+
* DIM output: `0x00000010,0x00000111\n3\n0x00000020,0x00000221\n`
7881

7982
#### SWT_SEQUENCE
8083
* Parameters:

apps/AlfClient.cxx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ class AlfClient : public AliceO2::Common::Program
163163
}
164164

165165
if (mOptions.sca) {
166-
auto scaOut = scaSequence.write({ std::make_pair("0x00010002", "0xff000000"),
166+
auto scaOut = scaSequence.write({ std::make_pair("1000", "wait"),
167+
std::make_pair("0x00010002", "0xff000000"),
167168
std::make_pair("0x00020004", "0xff000000"),
168169
std::make_pair("0x00030006", "0xff000000"),
169170
std::make_pair("0x0B950282", "0x50010000"),
@@ -196,7 +197,7 @@ class AlfClient : public AliceO2::Common::Program
196197
"42",
197198
"0",
198199
"53",
199-
//"30", // comment to test case of less parameters than expected
200+
"30", // comment to test case of less parameters than expected
200201
"29",
201202
"#a comment", // tests that a comment is parsed gracfully
202203
"false",

src/AlfServer.cxx

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ std::string AlfServer::registerWrite(const std::string& parameter, std::shared_p
6161
std::string AlfServer::scaBlobWrite(const std::string& parameter, AlfLink link)
6262
{
6363
std::vector<std::string> stringPairs = Util::split(parameter, argumentSeparator());
64-
std::vector<Sca::CommandData> commands = parseStringToScaCommands(stringPairs);
64+
std::vector<std::pair<Sca::Data, Sca::Operation>> scaPairs = parseStringToScaPairs(stringPairs);
6565
Sca sca = Sca(link);
66-
return sca.writeSequence(commands);
66+
return sca.writeSequence(scaPairs);
6767
}
6868

6969
std::string AlfServer::swtBlobWrite(const std::string& parameter, AlfLink link)
7070
{
7171

7272
std::vector<std::string> stringPairs = Util::split(parameter, argumentSeparator());
73-
std::vector<std::pair<Swt::SwtData, Swt::Operation>> swtPairs = parseStringToSwtPairs(stringPairs);
73+
std::vector<std::pair<Swt::Data, Swt::Operation>> swtPairs = parseStringToSwtPairs(stringPairs);
7474
Swt swt = Swt(link);
7575
return swt.writeSequence(swtPairs);
7676
}
@@ -177,22 +177,39 @@ roc::PatternPlayer::Info AlfServer::parseStringToPatternPlayerInfo(const std::ve
177177
return ppInfo;
178178
}
179179

180-
Sca::CommandData AlfServer::stringToScaPair(std::string stringPair)
180+
std::pair<Sca::Data, Sca::Operation> AlfServer::stringToScaPair(const std::string stringPair)
181181
{
182182
std::vector<std::string> scaPair = Util::split(stringPair, pairSeparator());
183183
if (scaPair.size() != 2) {
184184
BOOST_THROW_EXCEPTION(
185185
AlfException() << ErrorInfo::Message("SCA command-data pair not formatted correctly"));
186186
}
187-
Sca::CommandData commandData;
188-
commandData.command = Util::stringToHex(scaPair[0]);
189-
commandData.data = Util::stringToHex(scaPair[1]);
190-
return commandData;
187+
188+
Sca::Data data;
189+
Sca::Operation operation;
190+
191+
if (scaPair[scaPair.size() - 1] == "wait") {
192+
operation = Sca::Operation::Wait;
193+
try {
194+
data = std::stoi(scaPair[0]);
195+
} catch (const std::exception& e) {
196+
BOOST_THROW_EXCEPTION(SwtException() << ErrorInfo::Message("SCA Wait Time provided cannot be converted to int"));
197+
}
198+
} else { // regular sca command
199+
operation = Sca::Operation::Command;
200+
Sca::CommandData commandData;
201+
commandData.command = Util::stringToHex(scaPair[0]);
202+
commandData.data = Util::stringToHex(scaPair[1]);
203+
data = commandData;
204+
}
205+
206+
return std::make_pair(data, operation);
191207
}
192208

193209
/// Converts a 76-bit hex number string
194-
std::pair<Swt::SwtData, Swt::Operation> AlfServer::stringToSwtPair(const std::string stringPair)
210+
std::pair<Swt::Data, Swt::Operation> AlfServer::stringToSwtPair(const std::string stringPair)
195211
{
212+
std::cout << "trigger" << std::endl;
196213
std::vector<std::string> swtPair = Util::split(stringPair, pairSeparator());
197214
if (swtPair.size() < 1 || swtPair.size() > 2) {
198215
BOOST_THROW_EXCEPTION(
@@ -219,7 +236,7 @@ std::pair<Swt::SwtData, Swt::Operation> AlfServer::stringToSwtPair(const std::st
219236
BOOST_THROW_EXCEPTION(std::out_of_range("Parameter for SWT operation unkown"));
220237
}
221238

222-
Swt::SwtData data;
239+
Swt::Data data;
223240

224241
if (operation == Swt::Operation::Write) {
225242
SwtWord word;
@@ -329,9 +346,9 @@ std::pair<Ic::IcData, Ic::Operation> AlfServer::stringToIcPair(const std::string
329346
return std::make_pair(icData, icOperation);
330347
}
331348

332-
std::vector<Sca::CommandData> AlfServer::parseStringToScaCommands(std::vector<std::string> stringPairs)
349+
std::vector<std::pair<Sca::Data, Sca::Operation>> AlfServer::parseStringToScaPairs(std::vector<std::string> stringPairs)
333350
{
334-
std::vector<Sca::CommandData> pairs;
351+
std::vector<std::pair<Sca::Data, Sca::Operation>> pairs;
335352
for (const auto& stringPair : stringPairs) {
336353
if (stringPair.find('#') == std::string::npos) { // =isn't a comment
337354
pairs.push_back(stringToScaPair(stringPair));
@@ -340,10 +357,10 @@ std::vector<Sca::CommandData> AlfServer::parseStringToScaCommands(std::vector<st
340357
return pairs;
341358
}
342359

343-
std::vector<std::pair<Swt::SwtData, Swt::Operation>> AlfServer::parseStringToSwtPairs(std::vector<std::string> stringPairs)
360+
std::vector<std::pair<Swt::Data, Swt::Operation>> AlfServer::parseStringToSwtPairs(std::vector<std::string> stringPairs)
344361
{
345362

346-
std::vector<std::pair<Swt::SwtData, Swt::Operation>> pairs;
363+
std::vector<std::pair<Swt::Data, Swt::Operation>> pairs;
347364
for (const auto& stringPair : stringPairs) {
348365
if (stringPair.find('#') == std::string::npos) {
349366
pairs.push_back(stringToSwtPair(stringPair));

src/AlfServer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ class AlfServer
5151
static std::string icGbtI2cWrite(const std::string& parameter, AlfLink link);
5252
static std::string patternPlayer(const std::string& parameter, std::shared_ptr<roc::BarInterface>);
5353

54-
static Sca::CommandData stringToScaPair(std::string stringPair);
55-
static std::pair<Swt::SwtData, Swt::Operation> stringToSwtPair(const std::string stringPair);
54+
static std::pair<Sca::Data, Sca::Operation> stringToScaPair(const std::string stringPair);
55+
static std::pair<Swt::Data, Swt::Operation> stringToSwtPair(const std::string stringPair);
5656
static std::pair<Ic::IcData, Ic::Operation> stringToIcPair(const std::string stringPair);
57-
static std::vector<Sca::CommandData> parseStringToScaCommands(std::vector<std::string> stringPairs);
58-
static std::vector<std::pair<Swt::SwtData, Swt::Operation>> parseStringToSwtPairs(std::vector<std::string> stringPairs);
57+
static std::vector<std::pair<Sca::Data, Sca::Operation>> parseStringToScaPairs(std::vector<std::string> stringPairs);
58+
static std::vector<std::pair<Swt::Data, Swt::Operation>> parseStringToSwtPairs(std::vector<std::string> stringPairs);
5959
static std::vector<std::pair<Ic::IcData, Ic::Operation>> parseStringToIcPairs(std::vector<std::string> stringPairs);
6060
static roc::PatternPlayer::Info parseStringToPatternPlayerInfo(const std::vector<std::string> sringsPairs);
6161

src/Sca/Sca.cxx

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
/// \author Pascal Boeschoten ([email protected])
1515
/// \author Kostas Alexopoulos ([email protected])
1616

17+
#include <boost/format.hpp>
1718
#include <chrono>
1819
#include <fstream>
1920
#include <sstream>
21+
#include <thread>
2022
#include <vector>
2123

2224
#include "AlfException.h"
@@ -233,18 +235,41 @@ void Sca::waitOnBusyClear()
233235
<< ErrorInfo::Message("Exceeded timeout on busy wait"));
234236
}
235237

236-
std::string Sca::writeSequence(const std::vector<CommandData>& commands)
238+
std::string Sca::writeSequence(const std::vector<std::pair<Data, Operation>>& operations)
237239
{
238240
std::stringstream resultBuffer;
239-
for (const auto& commandData : commands) {
241+
for (const auto& it : operations) {
242+
Data data = it.first;
240243
try {
241-
write(commandData);
242-
ReadResult result = read();
243-
resultBuffer << Util::formatValue(commandData.command) << "," << Util::formatValue(result.data) << "\n";
244+
if (it.second == Operation::Command) {
245+
auto commandData = std::get<CommandData>(data);
246+
write(commandData);
247+
ReadResult result = read();
248+
resultBuffer << Util::formatValue(commandData.command) << "," << Util::formatValue(result.data) << "\n";
249+
} else if (it.second == Operation::Wait) {
250+
int waitTime;
251+
try {
252+
waitTime = std::get<WaitTime>(data);
253+
} catch (...) { // no timeout was provided
254+
data = DEFAULT_SCA_WAIT_TIME_MS;
255+
waitTime = std::get<WaitTime>(data);
256+
}
257+
std::this_thread::sleep_for(std::chrono::milliseconds(waitTime));
258+
resultBuffer << waitTime << "\n";
259+
} else {
260+
BOOST_THROW_EXCEPTION(ScaException() << ErrorInfo::Message("SCA operation type unknown"));
261+
}
244262
} catch (const ScaException& e) {
245263
// If an SCA error occurs, we stop executing the sequence of commands and return the results as far as we got
246264
// them, plus the error message.
247-
std::string meaningfulMessage = (boost::format("SCA_SEQUENCE cmd=0x%08x data=0x%08x cruSequence=%d link=%d error='%s'") % commandData.command % commandData.data % mLink.cruSequence % mLink.linkId % e.what()).str();
265+
std::string meaningfulMessage;
266+
if (it.second == Operation::Command) {
267+
meaningfulMessage = (boost::format("SCA_SEQUENCE cmd=0x%08x data=0x%08x cruSequence=%d link=%d error='%s'") % std::get<Command>(data).command % std::get<Command>(data).data % mLink.cruSequence % mLink.linkId % e.what()).str();
268+
} else if (it.second == Operation::Wait) {
269+
meaningfulMessage = (boost::format("SCA_SEQUENCE WAIT waitTime=%d cruSequence=%d link=%d error='%s'") % std::get<WaitTime>(data) % mLink.cruSequence % mLink.linkId % e.what()).str();
270+
} else {
271+
meaningfulMessage = (boost::format("SCA_SEQUENCE UNKNOWN cruSequence=%d link=%d error='%s'") % mLink.cruSequence % mLink.linkId % e.what()).str();
272+
}
248273
getErrorLogger() << meaningfulMessage << endm;
249274
resultBuffer << meaningfulMessage;
250275
BOOST_THROW_EXCEPTION(ScaException() << ErrorInfo::Message(resultBuffer.str()));

src/Sca/Sca.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <string>
2121
#include <map>
22+
#include <variant>
2223

2324
#include "Common.h"
2425
#include "ReadoutCard/CardType.h"
@@ -45,6 +46,12 @@ class Sca
4546
uint32_t data;
4647
};
4748

49+
typedef int WaitTime;
50+
typedef std::variant<CommandData, WaitTime> Data;
51+
52+
enum Operation { Command,
53+
Wait };
54+
4855
/// \param bar2 SCA is on BAR 2
4956
/// \param link Needed to get offset for SCA registers
5057
Sca(AlfLink link);
@@ -59,7 +66,7 @@ class Sca
5966
write(commandData.command, commandData.data);
6067
};
6168

62-
std::string writeSequence(const std::vector<CommandData>& commands);
69+
std::string writeSequence(const std::vector<std::pair<Data, Operation>>& operations);
6370

6471
private:
6572
uint32_t barRead(uint32_t index);
@@ -75,6 +82,7 @@ class Sca
7582
roc::RegisterReadWriteInterface& mBar2;
7683

7784
AlfLink mLink;
85+
static constexpr int DEFAULT_SCA_WAIT_TIME_MS = 3;
7886
};
7987

8088
} // namespace Alf

src/Swt/Swt.cxx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,11 @@ uint32_t Swt::barRead(uint32_t index)
131131
return read;
132132
}
133133

134-
std::string Swt::writeSequence(std::vector<std::pair<SwtData, Operation>> sequence)
134+
std::string Swt::writeSequence(std::vector<std::pair<Data, Operation>> sequence)
135135
{
136136
std::stringstream resultBuffer;
137137
for (const auto& it : sequence) {
138-
SwtData data = it.first;
138+
Data data = it.first;
139139
try {
140140
if (it.second == Operation::Read) {
141141
std::vector<SwtWord> results;
@@ -169,8 +169,10 @@ std::string Swt::writeSequence(std::vector<std::pair<SwtData, Operation>> sequen
169169
meaningfulMessage = (boost::format("SWT_SEQUENCE READ timeout=%d cruSequence=%d link=%d, error='%s'") % std::get<TimeOut>(data) % mLink.cruSequence % mLink.linkId % e.what()).str();
170170
} else if (it.second == Operation::Write) {
171171
meaningfulMessage = (boost::format("SWT_SEQUENCE WRITE data=%s cruSequence=%d link=%d, error='%s'") % std::get<SwtWord>(data) % mLink.cruSequence % mLink.linkId % e.what()).str();
172-
} else {
172+
} else if (it.second == Operation::Reset) {
173173
meaningfulMessage = (boost::format("SWT_SEQUENCE RESET cruSequence=%d link=%d, error='%s'") % mLink.cruSequence % mLink.linkId % e.what()).str();
174+
} else {
175+
meaningfulMessage = (boost::format("SWT_SEQUENCE UNKNOWN cruSequence=%d link=%d, error='%s'") % mLink.cruSequence % mLink.linkId % e.what()).str();
174176
}
175177
getErrorLogger() << meaningfulMessage << endm;
176178
resultBuffer << meaningfulMessage;

src/Swt/Swt.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class Swt
4747
Swt(AlfLink link);
4848

4949
typedef int TimeOut;
50-
typedef std::variant<SwtWord, TimeOut> SwtData;
50+
typedef std::variant<SwtWord, TimeOut> Data;
5151

5252
void reset();
5353
uint32_t write(const SwtWord& swtWord);
@@ -57,7 +57,7 @@ class Swt
5757
Write,
5858
Reset };
5959

60-
std::string writeSequence(std::vector<std::pair<SwtData, Operation>> sequence);
60+
std::string writeSequence(std::vector<std::pair<Data, Operation>> sequence);
6161

6262
private:
6363
void setChannel(int gbtChannel);

0 commit comments

Comments
 (0)