trying to use cairo gtk and ros at the same time

asked 2018-07-12 08:55:37 -0500

Rodrigo Lourenço gravatar image

I am having problems compiling this code, can someone give me a hint on how to solve it.

thanks in advance. Rodrigo

#include "ros/ros.h"
#include "std_msgs/Int16.h"
#include "std_msgs/Float64.h"
#include "std_msgs/Float32.h"
#include "pubsub/RaposaWheels.h"
#include "pubsub/main.h"
#include <geometry_msgs/Quaternion.h>
#include <std_msgs/Header.h>
#include <iostream>
#include <sstream>
#include <cairo.h>
#include <gtk/gtk.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct orien_ang{
    float x;
    float y;
}ang;

GtkWidget* GlobalTable;
GtkWidget* darea1;
GtkWidget* darea2;
cairo_t* cr1;
cairo_t* cr2;
double body_roll;

ang* Gorien;

//Funções para criar o desenho.
static void do_drawing(cairo_t *cr, double x, double y);
static void do_drawing2(cairo_t *cr, double broll);

//Função CallBack
void number_callback(const pubsub::main::ConstPtr& msg)
{

    //ROS_INFO("Recieved  msg [%f]",msg->pan);
    //ROS_INFO("Recieved  msg [%d]",msg->electronics_battery_mV);
    body_roll = msg->body_roll;
    cr1 = gdk_cairo_create (darea1->draw);
    cr2 = gdk_cairo_create (darea2->draw);
    do_drawing(cr1,(*Gorien).x, (*Gorien).y);
    do_drawing2(cr2, body_roll);


}

static void do_drawing(cairo_t *cr, double x, double y)
{

    double int_x, int_y;
    double radius;
    double inset;
    double aux_ang1, aux_ang2, aux_ang3, aux_ang4;
    int i;


    int_x = draw_Wigth/2;
    int_y = draw_height/2;


    //Make remaining calculations before drawing

    radius = draw_Wigth/3 - 5;

    cairo_set_source_rgb(cr, 0, 0, 0); //Black
    cairo_stroke(cr);

    //Ticks
    i = 0;
    while (i < 36){
        cairo_save(cr);
        inset = (1.0/18)*radius;
        cairo_set_line_width(cr, 0.5 * cairo_get_line_width(cr));
        //cairo_set_line_width(cr, 0.5);
        cairo_move_to(cr, int_x + (radius - inset)* cos(i * pi /18.0), int_y + (radius - inset)* sin(i * pi /18.0));
        cairo_line_to(cr, int_x + radius* cos(i * pi/18.0), int_y + radius* sin(i * pi/18.0));
        cairo_stroke(cr);
        cairo_restore(cr);
        i = i + 1;
    }

    i = 1;
    while ( i < 9)
    {
        cairo_save(cr);

        inset = 0.15 * radius;
        cairo_move_to(cr, int_x + (radius - inset) * cos(i * pi/4.0), int_y + (radius-inset)*sin(i * pi / 4.0));
        cairo_line_to(cr, int_x + radius * cos(i * pi/4.0), int_y + radius*sin(i * pi / 4.0));
        cairo_stroke(cr);
        cairo_restore(cr);
        i = i + 1;
    }

    //Drawing main line
    cairo_save(cr);
    cairo_set_line_width(cr, 4 * cairo_get_line_width(cr));
    cairo_set_source_rgb(cr,0, 1, 0); //Green
    cairo_move_to(cr, int_x + radius*0.6*( -1* cos((*Gorien).x)), int_y + radius*0.6*sin((*Gorien).x));
    cairo_line_to(cr, int_x + radius*0.6*cos((*Gorien).x), int_y + radius*0.6*(-1*sin((*Gorien).x)));
    cairo_close_path(cr);
    cairo_stroke(cr);
    cairo_restore(cr);

    //Drawing secondary Lines
    cairo_save(cr);
    cairo_set_line_width(cr, 4 * cairo_get_line_width(cr));
    cairo_set_source_rgb(cr, 0, 1, 0); //Green 

    //Calculos para determinar os pontos iniciais da 1º linha
    aux_ang1 = (int_x + radius*0.6*cos((*Gorien).x)); 
    aux_ang2 = (aux_ang1 + 0.2*radius*sin((*Gorien).x));
    aux_ang3 = (int_y - radius*0.6*sin((*Gorien).x));
    aux_ang4 = (aux_ang3 + 0.2*radius*cos((*Gorien).x));
    cairo_move_to(cr, aux_ang2, aux_ang4);

    //Calculos para determinar os pontos finais da 1º linha
    aux_ang1 = (int_x + radius*0.6*cos((*Gorien).x)); 
    aux_ang2 = (aux_ang1 - 0.2*radius*sin((*Gorien).x));
    aux_ang3 = (int_y - radius*0.6*sin((*Gorien).x));
    aux_ang4 = (aux_ang3 - 0.2*radius*cos((*Gorien).x));
    cairo_line_to(cr, aux_ang2, aux_ang4);

    cairo_close_path(cr);
    cairo_stroke(cr);
    cairo_restore(cr);  

    cairo_save(cr);
    cairo_set_line_width(cr, 4 * cairo_get_line_width(cr));
    cairo_set_source_rgb(cr, 0 ...
(more)
edit retag flag offensive close merge delete