int main(int argc, char **argv) { int num_tests = 6; long length; int mask; int retval; int mythreshold=THRESHOLD; const PAPI_hw_info_t *hw_info; const PAPI_exe_info_t *prginfo; caddr_t start, end; prof_init(argc, argv, &hw_info, &prginfo); mask = prof_events(num_tests,hw_info); #ifdef PROFILE_ALL /* use these lines to profile entire code address space */ start = prginfo->address_info.text_start; end = prginfo->address_info.text_end; #else /* use these lines to profile only do_flops address space */ start = (caddr_t)do_flops; end = (caddr_t)fdo_flops; /* Itanium and ppc64 processors return function descriptors instead of function addresses. You must dereference the descriptor to get the address. */ #if defined(ITANIUM1) || defined(ITANIUM2) || defined(__powerpc64__) start = (caddr_t)(((struct fdesc *)start)->ip); end = (caddr_t)(((struct fdesc *)end)->ip); #endif #endif #if defined(linux) { char *tmp = getenv("THRESHOLD"); if (tmp) mythreshold = atoi(tmp); } #endif length = end - start; if (length < 0) test_fail(__FILE__, __LINE__, "Profile length < 0!", length); prof_print_address("Test case profile: POSIX compatible profiling with hardware counters.\n",prginfo); prof_print_prof_info(start,end,mythreshold,event_name); retval = do_profile(start, length, FULL_SCALE, mythreshold, PAPI_PROFIL_BUCKET_16); if (retval) retval = do_profile(start, length, FULL_SCALE, mythreshold, PAPI_PROFIL_BUCKET_32); if (retval) retval = do_profile(start, length, FULL_SCALE, mythreshold, PAPI_PROFIL_BUCKET_64); remove_test_events(&EventSet, mask); if (retval) test_pass(__FILE__, values, num_tests); else test_fail(__FILE__, __LINE__, "No information in buffers", 1); exit(1); }
/* * timer_interrupt() needs to keep up the real-time clock, * as well as call the "do_timer()" routine every clocktick */ static void timer_interrupt(int irq, void *dummy, struct pt_regs * regs) { #if defined(CONFIG_SYNC_RTC) /* last time the cmos clock got updated */ static long last_rtc_update=0; #endif /* may need to kick the hardware timer */ platform_timer_eoi(); do_timer(regs); #if defined(CONFIG_PROFILE) if (!user_mode(regs)) do_profile(regs->pc); #endif /* * If we have an externally synchronized Linux clock, then update * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be * called as close as possible to 500 ms before the new second starts. */ #if defined(CONFIG_SYNC_RTC) if ((time_status & STA_UNSYNC) == 0 && xtime.tv_sec > last_rtc_update + 660 && xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 && xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) { if (platform_set_rtc(xtime.tv_sec) == 0) last_rtc_update = xtime.tv_sec; else last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ } #endif }
/* * timer_interrupt() needs to keep up the real-time clock, * as well as call the "do_timer()" routine every clocktick */ static void timer_interrupt(int irq, void *dummy, struct pt_regs * regs) { /* last time the cmos clock got updated */ static long last_rtc_update=0; /* may need to kick the hardware timer */ #if 0 if (mach_tick) mach_tick(); #endif do_timer(regs); #if 0 if (!user_mode(regs)) do_profile(regs->pc); #endif /* * If we have an externally synchronized Linux clock, then update * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be * called as close as possible to 500 ms before the new second starts. */ if ((time_status & STA_UNSYNC) == 0 && xtime.tv_sec > last_rtc_update + 660 && xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 && xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) { if (set_rtc_mmss(xtime.tv_sec) == 0) last_rtc_update = xtime.tv_sec; else last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ } #if 0 #ifdef CONFIG_HEARTBEAT /* use power LED as a heartbeat instead -- much more useful for debugging -- based on the version for PReP by Cort */ /* acts like an actual heart beat -- ie thump-thump-pause... */ if (mach_heartbeat) { static unsigned cnt = 0, period = 0, dist = 0; if (cnt == 0 || cnt == dist) mach_heartbeat( 1 ); else if (cnt == 7 || cnt == dist+7) mach_heartbeat( 0 ); if (++cnt > period) { cnt = 0; /* The hyperbolic function below modifies the heartbeat period * length in dependency of the current (5min) load. It goes * through the points f(0)=126, f(1)=86, f(5)=51, * f(inf)->30. */ period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30; dist = period / 4; } } #endif /* CONFIG_HEARTBEAT */ #endif }
static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned long new_itm; new_itm = local_cpu_data->itm_next; if (!time_after(ia64_get_itc(), new_itm)) printk(KERN_ERR "Oops: timer tick before it's due (itc=%lx,itm=%lx)\n", ia64_get_itc(), new_itm); while (1) { /* * Do kernel PC profiling here. We multiply the instruction number by * four so that we can use a prof_shift of 2 to get instruction-level * instead of just bundle-level accuracy. */ if (!user_mode(regs)) do_profile(regs->cr_iip + 4*ia64_psr(regs)->ri); #ifdef CONFIG_SMP smp_do_timer(regs); #endif new_itm += local_cpu_data->itm_delta; if (smp_processor_id() == 0) { /* * Here we are in the timer irq handler. We have irqs locally * disabled, but we don't know if the timer_bh is running on * another CPU. We need to avoid to SMP race by acquiring the * xtime_lock. */ write_lock(&xtime_lock); do_timer(regs); local_cpu_data->itm_next = new_itm; write_unlock(&xtime_lock); } else local_cpu_data->itm_next = new_itm; if (time_after(new_itm, ia64_get_itc())) break; } do { /* * If we're too close to the next clock tick for comfort, we increase the * saftey margin by intentionally dropping the next tick(s). We do NOT update * itm.next because that would force us to call do_timer() which in turn would * let our clock run too fast (with the potentially devastating effect of * losing monotony of time). */ while (!time_after(new_itm, ia64_get_itc() + local_cpu_data->itm_delta/2)) new_itm += local_cpu_data->itm_delta; ia64_set_itm(new_itm); /* double check, in case we got hit by a (slow) PMI: */ } while (time_after_eq(ia64_get_itc(), new_itm)); }
void timer_interrupt(int irq, void *dummy, struct pt_regs * regs) { /* last time the cmos clock got updated */ static long last_rtc_update=0; #if DEBUG_TIMER in_timer_interrupt++; if( !(in_timer_interrupt % 500) ) { printk("timer_interrupt: %d\n", in_timer_interrupt); #if 0 #define L regs->L #define FL regs->FL { int i; printk("Interrupted Task:"); for( i=0 ; i<FL; i++) { printk("L[%d] : 0x%08x,%s",i,L[i], (i%3)?" ":"\n"); } printk("\nSaved PC: 0x%08x\n",L[FL] ); printk("Exception Entry: %d\n",L[FL+3] ); } #undef FL #undef L #endif } #endif /* may need to kick the hardware timer */ /* We have already called BSP tick if (mach_tick) mach_tick(); */ do_timer(regs); #ifdef CONFIG_PROFILE /* FIXME */ if (!user_mode(regs)) do_profile(regs->pc); #endif /* * If we have an externally synchronized Linux clock, then update * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be * called as close as possible to 500 ms before the new second starts. */ if ((time_status & STA_UNSYNC) == 0 && xtime.tv_sec > last_rtc_update + 660 && xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 && xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) { if (set_rtc_mmss(xtime.tv_sec) == 0) last_rtc_update = xtime.tv_sec; else last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */ } }
int main(int argc, char *argv[]) { char *name, *outfile; const char *unit; int unit_id; double factor; int fd, projection; FILE *fp, *coor_fp; double res; char *null_string; char ebuf[256], nbuf[256], label[512], formatbuff[256]; char b1[100], b2[100]; int n; int havefirst = FALSE; int coords = 0, i, k = -1; double e1, e2, n1, n2; RASTER_MAP_TYPE data_type; struct Cell_head window; struct { struct Option *opt1, *profile, *res, *output, *null_str, *coord_file, *units; struct Flag *g, *c, *m; } parm; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("profile")); module->description = _("Outputs the raster map layer values lying on user-defined line(s)."); parm.opt1 = G_define_standard_option(G_OPT_R_INPUT); parm.output = G_define_standard_option(G_OPT_F_OUTPUT); parm.output->required = NO; parm.output->answer = "-"; parm.output->description = _("Name of file for output (use output=- for stdout)"); parm.profile = G_define_standard_option(G_OPT_M_COORDS); parm.profile->required = NO; parm.profile->multiple = YES; parm.profile->description = _("Profile coordinate pairs"); parm.coord_file = G_define_standard_option(G_OPT_F_INPUT); parm.coord_file->key = "file"; parm.coord_file->required = NO; parm.coord_file->label = _("Name of input file containing coordinate pairs"); parm.coord_file->description = _("Use instead of the 'coordinates' option. " "\"-\" reads from stdin."); parm.res = G_define_option(); parm.res->key = "resolution"; parm.res->type = TYPE_DOUBLE; parm.res->required = NO; parm.res->description = _("Resolution along profile (default = current region resolution)"); parm.null_str = G_define_option(); parm.null_str->key = "null"; parm.null_str->type = TYPE_STRING; parm.null_str->required = NO; parm.null_str->answer = "*"; parm.null_str->description = _("Character to represent no data cell"); parm.g = G_define_flag(); parm.g->key = 'g'; parm.g->description = _("Output easting and northing in first two columns of four column output"); parm.c = G_define_flag(); parm.c->key = 'c'; parm.c->description = _("Output RRR:GGG:BBB color values for each profile point"); parm.units = G_define_standard_option(G_OPT_M_UNITS); parm.units->options = "meters,kilometers,feet,miles"; parm.units->label = parm.units->description; parm.units->description = _("If units are not specified, current location units are used. " "Meters are used by default in geographic (latlon) locations."); if (G_parser(argc, argv)) exit(EXIT_FAILURE); clr = 0; if (parm.c->answer) clr = 1; /* color output */ null_string = parm.null_str->answer; if ((parm.profile->answer && parm.coord_file->answer) || (!parm.profile->answer && !parm.coord_file->answer)) G_fatal_error(_("Either use profile option or coordinate_file " " option, but not both")); G_get_window(&window); projection = G_projection(); /* get conversion factor and units name */ if (parm.units->answer) { unit_id = G_units(parm.units->answer); factor = 1. / G_meters_to_units_factor(unit_id); unit = G_get_units_name(unit_id, 1, 0); } /* keep meters in case of latlon */ else if (projection == PROJECTION_LL) { factor = 1; unit = "meters"; } else { /* get conversion factor to current units */ unit = G_database_unit_name(1); factor = G_database_units_to_meters_factor(); } if (parm.res->answer) { res = atof(parm.res->answer); /* Catch bad resolution ? */ if (res <= 0) G_fatal_error(_("Illegal resolution %g [%s]"), res / factor, unit); } else { /* Do average of EW and NS res */ res = (window.ew_res + window.ns_res) / 2; } G_message(_("Using resolution: %g [%s]"), res / factor, unit); G_begin_distance_calculations(); /* Open Input File for reading */ /* Get Input Name */ name = parm.opt1->answer; if (parm.g->answer) coords = 1; /* Open Raster File */ fd = Rast_open_old(name, ""); /* initialize color structure */ if (clr) Rast_read_colors(name, "", &colors); /* Open ASCII file for output or stdout */ outfile = parm.output->answer; if ((strcmp("-", outfile)) == 0) { fp = stdout; } else if (NULL == (fp = fopen(outfile, "w"))) G_fatal_error(_("Unable to open file <%s>"), outfile); /* Get Raster Type */ data_type = Rast_get_map_type(fd); /* Done with file */ /* Show message giving output format */ G_message(_("Output columns:")); if (coords == 1) sprintf(formatbuff, _("Easting, Northing, Along track dist. [%s], Elevation"), unit); else sprintf(formatbuff, _("Along track dist. [%s], Elevation"), unit); if (clr) strcat(formatbuff, _(" RGB color")); G_message(formatbuff); /* Get Profile Start Coords */ if (parm.coord_file->answer) { if (strcmp("-", parm.coord_file->answer) == 0) coor_fp = stdin; else coor_fp = fopen(parm.coord_file->answer, "r"); if (coor_fp == NULL) G_fatal_error(_("Could not open <%s>"), parm.coord_file->answer); for (n = 1; input(b1, ebuf, b2, nbuf, label, coor_fp); n++) { G_debug(4, "stdin line %d: ebuf=[%s] nbuf=[%s]", n, ebuf, nbuf); if (!G_scan_easting(ebuf, &e2, G_projection()) || !G_scan_northing(nbuf, &n2, G_projection())) G_fatal_error(_("Invalid coordinates %s %s"), ebuf, nbuf); if (havefirst) do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); e1 = e2; n1 = n2; havefirst = TRUE; } if (coor_fp != stdin) fclose(coor_fp); } else { /* Coords given on the Command Line using the profile= option */ for (i = 0; parm.profile->answers[i]; i += 2) { /* Test for number coordinate pairs */ k = i; } if (k == 0) { /* Only one coordinate pair supplied */ G_scan_easting(parm.profile->answers[0], &e1, G_projection()); G_scan_northing(parm.profile->answers[1], &n1, G_projection()); e2 = e1; n2 = n1; /* Get profile info */ do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); } else { for (i = 0; i <= k - 2; i += 2) { G_scan_easting(parm.profile->answers[i], &e1, G_projection()); G_scan_northing(parm.profile->answers[i + 1], &n1, G_projection()); G_scan_easting(parm.profile->answers[i + 2], &e2, G_projection()); G_scan_northing(parm.profile->answers[i + 3], &n2, G_projection()); /* Get profile info */ do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); } } } Rast_close(fd); fclose(fp); if (clr) Rast_free_colors(&colors); exit(EXIT_SUCCESS); } /* Done with main */
int main( int argc, char **argv ) { long length; int mask; int retval; const PAPI_exe_info_t *prginfo; caddr_t start, end; prof_init( argc, argv, &prginfo ); hw_info = PAPI_get_hardware_info( ); if ( hw_info == NULL ) test_fail( __FILE__, __LINE__, "PAPI_get_hardware_info", 2 ); mask = MASK_TOT_CYC | MASK_TOT_INS | MASK_FP_OPS | MASK_L2_TCM; #if defined(__powerpc__) if ( strcmp( hw_info->model_string, "POWER6" ) == 0 ) mask = MASK_TOT_CYC | MASK_FP_INS; else mask = MASK_TOT_CYC | MASK_TOT_INS | MASK_FP_INS; #endif #if defined(ITANIUM2) mask = MASK_TOT_CYC | MASK_FP_OPS | MASK_L2_TCM | MASK_L1_DCM; #endif EventSet = add_test_events( &num_events, &mask, 0 ); values = allocate_test_space( 1, num_events ); /* profile the cleara and my_main address space */ start = ( caddr_t ) cleara; end = ( caddr_t ) my_dummy; /* Itanium and PowerPC64 processors return function descriptors instead * of function addresses. You must dereference the descriptor to get the address. */ #if defined(ITANIUM1) || defined(ITANIUM2) || defined(__powerpc64__) start = ( caddr_t ) ( ( ( struct fdesc * ) start )->ip ); end = ( caddr_t ) ( ( ( struct fdesc * ) end )->ip ); #endif /* call dummy so it doesn't get optimized away */ retval = my_dummy( 1 ); length = end - start; if ( length < 0 ) test_fail( __FILE__, __LINE__, "Profile length < 0!", ( int ) length ); prof_print_address ( "Test case byte_profile: Multi-event profiling at byte resolution.\n", prginfo ); prof_print_prof_info( start, end, THRESHOLD, event_name ); retval = do_profile( start, ( unsigned ) length, FULL_SCALE * 2, THRESHOLD, PAPI_PROFIL_BUCKET_32, mask ); remove_test_events( &EventSet, mask ); if ( retval ) test_pass( __FILE__, values, 1 ); else test_fail( __FILE__, __LINE__, "No information in buffers", 1 ); return 1; }
void __noprof __cyg_profile_func_exit(void *this_fn, void *call_site) { do_profile(this_fn, call_site, PROF_EXIT); }
/* * Compiler stubs, which get called upon each function entry or exit */ void __noprof __cyg_profile_func_enter(void *this_fn, void *call_site) { do_profile(this_fn, call_site, PROF_ENTRY); }
int main(int argc, char *argv[]) { char *name, *outfile; int fd, projection; FILE *fp; double res; char *null_string; char ebuf[256], nbuf[256], label[512], formatbuff[256]; char b1[100], b2[100]; int n; int havefirst = FALSE; int coords = 0, i, k = -1; double e1, e2, n1, n2; RASTER_MAP_TYPE data_type; struct Cell_head window; struct { struct Option *opt1, *profile, *res, *output, *null_str; struct Flag *g, *c; } parm; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("profile")); module->description = _("Outputs the raster map layer values lying on user-defined line(s)."); parm.opt1 = G_define_standard_option(G_OPT_R_INPUT); parm.output = G_define_option(); parm.output->key = "output"; parm.output->type = TYPE_STRING; parm.output->required = NO; parm.output->answer = "-"; parm.output->gisprompt = "new_file,file,output"; parm.output->description = _("Name of file for output (use output=- for stdout)"); parm.profile = G_define_option(); parm.profile->key = "profile"; parm.profile->type = TYPE_STRING; parm.profile->required = NO; parm.profile->multiple = YES; parm.profile->key_desc = "east,north"; parm.profile->description = _("Profile coordinate pairs"); parm.res = G_define_option(); parm.res->key = "res"; parm.res->type = TYPE_DOUBLE; parm.res->required = NO; parm.res->description = _("Resolution along profile (default = current region resolution)"); parm.null_str = G_define_option(); parm.null_str->key = "null"; parm.null_str->type = TYPE_STRING; parm.null_str->required = NO; parm.null_str->answer = "*"; parm.null_str->description = _("Character to represent no data cell"); parm.g = G_define_flag(); parm.g->key = 'g'; parm.g->description = _("Output easting and northing in first two columns of four column output"); parm.c = G_define_flag(); parm.c->key = 'c'; parm.c->description = _("Output RRR:GGG:BBB color values for each profile point"); if (G_parser(argc, argv)) exit(EXIT_FAILURE); clr = 0; if (parm.c->answer) clr = 1; /* color output */ null_string = parm.null_str->answer; G_get_window(&window); projection = G_projection(); if (parm.res->answer) { res = atof(parm.res->answer); /* Catch bad resolution ? */ if (res <= 0) G_fatal_error(_("Illegal resolution! [%g]"), res); } else { /* Do average of EW and NS res */ res = (window.ew_res + window.ns_res) / 2; } G_message(_("Using resolution [%g]"), res); G_begin_distance_calculations(); /* Open Input File for reading */ /* Get Input Name */ name = parm.opt1->answer; if (parm.g->answer) coords = 1; /* Open Raster File */ fd = Rast_open_old(name, ""); /* initialize color structure */ if (clr) Rast_read_colors(name, "", &colors); /* Open ASCII file for output or stdout */ outfile = parm.output->answer; if ((strcmp("-", outfile)) == 0) { fp = stdout; } else if (NULL == (fp = fopen(outfile, "w"))) G_fatal_error(_("Unable to open file <%s>"), outfile); /* Get Raster Type */ data_type = Rast_get_map_type(fd); /* Done with file */ /* Show message giving output format */ G_message(_("Output Format:")); if (coords == 1) sprintf(formatbuff, _("[Easting] [Northing] [Along Track Dist.(m)] [Elevation]")); else sprintf(formatbuff, _("[Along Track Dist.(m)] [Elevation]")); if (clr) strcat(formatbuff, _(" [RGB Color]")); G_message(formatbuff); /* Get Profile Start Coords */ if (!parm.profile->answer) { /* Assume input from stdin */ for (n = 1; input(b1, ebuf, b2, nbuf, label); n++) { G_debug(4, "stdin line %d: ebuf=[%s] nbuf=[%s]", n, ebuf, nbuf); if (!G_scan_easting(ebuf, &e2, G_projection()) || !G_scan_northing(nbuf, &n2, G_projection())) G_fatal_error(_("Invalid coordinates %s %s"), ebuf, nbuf); if (havefirst) do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); e1 = e2; n1 = n2; havefirst = TRUE; } } else { /* Coords from Command Line */ for (i = 0; parm.profile->answers[i]; i += 2) { /* Test for number coordinate pairs */ k = i; } if (k == 0) { /* Only one coordinate pair supplied */ G_scan_easting(parm.profile->answers[0], &e1, G_projection()); G_scan_northing(parm.profile->answers[1], &n1, G_projection()); e2 = e1; n2 = n1; /* Get profile info */ do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); } else { for (i = 0; i <= k - 2; i += 2) { G_scan_easting(parm.profile->answers[i], &e1, G_projection()); G_scan_northing(parm.profile->answers[i + 1], &n1, G_projection()); G_scan_easting(parm.profile->answers[i + 2], &e2, G_projection()); G_scan_northing(parm.profile->answers[i + 3], &n2, G_projection()); /* Get profile info */ do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); } } } Rast_close(fd); fclose(fp); if (clr) Rast_free_colors(&colors); exit(EXIT_SUCCESS); } /* Done with main */
int main(int argc, char *argv[]) { const char *name; char outfile[GNAME_MAX]; int fd, projection; char buf[512], buf1[1024], buf2[1024]; int screen_x, screen_y; int i, k; int frame_start = 0; double e1, e2, n1, n2; RASTER_MAP_TYPE data_type; struct Cell_head window; struct { struct Option *opt1, *route, *name, *output, *dist, *ht, *frames, *start; struct Flag *f, *c, *k, *o, *e; } parm; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("miscellaneous")); G_add_keyword(_("graphics")); G_add_keyword(_("raster")); G_add_keyword(_("raster3d")); G_add_keyword(_("vector")); G_add_keyword(_("visualization")); module->description = _("Creates fly-through script to run in NVIZ."); parm.opt1 = G_define_standard_option(G_OPT_R_INPUT); parm.output = G_define_standard_option(G_OPT_F_OUTPUT); parm.output->description = _("Name of output script"); parm.name = G_define_option(); parm.name->key = "name"; parm.name->type = TYPE_STRING; parm.name->required = NO; parm.name->description = _("Prefix of output images (default = NVIZ)"); parm.route = G_define_option(); parm.route->key = "route"; parm.route->type = TYPE_STRING; parm.route->required = NO; parm.route->multiple = YES; parm.route->key_desc = "east,north"; parm.route->description = _("Route coordinates (east,north)"); parm.dist = G_define_option(); parm.dist->key = "dist"; parm.dist->type = TYPE_DOUBLE; parm.dist->required = YES; parm.dist->description = _("Camera layback distance (in map units)"); parm.ht = G_define_option(); parm.ht->key = "ht"; parm.ht->type = TYPE_DOUBLE; parm.ht->required = YES; parm.ht->description = _("Camera height above terrain"); parm.frames = G_define_option(); parm.frames->key = "frames"; parm.frames->type = TYPE_INTEGER; parm.frames->required = YES; parm.frames->description = _("Number of frames"); parm.start = G_define_option(); parm.start->key = "start"; parm.start->type = TYPE_INTEGER; parm.start->required = NO; parm.start->description = _("Start frame number (default=0)"); parm.f = G_define_flag(); parm.f->key = 'f'; parm.f->description = _("Full render -- Save images"); parm.c = G_define_flag(); parm.c->key = 'c'; parm.c->description = _("Fly at constant elevation (ht)"); parm.k = G_define_flag(); parm.k->key = 'k'; parm.k->description = _("Include command in the script to output a KeyFrame file"); parm.o = G_define_flag(); parm.o->key = 'o'; parm.o->description = _("Render images off-screen"); parm.e = G_define_flag(); parm.e->key = 'e'; parm.e->description = _("Enable vector and sites drawing"); if (G_parser(argc, argv)) exit(EXIT_FAILURE); /* check arguments */ if (!parm.route->answer) G_fatal_error(_("Either -i flag and/or route parameter must be used")); /* get GRASS parameters */ G_get_window(&window); projection = G_projection(); D_do_conversions(&window, 0, 1, 0, 1); /* setup screen coords */ screen_x = ((int)D_get_d_west() + (int)D_get_d_east()) / 2; screen_y = ((int)D_get_d_north() + (int)D_get_d_south()) / 2; /* get camera parameters */ DIST = atof(parm.dist->answer); HT = atof(parm.ht->answer); no_frames = atoi(parm.frames->answer); if (parm.start->answer) frame_start = atoi(parm.start->answer); if (parm.c->answer) height_flag = 1; if (parm.k->answer) key_frames = 1; if (parm.o->answer && !parm.f->answer) G_fatal_error(_("Off-screen only available with full render mode")); if (parm.o->answer) off_screen = 1; /* Initialize coords */ e1 = e2 = n1 = n2 = -9999.; G_begin_distance_calculations(); /* Open Input File for reading */ name = parm.opt1->answer; /* Open Raster File */ fd = Rast_open_old(name, ""); /* Set Image name */ if (parm.name->answer) sprintf(img_name, "%s", parm.name->answer); else sprintf(img_name, "NVIZ"); /* Open ASCII file for output */ /* append ".nvscr" to filename if it doesn't already have it */ strncpy(outfile, parm.output->answer, GNAME_MAX - 7); outfile[GNAME_MAX - 7] = '\0'; /* strncpy() doesn't null terminate the string */ if (strcmp(&outfile[strlen(outfile) - 6], ".nvscr") != 0) strcat(outfile, ".nvscr"); if (NULL == (fp = fopen(outfile, "w"))) G_fatal_error(_("Unable to open file <%s>"), outfile); /* Get Raster Type */ data_type = Rast_get_map_type(fd); /* Done with file */ /* Output initial startup stuff */ sprintf(buf1, "## REGION: n=%f s=%f e=%f w=%f\n## Input=%s Dist=%f Ht=%f\n", window.north, window.south, window.east, window.west, outfile, DIST, HT); sprintf(buf2, "\nset FRAMES %d\n", no_frames); strcat(buf1, buf2); fprintf(fp, "%s", buf1); sprintf(buf1, "SendScriptLine \"Nclear_keys\""); sprintf(buf2, "\nSendScriptLine \"Nupdate_frames\""); strcat(buf1, buf2); fprintf(fp, "%s", buf1); sprintf(buf1, "\nSendScriptLine \"Nset_numsteps $FRAMES\""); sprintf(buf2, "\nSendScriptLine \"Nupdate_frames\"\n"); strcat(buf1, buf2); fprintf(fp, "%s", buf1); /* Use Linear mode for smooth frame transition */ sprintf(buf1, "\nSendScriptLine \"Nset_interp_mode linear\""); sprintf(buf2, "\nSendScriptLine \"Nupdate_frames\"\n\n"); strcat(buf1, buf2); fprintf(fp, "%s", buf1); /* eanble vector and sites drawing */ if (parm.e->answer) { sprintf(buf1, "\nSendScriptLine \"Nshow_vect on\""); sprintf(buf2, "\nSendScriptLine \"Nshow_sites on\"\n\n"); strcat(buf1, buf2); fprintf(fp, "%s", buf1); } /* Coords from Command Line */ for (i = 0; parm.route->answers[i]; i += 2) { /* Test for number coordinate pairs */ k = i; } if (k < 6) { /* Only one coordinate pair supplied */ G_fatal_error(_("You must provide at least four points %d"), k); } else { for (i = 0; i <= k - 2; i += 2) { sscanf(parm.route->answers[i], "%lf", &e1); sscanf(parm.route->answers[i + 1], "%lf", &n1); sscanf(parm.route->answers[i + 2], "%lf", &e2); sscanf(parm.route->answers[i + 3], "%lf", &n2); /* Get profile info */ do_profile(e1, e2, n1, n2, name, fd, data_type); /* Get last coord */ if (i == k - 2) do_profile(e2, e2, n2, n2, name, fd, data_type); } } /* done with coordinates */ /* Output final part of script */ /* generate key-frame script */ if (key_frames) { strcpy(buf, outfile); buf[strlen(outfile) - 6] = '\0'; /* skip extension */ strcat(buf, ".kanim"); fprintf(fp, "\n## The following saves the animation to a format\n"); fprintf(fp, "## suitable for editing with the kanimator panel\n"); fprintf(fp, "SendScriptLine \"Nprint_keys %s\"\n", buf); fprintf(fp, "puts \"Saving Key Frame file %s\"\n", buf); } /* output off-screen option */ if (off_screen) { fprintf(fp, "\n## Off screen rendering enabled \n"); fprintf(fp, "## Ensure main window is minimized before running\n"); fprintf(fp, "SendScriptLine \"Noff_screen 1\"\n"); } fprintf(fp, "\n\nset num %d", frame_start); fprintf(fp, "\n\nfor {set frame 1} {$frame <= $FRAMES} {incr frame} {"); if (parm.f->answer) { /* Full render and save */ fprintf(fp, "\nset name %s", img_name); fprintf(fp, "\nset num2 [format \"\%%04d\" $num]"); fprintf(fp, "\nappend name $num2 \".ppm\""); fprintf(fp, "\nSendScriptLine \"Ndo_framestep $frame 1\""); fprintf(fp, "\nSendScriptLine \"Nwrite_ppm $name \""); fprintf(fp, "\nincr num"); }