RocketLogger  1.0
rl_server.c
Go to the documentation of this file.
1 
5 #include <sys/statvfs.h>
6 #include <stdio.h>
7 #include <stdint.h>
8 #include <libgen.h>
9 
10 #include "rl_lib.h"
11 #include "rl_util.h"
12 
14 #define ARG_COUNT 4
15 #define MAX_STRING_LENGTH 150
17 #define MAX_STRING_VALUE 20
19 #define TIME_MARGIN 10
21 
22 // Global variables
24 int sem_id;
26 struct web_shm* web_data;
27 
29 uint32_t id;
31 uint8_t get_data;
33 uint32_t t_scale;
35 int64_t last_time;
37 int64_t curr_time;
39 int8_t num_channels;
40 
43 
46 
47 
48 // functions
54 int64_t get_free_space(char* path) {
55 
56  struct statvfs stat;
57  statvfs(path, &stat);
58 
59  return (uint64_t) stat.f_bavail * (uint64_t) stat.f_bsize;
60 
61 }
62 
68 void print_json_32(int32_t data[], int length) {
69  char str[MAX_STRING_LENGTH];
70  char val[MAX_STRING_VALUE];
71  int i;
72  sprintf(str, "[\"%d\"", data[0]);
73  for (i=1; i < length; i++) {
74  sprintf(val, ",\"%d\"", data[i]);
75  strcat(str, val);
76  }
77  strcat(str, "]\n");
78  printf("%s",str);
79 }
80 
86 void print_json_64(int64_t data[], int length) {
87  char str[MAX_STRING_LENGTH];
88  char val[MAX_STRING_VALUE];
89  int i;
90  sprintf(str, "[\"%lld\"", data[0]);
91  for (i=1; i < length; i++) {
92  sprintf(val, ",\"%lld\"", data[i]);
93  strcat(str, val);
94  }
95  strcat(str, "]\n");
96  printf("%s",str);
97 }
98 
102 void print_status(void) {
103  // STATUS
104  printf("%d\n", status.state);
105  if(status.state != RL_RUNNING) {
107 
108  // read calibration time
109  struct rl_calibration tmp_calibration;
110  rl_read_calibration(&tmp_calibration, &status.conf);
111  status.calibration_time = tmp_calibration.time;
112  }
113  // copy of filename (for dirname)
114  char file_name_copy[MAX_PATH_LENGTH];
115  strcpy(file_name_copy, status.conf.file_name);
116  printf("%llu\n", get_free_space(dirname(file_name_copy)));
117  printf("%llu\n", status.calibration_time);
118 
119  // CONFIG
120  printf("%d\n", status.conf.sample_rate);
121  printf("%d\n", status.conf.update_rate);
122  printf("%d\n", status.conf.digital_inputs);
123  printf("%d\n", status.conf.calibration);
124  printf("%d\n", status.conf.file_format);
125  printf("%s\n", status.conf.file_name);
126  printf("%llu\n", status.conf.max_file_size);
129  printf("%llu\n", status.samples_taken);
130  printf("%d\n", status.conf.enable_web_server);
131 
132 }
133 
137 void print_data(void) {
138 
139  // print data length
140  int buffer_count = (curr_time - last_time + TIME_MARGIN)/1000;
141 
142  // get available buffers
144  return;
145  }
146  int buffer_available = web_data->buffer[t_scale].filled;
147  set_sem(sem_id, DATA_SEM, 1);
148 
149  if(buffer_count > buffer_available) {
150  buffer_count = buffer_available;
151  }
152 
153  int buffer_size = buffer_sizes[t_scale];
154 
155  // print request id and status
156  printf("%d\n", id);
157  print_status();
158 
159  // data available
160  printf("1\n");
161 
162  // print time scale
163  printf("%d\n", t_scale);
164 
165  // print time
166  printf("%lld\n", curr_time);
167 
168  // print buffer information
169  printf("%d\n", buffer_count);
170  printf("%d\n", buffer_size);
171 
172  // read data
173  int64_t data[buffer_count][buffer_size][num_channels];
174  int i;
175 
177  return;
178  }
179  for(i=0; i<buffer_count; i++) {
180 
181  // read data buffer
182  int64_t* shm_data = buffer_get(&web_data->buffer[t_scale], i);
183  if(web_data->buffer[t_scale].element_size > sizeof(data)) {
184  rl_log(ERROR, "In print_data: memcpy is trying to copy to much data.");
185  break;
186  } else {
187  memcpy(&data[i][0][0], shm_data, web_data->buffer[t_scale].element_size);
188  }
189  }
190  set_sem(sem_id, DATA_SEM, 1);
191 
192  // print data
193  for(i=buffer_count-1; i>=0; i--) {
194  int j;
195  for(j=0; j<buffer_size; j++) {
196  print_json_64(data[i][j], num_channels);
197  }
198  }
199 }
200 
212 int main(int argc, char* argv[]) {
213 
214  // parse arguments
215  if(argc != ARG_COUNT + 1) {
216  rl_log(ERROR, "in rl_server: not enough arguments");
217  exit(FAILURE);
218  }
219  id = atoi(argv[1]);
220  get_data = atoi(argv[2]);
221  t_scale = atoi(argv[3]);
222  last_time = atoll(argv[4]);
223 
224  // check time scale
225  if(t_scale != S1 && t_scale != S10 && t_scale != S100) {
226  rl_log(WARNING, "unknown time scale");
227  t_scale = S1;
228  }
229 
230  // get status
232 
233 
234  // quit, if data not requested or not running or web disabled
236  // print request id and status
237  printf("%d\n", id);
238  print_status();
239  printf("0\n"); // no data available
240  exit(EXIT_SUCCESS);
241  }
242 
243  // open semaphore
244  sem_id = open_sem();
245  if(sem_id < 0) {
246  // error already logged
247  exit(EXIT_FAILURE);
248  }
249 
250  // open shared memory
251  web_data = open_web_shm();
252 
253  // fetch data
254  uint8_t data_read = 0;
255  while(data_read == 0) {
256 
257  // get current time
259  exit(EXIT_FAILURE);
260  }
261  curr_time = web_data->time;
262  num_channels = web_data->num_channels;
263  set_sem(sem_id, DATA_SEM, 1);
264 
265 
266  if(curr_time > last_time) {
267 
268  // re-read status
270 
271  // read and print data
272  print_data();
273 
274  data_read = 1;
275  } else {
276 
277  if(last_time > curr_time) {
278  // assume outdated time stamp
279  last_time = 0;
280  }
281 
282  // wait on new data
283  if(data_read == 0) {
285  // time-out or error -> stop
286  break;
287  }
288  }
289  }
290  }
291 
292  // unmap shared memory
293  shmdt(web_data);
294 
295  exit(EXIT_SUCCESS);
296 }
void print_data(void)
Definition: rl_server.c:137
int force_high_channels[NUM_I_CHANNELS]
Current channels to force to high range.
Definition: types.h:214
struct ringbuffer buffer[WEB_RING_BUFFER_COUNT]
Array of ring buffers for different time scales.
Definition: web.h:70
#define FAILURE
Definition: types.h:53
#define SUCCESS
Definition: types.h:50
1 samples/s
Definition: web.h:27
struct rl_status status
Current status of RocketLogger.
Definition: rl_server.c:42
int open_sem(void)
Definition: sem.c:37
int main(int argc, char *argv[])
Definition: rl_server.c:212
#define BUFFER1_SIZE
Size of 1s/div buffer.
Definition: web.h:31
#define WAIT_SEM
Number of wait semaphore in set (blocks all server processes, until new data is available) ...
Definition: types.h:275
uint8_t get_data
1: data requested, 0: no data requested
Definition: rl_server.c:31
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:12
struct web_shm * open_web_shm(void)
Definition: web.c:32
#define BUFFER10_SIZE
Size of 10s/div buffer.
Definition: web.h:33
int set_sem(int sem_id, int sem_num, int val)
Definition: sem.c:85
uint32_t num_channels
Number of channels sampled.
Definition: web.h:68
int wait_sem(int sem_id, int sem_num, int time_out)
Definition: sem.c:52
int digital_inputs
En-/disable digital inputs.
Definition: types.h:216
#define MAX_PATH_LENGTH
Maximum path length in characters.
Definition: types.h:76
100 sample/s
Definition: web.h:25
int enable_web_server
En-/disable plots on web interface.
Definition: types.h:218
rl_use_cal calibration
Use/ignore existing calibration.
Definition: types.h:220
int sem_id
ID of semaphore set.
Definition: rl_server.c:24
#define MAX_STRING_VALUE
Maximum string value length.
Definition: rl_server.c:18
#define DATA_SEM
Number of data semaphore in set (manages access to shared memory data)
Definition: types.h:273
#define TIME_MARGIN
Time margin for buffer number (in ms)
Definition: rl_server.c:20
rl_state state
State.
Definition: types.h:234
uint64_t samples_taken
Number of samples taken.
Definition: types.h:238
int read_default_config(struct rl_conf *conf)
Definition: rl_util.c:536
struct web_shm * web_data
Pointer to shared memory data.
Definition: rl_server.c:26
#define NUM_I_CHANNELS
Maximum number of RocketLogger current channels.
Definition: types.h:80
uint32_t t_scale
Requested time scale.
Definition: rl_server.c:33
uint32_t filled
Number of elements in buffer.
Definition: web.h:54
#define NUM_CHANNELS
Maximum number of RocketLogger channels.
Definition: types.h:78
int64_t curr_time
Time stamp of last buffer stored to shared memory.
Definition: rl_server.c:37
Warning.
Definition: types.h:168
#define BUFFER100_SIZE
Size of 100s/div buffer.
Definition: web.h:35
char file_name[MAX_PATH_LENGTH]
Data file name.
Definition: types.h:226
10 samples/s
Definition: web.h:26
Running.
Definition: types.h:118
int channels[NUM_CHANNELS]
Channels to sample.
Definition: types.h:212
uint64_t time
Time stamp of calibration run.
Definition: types.h:252
int64_t time
Time stamp of most recent datum (in UNIX time, UTC)
Definition: web.h:66
int64_t * buffer_get(struct ringbuffer *buffer, int num)
Definition: web.c:82
uint64_t calibration_time
Time stamp of last calibration run.
Definition: types.h:244
int64_t last_time
Last client time stamp.
Definition: rl_server.c:35
int64_t get_free_space(char *path)
Definition: rl_server.c:54
#define SEM_TIME_OUT
Time out time in seconds, waiting on semaphore read.
Definition: types.h:266
void rl_read_calibration(struct rl_calibration *calibration_ptr, struct rl_conf *conf)
Definition: rl_lib.c:52
rl_file_format file_format
File format.
Definition: types.h:222
#define WEB_RING_BUFFER_COUNT
Number of ring buffers in shared memory.
Definition: web.h:13
int update_rate
Data update rate.
Definition: types.h:208
Definition: web.h:64
Error.
Definition: types.h:167
struct rl_conf conf
Current configuration.
Definition: types.h:242
uint32_t element_size
Size of buffer element.
Definition: web.h:50
int sample_rate
Sampling rate.
Definition: types.h:206
#define ARG_COUNT
Number of input arguments required.
Definition: rl_server.c:14
uint32_t id
Client request id.
Definition: rl_server.c:29
int buffer_sizes[WEB_RING_BUFFER_COUNT]
Buffer sizes for different time scales.
Definition: rl_server.c:45
Not sampling.
Definition: types.h:126
uint64_t max_file_size
Maximum data file size.
Definition: types.h:224
rl_sampling sampling
Sampling state.
Definition: types.h:236
int8_t num_channels
Number of channels sampled.
Definition: rl_server.c:39
void print_json_32(int32_t data[], int length)
Definition: rl_server.c:68
void print_json_64(int64_t data[], int length)
Definition: rl_server.c:86
int rl_read_status(struct rl_status *status)
Definition: rl_lib.c:33
#define MAX_STRING_LENGTH
Maximum string line length.
Definition: rl_server.c:16
void print_status(void)
Definition: rl_server.c:102