#include // Every Xlib program must include this #include #include #include #include #include #include // So we got the profile for 10 seconds #include #include #include #include #include "rocflight.h" #include "num.h" #include "state.h" #define PIXEL_M 15 #define PIXEL_M_S 15 #define H 40 #define L 40 #define SCALEY 1 #define WIDTH L * PIXEL_M #define HEIGHT (int)(H * PIXEL_M * SCALEY) #define MAX_HISTORY 200 #define FREQ 32 #define STEP (1.0/FREQ) #define POSX_TO_PIXEL(x) (WIDTH/2 + (int)((x) * PIXEL_M)) #define POSY_TO_PIXEL(y) (HEIGHT - (int)((y) * PIXEL_M * SCALEY)) struct rocketAnim_t { int width, height; GC gc; GC tmpgc; Display *display; Window window; Pixmap pixmap; unsigned long red, blue, white, green; XFontStruct *font_info; int font_height; } rocket; int eom(int neq, double time, double *y, double *dy, void *data); unsigned long AllocColor(char *colName) { Colormap cmap; XColor c0, c1; cmap = DefaultColormap(rocket.display, 0); XAllocNamedColor(rocket.display, cmap, colName, &c1, &c0); return(c1.pixel); } void ExposeScreen(void) { XCopyArea(rocket.display, rocket.pixmap, rocket.window, rocket.tmpgc, 0, 0, rocket.width, rocket.height, 0, 0); } void rocketInit(void) { Display *d; Window w; Pixmap p; XEvent e; d = rocket.display = XOpenDisplay(NULL); w = rocket.window = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, rocket.width, rocket.height, 2, BlackPixel(d, 0), WhitePixel(d, 0)); p = rocket.pixmap = XCreatePixmap(d, DefaultRootWindow(d), rocket.width, rocket.height, DefaultDepth(d, 0)); rocket.gc = XCreateGC(d, w, 0, 0); rocket.tmpgc = XCreateGC(d, w, 0, 0); rocket.red = AllocColor("red"); rocket.blue = AllocColor("blue"); rocket.white = AllocColor("white"); rocket.green = AllocColor("green"); rocket.font_info = XQueryFont(d, XGContextFromGC(rocket.gc)); rocket.font_height = rocket.font_info->ascent + rocket.font_info->descent; XSetForeground(rocket.display, rocket.gc, rocket.white); XFillRectangle(d, p, rocket.gc, 0, 0, rocket.width, rocket.height); XMapWindow(d, w); XSelectInput(d, w, StructureNotifyMask); for(;;) { XNextEvent(d, &e); if (e.type == MapNotify) break; } XFlush(d); } void DrawLine(int x1, int y1, int x2, int y2) { /* Draw the new line */ XDrawLine(rocket.display, rocket.pixmap, rocket.gc, x1, y1, x2, y2); } void DrawPoint(int x, int y) { /* draw the point */ XSetForeground(rocket.display, rocket.gc, rocket.red); XDrawPoint(rocket.display, rocket.pixmap, rocket.gc, x, y); } void DrawFillCircle(int x, int y, int r) { /* Draw the circle */ XSetForeground(rocket.display, rocket.gc, rocket.red); XFillArc(rocket.display, rocket.pixmap, rocket.gc, x - r, y - r, 2*r, 2*r, 0, 360*64); } void DrawSystem(double *y) { int i, j; double x1, y1; double theta; double vitesse_tot; char vitessex[32]; char vitessey[32]; char vitesset[32]; char alpha_str[32]; char theta_str[32]; char velocity_str[32]; double velocity; theta = y[10]; velocity = sqrt(y[0]*y[0] + y[1]*y[1] + y[2]*y[2]); vitesse_tot = sqrt(pow(y[0], 2) + pow(y[2], 2)); sprintf(velocity_str, "Velocity : % .2f m/s", velocity); sprintf(alpha_str, "Angle of attack : % 6.2f deg", atan(y[2]/y[0])*180/M_PI); sprintf(theta_str, "Theta : % .2f deg", theta*180/M_PI); sprintf(vitessex, "Vitesse axe x : % .2f", y[0]); sprintf(vitessey, "Vitesse axe y : % .2f", y[2]); sprintf(vitesset, "Vitesse absolue: % .2f", vitesse_tot); /* Clear the screen */ XSetForeground(rocket.display, rocket.gc, rocket.white); XFillRectangle(rocket.display, rocket.pixmap, rocket.gc, 0, 0, rocket.width, rocket.height); //DrawFillCircle(POSX_TO_PIXEL(x), POSY_TO_PIXEL(y), 10); //printf("%f\n", y[10]); /* Draw the rocket */ XSetForeground(rocket.display, rocket.gc, rocket.red); x1 = 0 + 8*cos(theta); y1 = 20 + 8*sin(theta); DrawLine(POSX_TO_PIXEL(0 - sin(theta)), POSY_TO_PIXEL(20 + cos(theta)), POSX_TO_PIXEL(x1 - sin(theta)), POSY_TO_PIXEL(y1 + cos(theta))); DrawLine(POSX_TO_PIXEL(0 + sin(theta)), POSY_TO_PIXEL(20 - cos(theta)), POSX_TO_PIXEL(x1 + sin(theta)), POSY_TO_PIXEL(y1 - cos(theta))); DrawLine(POSX_TO_PIXEL(x1 - sin(theta)), POSY_TO_PIXEL(y1 + cos(theta)), POSX_TO_PIXEL(x1 + 4*cos(theta)), POSY_TO_PIXEL(y1 + 4*sin(theta))); DrawLine(POSX_TO_PIXEL(x1 + sin(theta)), POSY_TO_PIXEL(y1 - cos(theta)), POSX_TO_PIXEL(x1 + 4*cos(theta)), POSY_TO_PIXEL(y1 + 4*sin(theta))); XSetForeground(rocket.display, rocket.gc, rocket.blue); x1 = (y[0]*cos(theta) - y[2]*sin(theta))/50; y1 = 20 + (y[0]*sin(theta) + y[2]*cos(theta))/50; DrawLine(POSX_TO_PIXEL(0), POSY_TO_PIXEL(20), POSX_TO_PIXEL(x1), POSY_TO_PIXEL(y1)); //DrawLine(x, y, /* if (modeleInfo.full) j = MAX_HISTORY; else j = modeleInfo.lasthistory; for (i = 0; i < j; i++) DrawPoint(POSX_TO_PIXEL(modeleInfo.pointhistory[i][0]), POSY_TO_PIXEL(modeleInfo.pointhistory[i][1])); */ XDrawString(rocket.display, rocket.pixmap, rocket.gc, 10, HEIGHT - 3*rocket.font_height, velocity_str, strlen(velocity_str)); XDrawString(rocket.display, rocket.pixmap, rocket.gc, 10, HEIGHT - 2*rocket.font_height, alpha_str, strlen(alpha_str)); XDrawString(rocket.display, rocket.pixmap, rocket.gc, 10, HEIGHT - rocket.font_height, theta_str, strlen(theta_str)); XDrawString(rocket.display, rocket.pixmap, rocket.gc, 100, HEIGHT - 3*rocket.font_height, vitessex, strlen(vitessex)); XDrawString(rocket.display, rocket.pixmap, rocket.gc, 100, HEIGHT - 2*rocket.font_height, vitessey, strlen(vitessey)); XDrawString(rocket.display, rocket.pixmap, rocket.gc, 100, HEIGHT - 1*rocket.font_height, vitesset, strlen(vitesset)); /* XFillRectangle(rocket.display, rocket.pixmap, rocket.gc, 140, HEIGHT - 4*rocket.font_height + rocket.font_info->ascent/2, (int)(PIXEL_M_S * fabs(modeleInfo.state[2])), rocket.font_height/2); XFillRectangle(rocket.display, rocket.pixmap, rocket.gc, 140, HEIGHT - 3*rocket.font_height + rocket.font_info->ascent/2, (int)(PIXEL_M_S * fabs(modeleInfo.state[3])), rocket.font_height/2); XFillRectangle(rocket.display, rocket.pixmap, rocket.gc, 140, HEIGHT - 2*rocket.font_height + rocket.font_info->ascent/2, (int)(PIXEL_M_S * vitesse_tot), rocket.font_height/2); */ ExposeScreen(); XFlush(rocket.display); } int main(int argc, char *argv[]) { int i, n; int neq = 12; double time; double res[12]; double *ans; double *init_cond; double u = 100; /* velocity component in x */ double v = 0; /* velocity component in y */ double w = 0; /* velocity component in z */ double P = 0; /* angular velocity */ double Q = 0; /* */ double R = 0; /* */ double lambda = 0*(M_PI/180); /* latitude (positive north) */ double mu = 0*(M_PI/180); /* longitude (positive east) */ double Re = EARTH_RAD + 5000; /* distance from earth center */ double phi = 0*(M_PI/180); /* */ double theta = 45*(M_PI/180); /* positive up */ double psi = 0*(M_PI/180); /* positive cw*/ // double dt = 0.05; double duration = 10; state_t s; int fd, retval; unsigned long tmp, data; struct rtc_time rtc_tm; /* Initialize the window */ rocket.width = WIDTH; rocket.height = HEIGHT; rocketInit(); /* open and configure the realtime clock */ fd = open ("/dev/rtc", O_RDONLY); if (fd == -1) { perror("/dev/rtc"); exit(errno); } /* Set the periodic IRQ rate to FREQ Hz */ retval = ioctl(fd, RTC_IRQP_SET, FREQ); if (retval == -1) { perror("ioctl"); exit(errno); } /* Enable periodic interrupts */ retval = ioctl(fd, RTC_PIE_ON, 0); if (retval == -1) { perror("ioctl"); exit(errno); } //initModele(); s.m = 10.0; s.Ix = 25e-3; s.Iy = 3; s.Iz = 3; s.Faero[0] = 0; s.Faero[1] = 0; s.Faero[2] = 0; s.Maero[0] = 0; s.Maero[1] = 0; s.Maero[2] = 0; init_cond = (double *) malloc(sizeof(double) * neq); s.L_BV[0][0] = cos(theta)*cos(psi); s.L_BV[0][1] = cos(theta)*sin(psi); s.L_BV[0][2] =-sin(theta); s.L_BV[1][0] = sin(phi)*sin(theta)*cos(psi) - cos(phi)*sin(psi); s.L_BV[1][1] = sin(phi)*sin(theta)*sin(psi) + cos(phi)*cos(psi); s.L_BV[1][2] = sin(phi)*cos(theta); s.L_BV[2][0] = cos(phi)*sin(theta)*cos(psi) + sin(phi)*sin(psi); s.L_BV[2][1] = cos(phi)*sin(theta)*sin(psi) - sin(phi)*cos(psi); s.L_BV[2][2] = cos(phi)*cos(theta); init_cond[0] = u; /* velocity component in x */ init_cond[1] = v; /* velocity component in y */ init_cond[2] = w; /* velocity component in z */ init_cond[3] = P+ (s.L_BV[0][0]*WE*cos(lambda)-s.L_BV[0][2]*WE*sin(lambda)); init_cond[4] = Q+ (s.L_BV[1][0]*WE*cos(lambda)-s.L_BV[1][2]*WE*sin(lambda)); init_cond[5] = R+ (s.L_BV[2][0]*WE*cos(lambda)-s.L_BV[2][2]*WE*sin(lambda)); init_cond[6] = lambda; /* latitude */ init_cond[7] = mu; /* longitude */ init_cond[8] = Re; /* radius */ init_cond[9] = phi; /* phi */ init_cond[10] = theta; /* theta */ init_cond[11] = psi; /* psi */ time = 0; // eom(neq, time, init_cond, res, &s); /* fprintf(stderr, "% e (u dot)\n", res[0]); fprintf(stderr, "% e (v dot)\n", res[1]); fprintf(stderr, "% e (w dot)\n", res[2]); fprintf(stderr, "% e (p dot)\n", res[3]); fprintf(stderr, "% e (q dot)\n", res[4]); fprintf(stderr, "% e (r dot)\n", res[5]); fprintf(stderr, "% e (lambda dot)\n", res[6]); fprintf(stderr, "% e (mu dot)\n", res[7]); fprintf(stderr, "% e (R dot)\n", res[8]); fprintf(stderr, "% e (phi dot)\n", res[9]); fprintf(stderr, "% e (theta dot)\n", res[10]); fprintf(stderr, "% e (psi dot)\n", res[11]); */ n = NUM_rk4 (eom, neq, STEP, duration, init_cond, &ans, &s); /* set the initial conditions */ //modeleInfo.state[0] = 7.0; //modeleInfo.state[1] = 25.0;//.3944; //modeleInfo.state[2] = 0.0; //modeleInfo.state[3] = 0.0; // for( i = 0; i < n; i++) // { // printf("% .12e ", ans[0 + neq*i]); /* u */ // printf("% .12e ", ans[1 + neq*i]); /* v */ // printf("% .12e ", ans[2 + neq*i]); /* w */ // printf("% .12e ", ans[3 + neq*i]); /* p */ // printf("% .12e ", ans[4 + neq*i]); /* q */ // printf("% .12e ", ans[5 + neq*i]); /* r */ // printf("% .12e ", ans[6 + neq*i]); /* lambda */ // printf("% .12e ", ans[7 + neq*i]); /* mu */ // printf("% .12e ", ans[8 + neq*i]); /* R */ // printf("% .12e ", ans[9 + neq*i]); /* phi */ // printf("% .12e ", ans[10 + neq*i]); /* theta */ // printf("% .12e \n", ans[11 + neq*i]); /* psi */ // } // DrawSystem(y); for (i = 0; i < n; i++) { /* This blocks */ retval = read(fd, &data, sizeof(unsigned long)); if (retval == -1) { perror("read"); exit(errno); } DrawSystem(ans + neq*i); } /* Disable periodic interrupts */ retval = ioctl(fd, RTC_PIE_OFF, 0); if (retval == -1) { perror("ioctl"); exit(errno); } free(init_cond); //free(ans); return 0; }