Commit 51fc26e1 authored by dickelbeck's avatar dickelbeck

mouse synchronization from PCBNEW to EESCHEMA

parent b0b3a6d5
///////////////////////
// Name: eda_dde.cpp //
///////////////////////
///////////////////////
// Name: eda_dde.cpp //
///////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
......@@ -23,9 +23,7 @@
#include "common.h"
#include "macros.h"
#define ID_CONN "CAO_COM"
wxString HOSTNAME(wxT("localhost"));
wxString HOSTNAME( wxT( "localhost" ) );
/* variables locales */
......@@ -34,36 +32,37 @@ wxString HOSTNAME(wxT("localhost"));
char client_ipc_buffer[IPC_BUF_SIZE];
char server_ipc_buffer[IPC_BUF_SIZE];
wxServer * server;
wxServer* server;
void (* RemoteFct)(char * cmd);
void (*RemoteFct)(const char* cmd);
char buffcar[1024];
void SetupServerFunction(void (* remotefct)(char * remotecmd) )
void SetupServerFunction( void (*remotefct)(const char* remotecmd) )
{
RemoteFct = remotefct;
}
/*****************************/
/* Routines liees au SERVEUR */
/*****************************/
/*****************************/
/* Routines liees au SERVEUR */
/*****************************/
/* Fonction d'initialisation d'un serveur socket
*/
WinEDA_Server * CreateServer(wxWindow * window, int service)
*/
WinEDA_Server* CreateServer( wxWindow* window, int service )
{
wxIPV4address addr;
wxIPV4address addr;
// Create a new server
addr.Service(service);
addr.Service( service );
server = new wxServer(addr);
if(server)
server = new wxServer( addr );
if( server )
{
server->SetNotify(wxSOCKET_CONNECTION_FLAG);
server->SetEventHandler(*window, ID_EDA_SOCKET_EVENT_SERV);
server->Notify(TRUE);
server->SetNotify( wxSOCKET_CONNECTION_FLAG );
server->SetEventHandler( *window, ID_EDA_SOCKET_EVENT_SERV );
server->Notify( TRUE );
}
return server;
......@@ -71,23 +70,27 @@ wxIPV4address addr;
/********************************************************/
void WinEDA_DrawFrame::OnSockRequest(wxSocketEvent& evt)
void WinEDA_DrawFrame::OnSockRequest( wxSocketEvent& evt )
/********************************************************/
/* Fonction appelee a chaque demande d'un client
*/
*/
{
size_t len;
wxSocketBase *sock = evt.GetSocket();
size_t len;
wxSocketBase* sock = evt.GetSocket();
switch (evt.GetSocketEvent())
switch( evt.GetSocketEvent() )
{
case wxSOCKET_INPUT:
sock->Read(server_ipc_buffer,1);
if( sock->LastCount() == 0 ) break; // No data: Occurs on open connection
sock->Read(server_ipc_buffer+1,IPC_BUF_SIZE-2);
sock->Read( server_ipc_buffer, 1 );
if( sock->LastCount() == 0 )
break; // No data: Occurs on open connection
sock->Read( server_ipc_buffer + 1, IPC_BUF_SIZE - 2 );
len = 1 + sock->LastCount();
server_ipc_buffer[len] = 0;
if(RemoteFct ) RemoteFct(server_ipc_buffer);
if( RemoteFct )
RemoteFct( server_ipc_buffer );
break;
case wxSOCKET_LOST:
......@@ -95,51 +98,55 @@ wxSocketBase *sock = evt.GetSocket();
break;
default:
wxPrintf( wxT("WinEDA_DrawFrame::OnSockRequest() error: Invalid event !"));
wxPrintf( wxT( "WinEDA_DrawFrame::OnSockRequest() error: Invalid event !" ) );
break;
}
}
/**************************************************************/
void WinEDA_DrawFrame::OnSockRequestServer(wxSocketEvent& evt)
void WinEDA_DrawFrame::OnSockRequestServer( wxSocketEvent& evt )
/**************************************************************/
/* fonction appele lors d'une demande de connexion d'un client
*/
*/
{
wxSocketBase *sock2;
wxSocketServer *server = (wxSocketServer *) evt.GetSocket();
wxSocketBase* sock2;
wxSocketServer* server = (wxSocketServer*) evt.GetSocket();
sock2 = server->Accept();
if (sock2 == NULL) return;
if( sock2 == NULL )
return;
sock2->Notify(TRUE);
sock2->SetEventHandler(*this, ID_EDA_SOCKET_EVENT);
sock2->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
sock2->Notify( TRUE );
sock2->SetEventHandler( *this, ID_EDA_SOCKET_EVENT );
sock2->SetNotify( wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG );
}
/****************************/
/* Routines liees au CLIENT */
/*****************************/
/****************************/
/* Routines liees au CLIENT */
/*****************************/
/********************************************/
bool SendCommand( int service, char * cmdline)
/********************************************/
/* Used by a client to sent (by a socket connection) a data to a server.
- Open a Socket Client connection
- Send the buffer cmdline
- Close the socket connection
/**************************************************/
bool SendCommand( int service, const char* cmdline )
/**************************************************/
service is the service number for the TC/IP connection
*/
/* Used by a client to sent (by a socket connection) a data to a server.
* - Open a Socket Client connection
* - Send the buffer cmdline
* - Close the socket connection
*
* service is the service number for the TC/IP connection
*/
{
wxSocketClient * sock_client;
bool success = FALSE;
wxIPV4address addr;
wxSocketClient* sock_client;
bool success = FALSE;
wxIPV4address addr;
// Create a connexion
addr.Hostname(HOSTNAME);
addr.Service(service);
addr.Hostname( HOSTNAME );
addr.Service( service );
// Mini-tutorial for Connect() :-) (JP CHARRAS Note: see wxWidgets: sockets/client.cpp sample)
// ---------------------------
......@@ -189,20 +196,20 @@ wxIPV4address addr;
// bool success = client->IsConnected();
//
// And that's all :-)
sock_client = new wxSocketClient();
sock_client->SetTimeout(2); // Time out in Seconds
sock_client->Connect(addr, FALSE);
sock_client->WaitOnConnect(0, 100);
sock_client->SetTimeout( 2 ); // Time out in Seconds
sock_client->Connect( addr, FALSE );
sock_client->WaitOnConnect( 0, 100 );
if (sock_client->Ok() && sock_client->IsConnected())
if( sock_client->Ok() && sock_client->IsConnected() )
{
success = TRUE;
sock_client->SetFlags(wxSOCKET_NOWAIT /*wxSOCKET_WAITALL*/);
sock_client->Write(cmdline, strlen(cmdline));
sock_client->SetFlags( wxSOCKET_NOWAIT /*wxSOCKET_WAITALL*/ );
sock_client->Write( cmdline, strlen( cmdline ) );
}
sock_client->Close();
sock_client->Destroy();
return success;
}
This diff is collapsed.
......@@ -20,10 +20,10 @@
#include "netlist.h"
#include "worksheet.h"
#include "trigo.h"
#include "protos.h"
#include "bitmaps.h"
#include "eda_dde.h"
/* Routines locales */
static void CreateScreens(void);
......@@ -72,6 +72,13 @@ wxString FFileName;
SetTopWindow(SchematicFrame);
SchematicFrame->Show(TRUE);
if( CreateServer( SchematicFrame, KICAD_SCH_PORT_SERVICE_NUMBER ) )
{
// RemoteCommand is in controle.cpp and is called when PCBNEW
// sends EESCHEMA a command
SetupServerFunction( RemoteCommand );
}
SchematicFrame->Zoom_Automatique(TRUE);
/* Load file specified in the command line. */
......
This diff is collapsed.
......@@ -456,4 +456,8 @@ void InstallFindFrame(WinEDA_SchematicFrame *parent, wxPoint &pos);
/***************/
void DisplayOptionFrame(WinEDA_DrawFrame * parent, const wxPoint & framepos);
/****************/
/* CONTROLE.CPP */
/****************/
void RemoteCommand( const char* cmdline );
......@@ -26,6 +26,9 @@
BEGIN_EVENT_TABLE(WinEDA_SchematicFrame, wxFrame)
COMMON_EVENTS_DRAWFRAME
EVT_SOCKET(ID_EDA_SOCKET_EVENT_SERV, WinEDA_DrawFrame::OnSockRequestServer)
EVT_SOCKET(ID_EDA_SOCKET_EVENT, WinEDA_DrawFrame::OnSockRequest)
EVT_CLOSE(WinEDA_SchematicFrame::OnCloseWindow)
EVT_SIZE(WinEDA_SchematicFrame::OnSize)
......
/************************************************************/
/* appl_wxstruct.h: */
/* descriptions des principales classes derivees utilisees: */
/* Class "EDA_Appl: classe de l'application generale */
/************************************************************/
/************************************************************/
/* appl_wxstruct.h: */
/* descriptions des principales classes derivees utilisees: */
/* Class "EDA_Appl: classe de l'application generale */
/************************************************************/
/* Ce fichier doit etre inclus dans "wxstruct.h"
*/
*/
#ifndef APPL_WXSTRUCT_H
#define APPL_WXSTRUCT_H
......@@ -15,79 +15,77 @@
#endif
/**********************************************/
/* Class representing the entire Application */
/**********************************************/
eda_global WinEDA_App * EDA_Appl; /* application representant le programme */
/**********************************************/
/* Class representing the entire Application */
/**********************************************/
eda_global WinEDA_App* EDA_Appl; /* application representant le programme */
class WinEDA_App: public wxApp
class WinEDA_App : public wxApp
{
public:
wxString m_Project;
wxSingleInstanceChecker * m_Checker;
WinEDA_MainFrame * m_MainFrame;
WinEDA_PcbFrame * m_PcbFrame;
WinEDA_ModuleEditFrame * m_ModuleEditFrame;
WinEDA_GerberFrame * m_GerberFrame;
WinEDA_SchematicFrame * SchematicFrame; // Edition des Schemas
WinEDA_LibeditFrame * LibeditFrame; // Edition des composants
WinEDA_ViewlibFrame * ViewlibFrame; // Visualisation des composants
WinEDA_CvpcbFrame * m_CvpcbFrame;
wxSingleInstanceChecker* m_Checker;
WinEDA_MainFrame* m_MainFrame;
WinEDA_PcbFrame* m_PcbFrame;
WinEDA_ModuleEditFrame* m_ModuleEditFrame;
WinEDA_GerberFrame* m_GerberFrame;
WinEDA_SchematicFrame* SchematicFrame; // Edition des Schemas
WinEDA_LibeditFrame* LibeditFrame; // Edition des composants
WinEDA_ViewlibFrame* ViewlibFrame; // Visualisation des composants
WinEDA_CvpcbFrame* m_CvpcbFrame;
wxPoint m_HelpPos;
wxSize m_HelpSize;
wxHtmlHelpController * m_HtmlCtrl;
wxConfig * m_EDA_Config; // Config courante (tailles et positions fenetres ...*/
wxConfig * m_EDA_CommonConfig; // common setup (language ...) */
wxHtmlHelpController* m_HtmlCtrl;
wxConfig* m_EDA_Config; // Config courante (tailles et positions fenetres ...*/
wxConfig* m_EDA_CommonConfig; // common setup (language ...) */
wxString m_HelpFileName;
wxString m_CurrentOptionFile; // dernier fichier .cnf utilis
wxString m_CurrentOptionFileDateAndTime;
wxString m_BinDir; /* Chemin ou reside l'executable
(utilis si KICAD non dfini)*/
* (utilis si KICAD non dfini)*/
wxArrayString m_LastProject; /* liste des derniers projets chargs */
unsigned int m_LastProjectMaxCount; /* Max histhory file length */
wxString m_KicadEnv; /* Chemin de kicad dfini dans la variable
d'environnement KICAD,
typiquement /usr/local/kicad ou c:\kicad */
wxString m_KicadEnv;/* Chemin de kicad dfini dans la variable
* d'environnement KICAD,
* typiquement /usr/local/kicad ou c:\kicad */
bool m_Env_Defined; // TRUE si variable d'environnement KICAD definie
wxLocale * m_Locale; // Gestion de la localisation
wxLocale* m_Locale; // Gestion de la localisation
int m_LanguageId; // indicateur de choix du langage ( 0 = defaut)
wxMenu * m_Language_Menu; // List menu for languages
wxMenu* m_Language_Menu; // List menu for languages
wxString m_PdfBrowser; // Name of the selected browser, for browsing pdf datasheets
bool m_PdfBrowserIsDefault; // True if the pdf browser is the default (m_PdfBrowser not used)
public:
WinEDA_App(void);
~WinEDA_App(void);
bool OnInit(void);
int OnRun(void);
bool SetBinDir(void);
void InitEDA_Appl(const wxString & name);
bool SetLanguage(bool first_time = FALSE);
wxMenu * SetLanguageList(wxMenu * MasterMenu);
void SetLanguageIdentifier(int menu_id);
void InitOnLineHelp(void);
WinEDA_App( void );
~WinEDA_App( void );
bool OnInit( void );
int OnRun( void );
bool SetBinDir( void );
void InitEDA_Appl( const wxString& name );
bool SetLanguage( bool first_time = FALSE );
wxMenu* SetLanguageList( wxMenu* MasterMenu );
void SetLanguageIdentifier( int menu_id );
void InitOnLineHelp( void );
// Sauvegarde de configurations et options:
void GetSettings(void);
void SaveSettings(void);
void SetLastProject(const wxString & FullFileName);
void WriteProjectConfig(const wxString & local_config_filename,
const wxString & GroupName, PARAM_CFG_BASE ** List);
bool ReadProjectConfig(const wxString & local_config_filename,
const wxString & GroupName, PARAM_CFG_BASE ** List,
bool Load_Only_if_New);
void ReadPdfBrowserInfos(void);
void WritePdfBrowserInfos(void);
void GetSettings( void );
void SaveSettings( void );
void SetLastProject( const wxString& FullFileName );
void WriteProjectConfig( const wxString& local_config_filename,
const wxString& GroupName, PARAM_CFG_BASE** List );
bool ReadProjectConfig( const wxString& local_config_filename,
const wxString& GroupName, PARAM_CFG_BASE** List,
bool Load_Only_if_New );
void ReadPdfBrowserInfos( void );
void WritePdfBrowserInfos( void );
};
#endif /* APPL_WXSTRUCT_H */
......@@ -12,9 +12,6 @@
#define COMMON_GLOBL extern
#endif
/* Numero de ports TCP/IP utilis�s par KICAD */
#define KICAD_PCB_PORT_SERVICE_NUMBER 4242
/* Etat des touches speciales du clavier */
......
......@@ -11,17 +11,20 @@
#define WinEDA_Server wxSocketServer
/********************/
/* autres fonctions */
/********************/
WinEDA_Server * CreateServer(wxWindow * window, int service);
bool SendCommand( int service, char * cmdline);
void SetupServerFunction(void (* remotefct)(char * remotecmd) );
// TCP/IP ports used by PCBNEW and EESCHEMA respectively.
#define KICAD_PCB_PORT_SERVICE_NUMBER 4242 ///< PCBNEW listens on this port for commands from EESCHEMA
#define KICAD_SCH_PORT_SERVICE_NUMBER 4243 ///< EESCHEMA listens on this port for commands from PCBNEW
#define MSG_TO_PCB KICAD_PCB_PORT_SERVICE_NUMBER
#define MSG_TO_SCH KICAD_SCH_PORT_SERVICE_NUMBER
/********************/
/* autres fonctions */
/********************/
WinEDA_Server * CreateServer( wxWindow * window, int port );
bool SendCommand( int port, const char* cmdline );
void SetupServerFunction( void (*remotefct) (const char* remotecmd) );
......@@ -700,6 +700,14 @@ public:
// divers
void InstallFindFrame( const wxPoint& pos, wxDC* DC );
/**
* Function SendMessageToEESCHEMA
* sends a message to the schematic editor so that it may move its cursor
* to a part with the same reference as the objectToSync
* @param objectToSync The object whose reference is used to syncronize eeschema.
*/
void SendMessageToEESCHEMA( EDA_BaseStruct* objectToSync );
/* Special micro_ondes */
void Edit_Gap( wxDC* DC, MODULE* Module );
MODULE* Create_MuWaveBasicShape( wxDC* DC, const wxString& name, int pad_count );
......@@ -974,7 +982,17 @@ public:
bool LoadOneSheet( SCH_SCREEN* screen, const wxString& FullFileName );
// General search:
EDA_BaseStruct* FindSchematicItem( const wxString& pattern, int SearchType );
/**
* Function FindSchematicItem
* finds a string in the schematic.
* @param pattern The text to search for, either in value, reference or elsewhere.
* @param SearchType: 0 => Search is made in current sheet
* 1 => the whole hierarchy
* 2 => or for the next item
* @param mouseWarp If true, then move the mouse cursor to the item.
*/
EDA_BaseStruct* FindSchematicItem( const wxString& pattern, int SearchType, bool mouseWarp=true );
EDA_BaseStruct* FindMarker( int SearchType );
private:
......
......@@ -2,6 +2,11 @@
/* class_text_module.h : texts module description */
/***************************************************/
#ifndef TEXT_MODULE_H
#define TEXT_MODULE_H
/* Description des Textes sur Modules : */
#define TEXT_is_REFERENCE 0
#define TEXT_is_VALUE 1
......@@ -80,3 +85,6 @@ public:
virtual void Show( int nestLevel, std::ostream& os );
#endif
};
#endif // TEXT_MODULE_H
......@@ -22,52 +22,56 @@
/* Variables Locales */
/**********************************/
void RemoteCommand( char* cmdline )
void RemoteCommand( const char* cmdline )
/**********************************/
/* Read a remote command send by eeschema via a socket,
* port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242)
*/
{
char Line[1024];
char line[1024];
wxString msg;
char* idcmd, * text;
WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame;
strncpy( Line, cmdline, sizeof(Line) - 1 );
msg = CONV_FROM_UTF8( Line );
strncpy( line, cmdline, sizeof(line) - 1 );
msg = CONV_FROM_UTF8( line );
idcmd = strtok( Line, " \n\r" );
idcmd = strtok( line, " \n\r" );
text = strtok( NULL, " \n\r" );
if( (idcmd == NULL) || (text == NULL) )
return;
if( strcmp( idcmd, "$PART:" ) == 0 )
{
MODULE* Module;
msg = CONV_FROM_UTF8( text );
Module = ReturnModule( frame->m_Pcb, msg );
MODULE* module = ReturnModule( frame->m_Pcb, msg );
msg.Printf( _( "Locate module %s %s" ), msg.GetData(),
Module ? wxT( "Ok" ) : wxT( "not found" ) );
module ? wxT( "Ok" ) : wxT( "not found" ) );
frame->Affiche_Message( msg );
if( Module )
if( module )
{
wxClientDC dc( frame->DrawPanel );
frame->DrawPanel->PrepareGraphicContext( &dc );
frame->DrawPanel->CursorOff( &dc );
frame->GetScreen()->m_Curseur = Module->m_Pos;
frame->GetScreen()->m_Curseur = module->m_Pos;
frame->DrawPanel->CursorOn( &dc );
}
}
if( idcmd && strcmp( idcmd, "$PIN:" ) == 0 )
{
wxString PinName, ModName;
MODULE* Module;
D_PAD* Pad = NULL;
wxString pinName, modName;
MODULE* module;
D_PAD* pad = NULL;
int netcode = -1;
PinName = CONV_FROM_UTF8( text );
pinName = CONV_FROM_UTF8( text );
text = strtok( NULL, " \n\r" );
if( text && strcmp( text, "$PART:" ) == 0 )
text = strtok( NULL, "\n\r" );
......@@ -76,30 +80,34 @@ void RemoteCommand( char* cmdline )
frame->DrawPanel->PrepareGraphicContext( &dc );
ModName = CONV_FROM_UTF8( text );
Module = ReturnModule( frame->m_Pcb, ModName );
if( Module )
Pad = ReturnPad( Module, PinName );
if( Pad )
netcode = Pad->m_NetCode;
modName = CONV_FROM_UTF8( text );
module = ReturnModule( frame->m_Pcb, modName );
if( module )
pad = ReturnPad( module, pinName );
if( pad )
netcode = pad->m_NetCode;
if( netcode > 0 )
{
/* effacement surbrillance ancienne */
if( g_HightLigt_Status )
frame->Hight_Light( &dc );
g_HightLigth_NetCode = netcode;
frame->Hight_Light( &dc );
frame->DrawPanel->CursorOff( &dc );
frame->GetScreen()->m_Curseur = Pad->m_Pos;
frame->GetScreen()->m_Curseur = pad->m_Pos;
frame->DrawPanel->CursorOn( &dc );
}
if( Module == NULL )
if( module == NULL )
msg.Printf( _( "module %s not found" ), text );
else if( Pad == NULL )
msg.Printf( _( "Pin %s (module %s) not found" ), PinName.GetData(), ModName.GetData() );
else if( pad == NULL )
msg.Printf( _( "Pin %s (module %s) not found" ), pinName.GetData(), modName.GetData() );
else
msg.Printf( _( "Locate Pin %s (module %s)" ), PinName.GetData(), ModName.GetData() );
msg.Printf( _( "Locate Pin %s (module %s)" ), pinName.GetData(), modName.GetData() );
frame->Affiche_Message( msg );
}
}
......
......@@ -11,8 +11,9 @@
#include "autorout.h"
#include "id.h"
#include "protos.h"
#include "eda_dde.h"
#define CURRENT_ITEM (GetScreen()->m_CurrentItem)
......@@ -94,6 +95,8 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
else
{
DrawStruct = PcbGeneralLocateAndDisplay();
if( DrawStruct )
SendMessageToEESCHEMA( DrawStruct );
}
}
......@@ -128,6 +131,9 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
DrawStruct = m_Pcb->FindPadOrModule( GetScreen()->RefPos(true),
GetScreen()->m_Active_Layer );
Show_1_Ratsnest( DrawStruct, DC );
if( DrawStruct )
SendMessageToEESCHEMA( DrawStruct );
break;
case ID_PCB_MIRE_BUTT:
......@@ -311,6 +317,27 @@ out:
}
// see wxstruct.h
void WinEDA_PcbFrame::SendMessageToEESCHEMA( EDA_BaseStruct* objectToSync )
{
char cmd[1024];
MODULE* module = NULL;
if( objectToSync->m_StructType == TYPEMODULE )
module = (MODULE*) objectToSync;
else if( objectToSync->m_StructType == TYPEPAD )
module = (MODULE*)((D_PAD*)objectToSync)->m_Parent;
// ask only for the reference for now, maybe pins later.
if( module )
{
sprintf( cmd, "$PART: %s", CONV_TO_UTF8(module->m_Reference->m_Text) );
SendCommand( MSG_TO_SCH, cmd );
}
}
/*********************************************************************/
void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
/*********************************************************************/
......
......@@ -235,7 +235,9 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo
g_SaveTime = time( NULL );
#if defined(DEBUG)
#if 0 && defined(DEBUG)
// note this seems to freeze up pcbnew when run under the kicad project
// manager. runs fine from command prompt.
// output the board object tree to stdout:
m_Pcb->Show( 0, std::cout );
#endif
......
......@@ -394,7 +394,7 @@ TRACK * CreateLockPoint(int *pX, int *pY, TRACK * ptsegm, TRACK * refsegm);
/****************/
/* CONTROLE.CPP */
/****************/
void RemoteCommand(char * cmdline);
void RemoteCommand( const char* cmdline );
/*************/
/* STRUCT.CPP */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment