int main()
{    
    quickstartMode = (strcmp(org, "quickstart") == 0);

    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
    
    led2 = LED2_OFF; // K64F: turn off the main board LED 
    
    displayMessage("Connecting");
    Thread yellow_thread(flashing_yellow);
    Thread menu_thread(menu_loop);  
    
    LOG("***** IBM IoT Client Ethernet Example *****\n");
    MQTTEthernet ipstack;
    ethernetInitialising = false;
    MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
    LOG("Ethernet Initialized\n"); 
    
    if (quickstartMode)
        getMac(ipstack.getEth(), id, sizeof(id));
        
    attemptConnect(&client, &ipstack);
    
    if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)    
    {
        red();
        while (true)
            wait(1.0); // Permanent failures - don't retry
    }
    
    if (!quickstartMode) 
    {
        int rc = 0;
        if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
            WARN("rc from MQTT subscribe is %d\n", rc); 
    }
    
    blink_interval = 0;
    int count = 0;
    while (true)
    {
        if (++count == 100)
        {               // Publish a message every second
            if (publish(&client, &ipstack) != 0) 
                attemptConnect(&client, &ipstack);   // if we have lost the connection
            count = 0;
        }
        
        if (blink_interval == 0)
            led2 = LED2_OFF;
        else if (count % blink_interval == 0)
            led2 = !led2;
        client.yield(10);  // allow the MQTT client to receive messages
    }

}
Ejemplo n.º 2
0
static void testNSConnect(void) {
  int portNum = 7211;
  struct NSCounter basic = { 0, 0, 0 };
  struct NSCounter cur;
  struct NSNetConnectionHandler nsch;
  struct NSNetBindHandler nsbh;
  struct NSNet *ns;

  nsrh.bytesRead = NSRHBytesRead;
  nsrh.closed = NSRHClosed;

  nsch.success = NSCHSuccess;
  nsch.timedOut = NSCHTimedOut;
  nsch.refused = NSCHRefused;
  nsch.unknownHost = NSCHUnknownHost;

  nsbh.success = NSBHBindSuccess;
  nsbh.error = NSBHBindError;

  cur = basic;
  ns = newNSNet();
  attemptConnect(ns, &nsch, "notAValidHostName", 5555, &cur);
  rassert(cur.success == 0 && cur.unknownHost == 1 && cur.refused == 0 && cur.timedOut == 0);
  cur = basic;
  rassert(0 == attemptConnect(ns, &nsch, "localhost", 5555, &cur));
  waitForNetEvent(ns, 2000);
  rassert(cur.success == 0 && cur.unknownHost == 0 && cur.refused == 1 && cur.timedOut == 0);
  cur = basic;
  rassert(0 == attemptBind(ns, &nsbh, 1, portNum, &cur));
  rassert(cur.bindSuccess == 0 && cur.bindError == 0);
  rassert(0 == attemptConnect(ns, &nsch, "localhost", portNum, &cur));
  waitForNetEvent(ns, 1000);
  rassert(cur.success == 1 && cur.unknownHost == 0 && cur.refused == 0 && cur.timedOut == 0);
  rassert(cur.bindSuccess == 1 && cur.bindError == 0);
  cur = basic;
  rassert(0 == attemptBind(ns, &nsbh, 0, portNum+1, &cur));
  rassert(cur.bindSuccess == 0 && cur.bindError == 0);
  rassert(0 == attemptConnect(ns, &nsch, "localhost", portNum+1, &cur));
  waitForNetEvent(ns, 1000);
  rassert(cur.bindSuccess == 1 && cur.bindError == 0);
  rassert(connectNSCC != NULL);
  rassert(bindNSCC != NULL);
  clearReadBuffer();
  { char *msg = "msgtoserver"; writeNSBytes(connectNSCC, msg, strlen(msg)); }
  waitForNetEvent(ns, 1000);
  readBufferMustMatch("msgtoserver");
  clearReadBuffer();
  { char *msg = "msgtoclient!"; 
    while (*msg) {
      writeNSBytes(bindNSCC, msg, 1);
      waitForNetEvent(ns, 1000);
      msg += 1;
    }
  }
  readBufferMustMatch("msgtoclient!");
}
   bool AbstractNetworkManager::attemptPendingNodes()
   {
      bool ret_val = false;
      
      for (std::vector<Node*>::iterator i = mNodes.begin();
           i != mNodes.end() ; i++)
      {
         if ( Node::PENDING == (*i)->getStatus() )
         {
            if ( attemptConnect(*i) )
            {
               // If any of the nodes were successful connecting
               // then we should return true
               ret_val = true;
            }
         }
      }

      return ret_val;
   }
