/*
* Builds aJson object for the current Network Settings for editing
*/
void Network::settingsToJSON(aJsonObject *root)
{
  char buff[20];
  aJsonObject *ethernet;
  
  aJson.addBooleanToObject(root, "EEPROM", !SD.exists((char*) configFilename));
  aJson.addBooleanToObject(root, "DHCPEnabled",  use_dhcp);

  addArrayToObject(root, "MAC", mac, 6);
  addArrayToObject(root, "IP", ip);
  addArrayToObject(root, "Gateway", gateway);
  addArrayToObject(root, "Subnet", subnet);
  addArrayToObject(root, "DNS", dns);

  aJson.addNumberToObject(root, "HTTPPort",     httpPort);
  aJson.addNumberToObject(root, "WebsocketPort", websocketPort);

  aJson.addItemToObject(root, "Ethernet", ethernet = aJson.createObject());    
  
  IPAddressToString(buff, Ethernet.localIP());
  aJson.addStringToObject(ethernet, "IP",       buff);
  
  IPAddressToString(buff, Ethernet.gatewayIP());
  aJson.addStringToObject(ethernet, "Gateway",  buff);
  
  IPAddressToString(buff, Ethernet.subnetMask());
  aJson.addStringToObject(ethernet, "Subnet",   buff);
  
  IPAddressToString(buff, Ethernet.dnsServerIP());
  aJson.addStringToObject(ethernet, "DNS",      buff);
}
void Network::saveNetworkConfiguration(Stream& stream) {
  aJsonObject *root = aJson.createObject();
  
  aJson.addBooleanToObject(root, "DHCPEnabled",  use_dhcp);

  char buff[32];
  sprintf(buff, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  aJson.addStringToObject(root, "MAC", buff);
  
  IPAddressToString(buff, ip);
  aJson.addStringToObject(root, "IP", buff);
  
  IPAddressToString(buff, gateway);
  aJson.addStringToObject(root, "Gateway", buff);
  
  IPAddressToString(buff, subnet);
  aJson.addStringToObject(root, "Subnet", buff);
  
  IPAddressToString(buff, dns);
  aJson.addStringToObject(root, "DNS", buff);

  aJson.addNumberToObject(root, "HTTPPort",     httpPort);
  aJson.addNumberToObject(root, "WebsocketPort", websocketPort);
  
  aJson.print(root, &aJsonStream(&stream));
  
  aJson.deleteItem(root);
}
示例#3
0
void InterfaceManager::WriteNetworkInit( InterfaceList_t & cInterfaces )
{
	File cFile;

	if( cFile.SetTo( NETINIT_FILE, O_CREAT | O_TRUNC ) == 0 )
	{
		StringWriter cSw( &cFile );

		cSw.WriteLine( "#!/bin/sh" );

		for( InterfaceList_t::iterator i = cInterfaces.begin(); i != cInterfaces.end(  ); i++ )
		{
			cSw.Write( "ifconfig " );
			cSw.Write( ( *i )->GetName() );
			cSw.WriteLine( " down" );

			if( ( *i )->GetEnabled() )
			{
				cSw.Write( "echo \"Enabling interface " );
				cSw.Write( ( *i )->GetName() );
				cSw.WriteLine( "\" >> /var/log/kernel" );
				switch ( ( *i )->GetType() )
				{
				case Static:
					cSw.Write( "ifconfig " );
					cSw.Write( ( *i )->GetName() );
					cSw.Write( " up inet " );
					cSw.Write( IPAddressToString( ( *i )->GetAddress() ) );
					cSw.Write( " netmask " );
					cSw.WriteLine( IPAddressToString( ( *i )->GetNetmask() ) );

					if( ( *i )->GetGateway() > 0 )
					{
						cSw.Write( "route add net " );
						cSw.Write( IPAddressToString( ( *i )->GetAddress() ) );
						cSw.Write( " mask " );
						if( ( *i )->IsDefault() )
						{
							cSw.Write( "0.0.0.0" );
						}
						else
						{
							cSw.Write( IPAddressToString( ( *i )->GetNetmask() ) );
						}
						cSw.Write( " gw " );
						cSw.WriteLine( IPAddressToString( ( *i )->GetGateway() ) );
					}
					break;
				case DHCP:
					cSw.Write( "dhcpc -d " );
					cSw.Write( ( *i )->GetName() );
					cSw.WriteLine( " 2>>/var/log/dhcpc" );
					break;
				}
			}
		}
	}
}
/*
* Prints network configuration to serial port.
*/
void Network::printConfiguration() {
  
  // MAC address takes a bit of work to format for output.
  char buff[32];
  cout << F("MAC: ");
  for(int i=0; i<6; i++) {
    sprintf(buff, "%02X", mac[i]);
    cout << buff;
    if (i != 5) cout << ":";
  }
  cout << endl;

  cout << F("DHCP ");
  cout << (use_dhcp ? F("enabled") : F("disabled"));

  cout << F("\nCONFIGURATION:\n\tIP:\t\t");
  IPAddressToString(buff, ip);
  cout << buff;
  
  cout << F("\n\tSubnet Mask:\t");
  IPAddressToString(buff, subnet);
  cout << buff;
  
  cout << F("\n\tGateway:\t");
  IPAddressToString(buff, gateway);
  cout << buff;
  
  cout << F("\n\tDNS Server:\t");
  IPAddressToString(buff, dns);
  cout << buff;

  if (use_dhcp) {  
    cout << F("\nETHERNET:\n\tIP:\t\t");
    Ethernet.localIP().printTo(Serial);
  
    cout << F("\n\tSubnet Mask:\t");
    Ethernet.subnetMask().printTo(Serial);
  
    cout << F("\n\tGateway:\t");
    Ethernet.gatewayIP().printTo(Serial);
  
    cout << F("\n\tDNS Server:\t");
    Ethernet.dnsServerIP().printTo(Serial);
  }

  cout << F("\nHTTP Port: ") << (int)httpPort;
  cout << F("\nWebsocket Port: ") << (int)websocketPort;

  cout << F("\n");
}
示例#5
0
void InterfaceManager::SaveConfig( InterfaceList_t & cInterfaces )
{
	File cFile;

	if( cFile.SetTo( CONFIG_FILE, O_CREAT | O_TRUNC ) == 0 )
	{
		StringWriter cSw( &cFile );

		for( InterfaceList_t::iterator i = cInterfaces.begin(); i != cInterfaces.end(  ); i++ )
		{
			cSw.WriteLine( "interface" );
			cSw.Write( "type " );
			cSw.WriteLine( ( *i )->GetType() == Static ? "Static" : "DHCP" );
			cSw.Write( "name " );
			cSw.WriteLine( ( *i )->GetName() );
			cSw.Write( "mac " );
			cSw.WriteLine( ( *i )->GetMAC() );
			cSw.Write( "enabled " );
			cSw.WriteLine( ( *i )->GetEnabled()? "true" : "false" );
			cSw.Write( "default " );
			cSw.WriteLine( ( *i )->IsDefault()? "true" : "false" );

			switch ( ( *i )->GetType() )
			{
			case Static:
				{
					cSw.Write( "address " );
					cSw.WriteLine( IPAddressToString( ( *i )->GetAddress() ) );
					cSw.Write( "netmask " );
					cSw.WriteLine( IPAddressToString( ( *i )->GetNetmask() ) );
					cSw.Write( "gateway " );
					cSw.WriteLine( IPAddressToString( ( *i )->GetGateway() ) );
					break;
				}
			case DHCP:
				break;
			}
			cSw.WriteLine( "" );
		}
	}
}
示例#6
0
void ModelMgr::AddNetworkCars(const std::map<in_addr_t, in_addr_t> & mapNewCars)
{
	std::map<in_addr_t, in_addr_t>::const_iterator iterNewCar;
	std::map<in_addr_t, CarModel *> * pCarRegistry;
	std::map<in_addr_t, CarModel *>::iterator iterFoundCar;
	QString strName, strType;
	std::map<QString, QString> mapParams;
	std::vector<std::pair<QString, QString> > vecDepends;

	m_modelsMutex.lock();
	for (iterNewCar = mapNewCars.begin(); iterNewCar != mapNewCars.end(); ++iterNewCar)
	{
		pCarRegistry = g_pCarRegistry->acquireLock();
		iterFoundCar = pCarRegistry->find(iterNewCar->first);
		if (iterFoundCar == pCarRegistry->end())
		{
			strName = IPAddressToString(iterNewCar->first);
			strType = NETMODEL_NAME;

			mapParams[CARMODEL_PARAM_CARIP] = strName;

			if (AddModel(strName, strType, mapParams))
				vecDepends.push_back(std::pair<QString, QString>(strName, ""));
			iterFoundCar = pCarRegistry->find(iterNewCar->first);
			if (iterFoundCar != pCarRegistry->end() && iterFoundCar->second != NULL) {
				iterFoundCar->second->SetOwnerIPAddress(iterNewCar->second);
	
				g_pLogger->LogInfo(QString("Added vehicle [%1] with owner [%2]\n").arg(IPAddressToString(iterNewCar->first)).arg(IPAddressToString(iterNewCar->second)));
			}
		}

		g_pCarRegistry->releaseLock();
	}

	if (!vecDepends.empty())
		BuildModelTree(vecDepends);

	m_modelsMutex.unlock();
}
示例#7
0
int CarModel::Save(std::map<QString, QString> & mapParams)
{
	if (Model::Save(mapParams))
		return 1;

	mapParams[CARMODEL_PARAM_DELAY] = QString("%1").arg(ToDouble(m_tDelay));
	mapParams[CARMODEL_PARAM_CARIP] = IPAddressToString(m_ipCar);
	mapParams[CARMODEL_PARAM_LOGCAR] = BooleanToString(m_bLogThisCar);
	mapParams[CARMODEL_LINK_PARAM] = m_pLinkModel == NULL ? "NULL" : m_pLinkModel->GetModelName();
	mapParams[CARMODEL_PHYS_PARAM] = m_pPhysModel == NULL ? "NULL" : m_pPhysModel->GetModelName();
	mapParams[CARMODEL_COMM_PARAM] = m_pCommModel == NULL ? "NULL" : m_pCommModel->GetModelName();
	mapParams[CARMODEL_TRACKSPEED_PARAM] = BooleanToString(m_bTrackSpeed);

	return 0;
}
示例#8
0
void IFaceWin::Load( void )
{
	m_pcCbEnabled->SetValue( m_pcIFace->GetEnabled() );
	switch ( m_pcIFace->GetType() )
	{
	case Static:
		{
			m_pcDdmType->SetCurrentString( MSG_IFWIN_TYPE_STATIC );
			m_pcTxtAddress->Set( IPAddressToString( m_pcIFace->GetAddress() ).c_str(  ) );
			m_pcTxtNetmask->Set( IPAddressToString( m_pcIFace->GetNetmask() ).c_str(  ) );
			m_pcTxtGateway->Set( IPAddressToString( m_pcIFace->GetGateway() ).c_str(  ) );
			break;
		}

	case DHCP:
		{
			m_pcDdmType->SetCurrentString( MSG_IFWIN_TYPE_DHCP );
			m_pcTxtAddress->SetEnable( false );
			m_pcTxtNetmask->SetEnable( false );
			m_pcTxtGateway->SetEnable( false );
			break;
		}
	}
}
示例#9
0
QString CarModel::GetCarListColumnText(CarListColumn eColumn) const
{
	switch (eColumn)
	{
	case CarListColumnName:
		return IPAddressToString(m_ipCar);
	case CarListColumnLongitude:
		return DegreesToString(m_ptPosition.m_iLong, 6);
	case CarListColumnLatitude:
		return DegreesToString(m_ptPosition.m_iLat, 6);
	case CarListColumnSpeed:
		return QString("%1 mph").arg(m_iSpeed);
	case CarListColumnHeading:
		return DegreesToString((long)m_iHeading * 10000, 2);
	default:
		return "";
	}
}
示例#10
0
bool OpenConnection(in_addr_t ipReal, const QString & strClient)
{
	std::map<in_addr_t, Client *>::iterator iterClient, iterOldClient;
	std::map<QString, ClientCreator>::iterator iterCreator;
	bool bSuccess = false;
	Client * pClient;

	g_mutexClients.lock();

	g_pLogger->LogInfo(QString("Starting %1 to host %2...").arg(strClient).arg(IPAddressToString(ipReal)));

	iterCreator = g_mapClientCreators.find(strClient);
	iterClient = g_mapClients.find(ipReal);

	if (iterClient != g_mapClients.end())
	{
		if (iterClient->second != NULL)
		{
			iterClient->second->Stop();
			delete iterClient->second;
		}
		g_mapClients.erase(iterClient);
	}
	if (iterCreator != g_mapClientCreators.end())
		pClient = (*iterCreator->second)();
	else
		pClient = NULL;

	if (pClient != NULL && pClient->Start(ipReal))
		bSuccess = g_mapClients.insert(std::pair<in_addr_t, Client *>(ipReal, pClient)).second;
	else if (pClient != NULL)
		delete pClient;

	if (bSuccess)
		g_pLogger->LogInfo("Successful\n");
	else
		g_pLogger->LogInfo("Failed\n");

	g_mutexClients.unlock();

	return bSuccess;
}
示例#11
0
void CloseConnection(in_addr_t ipReal)
{
	std::map<in_addr_t, Client *>::iterator iterConnection;

	g_mutexClients.lock();
	g_pLogger->LogInfo(QString("Stopping client to host %1...").arg(IPAddressToString(ipReal)));
	iterConnection = g_mapClients.find(ipReal);
	if (iterConnection != g_mapClients.end())
	{
		if (iterConnection->second != NULL)
		{
			iterConnection->second->Stop();
			delete iterConnection->second;
			iterConnection->second = NULL;
		}
		g_mapClients.erase(iterConnection);
	}
	g_pLogger->LogInfo("Successful\n");
	g_mutexClients.unlock();
}
示例#12
0
bool Setting::SetValue(const SettingData & sValue)
{
	bool bValid;
	in_addr_t ipValue;
	if (bValid = IsValid(sValue))
	{
		switch (m_eType & 0xF)
		{
		case SettingTypeText:
		case SettingTypeFile:
			m_sValue.strValue = sValue.strValue;
			break;
		case SettingTypeColor:
		{
			QColor clr(sValue.strValue);
			m_sValue.strValue = clr.isValid() ? clr.name() : "";
			break;
		}
		case SettingTypeIP:
			StringToIPAddress(sValue.strValue, ipValue);
			m_sValue.strValue = IPAddressToString(ipValue);
			break;
		case SettingTypeBool:
			m_sValue.bValue = sValue.bValue;
			break;
		case SettingTypeInt:
			m_sValue.iValue = sValue.iValue;
			break;
		case SettingTypeFloat:
			m_sValue.fValue = sValue.fValue;
			break;
		default:
			return false;
		}
	}
	return bValid;
}
示例#13
0
int CarModel::ProcessEvent(SimEvent & event)
{
	if (Model::ProcessEvent(event))
		return 1;

	switch (event.GetEventID())
	{
	case EVENT_CARMODEL_UPDATE:
	{
		if (m_pPhysModel != NULL)
			m_pPhysModel->DoUpdate(event.GetTimestamp());
		if (m_pLinkModel != NULL)
			m_pLinkModel->DoUpdate(event.GetTimestamp());
		if (m_pCommModel != NULL)
			m_pCommModel->DoUpdate(event.GetTimestamp());

		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage = m_mapKnownVehicles.begin();
		while (iterCarMessage != m_mapKnownVehicles.end())
		{
			if (iterCarMessage->second.m_tTime + MakeTime(NETWORK_TIMEOUT_SECS, NETWORK_TIMEOUT_USECS) < event.GetTimestamp()) {
				std::map<in_addr_t, SafetyPacket>::iterator iterCarMessageTemp = iterCarMessage;
				++iterCarMessage;
				m_mapKnownVehicles.erase(iterCarMessageTemp);
			} else
				++iterCarMessage;
		}

		if (IsActive())
		{
			std::vector<CarModel *> vecNeighbors;
			g_pCarRegistry->GetCommunicatingCarsInRange(this, vecNeighbors);
			m_msgNeighbors.tMessage = m_tTimestamp;
			m_msgNeighbors.iNeighbors = vecNeighbors.size();
			m_msgNeighbors.iCollisionCount = m_pPhysModel != NULL ? (m_pPhysModel->GetCollisionCount() - m_msgNeighbors.iAccumulatedCollisions) : 0;
			m_msgNeighbors.iAccumulatedCollisions += m_msgNeighbors.iCollisionCount;
			m_msgNeighbors.iMessages = m_pPhysModel != NULL ? (m_pPhysModel->GetMessageCount() - m_msgNeighbors.iAccumulatedMessages) : 0;
			m_msgNeighbors.iAccumulatedMessages += m_msgNeighbors.iMessages;
#ifdef MULTILANETEST
			m_msgNeighbors.iLane = m_iLane;
#endif
	
			if (m_msgNeighbors.iCollisionCount > 0 || m_msgNeighbors.iMessages > 0 || m_msgNeighbors.iNeighbors > 0)
				g_pLogger->WriteMessage(LOGFILE_NEIGHBORS, &m_msgNeighbors);
		}
		event.SetTimestamp(event.GetTimestamp() + m_tDelay);
		g_pSimulator->m_EventQueue.AddEvent(event);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEBEGIN:
	{
		Packet * pPacket = (Packet *)event.GetEventData();
		bool bValid = (pPacket != NULL);
		if (bValid && m_pCommModel != NULL && pPacket->m_ePacketType == ptSafety)
			m_pCommModel->AddMessageToHistory(*(SafetyPacket *)pPacket);
		if (bValid && m_pPhysModel != NULL)
			bValid = m_pPhysModel->BeginProcessPacket(pPacket);
		if (bValid && m_pLinkModel != NULL)
			bValid = m_pLinkModel->BeginProcessPacket(pPacket);
		if (bValid)
			g_pSimulator->m_EventQueue.AddEvent(SimEvent(pPacket->m_tRX, EVENT_PRIORITY_HIGHEST, QString::null, m_strModelName, EVENT_CARMODEL_RXMESSAGEEND, pPacket, DestroyPacket));
		else
			DestroyPacket(pPacket);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEEND:
	{
		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage;
		std::map<PacketSequence, Event1Message>::iterator iterEvent1Message;
		Packet * pPacket = (Packet *)event.GetEventData();
		// process messages in the order that they were received
		bool bValid = pPacket != NULL && m_pPhysModel != NULL && m_pPhysModel->EndProcessPacket(pPacket);

		if (bValid)
			bValid = m_pLinkModel != NULL && m_pLinkModel->EndProcessPacket(pPacket);

		if (bValid)
		{
			switch (pPacket->m_ePacketType)
			{
			case ptGeneric:
			{
				Packet * pMsg = (Packet *)pPacket;
				// received message successfully
				//g_pLogger->LogInfo(QString("%1> ***Generic Packet\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)));

				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			case ptSafety:
			{
				SafetyPacket * pMsg = (SafetyPacket *)pPacket;
				//printf("m_iLane = %u m_iHeading = %d", m_iLane, m_iHeading);
				// received message successfully
				if((sin( pMsg->m_iHeading * 3.14/18000) * sin( m_iHeading * 3.14/18000) + cos( pMsg->m_iHeading *3.14/18000)* cos( m_iHeading *3.14/18000) >= 0) && ((  m_ptPosition.m_iLong - pMsg->m_ptPosition.m_iLong ) * sin( pMsg->m_iHeading * 3.14/18000)  + (m_ptPosition.m_iLat - pMsg->m_ptPosition.m_iLat) * cos( pMsg->m_iHeading *3.14/18000) > 0))
					break;

				if (!QString((const char*)pMsg->m_pData).contains (QString("@%1 ").arg(IPAddressToString(pMsg->m_ipRX)))){
				if((const char *)pMsg->m_pData != NULL){
				        time_t  timer = time(NULL);
    					printf("%s  ", ctime(&timer));
					g_pLogger->LogInfo(QString("[From %1 Receiv %2: %3]\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg(IPAddressToString(pMsg->m_ipRX)).arg((const char *)pMsg->m_pData).ascii());
					QString temp = QString("%1@%2 ").arg((const char *)pMsg->m_pData).arg(IPAddressToString(pMsg->m_ipRX));
					free(pMsg->m_pData);
					unsigned char * temp_c_string = (unsigned char *)calloc (temp.length()+1, sizeof(unsigned char));
   					const char * const_c_string = temp.ascii();
					for (int i = 0 ; i < temp.length(); i++) temp_c_string[i]=const_c_string[i];
					temp_c_string[temp.length()] = '\0';
					pMsg->m_pData = temp_c_string;
					pMsg->m_iDataLength = sizeof(unsigned char)*(temp.length()+1);

				}

				if (m_pCommModel)
					m_pCommModel->AddMessageToRebroadcastQueue(*pMsg);
				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				}

				break;
			}
			default:
				break;
			}
			m_pLinkModel->AddReceivedPacket(pPacket);
		}

		DestroyPacket(pPacket);
		break;
	}
	default:
		break;
	}

	return 0;
}
示例#14
0
bool InitNetwork()
{
	QString strNetInitFile, strNetInitArgs, strValue;
	bool bContinue = true;
	int iErrorCode;

	// make sure network isn't running
	CloseNetwork();

	if (g_bNetworkEnabled)
		return false;

	g_pLogger->LogInfo("Opening Network Interface...");

	g_strDeviceName = g_pSettings->GetParam(PARAMKEY_NETWORK_DEVNAME, g_pSettings->m_sSettings[SETTINGS_NETWORK_DEVICENAME_NUM].GetValue().strValue, true);
	g_strDeviceType = g_pSettings->m_sSettings[SETTINGS_NETWORK_DEVICETYPE_NUM].GetValue().strValue;
	if (g_pSettings->GetParam(PARAMKEY_NETWORK_IP, "", false).isEmpty() || !StringToIPAddress(g_pSettings->GetParam(PARAMKEY_NETWORK_IP, "", false), g_ipAddress))
	{
		if (!StringToIPAddress(g_pSettings->m_sSettings[SETTINGS_NETWORK_IPADDRESS_NUM].GetValue().strValue, g_ipAddress))
			g_ipAddress = 0;
	}
	if (g_pSettings->GetParam(PARAMKEY_NETWORK_SUBNET, "", false).isEmpty() || !StringToIPAddress(g_pSettings->GetParam(PARAMKEY_NETWORK_SUBNET, "", false), g_ipSubnet))
		StringToIPAddress(g_pSettings->m_sSettings[SETTINGS_NETWORK_IPSUBNET_NUM].GetValue().strValue, g_ipSubnet);
	g_iTXPower = g_pSettings->m_sSettings[SETTINGS_NETWORK_TXPOWER_NUM].GetValue().iValue;
	g_iTXRate = g_pSettings->m_sSettings[SETTINGS_NETWORK_TXRATE_NUM].GetValue().iValue;

	strNetInitFile = g_pSettings->m_sSettings[SETTINGS_NETWORK_INITFILE_NUM].GetValue().strValue;
	if (!strNetInitFile.isEmpty())
	{
		strNetInitArgs = g_pSettings->m_sSettings[SETTINGS_NETWORK_INITARGS_NUM].GetValue().strValue;

		strNetInitArgs.replace("%dn", g_strDeviceName);
		strNetInitArgs.replace("%dt", g_strDeviceType);
		strNetInitArgs.replace("%ip", IPAddressToString(g_ipAddress));
		strNetInitArgs.replace("%sub", IPAddressToString(g_ipSubnet));
		strNetInitArgs.replace("%txp", QString::number(g_iTXPower));
		strNetInitArgs.replace("%txr", QString::number(g_iTXRate));

		if (!strNetInitArgs.isEmpty())
			strNetInitFile += " " + strNetInitArgs;

		while (bContinue)
		{
			iErrorCode = system(strNetInitFile);
			if (iErrorCode == 0) {
				g_bNetworkEnabled = true;
				bContinue = false;
			} else
				bContinue = g_pLogger->PromptLogError(PACKAGE_TITLE, QString("Could not open network interface (code %1)").arg(iErrorCode), false);
		}
	}
	else
		g_bNetworkEnabled = true;

	if (g_bNetworkEnabled)
	{
		/*if (g_strDeviceType.compare("denso") == 0)
			g_bNetworkEnabled = InitializeDensoUnit(g_ipAddress, g_ipSubnet, g_strDeviceName, g_iTXPower, g_iTXRate);
		*/
	}

	if (g_bNetworkEnabled)
		g_pLogger->LogInfo("Successful\n");
	else {
		g_pLogger->LogInfo("Failed\n");
		return false;
	}

	if (g_pMainWindow != NULL)
	{
		g_pMainWindow->m_pNetInit->setMenuText("Re&initialize");
		g_pMainWindow->m_pNetInit->setToolTip("Reinitialize network devices and connections");
		g_pMainWindow->m_pNetClose->setEnabled(true);
		g_pMainWindow->m_pNetMenu->setItemEnabled(g_pMainWindow->m_iNetServerMenuID, true);
		g_pMainWindow->m_pNetworkManager->SetNetworkInitialized(true);
	}

	g_pOldSigPipeHandler = signal(SIGPIPE, SIG_IGN);

	// start server
	if (g_pSettings->m_sSettings[SETTINGS_NETWORK_AUTOSERVER_NUM].GetValue().bValue)
	{
		if (g_strDeviceType.compare("denso") == 0)
			return StartServer(UDPSERVER_NAME);
		else
			return StartServer(UDPSERVER_NAME);
	}
	else
		return true;
}
示例#15
0
int CarModel::ProcessEvent(SimEvent & event)
{
	if (Model::ProcessEvent(event))
		return 1;

	switch (event.GetEventID())
	{
	case EVENT_CARMODEL_UPDATE:
	{
		if (m_pPhysModel != NULL)
			m_pPhysModel->DoUpdate(event.GetTimestamp());
		if (m_pLinkModel != NULL)
			m_pLinkModel->DoUpdate(event.GetTimestamp());
		if (m_pCommModel != NULL)
			m_pCommModel->DoUpdate(event.GetTimestamp());

		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage = m_mapKnownVehicles.begin();
		while (iterCarMessage != m_mapKnownVehicles.end())
		{
			if (iterCarMessage->second.m_tTime + MakeTime(NETWORK_TIMEOUT_SECS, NETWORK_TIMEOUT_USECS) < event.GetTimestamp()) {
				std::map<in_addr_t, SafetyPacket>::iterator iterCarMessageTemp = iterCarMessage;
				++iterCarMessage;
				m_mapKnownVehicles.erase(iterCarMessageTemp);
			} else
				++iterCarMessage;
		}

		if (IsActive())
		{
			std::vector<CarModel *> vecNeighbors;
			g_pCarRegistry->GetCommunicatingCarsInRange(this, vecNeighbors);
			m_msgNeighbors.tMessage = m_tTimestamp;
			m_msgNeighbors.iNeighbors = vecNeighbors.size();
			m_msgNeighbors.iCollisionCount = m_pPhysModel != NULL ? (m_pPhysModel->GetCollisionCount() - m_msgNeighbors.iAccumulatedCollisions) : 0;
			m_msgNeighbors.iAccumulatedCollisions += m_msgNeighbors.iCollisionCount;
			m_msgNeighbors.iMessages = m_pPhysModel != NULL ? (m_pPhysModel->GetMessageCount() - m_msgNeighbors.iAccumulatedMessages) : 0;
			m_msgNeighbors.iAccumulatedMessages += m_msgNeighbors.iMessages;
#ifdef MULTILANETEST
			m_msgNeighbors.iLane = m_iLane;
#endif
	
			if (m_msgNeighbors.iCollisionCount > 0 || m_msgNeighbors.iMessages > 0 || m_msgNeighbors.iNeighbors > 0)
				g_pLogger->WriteMessage(LOGFILE_NEIGHBORS, &m_msgNeighbors);
		}
		event.SetTimestamp(event.GetTimestamp() + m_tDelay);
		g_pSimulator->m_EventQueue.AddEvent(event);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEBEGIN:
	{
		Packet * pPacket = (Packet *)event.GetEventData();
		bool bValid = (pPacket != NULL);
		if (bValid && m_pCommModel != NULL && pPacket->m_ePacketType == ptSafety)
			m_pCommModel->AddMessageToHistory(*(SafetyPacket *)pPacket);
		if (bValid && m_pPhysModel != NULL)
			bValid = m_pPhysModel->BeginProcessPacket(pPacket);
		if (bValid && m_pLinkModel != NULL)
			bValid = m_pLinkModel->BeginProcessPacket(pPacket);
		if (bValid)
			g_pSimulator->m_EventQueue.AddEvent(SimEvent(pPacket->m_tRX, EVENT_PRIORITY_HIGHEST, QString::null, m_strModelName, EVENT_CARMODEL_RXMESSAGEEND, pPacket, DestroyPacket));
		else
			DestroyPacket(pPacket);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEEND:
	{
		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage;
		std::map<PacketSequence, Event1Message>::iterator iterEvent1Message;
		Packet * pPacket = (Packet *)event.GetEventData();
		// process messages in the order that they were received
		bool bValid = pPacket != NULL && m_pPhysModel != NULL && m_pPhysModel->EndProcessPacket(pPacket);

		if (bValid)
			bValid = m_pLinkModel != NULL && m_pLinkModel->EndProcessPacket(pPacket);

		if (bValid)
		{
			switch (pPacket->m_ePacketType)
			{
			case ptGeneric:
			{
				Packet * pMsg = (Packet *)pPacket;
				// received message successfully
				//g_pLogger->LogInfo(QString("%1> ***Generic Packet\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)));

				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			case ptSafety:
			{
				SafetyPacket * pMsg = (SafetyPacket *)pPacket;
				// received message successfully
				g_pLogger->LogInfo(QString("%1> ***Safety: %2\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg((const char *)pMsg->m_pData));
				if((const char *)pMsg->m_pData != NULL)
					m_pMessageList->addMessage(QString("<SafetyPacket from %1 received by %2>  %3").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg(IPAddressToString(pMsg->m_ipRX)).arg((const char *)pMsg->m_pData));
				if (m_pCommModel)
					m_pCommModel->AddMessageToRebroadcastQueue(*pMsg);
				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			default:
				break;
			}
			m_pLinkModel->AddReceivedPacket(pPacket);
		}

		DestroyPacket(pPacket);
		break;
	}
	default:
		break;
	}

	return 0;
}
示例#16
0
void CloseNetwork()
{
	if (IsNetworkRunning())
	{
		QString strNetCloseFile, strNetCloseArgs;
		bool bContinue = true;
		int iErrorCode;

		// stop clients, server
		CloseAllConnections();
		if (g_pMainWindow != NULL)
			g_pMainWindow->m_pNetworkManager->UpdateClientTable();
		if (!g_mapClients.empty())
			return;

		StopServer();
		if (g_pServer != NULL)
			return;

		g_pLogger->LogInfo("Closing Network Interface...");
		signal(SIGPIPE, g_pOldSigPipeHandler);

		/*if (g_strDeviceType.compare("denso") == 0)
			g_bNetworkEnabled = !CloseDensoUnit();
		*/
		strNetCloseFile = g_pSettings->m_sSettings[SETTINGS_NETWORK_CLOSEFILE_NUM].GetValue().strValue;
		if (!g_bNetworkEnabled && !strNetCloseFile.isEmpty())
		{
			strNetCloseArgs = g_pSettings->m_sSettings[SETTINGS_NETWORK_CLOSEARGS_NUM].GetValue().strValue;

			strNetCloseArgs.replace("%dn", g_strDeviceName);
			strNetCloseArgs.replace("%dt", g_strDeviceType);
			strNetCloseArgs.replace("%ip", IPAddressToString(g_ipAddress));
			strNetCloseArgs.replace("%sub", IPAddressToString(g_ipSubnet));
			strNetCloseArgs.replace("%txp", QString::number(g_iTXPower));
			strNetCloseArgs.replace("%txr", QString::number(g_iTXRate));

			if (!strNetCloseArgs.isEmpty())
				strNetCloseFile += " " + strNetCloseArgs;

			while (bContinue)
			{
				iErrorCode = system(strNetCloseFile);
				if (iErrorCode == 0) {
					g_bNetworkEnabled = false;
					bContinue = false;
				} else
					bContinue = g_pLogger->PromptLogError(PACKAGE_TITLE, QString("Could not close network interface (code %1)").arg(iErrorCode), false);
			}
		}
		else
			g_bNetworkEnabled = false;

		if (g_bNetworkEnabled) {
			g_pLogger->LogInfo("Failed\n");
			return;
		} else
			g_pLogger->LogInfo("Successful\n");

		if (g_pMainWindow != NULL)
		{
			g_pMainWindow->m_pNetInit->setMenuText("&Initialize");
			g_pMainWindow->m_pNetInit->setToolTip("Initialize network devices and connections");
			g_pMainWindow->m_pNetClose->setEnabled(false);
			g_pMainWindow->m_pNetMenu->setItemEnabled(g_pMainWindow->m_iNetServerMenuID, false);
			g_pMainWindow->m_pNetworkManager->SetNetworkInitialized(false);
		}
	}
}
void QAutoGenDialog::accept()
{
	unsigned int i, iVehicles = m_txtVehicles->value(), iCar;
	QString strParam, strValue, strName, strType = m_comboVehicleType->currentText();
	std::map<QString, QString> mapParams;
	std::map<QString, std::map<QString, AutoGenParameter> >::iterator iterParams = m_mapModels.find(strType), iterAssocParams;
	std::map<QString, AutoGenParameter>::iterator iterParam;
	QStringList listDepends;
	QStringList::iterator iterDepend;
	in_addr_t ipAddress, ipTemp;
	std::map<QString, QString> mapAssocModels;
	std::map<QString, QString>::iterator iterAssocModel;
	std::map<QString, QString> mapAssocModelTypes;
	std::map<QString, QString>::iterator iterAssocModelType;
	std::vector<std::pair<QString, QString> > vecAssocModelTypes;
	std::map<QString, std::map<QString, AutoGenParameter> > mapAssocModelParams;
	std::map<QString, std::map<QString, ModelParameter> >::iterator iterModelType = m_pMapParams->find(strType), iterModelParams;
	std::map<QString, ModelParameter>::iterator iterModelParam;
	std::set<QString> setDepends;
	std::set<QString>::iterator iterSetDepend;
	QAutoGenModelDialog * pDialog;
	int nResult;
	bool bAddressSet = false;
	std::map<QString, Rect>::iterator iterAddressParams;

	// get record list for different parameters
	for (iterAddressParams = m_mapMapSelections.begin(); iterAddressParams != m_mapMapSelections.end(); ++iterAddressParams)
	{
		switch (m_comboRegionType->currentItem())
		{
		case 0:
			g_pMapDB->GetRecordsInRegion(m_mapRandomRecords[iterAddressParams->first], iterAddressParams->second);
			break;
		default:
			break;
		}
	}

	// make list of associated models
	for (iterParam = iterParams->second.begin(); iterParam != iterParams->second.end(); ++iterParam)
	{
		strParam = iterParam->first, strValue = iterParam->second.strValue;
		iterModelParam = iterModelType->second.find(strParam);
		if (iterParam->second.eType == AutoGenParamTypeNewModel)
		{
			vecAssocModelTypes.push_back(std::pair<QString, QString>(strParam, strValue));
			mapAssocModelTypes.insert(vecAssocModelTypes.back());
		}
	}

	for (i = 0; i < vecAssocModelTypes.size(); i++)
	{
		if (vecAssocModelTypes[i].second.compare(NULLMODEL_NAME) != 0)
		{
			pDialog = new QAutoGenModelDialog(vecAssocModelTypes[i].first, vecAssocModelTypes[i].second, this);
			m_mapModelIndexes[vecAssocModelTypes[i].second] = 0;
			iterModelParams = m_pMapParams->find(vecAssocModelTypes[i].second);
			iterAssocParams = m_mapModels.find(vecAssocModelTypes[i].second);
			iterAssocParams = mapAssocModelParams.insert(std::pair<QString, std::map<QString, AutoGenParameter> >(vecAssocModelTypes[i].first, iterAssocParams->second)).first;
			pDialog->m_pVecModelTypes = m_pVecModelTypes;
			pDialog->m_pAssocModelTypeMap = &mapAssocModelTypes;
			pDialog->m_pAssocModelTypes = &vecAssocModelTypes;
			pDialog->m_pModelParams = &iterModelParams->second;
			// generate auto-generator parameters
			pDialog->m_pParams = &iterAssocParams->second;
			pDialog->InitializeModelParams();
			nResult = pDialog->exec();
			delete pDialog;
			if (nResult == QDialog::Rejected)
				return;
		}
	}

	iCar = 0;
	qApp->setOverrideCursor(QCursor(Qt::WaitCursor));
	ipAddress = GetIPAddress();
	for (i = 0; i < iVehicles; i++)
	{
		// create this vehicle
		while (m_pModelNames->find(strName = QString("%1%2").arg(strType).arg(iCar)) != m_pModelNames->end())
			iCar++;
		for (iterParam = iterParams->second.begin(); iterParam != iterParams->second.end(); ++iterParam)
		{
			strParam = iterParam->first, strValue = iterParam->second.strValue;
			iterModelParam = iterModelType->second.find(strParam);
			switch (iterParam->second.eType & (~AutoGenParamTypeNoRandom))
			{
			case AutoGenParamTypeNewModel:
				iterAssocModelType = mapAssocModelTypes.find(strParam);
				setDepends.insert(mapParams[iterAssocModelType->first] = GetAssocModel(iterAssocModelType->first, iterAssocModelType->second, mapAssocModels, mapAssocModelTypes, mapAssocModelParams, i));
				break;
			case AutoGenParamTypeDepends:
				listDepends = QStringList::split(';', strValue);
				for (iterDepend = listDepends.begin(); iterDepend != listDepends.end(); ++iterDepend)
					setDepends.insert(*iterDepend);
				break;
			case AutoGenParamTypeIP:
				if (!bAddressSet && StringToIPAddress(strValue, ipTemp))
					ipAddress = ipTemp;
				break;
			case AutoGenParamTypeRandom:
				mapParams[strParam] = GetRandomParameter(strParam, strValue, iterModelParam->second);
				break;
			case AutoGenParamTypeFile:
				mapParams[strParam] = GetFileParameter(strParam, strValue, i);
				break;
			default:
				mapParams[strParam] = strValue;
				break;
			}
		}
		while (m_pVehicleIPs->find(ipAddress) != m_pVehicleIPs->end())
			ipAddress++;
		bAddressSet = true;
		mapParams[m_strIPAddressParam] = IPAddressToString(ipAddress);
		setDepends.erase("NULL");
		mapParams[PARAM_DEPENDS] = QString::null;
		for (iterSetDepend = setDepends.begin(); iterSetDepend != setDepends.end(); ++iterSetDepend)
		{
			if (mapParams[PARAM_DEPENDS].isEmpty())
				mapParams[PARAM_DEPENDS] = *iterSetDepend;
			else
				mapParams[PARAM_DEPENDS] += (';' + *iterSetDepend);
		}
		setDepends.clear();
		m_pVehicleIPs->insert(ipAddress);
		m_pModels->insert(std::pair<QString, std::map<QString, QString> >(strName, mapParams));
		m_pVehicleList->push_back(std::pair<QString, QString>(strName, strType));
		m_pModelNames->insert(strName);
		mapAssocModels.clear();
		iCar++;
		ipAddress++;
	}

	m_mapFileData.clear();
	qApp->restoreOverrideCursor();
	QDialog::accept();
}
示例#18
0
void Logger::WriteMessage(unsigned int iLogFile, const void * pMessage)
{
	m_mutexLogFiles[iLogFile].lock();
	if (m_pLogFiles[iLogFile] != NULL)
	{
		switch (iLogFile)
		{
		case LOGFILE_MESSAGES:
		{
			const SafetyPacket & msg = *(const SafetyPacket *)pMessage;
#ifdef LOGEVENTSONLY
			if (msg.m_ePacketType != ptSafety)
				break;
#endif
			if (msg.m_ipRX == 0)
			{
				fprintf(m_pLogFiles[iLogFile],
					"%-8u %-19.6f %-15s %-11.6f %-11.6f %-5hd %-7.2f %-15s                 %-19.6f                                    %s\n",
					msg.m_ID.srcID.iSeqNumber,
					ToDouble(msg.m_tTime),
					(const char *)IPAddressToString(msg.m_ID.srcID.ipCar),
					msg.m_ptPosition.m_iLong * 1e-6,
					msg.m_ptPosition.m_iLat * 1e-6,
					msg.m_iSpeed,
					msg.m_iHeading * 1e-2,
					(const char *)IPAddressToString(msg.m_ipTX),
					ToDouble(msg.m_tTX),
					msg.m_iDataLength > 0 ? (const char *)msg.m_pData : "");
			}
			else
			{
				fprintf(m_pLogFiles[iLogFile],
					"%-8u %-19.6f %-15s %-11.6f %-11.6f %-5hd %-7.2f %-15s %-15s %-19.6f %-19.6f %-4hd %-4hd %-4hd %s\n",
					msg.m_ID.srcID.iSeqNumber,
					ToDouble(msg.m_tTime),
					(const char *)IPAddressToString(msg.m_ID.srcID.ipCar),
					msg.m_ptPosition.m_iLong * 1e-6,
					msg.m_ptPosition.m_iLat * 1e-6,
					msg.m_iSpeed,
					msg.m_iHeading * 1e-2,
					(const char *)IPAddressToString(msg.m_ipTX),
					(const char *)IPAddressToString(msg.m_ipRX),
					ToDouble(msg.m_tTX),
					ToDouble(msg.m_tRX),
					msg.m_iRSSI,
					msg.m_iSNR,
					msg.m_iTTL,
					msg.m_iDataLength > 0 ? (const char *)msg.m_pData : "");
			}
			break;
		}
		case LOGFILE_EVENT1:
		{
			const Event1Message & msg = *(const Event1Message *)pMessage;
			fprintf(m_pLogFiles[iLogFile], "%-19.6f %-8u %-15s %-11.3f    %-11.3f          %-8u\n",
			  ToDouble(msg.tMessage),
			  msg.ID.iSeqNumber,
			  (const char *)IPAddressToString(msg.ID.ipCar),
			  msg.fDistance,
			  msg.fOriginatorDistance,
			  msg.iCars);
			break;
		}
		case LOGFILE_NEIGHBORS:
		{
			const NeighborMessage & msg = *(const NeighborMessage *)pMessage;
#ifdef MULTILANETEST
			fprintf(m_pLogFiles[iLogFile], "%-19.6f %-15s %-9u %-9u %-9u %-1u\n",
			  ToDouble(msg.tMessage),
			  (const char *)IPAddressToString(msg.ipCar),
			  msg.iNeighbors,
			  msg.iMessages,
			  msg.iCollisionCount,
			  msg.iLane);
#else
			fprintf(m_pLogFiles[iLogFile], "%-19.6f %-15s %-9u %-9u %-9u\n",
			  ToDouble(msg.tMessage),
			  (const char *)IPAddressToString(msg.ipCar),
			  msg.iNeighbors,
			  msg.iMessages,
			  msg.iCollisionCount);
#endif
			break;
		}
		default:
			break;
		}
		fflush(m_pLogFiles[iLogFile]);
	}
	m_mutexLogFiles[iLogFile].unlock();
}