@@ -322,12 +322,12 @@ void ProjMgrRunDebug::CollectDebuggerSettings(const ContextItem& context, const
322322 }
323323
324324 // add info from debug-adapters
325+ DebugAdapterItem adapter;
325326 if (!adapters.empty ()) {
326- DebugAdapterItem adapter;
327327 if (GetDebugAdapter (m_runDebug.debugger .name , adapters, adapter)) {
328328 m_runDebug.debugger .name = adapter.name ;
329- if (adapter.gdbserver ) {
330- unsigned long long port = adapter.defaults .port .empty () ? 0 : RteUtils::StringToULL (adapter.defaults .port );
329+ if (adapter.defaults . gdbserver . active ) {
330+ unsigned long long port = adapter.defaults .gdbserver . port .empty () ? 0 : RteUtils::StringToULL (adapter.defaults . gdbserver .port );
331331 // add primary processor port first
332332 m_runDebug.debugger .gdbserver .push_back ({ port, m_runDebug.debugger .startPname });
333333 for (const auto & [pname, _] : pnames) {
@@ -348,8 +348,77 @@ void ProjMgrRunDebug::CollectDebuggerSettings(const ContextItem& context, const
348348 }
349349 }
350350
351+ // collect telnet options
352+ CollectTelnetOptions (context, adapter, pnames);
353+
351354 // merge custom options
352355 MergeCustomItems (context.debugger .custom , m_runDebug.debugger .custom );
356+
357+ }
358+
359+ void ProjMgrRunDebug::CollectTelnetOptions (const ContextItem& context, DebugAdapterItem& adapter,
360+ const std::map<std::string, RteDeviceProperty*>& pnames) {
361+ if (!context.debugger .telnet .empty () || adapter.defaults .telnet .active ) {
362+ set<unsigned long long > usedPorts;
363+ const string fileBase = context.directories .cprj + " /" + context.directories .outBaseDir + " /" +
364+ m_runDebug.solutionName + " +" + m_runDebug.targetType ;
365+
366+ // get values from user definitions
367+ for (const auto & [pname, value] : context.debugger .telnet ) {
368+ if (pnames.size () > 1 && value.pname .empty ()) {
369+ ProjMgrLogger::Get ().Warn (" 'telnet:' pname is required (multicore device)" );
370+ continue ;
371+ }
372+ if (pnames.find (pname) == pnames.end ()) {
373+ ProjMgrLogger::Get ().Warn (" pname '" + pname + " ' does not match any device pname" );
374+ continue ;
375+ }
376+ m_runDebug.debugger .telnet [pname] = { value };
377+ if (!value.port .empty ()) {
378+ m_runDebug.debugger .telnet [pname].ullPort = RteUtils::StringToULL (value.port );
379+ usedPorts.insert (m_runDebug.debugger .telnet [pname].ullPort );
380+ }
381+ if (value.mode .empty ()) {
382+ m_runDebug.debugger .telnet [pname].mode = adapter.defaults .telnet .mode .empty () ? " monitor" : adapter.defaults .telnet .mode ;
383+ }
384+ if (value.mode == " file" && value.file .empty ()) {
385+ m_runDebug.debugger .telnet [pname].file = fileBase + (pname.empty () ? " " : ' .' + pname);
386+ }
387+ }
388+ // active flag: enable telnet options for all cores
389+ if (adapter.defaults .telnet .active ) {
390+ for (const auto & [pname, _] : pnames) {
391+ auto & telnet = m_runDebug.debugger .telnet [pname];
392+ if (telnet.mode .empty () || telnet.mode == " off" ) {
393+ telnet.mode = adapter.defaults .telnet .mode .empty () ? " monitor" : adapter.defaults .telnet .mode ;
394+ }
395+ }
396+ }
397+ // port number handling
398+ unsigned long long port = adapter.defaults .telnet .port .empty () ? 0 : RteUtils::StringToULL (adapter.defaults .telnet .port );
399+ if (m_runDebug.debugger .telnet .find (m_runDebug.debugger .startPname ) != m_runDebug.debugger .telnet .end ()) {
400+ // add primary processor port first
401+ auto & startPort = m_runDebug.debugger .telnet [m_runDebug.debugger .startPname ].ullPort ;
402+ if (startPort == 0 ) {
403+ startPort = port;
404+ } else {
405+ port = startPort;
406+ }
407+ usedPorts.insert (port);
408+ }
409+ for (auto & [pname, telnet] : m_runDebug.debugger .telnet ) {
410+ // add ports for other processors
411+ if (pname != m_runDebug.debugger .startPname ) {
412+ // get customized port if set
413+ port = telnet.port .empty () ? port : telnet.ullPort ;
414+ while (usedPorts.find (port) != usedPorts.end ()) {
415+ // skip port number if it has already been used
416+ port++;
417+ }
418+ telnet.ullPort = port;
419+ }
420+ }
421+ }
353422}
354423
355424void ProjMgrRunDebug::CollectDebugTopology (const ContextItem& context, const vector<pair<const RteItem*, vector<string>>> debugs,
0 commit comments