Ejemplo n.º 4
0
void PatchRoadGenerator::generateRoadNetwork() {
	srand(12345);

	// mark all the existing vertices as fixed
	{
		RoadVertexIter vi, vend;
		for (boost::tie(vi, vend) = boost::vertices(roads.graph); vi != vend; ++vi) {
			roads.graph[*vi]->fixed = true;
		}
	}

	// remove all the local streets temporalily
	QMap<RoadEdgeDesc, bool> originalLocalStreets;
	{
		RoadEdgeIter ei, eend;
		for (boost::tie(ei, eend) = boost::edges(roads.graph); ei != eend; ++ei) {
			if (!roads.graph[*ei]->valid) continue;
			if (roads.graph[*ei]->type == RoadEdge::TYPE_STREET) {
				originalLocalStreets[*ei] = true;
				roads.graph[*ei]->valid = false;
			}
		}
	}

	std::list<RoadVertexDesc> seeds;

	// Avenueのシードを生成
	generateAvenueSeeds(seeds);

	// Avenueを生成
	std::cout << "Avenue generation started." << std::endl;
	{
		// detect interesting shapes
		std::vector<std::vector<RoadEdgeDescs> > shapes;
		std::vector<std::vector<Patch> > patches;
		{
			shapes.resize(features.size());
			patches.resize(features.size());
			for (int i = 0; i < features.size(); ++i) {
				shapes[i] = features[i].shapes(RoadEdge::TYPE_AVENUE, G::getFloat("houghScale"), G::getFloat("avenuePatchDistance"));
				patches[i] = RoadGeneratorHelper::convertToPatch(RoadEdge::TYPE_AVENUE, features[i].roads(RoadEdge::TYPE_AVENUE), features[i].roads(RoadEdge::TYPE_AVENUE), shapes[i]);
			}
		}

		int iter;
		for (iter = 0; !seeds.empty() && iter < G::getInt("numAvenueIterations"); ) {
			RoadVertexDesc desc = seeds.front();
			seeds.pop_front();

			// 既に3つ以上エッジがある場合は、スキップする
			if (GraphUtil::getDegree(roads, desc) >= 3) {
				continue;
			}

			// エリアの外なら、スキップする
			if (!targetArea.contains(roads.graph[desc]->pt)) {
				printf("ERROR: this check should have been done before.\n");
				continue;
			}

			// 水中なら、スキップする
			float z = vboRenderManager->getTerrainHeight(roads.graph[desc]->pt.x(), roads.graph[desc]->pt.y(), true);
			if (z < G::getFloat("seaLevelForAvenue")) {
				std::cout << "attemptExpansion (avenue): " << iter << " (skipped because it is under the sea)" << std::endl;
				continue;
			}

			std::cout << "attemptExpansion (avenue): " << iter << " (Seed: " << desc << ")" << std::endl;
			//int ex_id = roads.graph[desc]->properties["ex_id"].toInt();
			int ex_id = defineExId(roads.graph[desc]->pt);

			if (!attemptConnect(RoadEdge::TYPE_AVENUE, desc, ex_id, features, seeds)) {
				if (!attemptExpansion(RoadEdge::TYPE_AVENUE, desc, ex_id, features[ex_id], patches[ex_id], seeds)) {
					attemptExpansion2(RoadEdge::TYPE_AVENUE, desc, features[ex_id], seeds);
				}
			}

			char filename[255];
			sprintf(filename, "road_images/avenues_%d.jpg", iter);
			RoadGeneratorHelper::saveRoadImage(roads, seeds, filename);

			iter++;
		}
	}
	std::cout << "Avenue generation completed." << std::endl;

	seeds.clear();

	// Avenueをクリーンナップ
	if (G::getBool("cleanAvenues")) {
		removeDeadend(roads);
	}

	if (G::getBool("removeSmallBlocks")) {
		SmallBlockRemover::remove(roads, G::getFloat("minBlockSize"));
	}

	// recover the temporarily removed local streets if they are not intersected with other edges
	{
		for (QMap<RoadEdgeDesc, bool>::iterator it = originalLocalStreets.begin(); it != originalLocalStreets.end(); ++it) {
			if (!GraphUtil::isIntersect(roads, roads.graph[it.key()]->polyline)) {
				roads.graph[it.key()]->valid = true;
			}
		}
	}

	// Local streetを生成
	if (G::getBool("generateLocalStreets")) {
		generateStreetSeeds(seeds);
		
		// detect interesting shapes
		std::vector<std::vector<RoadEdgeDescs> > shapes;
		std::vector<std::vector<Patch> > patches;
		{
			shapes.resize(features.size());
			patches.resize(features.size());
			for (int i = 0; i < features.size(); ++i) {
				shapes[i] = features[i].shapes(RoadEdge::TYPE_STREET, G::getFloat("houghScale") * 0.2f, G::getFloat("streetPatchDistance"));
				patches[i] = RoadGeneratorHelper::convertToPatch(RoadEdge::TYPE_STREET, features[i].roads(RoadEdge::TYPE_STREET), features[i].roads(RoadEdge::TYPE_AVENUE), shapes[i]);
			}
		}
		
		std::cout << "Local street generation started." << std::endl;

		int iter;
		for (iter = 0; !seeds.empty() && iter < G::getInt("numStreetIterations");) {
			RoadVertexDesc desc = seeds.front();
			seeds.pop_front();

			// 既に3つ以上エッジがある場合は、スキップする
			if (GraphUtil::getDegree(roads, desc) >= 3) {
				continue;
			}

			// エリアの外なら、スキップする
			if (!targetArea.contains(roads.graph[desc]->pt)) {
				printf("ERROR: this check should have been done before.\n");
				continue;
			}

			float z = vboRenderManager->getTerrainHeight(roads.graph[desc]->pt.x(), roads.graph[desc]->pt.y(), true);
			if (z < G::getFloat("seaLevelForStreet")) {
				std::cout << "attemptExpansion (street): " << iter << " (skipped because it is under the sea or on the mountains)" << std::endl;
				continue;
			}

			std::cout << "attemptExpansion (street): " << iter << " (Seed: " << desc << ")" << std::endl;

			int ex_id = roads.graph[desc]->properties["ex_id"].toInt();
			//if (!attemptConnect(RoadEdge::TYPE_STREET, desc, features[ex_id], seeds)) {
				if (!attemptExpansion(RoadEdge::TYPE_STREET, desc, ex_id, features[ex_id], patches[ex_id], seeds)) {
					attemptExpansion2(RoadEdge::TYPE_STREET, desc, features[ex_id], seeds);
				}
			//}

			char filename[255];
			sprintf(filename, "road_images/streets_%d.jpg", iter);
			RoadGeneratorHelper::saveRoadImage(roads, seeds, filename);

			iter++;
		}
		std::cout << "Local street generation completed." << std::endl;
	}

	// 指定されたエリアでCropping
	if (G::getBool("cropping")) {
		GraphUtil::extractRoads2(roads, targetArea);
	}

	if (G::getBool("cleanStreets")) {
		RoadGeneratorHelper::removeDeadend(roads);
	}
	
	GraphUtil::cleanEdges(roads);
}