summaryrefslogtreecommitdiff
path: root/pcbnew/cross-probing.cpp
diff options
context:
space:
mode:
authorsaurabhb172020-02-26 16:00:53 +0530
committerGitHub2020-02-26 16:00:53 +0530
commit886d9cb772e81d2e5262284bc3082664f084337f (patch)
tree6acee185a4dc19113fcbf0f9a3d6941085dedaf7 /pcbnew/cross-probing.cpp
parent0db48f6533517ecebfd9f0693f89deca28408b76 (diff)
parentaa35045840b78d3f48212db45da59a2e5c69b223 (diff)
downloadKiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.tar.gz
KiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.tar.bz2
KiCad-eSim-886d9cb772e81d2e5262284bc3082664f084337f.zip
Merge pull request #1 from saurabhb17/develop
Added main functions
Diffstat (limited to 'pcbnew/cross-probing.cpp')
-rw-r--r--pcbnew/cross-probing.cpp251
1 files changed, 251 insertions, 0 deletions
diff --git a/pcbnew/cross-probing.cpp b/pcbnew/cross-probing.cpp
new file mode 100644
index 0000000..9c95569
--- /dev/null
+++ b/pcbnew/cross-probing.cpp
@@ -0,0 +1,251 @@
+/**
+ * @file pcbnew/cross-probing.cpp
+ * @brief Cross probing functions to handle communication to andfrom Eeschema.
+ */
+
+/**
+ * Handle messages between Pcbnew and Eeschema via a socket, the port numbers are
+ * KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) (Eeschema to Pcbnew)
+ * KICAD_SCH_PORT_SERVICE_NUMBER (currently 4243) (Pcbnew to Eeschema)
+ * Note: these ports must be enabled for firewall protection
+ */
+
+#include <fctsys.h>
+#include <pgm_base.h>
+#include <kiface_i.h>
+#include <kiway_express.h>
+#include <wxPcbStruct.h>
+#include <eda_dde.h>
+#include <macros.h>
+
+#include <pcbnew_id.h>
+#include <class_board.h>
+#include <class_module.h>
+
+#include <collectors.h>
+#include <pcbnew.h>
+
+#include <tools/common_actions.h>
+#include <tool/tool_manager.h>
+#include <pcb_draw_panel_gal.h>
+
+/* Execute a remote command send by Eeschema via a socket,
+ * port KICAD_PCB_PORT_SERVICE_NUMBER
+ * cmdline = received command from Eeschema
+ * Commands are
+ * $PART: "reference" put cursor on component
+ * $PIN: "pin name" $PART: "reference" put cursor on the footprint pin
+ */
+void PCB_EDIT_FRAME::ExecuteRemoteCommand( const char* cmdline )
+{
+ char line[1024];
+ wxString msg;
+ wxString modName;
+ char* idcmd;
+ char* text;
+ MODULE* module = NULL;
+ D_PAD* pad = NULL;
+ BOARD* pcb = GetBoard();
+ wxPoint pos;
+
+ strncpy( line, cmdline, sizeof(line) - 1 );
+ line[sizeof(line) - 1] = 0;
+
+ idcmd = strtok( line, " \n\r" );
+ text = strtok( NULL, " \n\r" );
+
+ if( !idcmd || !text )
+ return;
+
+ if( strcmp( idcmd, "$PART:" ) == 0 )
+ {
+ modName = FROM_UTF8( text );
+
+ module = pcb->FindModuleByReference( modName );
+
+ if( module )
+ msg.Printf( _( "%s found" ), GetChars( modName ) );
+ else
+ msg.Printf( _( "%s not found" ), GetChars( modName ) );
+
+ SetStatusText( msg );
+
+ if( module )
+ pos = module->GetPosition();
+ }
+ else if( strcmp( idcmd, "$PIN:" ) == 0 )
+ {
+ wxString pinName;
+ int netcode = -1;
+
+ pinName = FROM_UTF8( text );
+
+ text = strtok( NULL, " \n\r" );
+ if( text && strcmp( text, "$PART:" ) == 0 )
+ text = strtok( NULL, "\n\r" );
+
+ modName = FROM_UTF8( text );
+
+ module = pcb->FindModuleByReference( modName );
+
+ if( module )
+ pad = module->FindPadByName( pinName );
+
+ if( pad )
+ {
+ netcode = pad->GetNetCode();
+
+ // put cursor on the pad:
+ pos = pad->GetPosition();
+ }
+
+ if( netcode > 0 ) // highlight the pad net
+ {
+ pcb->HighLightON();
+ pcb->SetHighLightNet( netcode );
+ }
+ else
+ {
+ pcb->HighLightOFF();
+ pcb->SetHighLightNet( -1 );
+ }
+
+ if( module == NULL )
+ {
+ msg.Printf( _( "%s not found" ), GetChars( modName ) );
+ }
+ else if( pad == NULL )
+ {
+ msg.Printf( _( "%s pin %s not found" ), GetChars( modName ), GetChars( pinName ) );
+ SetCurItem( module );
+ }
+ else
+ {
+ msg.Printf( _( "%s pin %s found" ), GetChars( modName ), GetChars( pinName ) );
+ SetCurItem( pad );
+ }
+
+ SetStatusText( msg );
+ }
+
+ if( module ) // if found, center the module on screen, and redraw the screen.
+ {
+ if( IsGalCanvasActive() )
+ {
+ GetToolManager()->RunAction( COMMON_ACTIONS::crossProbeSchToPcb,
+ true,
+ pad ?
+ static_cast<BOARD_ITEM*>( pad ) :
+ static_cast<BOARD_ITEM*>( module )
+ );
+ }
+ else
+ {
+ SetCrossHairPosition( pos );
+ RedrawScreen( pos, false );
+ }
+ }
+}
+
+
+std::string FormatProbeItem( BOARD_ITEM* aItem )
+{
+ MODULE* module;
+
+ switch( aItem->Type() )
+ {
+ case PCB_MODULE_T:
+ module = (MODULE*) aItem;
+ return StrPrintf( "$PART: \"%s\"", TO_UTF8( module->GetReference() ) );
+
+ case PCB_PAD_T:
+ {
+ module = (MODULE*) aItem->GetParent();
+ wxString pad = ((D_PAD*)aItem)->GetPadName();
+
+ return StrPrintf( "$PART: \"%s\" $PAD: \"%s\"",
+ TO_UTF8( module->GetReference() ),
+ TO_UTF8( pad ) );
+ }
+
+ case PCB_MODULE_TEXT_T:
+ {
+ module = static_cast<MODULE*>( aItem->GetParent() );
+
+ TEXTE_MODULE* text_mod = static_cast<TEXTE_MODULE*>( aItem );
+
+ const char* text_key;
+
+ /* This can't be a switch since the break need to pull out
+ * from the outer switch! */
+ if( text_mod->GetType() == TEXTE_MODULE::TEXT_is_REFERENCE )
+ text_key = "$REF:";
+ else if( text_mod->GetType() == TEXTE_MODULE::TEXT_is_VALUE )
+ text_key = "$VAL:";
+ else
+ break;
+
+ return StrPrintf( "$PART: \"%s\" %s \"%s\"",
+ TO_UTF8( module->GetReference() ),
+ text_key,
+ TO_UTF8( text_mod->GetText() ) );
+ }
+
+ default:
+ break;
+ }
+
+ return "";
+}
+
+
+/* Send a remote command to Eeschema via a socket,
+ * aSyncItem = item to be located on schematic (module, pin or text)
+ * Commands are
+ * $PART: "reference" put cursor on component anchor
+ * $PART: "reference" $PAD: "pad number" put cursor on the component pin
+ * $PART: "reference" $REF: "reference" put cursor on the component ref
+ * $PART: "reference" $VAL: "value" put cursor on the component value
+ */
+void PCB_EDIT_FRAME::SendMessageToEESCHEMA( BOARD_ITEM* aSyncItem )
+{
+#if 1
+ wxASSERT( aSyncItem ); // can't we fix the caller?
+#else
+ if( !aSyncItem )
+ return;
+#endif
+
+ std::string packet = FormatProbeItem( aSyncItem );
+
+ if( packet.size() )
+ {
+ if( Kiface().IsSingle() )
+ SendCommand( MSG_TO_SCH, packet.c_str() );
+ else
+ {
+ // Typically ExpressMail is going to be s-expression packets, but since
+ // we have existing interpreter of the cross probe packet on the other
+ // side in place, we use that here.
+ Kiway().ExpressMail( FRAME_SCH, MAIL_CROSS_PROBE, packet, this );
+ }
+ }
+}
+
+
+void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
+{
+ const std::string& payload = mail.GetPayload();
+
+ switch( mail.Command() )
+ {
+ case MAIL_CROSS_PROBE:
+ ExecuteRemoteCommand( payload.c_str() );
+ break;
+
+ // many many others.
+ default:
+ ;
+ }
+}
+