Example #1
0
void envoyer_image(void *arg) {
    DMessage *message = d_new_message();
    DMessage *message_position = d_new_message();
    DMessage *message_arena = d_new_message();
    DImage *image = d_new_image();
    DJpegimage *jpegimage = d_new_jpegimage();
    char arena_found[] = "arena found";

    rt_printf("tstreaming : Envoi de l'image à ~2.5img/s\n");
    rt_task_set_periodic(NULL, TM_NOW, 400000000);
                
    while (1) {
        /* Attente de l'activation périodique */
        rt_task_wait_period(NULL);

        rt_mutex_acquire(&mutexEtatCamera, TM_INFINITE);
        camera->get_frame(camera, image);
        switch (etat_camera) {
        case 0 : /* streaming simple */
            rt_mutex_release(&mutexEtatCamera);
            break;
        case 1 : /* streaming avec arena */
            rt_mutex_release(&mutexEtatCamera);
            /* détection de l'arène */
            arena = (DArena *) image->compute_arena_position(image);

            /*check si l'arene a été trouvée*/
            if (arena != NULL) {
                x_arena = arena->get_x(arena);
                y_arena = arena->get_y(arena);
                //rt_printf("x = %f; y = %f\n ", x_arena, y_arena);
	    
                /*envoie du message confirmant que l'arène a été trouvée*/
                message_arena->set(message_arena, ACTION_ARENA_IS_FOUND, strlen(arena_found), arena_found);
                serveur->send(serveur, message_arena);

                d_imageshop_draw_arena(image, arena);
            }
	  

            break;
        case 2 : /* streaming avec position du robot */
            rt_mutex_release(&mutexEtatCamera);
            /* détection de la position du robot */
            arena = (DArena *) image->compute_arena_position(image);
            rt_mutex_acquire(&mutexPosition, TM_INFINITE);
            position_robot = (DPosition *) image->compute_robot_position(image, arena);
            if (position_robot != NULL) {
                x_robot = position_robot->get_x(position_robot);
                y_robot = position_robot->get_y(position_robot);
                orientation_robot = position_robot->get_orientation(position_robot);
                rt_mutex_release(&mutexPosition);
                /* rt_printf("\n\n\nx = %f; y = %f, angle = %f\n\n\n ", x_robot, y_robot, orientation_robot); */
	    
                /*envoie de la position par message*/
                message_position->put_position(message_position, position_robot);
                serveur->send(serveur, message_position);  
                d_imageshop_draw_position(image, position_robot);
                                                            
            }
            break;
        case 3 : /* streaming avec position de l'arene et du robot */
            rt_mutex_release(&mutexEtatCamera);
            /* détection de la position du robot  et de l'arene*/
            arena = (DArena *) image->compute_arena_position(image);
            rt_mutex_acquire(&mutexPosition, TM_INFINITE);
            position_robot = (DPosition *) image->compute_robot_position(image, arena);

            if (position_robot != NULL) {
                x_robot = position_robot->get_x(position_robot);
                y_robot = position_robot->get_y(position_robot);
                /* rt_printf("\n\n\nx = %f; y = %f\n\n\n ", x_robot, y_robot); */
                rt_mutex_release(&mutexPosition);

                /*envoie de la position par message*/
                message_position->put_position(message_position, position_robot);
                serveur->send(serveur, message_position);  
                d_imageshop_draw_position(image, position_robot);
            }
            /*check si l'arene a été trouvée*/
            if (arena != NULL) {
                x_arena = arena->get_x(arena);
                y_arena = arena->get_y(arena);
                /* rt_printf("x = %f; y = %f\n ", x_arena, y_arena); */
	    
                /*envoie du message confirmant que l'arène a été trouvée*/
                message_arena->set(message_arena, ACTION_ARENA_IS_FOUND, strlen(arena_found), arena_found);
                serveur->send(serveur, message_arena);

                d_imageshop_draw_arena(image, arena);
            }
            break;
        default :
            rt_printf("valeur de etat_camera corrompue\n");
        }
	
        /*compression et envoie de l'image*/
        jpegimage->compress(jpegimage, image);
        //jpegimage->print(jpegimage);
        message->put_jpeg_image(message, jpegimage);
        serveur->send(serveur, message);
    }
}