@@ -84,7 +84,14 @@ std::string AlfServer::scaBlobWrite(const std::string& parameter, AlfLink link)
8484 std::vector<std::string> stringPairs = Util::split (parameter, argumentSeparator ());
8585 std::vector<std::pair<Sca::Operation, Sca::Data>> scaPairs = parseStringToScaPairs (stringPairs);
8686 Sca sca = Sca (link);
87- return sca.writeSequence (scaPairs);
87+
88+ bool lock = false ;
89+ // Check if the operation should be locked
90+ if (scaPairs[0 ].first == Sca::Operation::Lock) {
91+ scaPairs.erase (scaPairs.begin ());
92+ lock = true ;
93+ }
94+ return sca.writeSequence (scaPairs, lock);
8895}
8996
9097std::string AlfServer::swtBlobWrite (const std::string& parameter, AlfLink link)
@@ -93,7 +100,14 @@ std::string AlfServer::swtBlobWrite(const std::string& parameter, AlfLink link)
93100 std::vector<std::string> stringPairs = Util::split (parameter, argumentSeparator ());
94101 std::vector<std::pair<Swt::Operation, Swt::Data>> swtPairs = parseStringToSwtPairs (stringPairs);
95102 Swt swt = Swt (link);
96- return swt.writeSequence (swtPairs);
103+
104+ bool lock = false ;
105+ // Check if the operation should be locked
106+ if (swtPairs[0 ].first == Swt::Operation::Lock) {
107+ swtPairs.erase (swtPairs.begin ());
108+ lock = true ;
109+ }
110+ return swt.writeSequence (swtPairs, lock);
97111}
98112
99113std::string AlfServer::icBlobWrite (const std::string& parameter, AlfLink link)
@@ -102,7 +116,14 @@ std::string AlfServer::icBlobWrite(const std::string& parameter, AlfLink link)
102116 std::vector<std::string> stringPairs = Util::split (parameter, argumentSeparator ());
103117 std::vector<std::pair<Ic::Operation, Ic::Data>> icPairs = parseStringToIcPairs (stringPairs);
104118 Ic ic = Ic (link);
105- return ic.writeSequence (icPairs);
119+
120+ bool lock = false ;
121+ // Check if the operation should be locked
122+ if (icPairs[0 ].first == Ic::Operation::Lock) {
123+ icPairs.erase (icPairs.begin ());
124+ lock = true ;
125+ }
126+ return ic.writeSequence (icPairs, lock);
106127}
107128
108129std::string AlfServer::icGbtI2cWrite (const std::string& parameter, AlfLink link)
@@ -249,23 +270,38 @@ std::vector<uint32_t> AlfServer::stringToRegisterPair(const std::string stringPa
249270std::pair<Sca::Operation, Sca::Data> AlfServer::stringToScaPair (const std::string stringPair)
250271{
251272 std::vector<std::string> scaPair = Util::split (stringPair, pairSeparator ());
252- if (scaPair.size () != 2 ) {
253- BOOST_THROW_EXCEPTION (
254- AlfException () << ErrorInfo::Message (" SCA command-data pair not formatted correctly" ));
255- }
256273
257274 Sca::Data data;
258275 Sca::Operation operation;
259276
260- if (scaPair[scaPair.size () - 1 ] == " wait" ) {
277+ if (scaPair.size () < 1 || scaPair.size () > 2 ) {
278+ BOOST_THROW_EXCEPTION (
279+ AlfException () << ErrorInfo::Message (" SCA command-data pair not formatted correctly" ));
280+ }
281+
282+ if (scaPair[scaPair.size () - 1 ] == " lock" ) {
283+ operation = Sca::Operation::Lock;
284+ if (scaPair.size () != 1 ) {
285+ BOOST_THROW_EXCEPTION (
286+ AlfException () << ErrorInfo::Message (" Too many arguments for LOCK operation" ));
287+ }
288+ } else if (scaPair[scaPair.size () - 1 ] == " wait" ) {
261289 operation = Sca::Operation::Wait;
290+ if (scaPair.size () != 2 ) {
291+ BOOST_THROW_EXCEPTION (
292+ AlfException () << ErrorInfo::Message (" Too few arguments for WAIT operation" ));
293+ }
262294 try {
263295 data = std::stoi (scaPair[0 ]);
264296 } catch (const std::exception& e) {
265297 BOOST_THROW_EXCEPTION (SwtException () << ErrorInfo::Message (" SCA Wait Time provided cannot be converted to int" ));
266298 }
267299 } else { // regular sca command
268300 operation = Sca::Operation::Command;
301+ if (scaPair.size () != 2 ) {
302+ BOOST_THROW_EXCEPTION (
303+ AlfException () << ErrorInfo::Message (" Too few arguments for SCA command-data pair" ));
304+ }
269305 Sca::CommandData commandData;
270306 commandData.command = Util::stringToHex (scaPair[0 ]);
271307 commandData.data = Util::stringToHex (scaPair[1 ]);
@@ -286,7 +322,13 @@ std::pair<Swt::Operation, Swt::Data> AlfServer::stringToSwtPair(const std::strin
286322
287323 Swt::Operation operation;
288324
289- if (swtPair[swtPair.size () - 1 ] == " read" ) {
325+ if (swtPair[swtPair.size () - 1 ] == " lock" ) {
326+ operation = Swt::Operation::Lock;
327+ if (swtPair.size () == 2 ) {
328+ BOOST_THROW_EXCEPTION (
329+ AlfException () << ErrorInfo::Message (" Too many arguments for LOCK operation" ));
330+ }
331+ } else if (swtPair[swtPair.size () - 1 ] == " read" ) {
290332 operation = Swt::Operation::Read;
291333 } else if (swtPair[swtPair.size () - 1 ] == " write" ) {
292334 operation = Swt::Operation::Write;
@@ -342,15 +384,23 @@ std::pair<Swt::Operation, Swt::Data> AlfServer::stringToSwtPair(const std::strin
342384std::pair<Ic::Operation, Ic::Data> AlfServer::stringToIcPair (const std::string stringPair)
343385{
344386 std::vector<std::string> icPair = Util::split (stringPair, pairSeparator ());
345- if (icPair.size () != 2 && icPair.size () != 3 ) {
387+ if (icPair.size () < 1 || icPair.size () > 3 ) {
346388 BOOST_THROW_EXCEPTION (
347389 AlfException () << ErrorInfo::Message (" IC pair not formatted correctly" ));
348390 }
349391
350392 Ic::Operation icOperation;
393+ Ic::IcData icData;
351394
352395 // Parse IC operation
353- if (icPair[icPair.size () - 1 ] == " read" ) {
396+ if (icPair[icPair.size () - 1 ] == " lock" ) {
397+ icOperation = Ic::Operation::Lock;
398+ if (icPair.size () > 1 ) {
399+ BOOST_THROW_EXCEPTION (
400+ AlfException () << ErrorInfo::Message (" Too many arguments for LOCK operation" ));
401+ }
402+ return std::make_pair (icOperation, icData); // no data to parse, return immediately
403+ } else if (icPair[icPair.size () - 1 ] == " read" ) {
354404 icOperation = Ic::Operation::Read;
355405 if (icPair.size () == 3 ) {
356406 BOOST_THROW_EXCEPTION (
@@ -398,8 +448,6 @@ std::pair<Ic::Operation, Ic::Data> AlfServer::stringToIcPair(const std::string s
398448 }
399449 }
400450
401- Ic::IcData icData;
402-
403451 std::stringstream ss;
404452 ss << std::setw (4 ) << std::setfill (' 0' ) << hexAddress;
405453
0 commit comments