nuclear@38: #include nuclear@38: #include nuclear@38: #include nuclear@38: #include nuclear@38: #include "record.h" nuclear@38: nuclear@38: struct event { nuclear@38: unsigned long tm; nuclear@38: float x, y, z; nuclear@38: float theta, phi; nuclear@38: nuclear@38: struct event *next; nuclear@38: }; nuclear@38: nuclear@38: static struct event *head, *tail; nuclear@38: static struct event *iter; nuclear@38: static int num_events; nuclear@38: nuclear@38: void rec_reset(void) nuclear@38: { nuclear@38: while(head) { nuclear@38: iter = head; nuclear@38: head = head->next; nuclear@38: free(iter); nuclear@38: } nuclear@38: num_events = 0; nuclear@38: } nuclear@38: nuclear@38: int rec_load(const char *fname) nuclear@38: { nuclear@38: FILE *fp; nuclear@38: int i; nuclear@38: nuclear@38: if(!(fp = fopen(fname, "rb"))) { nuclear@38: fprintf(stderr, "failed to open recording: %s: %s\n", fname, strerror(errno)); nuclear@38: return -1; nuclear@38: } nuclear@38: fread(&num_events, sizeof num_events, 1, fp); nuclear@38: nuclear@38: head = tail = 0; nuclear@38: nuclear@38: for(i=0; inext = ev; nuclear@38: tail = ev; nuclear@38: } nuclear@38: ev->next = 0; nuclear@38: } nuclear@38: iter = 0; nuclear@38: nuclear@38: fclose(fp); nuclear@38: return 0; nuclear@38: } nuclear@38: nuclear@38: int rec_save(const char *fname) nuclear@38: { nuclear@38: FILE *fp; nuclear@38: struct event *ev; nuclear@38: nuclear@38: if(!(fp = fopen(fname, "wb"))) { nuclear@38: fprintf(stderr, "failed to open recording: %s: %s\n", fname, strerror(errno)); nuclear@38: return -1; nuclear@38: } nuclear@38: fwrite(&num_events, sizeof num_events, 1, fp); nuclear@38: nuclear@38: ev = head; nuclear@38: while(ev) { nuclear@38: fwrite(ev, sizeof *ev, 1, fp); nuclear@38: ev = ev->next; nuclear@38: } nuclear@38: nuclear@38: fclose(fp); nuclear@38: return 0; nuclear@38: } nuclear@38: nuclear@38: void rec_add(unsigned long tm, float x, float y, float z, float theta, float phi) nuclear@38: { nuclear@38: struct event *ev = malloc(sizeof *ev); nuclear@38: if(!ev) { nuclear@38: fprintf(stderr, "failed to append rec-event: %s\n", strerror(errno)); nuclear@38: return; nuclear@38: } nuclear@38: ev->tm = tm; nuclear@38: ev->x = x; nuclear@38: ev->y = y; nuclear@38: ev->z = z; nuclear@38: ev->theta = theta; nuclear@38: ev->phi = phi; nuclear@38: nuclear@38: ev->next = 0; nuclear@38: if(head) { nuclear@38: tail->next = ev; nuclear@38: tail = ev; nuclear@38: } else { nuclear@38: head = tail = ev; nuclear@38: } nuclear@38: nuclear@38: num_events++; nuclear@38: } nuclear@38: nuclear@38: void rec_get(unsigned long tm, float *x, float *y, float *z, float *theta, float *phi) nuclear@38: { nuclear@38: if(!iter || iter->tm > tm) { nuclear@38: iter = head; nuclear@38: } nuclear@38: nuclear@38: while(iter && iter->next) { nuclear@38: if(iter->next->tm > tm) { nuclear@38: break; nuclear@38: } nuclear@38: iter = iter->next; nuclear@38: } nuclear@38: nuclear@38: if(iter) { nuclear@38: *x = iter->x; nuclear@38: *y = iter->y; nuclear@38: *z = iter->z; nuclear@38: *theta = iter->theta; nuclear@38: *phi = iter->phi; nuclear@38: } nuclear@38: }