⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scripting.cpp

📁 roadnav 内含一个基于wxWindows库的车载导航系统。编译后
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			
			// we need the socket to be non-blocking
			pSock->SetFlags(wxSOCKET_NOWAIT);
			
			// make some input and output stream wrappers, then add it to the list
			AddScript(new wxSocketInputStream(*pSock), new wxSocketOutputStream(*pSock), pSock);
		}
	}
	m_mtxServers.Unlock();
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief Pump everything
///
//////////////////////////////////////////////////////////////////////////////
void Scripting::Pump()
{
	PumpScripts();
	PumpServers();
}


//////////////////////////////////////////////////////////////////////////////
///
/// \brief Run a script from a file
///
//////////////////////////////////////////////////////////////////////////////
bool Scripting::RunFromFile(wxString strFilename)
{
	wxFFileInputStream * pStream;
	
	pStream = new wxFFileInputStream(strFilename);
	
	AddScript(pStream, NULL, NULL);
	
	return false;
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief Listen on a TCP port for connection for scripting commands
///
//////////////////////////////////////////////////////////////////////////////
bool Scripting::AddTCPServer(int iPort, bool bLocalConnectionsOnly)
{
	wxSocketServer * pServer;
	wxIPV4address addr;
	
	if (bLocalConnectionsOnly)
		addr.LocalHost();
	else
		addr.AnyAddress();
		
	addr.Service(iPort);		
		
	pServer = new wxSocketServer(addr);
	
	if (!pServer->Ok())
	{
		delete pServer;
		return true;
	}
	
	AddServer(pServer);
	
	return false;
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief Delete all TCP servers
///
//////////////////////////////////////////////////////////////////////////////
void Scripting::DeleteAllTCPServers()
{
	vector<wxSocketServer *>::iterator i2;

	m_mtxServers.Lock();
	for (i2 = m_vServers.begin(); i2 != m_vServers.end(); i2++)
	{
		delete (*i2);
	}
	m_vServers.clear();
	m_mtxServers.Unlock();
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief Low level function to perform the command in a string
///
//////////////////////////////////////////////////////////////////////////////
std::list<wxString> Scripting::ExecuteCommand(wxString strCmdAndArgs)
{
	list<wxString> vCmdAndArgs;
	wxStringTokenizer tkz(strCmdAndArgs, wxT("\t"), wxTOKEN_RET_EMPTY_ALL);
	
	while (tkz.HasMoreTokens())
		vCmdAndArgs.push_back(tkz.GetNextToken());

	return ExecuteCommand(vCmdAndArgs);		
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief Low level function to perform the command in a list (command and
/// arguments).
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::ExecuteCommand(list<wxString> vCmdAndArgs)
{
	wxString strCmd;
	list<wxString> rtn;
	
	if (vCmdAndArgs.size() == 0)
	{
		rtn.push_back(wxT("Invalid number of arguments"));
		return rtn;
	}
		
	strCmd = vCmdAndArgs.front().Upper();
	vCmdAndArgs.pop_front();
		
	if (strCmd == wxT("ADD_WAYPOINT"))
		return CommandAddWaypoint(strCmd, vCmdAndArgs);
		
	if (strCmd == wxT("GET_WAYPOINT"))
		return CommandGetWaypoint(strCmd, vCmdAndArgs);
		
	if (strCmd == wxT("DELETE_WAYPOINT"))
		return CommandDeleteWaypoint(strCmd, vCmdAndArgs);
		
	rtn.push_back(wxT("Unrecognized command"));
	
	return rtn;
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief add_waypoint command
///
/// add_waypoint <name> <visible> <call_out> <small_label> <icon_filename> <long> <lat>
///
/// add_waypoint <name> <visible> <call_out> <small_label> <icon_filename> <street_#> <street name> <street type> <city> <state>
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandAddWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
	list<wxString> rtn;
	wxString strWaypointName;
	bool bCallout;
	bool bSmallLabel;
	wxString strIconFilename;
	bool bVisible;
	
	if (vArgs.size() < 5)
	{
		rtn.push_back(wxT("Invalid number of arguments"));
		return rtn;
	}
	
	strWaypointName = PopFrontAndReturn(vArgs);
	bVisible = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
	bCallout = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
	bSmallLabel = wxtoi(PopFrontAndReturn(vArgs)) ? true : false;
	strIconFilename = PopFrontAndReturn(vArgs);

	switch (vArgs.size())
	{
		case 2:
		{
			double fLong = 0;
			double fLat = 0;
			Address cAddr;
			vector<bool> bVisibility;
			
			PopFrontAndReturn(vArgs).ToDouble(&fLong);
			PopFrontAndReturn(vArgs).ToDouble(&fLat);
			
			cAddr = FindCoordinates(Point(fLong, fLat), bVisibility);
			
			if (cAddr.m_bValid)
			{
				MapMarker cMarker(strWaypointName, &cAddr, -1, bCallout, bSmallLabel, true, strIconFilename, 1, bVisible);
				m_pctlMap->SetMarker(cMarker, false);
				rtn.push_back(wxT("OK"));
			}
			else
			{
				rtn.push_back(wxT("Look up failure"));
			}
			
			return rtn;
		}
		
		case 5:
		{
			int iSearchNumber;
			wxString strSearchStreet;
			wxString strSearchType;
			wxString strCity;
			wxString strState;
			Address cAddr;
			std::vector<bool> bVisibility;
			
			iSearchNumber = wxtoi(PopFrontAndReturn(vArgs));
			strSearchStreet = PopFrontAndReturn(vArgs);
			strSearchType = PopFrontAndReturn(vArgs);
			strCity = PopFrontAndReturn(vArgs);
			strState = PopFrontAndReturn(vArgs);
			
			cAddr = FindAddress(iSearchNumber, strSearchStreet, strSearchType, strCity, strState, bVisibility);

			if (cAddr.m_bValid)
			{
				MapMarker cMarker(strWaypointName, &cAddr, -1, bCallout, bSmallLabel, true, strIconFilename, 1, bVisible);
				m_pctlMap->SetMarker(cMarker, false);
				rtn.push_back(wxT("OK"));
			}
			else
			{
				rtn.push_back(wxT("Look up failure"));
			}
		}

	}

	rtn.push_back(wxT("Invalid number of arguments"));
	return rtn;
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief delete_waypoint command
///
/// delete_waypoint <name>
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandDeleteWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
	list<wxString> rtn;
	wxString strWaypointName;
	
	if (vArgs.size() != 1)
	{
		rtn.push_back(wxT("Invalid number of arguments"));
		return rtn;
	}
	
	strWaypointName = PopFrontAndReturn(vArgs);
	
	m_pctlMap->ClearMarker(strWaypointName);
	
	rtn.push_back(wxT("OK"));
	return rtn;
}

//////////////////////////////////////////////////////////////////////////////
///
/// \brief get_waypoint command
///
/// get_waypoint <name>
/// 
/// Will return the address and coordinates of waypoint
///
//////////////////////////////////////////////////////////////////////////////
list<wxString> Scripting::CommandGetWaypoint(wxString strCmd, std::list<wxString> vArgs)
{
	list<wxString> rtn;
	wxString strWaypointName;
	
	if (vArgs.size() != 1)
	{
		rtn.push_back(wxT("Invalid number of arguments"));
		return rtn;
	}
	
	strWaypointName = PopFrontAndReturn(vArgs);
	
	MapMarker & cMarker = m_pctlMap->GetMarker(strWaypointName);
	
	rtn.push_back(wxT("OK"));
	rtn.push_back(cMarker.m_cAddress.FormatAddress(true, true, false));
	
	return rtn;
}

wxString Scripting::CompileCommand(list<wxString> vCmdAndArgs)
{
	wxString strRtn;
	list<wxString>::iterator i;
	
	for (i = vCmdAndArgs.begin(); i != vCmdAndArgs.end(); i++)
	{
		if (i != vCmdAndArgs.begin())
			strRtn += wxT("\t");
		
		strRtn += *i;
	}
	return strRtn;
}


bool Scripting::WriteWaypointToFile(wxString strFilename, bool bAppend, const MapMarker & cMarker)
{
	wxFFile fFile;
	list<wxString> vCmdAndArgs;
	
	if (!fFile.Open(strFilename, bAppend ? wxT("a+b") : wxT("wb")))
		return true;
		
	vCmdAndArgs.push_back(wxT("add_waypoint"));
	vCmdAndArgs.push_back(cMarker.m_strName);
	vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bVisible));
	vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bCalloutBox));
	vCmdAndArgs.push_back(wxString::Format(wxT("%d"), cMarker.m_bSmallLabel));
	vCmdAndArgs.push_back(wxString::Format(cMarker.m_strIcon));
	vCmdAndArgs.push_back(wxString::Format(wxT("%.10f"), cMarker.m_cAddress.m_ptCoordinates.m_fLong));
	vCmdAndArgs.push_back(wxString::Format(wxT("%.10f"), cMarker.m_cAddress.m_ptCoordinates.m_fLat));
	
	fFile.Write(CompileCommand(vCmdAndArgs) + wxT("\n"));
	
	fFile.Close();
	
	return false;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -