示例#1
0
struct conn* createConnection(const char* ip_address, int port, int protocol, int naggles) 
{
	struct conn* connection = malloc(sizeof(struct conn));
	memset(connection, 0, sizeof(struct conn));

	if(protocol == UDP_MODE) {
		connection->sock = openUdpSocket(ip_address, port);
		connection->protocol = UDP_MODE;
	} 
	else {
		connection->sock = openTcpSocket(ip_address, port);
		connection->protocol = TCP_MODE;

		if(!naggles) {
			//Disable naggle's algorithm
			int flag = 1;
			int result = setsockopt(connection->sock,/* socket affected */
			                        IPPROTO_TCP,     /* set option at TCP level */
			                        TCP_NODELAY,     /* name of option */
			                        (char *) &flag,  /* the cast is historical cruft */
			                         sizeof(int));   /* length of option value */
			if (result < 0){
				printf("couldn't set tcp_nodelay\n");
				exit(-1);
			}
		}
	}

	static int uid_gen;
	connection->uid = uid_gen;
	uid_gen++;

	if (verbose) {
	    printf("Created connection on fd %d, uid %d\n", connection->sock, connection->uid);
	}

	return connection;
}
示例#2
0
文件: Udp.cpp 项目: KiLMaN/Master-RA
void * receiveUdpMessage(void * temp){
    do{
        openUdpSocket();
        sleep(1);
    }while(sockfdU == 0);


    char buff[BUFFER_SIZE];
	bzero(buff,BUFFER_SIZE);

	struct sockaddr_in cli_addr;
	socklen_t clilen;
	clilen = sizeof(cli_addr);
	listen((int)sockfdU,5);

   // unsigned short CRCRead = calculateCRC16((char*) 0xD0, 1);
   // unsigned short CRCSend = calculateCRC16((char*) 0xD1, 1);
	while(_continueUdp == 1){
	//    _isWorkingUdp = false;
	    int n = recvfrom(sockfdU,buff,sizeof(buff),0,(sockaddr *)&cli_addr,&clilen);
	    if(n == 3 ){
	//        _isWorkingUdp = true;
	        if( buff[0] == (char) 0xD0 /*&& buff[1] == CRCRead>>8 && buff[2]==CRCRead & 0xFF */ ){ // Auto detect frame
	            	#ifdef DEBUG
                        printf("Auto detect frame\n");
                        fflush(stdout);
                    #endif
                char answer[] = {(char) 0xD1, 0x00, 0x00}; // Remplace 0x22 et 0x33 par crc
                int aa = sendto(sockfdU, answer, sizeof(answer), 0, (struct sockaddr*)&cli_addr, clilen); // Send the answer
                printf("Send to: %i\n",aa);
                fflush(stdout);
            }
        }
    }
	close(sockfdU);
	return NULL;
}
示例#3
0
int main() {
    // --------------------- Opensim model.
    OpenSim::Model model{};
    model.setUseVisualizer(true);
    
    auto slab = new OpenSim::Body{"slab", 
                                  1, 
                                  SimTK::Vec3{0}, 
                                  SimTK::Inertia{0}};

    auto balljoint = new OpenSim::BallJoint{"balljoint",
                                            model.getGround(),
                                            SimTK::Vec3{0, 1, 0},
                                            SimTK::Vec3{0},
                                            *slab,
                                            SimTK::Vec3{0},
                                            SimTK::Vec3{0}};

    OpenSim::Brick brick{};
    brick.setFrame(*slab);
    brick.set_half_lengths(SimTK::Vec3{0.5, 0.05, 0.25});
    slab->addComponent(brick.clone());

    model.addBody(slab);
    model.addJoint(balljoint);

    auto& state = model.initSystem();

    model.updMatterSubsystem().setShowDefaultGeometry(false);
    SimTK::Visualizer& viz = model.updVisualizer().updSimbodyVisualizer();
    viz.setBackgroundType(viz.GroundAndSky);
    viz.setShowSimTime(true);
    viz.drawFrameNow(state);

    // -------------------------- UDP Socket.
    constexpr unsigned BUFFSIZE{8192};

    auto sock = openUdpSocket();

    // ------------------------- Kalman filter.
    Kalman kalman_roll{};
    Kalman kalman_pitch{};
    double oldtimestamp{};
    bool firstrow{true};

    // ------------------------ Streaming.
    while(true) {
        char buffer[BUFFSIZE];
        auto bytes = recvfrom(sock, buffer, BUFFSIZE, 0, 0, 0);

        if(bytes > 0) {
            auto data = parseImuData(buffer, BUFFSIZE);

            auto& timestamp = std::get<0>(data);
            auto& gravity   = std::get<1>(data);
            auto& omega     = std::get<2>(data);

            // If omega is (0, 0, 0), skip over because there was no data.
            // All three components are never equal except when they are 0.
            if(omega[0] == omega[1] && omega[1] == omega[2])
                continue;

            // Compute change in time and record the timestamp.
            auto deltat = timestamp - oldtimestamp;
            oldtimestamp = timestamp;
            if(firstrow) {
                firstrow = false;
                continue;
            }

            auto tilt = computeRollPitch(gravity);
            auto roll  = radToDeg(tilt.first);
            auto pitch = radToDeg(tilt.second);

            omega[0] = radToDeg(omega[0]);
            omega[1] = radToDeg(omega[1]);
            omega[2] = radToDeg(omega[2]);

            // Angular velocity about axis y is roll.
            // Angular velocity about axis x is pitch.
            auto roll_hat  =  kalman_roll.getAngle( roll, omega[1], deltat);
            auto pitch_hat = kalman_pitch.getAngle(pitch, omega[0], deltat);

            // Multiplying -1 to roll just for display. This way visualizaiton moves
            // like the physical phone.
            model.getCoordinateSet()[0].setValue(state, -1 * degToRad( roll_hat));
            model.getCoordinateSet()[2].setValue(state, degToRad(pitch_hat));
            
            viz.drawFrameNow(state);
            
            //std::cout << buffer << std::endl;
        } else
            std::cout << "skipping....." << std::endl;
    }

    return 0;
}
示例#4
0
文件: rttable.c 项目: PterX/rt-n56u
/**
*   Function for retrieving the Multicast Group socket.
*/
int getMcGroupSock() {
    if( ! mcGroupSock ) {
        mcGroupSock = openUdpSocket( INADDR_ANY, 0 );;
    }
    return mcGroupSock;
}