/*************************************************************************** * ds_streamproc: * * Save MiniSEED records in a custom directory/file structure. The * appropriate directories and files are created if nesecessary. If * files already exist they are appended to. If 'msr' is NULL then * ds_shutdown() will be called to close all open files and free all * associated memory. * * This version has been modified from others to add the add the suffix * integer supplied with ds_streamproc() to the defkey and file name. * * Returns 0 on success, -1 on error. ***************************************************************************/ extern int ds_streamproc (DataStream *datastream, MSRecord *msr, long suffix, int verbose) { DataStreamGroup *foundgroup = NULL; BTime stime; strlist *fnlist, *fnptr; char net[3], sta[6], loc[3], chan[4]; char filename[400]; char definition[400]; char pathformat[600]; char tstr[20]; int fnlen = 0; /* Set Verbosity for ds_ functions */ dsverbose = verbose; /* Special case for stream shutdown */ if ( ! msr ) { if ( dsverbose >= 1 ) fprintf (stderr, "Closing archiving for: %s\n", datastream->path ); ds_shutdown ( datastream ); return 0; } if ( ! msr->fsdh ) { fprintf (stderr, "ds_streamproc(): msr->fsdh must be available\n"); return -1; } /* Build file path and name from datastream->path */ filename[0] = '\0'; definition[0] = '\0'; snprintf (pathformat, sizeof(pathformat), "%s", datastream->path); strparse (pathformat, "/", &fnlist); fnptr = fnlist; /* Special case of an absolute path (first entry is empty) */ if ( *fnptr->element == '\0' ) { if ( fnptr->next != 0 ) { strncat (filename, "/", sizeof(filename)); fnptr = fnptr->next; } else { fprintf (stderr, "ds_streamproc(): empty path format\n"); strparse (NULL, NULL, &fnlist); return -1; } } /* Convert normalized starttime to BTime structure */ if ( ms_hptime2btime (msr->starttime, &stime) ) { fprintf (stderr, "ds_streamproc(): cannot convert start time to separate fields\n"); strparse (NULL, NULL, &fnlist); return -1; } while ( fnptr != 0 ) { int tdy; char *w, *p, def; p = fnptr->element; /* Special case of no file given */ if ( *p == '\0' && fnptr->next == 0 ) { fprintf (stderr, "ds_streamproc(): no file name specified, only %s\n", filename); strparse (NULL, NULL, &fnlist); return -1; } while ( (w = strpbrk (p, "%#")) != NULL ) { def = ( *w == '%' ); *w = '\0'; strncat (filename, p, (sizeof(filename) - fnlen)); fnlen = strlen (filename); w += 1; switch ( *w ) { case 'n' : ms_strncpclean (net, msr->fsdh->network, 2); strncat (filename, net, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, net, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 's' : ms_strncpclean (sta, msr->fsdh->station, 5); strncat (filename, sta, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, sta, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'l' : ms_strncpclean (loc, msr->fsdh->location, 2); strncat (filename, loc, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, loc, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'c' : ms_strncpclean (chan, msr->fsdh->channel, 3); strncat (filename, chan, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, chan, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'Y' : snprintf (tstr, sizeof(tstr), "%04d", (int) stime.year); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'y' : tdy = (int) stime.year; while ( tdy > 100 ) { tdy -= 100; } snprintf (tstr, sizeof(tstr), "%02d", tdy); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'j' : snprintf (tstr, sizeof(tstr), "%03d", (int) stime.day); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'H' : snprintf (tstr, sizeof(tstr), "%02d", (int) stime.hour); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'M' : snprintf (tstr, sizeof(tstr), "%02d", (int) stime.min); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'S' : snprintf (tstr, sizeof(tstr), "%02d", (int) stime.sec); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'F' : snprintf (tstr, sizeof(tstr), "%04d", (int) stime.fract); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'q' : snprintf (tstr, sizeof(tstr), "%c", msr->dataquality); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'L' : snprintf (tstr, sizeof(tstr), "%d", msr->reclen); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'r' : snprintf (tstr, sizeof(tstr), "%ld", (long int) (msr->samprate+0.5)); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case 'R' : snprintf (tstr, sizeof(tstr), "%.6f", msr->samprate); strncat (filename, tstr, (sizeof(filename) - fnlen)); if ( def ) strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case '%' : strncat (filename, "%", (sizeof(filename) - fnlen)); fnlen = strlen (filename); p = w + 1; break; case '#' : strncat (filename, "#", (sizeof(filename) - fnlen)); fnlen = strlen (filename); p = w + 1; break; default : fprintf (stderr, "Unknown layout format code: '%c'\n", *w); p = w; break; } } strncat (filename, p, (sizeof(filename) - fnlen)); fnlen = strlen (filename); /* If not the last entry then it should be a directory */ if ( fnptr->next != 0 ) { if ( access (filename, F_OK) ) { if ( errno == ENOENT ) { if ( dsverbose >= 1 ) fprintf (stderr, "Creating directory: %s\n", filename); if (mkdir (filename, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { fprintf (stderr, "ds_streamproc: mkdir(%s) %s\n", filename, strerror (errno)); strparse (NULL, NULL, &fnlist); return -1; } } else { fprintf (stderr, "%s: access denied, %s\n", filename, strerror(errno)); strparse (NULL, NULL, &fnlist); return -1; } } strncat (filename, "/", (sizeof(filename) - fnlen)); fnlen++; } fnptr = fnptr->next; } strparse (NULL, NULL, &fnlist); /* Add ".suffix" to filename and definition if suffix is not 0 */ if ( suffix ) { snprintf (tstr, sizeof(tstr), ".%ld", suffix); strncat (filename, tstr, (sizeof(filename) - fnlen)); strncat (definition, tstr, (sizeof(definition) - fnlen)); fnlen = strlen (filename); } /* Make sure the filename and definition are NULL terminated */ *(filename + sizeof(filename) - 1) = '\0'; *(definition + sizeof(definition) -1) = '\0'; /* Check for previously used stream entry, otherwise create it */ foundgroup = ds_getstream (datastream, msr, definition, filename); if (foundgroup != NULL) { /* Write binary data samples to approriate file */ if ( msr->datasamples && msr->numsamples ) { if ( dsverbose >= 3 ) fprintf (stderr, "Writing binary data samples to data stream file %s\n", filename); if ( !write (foundgroup->filed, msr->datasamples, msr->numsamples * ms_samplesize(msr->sampletype)) ) { fprintf (stderr, "ds_streamproc: failed to write binary data samples\n"); return -1; } else { foundgroup->modtime = time (NULL); } } /* Write the data record to the appropriate file */ else { if ( dsverbose >= 3 ) fprintf (stderr, "Writing data record to data stream file %s\n", filename); if ( !write (foundgroup->filed, msr->record, msr->reclen) ) { fprintf (stderr, "ds_streamproc: failed to write data record\n"); return -1; } else { foundgroup->modtime = time (NULL); } } return 0; } return -1; } /* End of ds_streamproc() */
void kmain(void) { int reset_after_shutdown=0; #ifdef CONF_DKEY int c; #endif /* Install the text.hi segment in the correct place. The * firmware loader puts it in the bss segment, we copy it * to it's final location. */ memcpy(&__text_hi, &__bss, &__etext_hi - &__text_hi); reset_vector = rom_reset_vector; /* Turn off motor, since writing to hitext manipulates motors */ motor_controller = 0; memset(&__bss, 0, &__bss_end - &__bss); #ifdef CONF_MM mm_init(); #endif while (1) { power_init(); #ifdef CONF_AUTOSHUTOFF shutoff_init(); #endif lcd_init(); #ifdef CONF_DSOUND dsound_init(); #endif #ifdef CONF_TIME systime_init(); #endif #ifdef CONF_DSENSOR ds_init(); #endif #ifdef CONF_DMOTOR dm_init(); #endif #ifdef CONF_LNP lnp_init(); lnp_logical_init(); #endif #ifdef CONF_TM tm_init(); #endif #ifdef CONF_PROGRAM program_init(); #endif show_on(); // wait till power key released // #ifdef CONF_DKEY dkey_multi=KEY_ANY; while((c=dkey_multi) & KEY_ONOFF); #else while (PRESSED(dbutton(), BUTTON_ONOFF)); delay(100); #endif cls(); #ifndef CONF_PROGRAM lcd_show(man_run); #ifndef CONF_LCD_REFRESH lcd_refresh(); #endif #endif // run app // #ifdef CONF_TM #ifndef CONF_PROGRAM execi(&main,0,0,PRIO_NORMAL,DEFAULT_STACK_SIZE); #endif tm_start(); #else main(0,0); #endif show_off(); // ON/OFF + PROGRAM -> erase firmware #ifdef CONF_DKEY while((c=dkey_multi) & KEY_ONOFF) if(c&KEY_PRGM) reset_after_shutdown=1; #else while (PRESSED(dbutton(), BUTTON_ONOFF)) if (PRESSED(dbutton(), BUTTON_PROGRAM)) reset_after_shutdown=1; #endif #ifdef CONF_PROGRAM program_shutdown(); #endif #ifdef CONF_LNP lnp_logical_shutdown(); #endif #ifdef CONF_DMOTOR dm_shutdown(); #endif #ifdef CONF_DSENSOR ds_shutdown(); #endif #ifdef CONF_TIME systime_shutdown(); #endif if (reset_after_shutdown) rom_reset(); lcd_clear(); lcd_power_off(); power_off(); } }