deepstone
annotate src/record.c @ 38:17a5107b6fa4
- added perspective correct interpolation
- added recording functionality
- added video capture functionality
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 10 Mar 2014 17:24:42 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@38 | 1 #include <stdio.h> |
nuclear@38 | 2 #include <stdlib.h> |
nuclear@38 | 3 #include <string.h> |
nuclear@38 | 4 #include <errno.h> |
nuclear@38 | 5 #include "record.h" |
nuclear@38 | 6 |
nuclear@38 | 7 struct event { |
nuclear@38 | 8 unsigned long tm; |
nuclear@38 | 9 float x, y, z; |
nuclear@38 | 10 float theta, phi; |
nuclear@38 | 11 |
nuclear@38 | 12 struct event *next; |
nuclear@38 | 13 }; |
nuclear@38 | 14 |
nuclear@38 | 15 static struct event *head, *tail; |
nuclear@38 | 16 static struct event *iter; |
nuclear@38 | 17 static int num_events; |
nuclear@38 | 18 |
nuclear@38 | 19 void rec_reset(void) |
nuclear@38 | 20 { |
nuclear@38 | 21 while(head) { |
nuclear@38 | 22 iter = head; |
nuclear@38 | 23 head = head->next; |
nuclear@38 | 24 free(iter); |
nuclear@38 | 25 } |
nuclear@38 | 26 num_events = 0; |
nuclear@38 | 27 } |
nuclear@38 | 28 |
nuclear@38 | 29 int rec_load(const char *fname) |
nuclear@38 | 30 { |
nuclear@38 | 31 FILE *fp; |
nuclear@38 | 32 int i; |
nuclear@38 | 33 |
nuclear@38 | 34 if(!(fp = fopen(fname, "rb"))) { |
nuclear@38 | 35 fprintf(stderr, "failed to open recording: %s: %s\n", fname, strerror(errno)); |
nuclear@38 | 36 return -1; |
nuclear@38 | 37 } |
nuclear@38 | 38 fread(&num_events, sizeof num_events, 1, fp); |
nuclear@38 | 39 |
nuclear@38 | 40 head = tail = 0; |
nuclear@38 | 41 |
nuclear@38 | 42 for(i=0; i<num_events; i++) { |
nuclear@38 | 43 struct event *ev = malloc(sizeof *ev); |
nuclear@38 | 44 if(!ev) { |
nuclear@38 | 45 perror("failed to allocate event structure"); |
nuclear@38 | 46 fclose(fp); |
nuclear@38 | 47 return -1; |
nuclear@38 | 48 } |
nuclear@38 | 49 if(fread(ev, sizeof *ev, 1, fp) < 1) { |
nuclear@38 | 50 perror("unexpected end of file"); |
nuclear@38 | 51 fclose(fp); |
nuclear@38 | 52 return -1; |
nuclear@38 | 53 } |
nuclear@38 | 54 |
nuclear@38 | 55 if(!head) { |
nuclear@38 | 56 head = tail = ev; |
nuclear@38 | 57 } else { |
nuclear@38 | 58 tail->next = ev; |
nuclear@38 | 59 tail = ev; |
nuclear@38 | 60 } |
nuclear@38 | 61 ev->next = 0; |
nuclear@38 | 62 } |
nuclear@38 | 63 iter = 0; |
nuclear@38 | 64 |
nuclear@38 | 65 fclose(fp); |
nuclear@38 | 66 return 0; |
nuclear@38 | 67 } |
nuclear@38 | 68 |
nuclear@38 | 69 int rec_save(const char *fname) |
nuclear@38 | 70 { |
nuclear@38 | 71 FILE *fp; |
nuclear@38 | 72 struct event *ev; |
nuclear@38 | 73 |
nuclear@38 | 74 if(!(fp = fopen(fname, "wb"))) { |
nuclear@38 | 75 fprintf(stderr, "failed to open recording: %s: %s\n", fname, strerror(errno)); |
nuclear@38 | 76 return -1; |
nuclear@38 | 77 } |
nuclear@38 | 78 fwrite(&num_events, sizeof num_events, 1, fp); |
nuclear@38 | 79 |
nuclear@38 | 80 ev = head; |
nuclear@38 | 81 while(ev) { |
nuclear@38 | 82 fwrite(ev, sizeof *ev, 1, fp); |
nuclear@38 | 83 ev = ev->next; |
nuclear@38 | 84 } |
nuclear@38 | 85 |
nuclear@38 | 86 fclose(fp); |
nuclear@38 | 87 return 0; |
nuclear@38 | 88 } |
nuclear@38 | 89 |
nuclear@38 | 90 void rec_add(unsigned long tm, float x, float y, float z, float theta, float phi) |
nuclear@38 | 91 { |
nuclear@38 | 92 struct event *ev = malloc(sizeof *ev); |
nuclear@38 | 93 if(!ev) { |
nuclear@38 | 94 fprintf(stderr, "failed to append rec-event: %s\n", strerror(errno)); |
nuclear@38 | 95 return; |
nuclear@38 | 96 } |
nuclear@38 | 97 ev->tm = tm; |
nuclear@38 | 98 ev->x = x; |
nuclear@38 | 99 ev->y = y; |
nuclear@38 | 100 ev->z = z; |
nuclear@38 | 101 ev->theta = theta; |
nuclear@38 | 102 ev->phi = phi; |
nuclear@38 | 103 |
nuclear@38 | 104 ev->next = 0; |
nuclear@38 | 105 if(head) { |
nuclear@38 | 106 tail->next = ev; |
nuclear@38 | 107 tail = ev; |
nuclear@38 | 108 } else { |
nuclear@38 | 109 head = tail = ev; |
nuclear@38 | 110 } |
nuclear@38 | 111 |
nuclear@38 | 112 num_events++; |
nuclear@38 | 113 } |
nuclear@38 | 114 |
nuclear@38 | 115 void rec_get(unsigned long tm, float *x, float *y, float *z, float *theta, float *phi) |
nuclear@38 | 116 { |
nuclear@38 | 117 if(!iter || iter->tm > tm) { |
nuclear@38 | 118 iter = head; |
nuclear@38 | 119 } |
nuclear@38 | 120 |
nuclear@38 | 121 while(iter && iter->next) { |
nuclear@38 | 122 if(iter->next->tm > tm) { |
nuclear@38 | 123 break; |
nuclear@38 | 124 } |
nuclear@38 | 125 iter = iter->next; |
nuclear@38 | 126 } |
nuclear@38 | 127 |
nuclear@38 | 128 if(iter) { |
nuclear@38 | 129 *x = iter->x; |
nuclear@38 | 130 *y = iter->y; |
nuclear@38 | 131 *z = iter->z; |
nuclear@38 | 132 *theta = iter->theta; |
nuclear@38 | 133 *phi = iter->phi; |
nuclear@38 | 134 } |
nuclear@38 | 135 } |