RocketLogger  1.1.5
rl_server.c
Go to the documentation of this file.
1 
32 #include <libgen.h>
33 #include <stdint.h>
34 #include <stdio.h>
35 #include <sys/statvfs.h>
36 
37 #include "rl_lib.h"
38 #include "rl_util.h"
39 #include "sem.h"
40 #include "web.h"
41 
43 #define ARG_COUNT 4
44 #define MAX_STRING_LENGTH 150
46 #define MAX_STRING_VALUE 20
48 #define TIME_MARGIN 10
50 
51 // Global variables
53 int sem_id;
55 struct web_shm* web_data;
56 
58 uint32_t id;
60 uint8_t get_data;
62 uint32_t t_scale;
64 int64_t last_time;
66 int64_t curr_time;
68 int8_t num_channels;
69 
72 
76 
77 // functions
83 int64_t get_free_space(char* path) {
84 
85  struct statvfs stat;
86  statvfs(path, &stat);
87 
88  return (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
89 }
90 
96 void print_json_32(int32_t data[], int length) {
97  char str[MAX_STRING_LENGTH];
98  char val[MAX_STRING_VALUE];
99  int i;
100  sprintf(str, "[\"%d\"", data[0]);
101  for (i = 1; i < length; i++) {
102  sprintf(val, ",\"%d\"", data[i]);
103  strcat(str, val);
104  }
105  strcat(str, "]\n");
106  printf("%s", str);
107 }
108 
114 void print_json_64(int64_t data[], int length) {
115  char str[MAX_STRING_LENGTH];
116  char val[MAX_STRING_VALUE];
117  int i;
118  sprintf(str, "[\"%lld\"", data[0]);
119  for (i = 1; i < length; i++) {
120  sprintf(val, ",\"%lld\"", data[i]);
121  strcat(str, val);
122  }
123  strcat(str, "]\n");
124  printf("%s", str);
125 }
126 
130 void print_status(void) {
131  // STATUS
132  printf("%d\n", status.state);
133  if (status.state != RL_RUNNING) {
135 
136  // read calibration time
137  struct rl_calibration tmp_calibration;
138  rl_read_calibration(&tmp_calibration, &status.conf);
139  status.calibration_time = tmp_calibration.time;
140  }
141  // copy of filename (for dirname)
142  char file_name_copy[MAX_PATH_LENGTH];
143  strcpy(file_name_copy, status.conf.file_name);
144  printf("%llu\n", get_free_space(dirname(file_name_copy)));
145  printf("%llu\n", status.calibration_time);
146 
147  // CONFIG
148  printf("%d\n", status.conf.sample_rate);
149  printf("%d\n", status.conf.update_rate);
150  printf("%d\n", status.conf.digital_inputs);
151  printf("%d\n", status.conf.calibration);
152  printf("%d\n", status.conf.file_format);
153  printf("%s\n", status.conf.file_name);
154  printf("%llu\n", status.conf.max_file_size);
157  printf("%llu\n", status.samples_taken);
158  printf("%d\n", status.conf.enable_web_server);
159 }
160 
164 void print_data(void) {
165 
166  // print data length
167  int buffer_count = (curr_time - last_time + TIME_MARGIN) / 1000;
168 
169  // get available buffers
171  return;
172  }
173  int buffer_available = web_data->buffer[t_scale].filled;
174  set_sem(sem_id, DATA_SEM, 1);
175 
176  if (buffer_count > buffer_available) {
177  buffer_count = buffer_available;
178  }
179 
180  int buffer_size = buffer_sizes[t_scale];
181 
182  // print request id and status
183  printf("%d\n", id);
184  print_status();
185 
186  // data available
187  printf("1\n");
188 
189  // print time scale
190  printf("%d\n", t_scale);
191 
192  // print time
193  printf("%lld\n", curr_time);
194 
195  // print buffer information
196  printf("%d\n", buffer_count);
197  printf("%d\n", buffer_size);
198 
199  // read data
200  int64_t data[buffer_count][buffer_size][num_channels];
201  int i;
202 
204  return;
205  }
206  for (i = 0; i < buffer_count; i++) {
207 
208  // read data buffer
209  int64_t* shm_data = web_buffer_get(&web_data->buffer[t_scale], i);
210  if (web_data->buffer[t_scale].element_size > sizeof(data)) {
211  rl_log(ERROR,
212  "In print_data: memcpy is trying to copy to much data.");
213  break;
214  } else {
215  memcpy(&data[i][0][0], shm_data,
216  web_data->buffer[t_scale].element_size);
217  }
218  }
219  set_sem(sem_id, DATA_SEM, 1);
220 
221  // print data
222  for (i = buffer_count - 1; i >= 0; i--) {
223  int j;
224  for (j = 0; j < buffer_size; j++) {
225  print_json_64(data[i][j], num_channels);
226  }
227  }
228 }
229 
242 int main(int argc, char* argv[]) {
243 
244  // parse arguments
245  if (argc != ARG_COUNT + 1) {
246  rl_log(ERROR, "in rl_server: not enough arguments");
247  exit(FAILURE);
248  }
249  id = atoi(argv[1]);
250  get_data = atoi(argv[2]);
251  t_scale = atoi(argv[3]);
252  last_time = atoll(argv[4]);
253 
254  // check time scale
255  if (t_scale != S1 && t_scale != S10 && t_scale != S100) {
256  rl_log(WARNING, "unknown time scale");
257  t_scale = S1;
258  }
259 
260  // get status
262 
263  // quit, if data not requested or not running or web disabled
265  status.conf.enable_web_server == 0 || get_data == 0) {
266  // print request id and status
267  printf("%d\n", id);
268  print_status();
269  printf("0\n"); // no data available
270  exit(EXIT_SUCCESS);
271  }
272 
273  // open semaphore
275  if (sem_id < 0) {
276  // error already logged
277  exit(EXIT_FAILURE);
278  }
279 
280  // open shared memory
281  web_data = web_open_shm();
282 
283  // fetch data
284  uint8_t data_read = 0;
285  while (data_read == 0) {
286 
287  // get current time
289  exit(EXIT_FAILURE);
290  }
291  curr_time = web_data->time;
292  num_channels = web_data->num_channels;
293  set_sem(sem_id, DATA_SEM, 1);
294 
295  if (curr_time > last_time) {
296 
297  // re-read status
299 
300  // read and print data
301  print_data();
302 
303  data_read = 1;
304  } else {
305 
306  if (last_time > curr_time) {
307  // assume outdated time stamp
308  last_time = 0;
309  }
310 
311  // wait on new data
312  if (data_read == 0) {
314  // time-out or error -> stop
315  break;
316  }
317  }
318  }
319  }
320 
321  // unmap shared memory
322  shmdt(web_data);
323 
324  exit(EXIT_SUCCESS);
325 }
void print_data(void)
Definition: rl_server.c:164
int force_high_channels[NUM_I_CHANNELS]
Current channels to force to high range.
Definition: types.h:263
int open_sem(key_t key, int num_sems)
Definition: sem.c:72
struct ringbuffer buffer[WEB_RING_BUFFER_COUNT]
Array of ring buffers for different time scales.
Definition: web.h:101
#define FAILURE
Definition: types.h:78
#define SUCCESS
Definition: types.h:75
1 samples/s
Definition: web.h:56
struct rl_status status
Current status of RocketLogger.
Definition: rl_server.c:71
struct web_shm * web_open_shm(void)
Definition: web.c:73
int main(int argc, char *argv[])
Definition: rl_server.c:242
#define BUFFER1_SIZE
Size of 1s/div buffer.
Definition: web.h:60
#define NUM_SEMS
Number of semaphores in set.
Definition: types.h:314
#define WAIT_SEM
Definition: types.h:326
uint8_t get_data
1: data requested, 0: no data requested
Definition: rl_server.c:60
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:39
#define SEM_KEY
Semaphore key (used for set creation)
Definition: types.h:312
#define BUFFER10_SIZE
Size of 10s/div buffer.
Definition: web.h:62
int set_sem(int sem_id, int sem_num, int val)
Definition: sem.c:124
uint32_t num_channels
Number of channels sampled.
Definition: web.h:99
int wait_sem(int sem_id, int sem_num, int time_out)
Definition: sem.c:88
int digital_inputs
En-/disable digital inputs.
Definition: types.h:265
#define MAX_PATH_LENGTH
Maximum path length in characters.
Definition: types.h:102
100 sample/s
Definition: web.h:54
int enable_web_server
En-/disable plots on web interface.
Definition: types.h:267
rl_use_cal calibration
Use/ignore existing calibration.
Definition: types.h:269
int sem_id
ID of semaphore set.
Definition: rl_server.c:53
#define MAX_STRING_VALUE
Maximum string value length.
Definition: rl_server.c:47
#define DATA_SEM
Number of data semaphore in set (manages access to shared memory data)
Definition: types.h:323
#define TIME_MARGIN
Time margin for buffer number (in ms)
Definition: rl_server.c:49
rl_state state
State.
Definition: types.h:285
uint64_t samples_taken
Number of samples taken.
Definition: types.h:289
int read_default_config(struct rl_conf *conf)
Definition: rl_util.c:683
struct web_shm * web_data
Pointer to shared memory data.
Definition: rl_server.c:55
#define NUM_I_CHANNELS
Maximum number of RocketLogger current channels.
Definition: types.h:106
uint32_t t_scale
Requested time scale.
Definition: rl_server.c:62
uint32_t filled
Number of elements in buffer.
Definition: web.h:85
#define NUM_CHANNELS
Maximum number of RocketLogger channels.
Definition: types.h:104
int64_t curr_time
Time stamp of last buffer stored to shared memory.
Definition: rl_server.c:66
Warning.
Definition: types.h:201
#define BUFFER100_SIZE
Size of 100s/div buffer.
Definition: web.h:64
char file_name[MAX_PATH_LENGTH]
Data file name.
Definition: types.h:275
10 samples/s
Definition: web.h:55
Running.
Definition: types.h:142
int channels[NUM_CHANNELS]
Channels to sample.
Definition: types.h:261
uint64_t time
Time stamp of calibration run.
Definition: types.h:303
int64_t time
Time stamp of most recent datum (in UNIX time, UTC)
Definition: web.h:97
uint64_t calibration_time
Time stamp of last calibration run.
Definition: types.h:295
int64_t last_time
Last client time stamp.
Definition: rl_server.c:64
int64_t get_free_space(char *path)
Definition: rl_server.c:83
#define SEM_TIME_OUT
Time out time in seconds, waiting on semaphore read.
Definition: types.h:316
void rl_read_calibration(struct rl_calibration *calibration_ptr, struct rl_conf *conf)
Definition: rl_lib.c:79
rl_file_format file_format
File format.
Definition: types.h:271
#define WEB_RING_BUFFER_COUNT
Number of ring buffers in shared memory.
Definition: web.h:42
int update_rate
Data update rate.
Definition: types.h:257
Definition: web.h:95
Error.
Definition: types.h:200
struct rl_conf conf
Current configuration.
Definition: types.h:293
uint32_t element_size
Size of buffer element.
Definition: web.h:81
int sample_rate
Sampling rate.
Definition: types.h:253
#define ARG_COUNT
Number of input arguments required.
Definition: rl_server.c:43
uint32_t id
Client request id.
Definition: rl_server.c:58
int buffer_sizes[WEB_RING_BUFFER_COUNT]
Buffer sizes for different time scales.
Definition: rl_server.c:74
Not sampling.
Definition: types.h:150
uint64_t max_file_size
Maximum data file size.
Definition: types.h:273
rl_sampling sampling
Sampling state.
Definition: types.h:287
int64_t * web_buffer_get(struct ringbuffer *buffer, int num)
Definition: web.c:129
int8_t num_channels
Number of channels sampled.
Definition: rl_server.c:68
void print_json_32(int32_t data[], int length)
Definition: rl_server.c:96
void print_json_64(int64_t data[], int length)
Definition: rl_server.c:114
int rl_read_status(struct rl_status *status)
Definition: rl_lib.c:60
#define MAX_STRING_LENGTH
Maximum string line length.
Definition: rl_server.c:45
void print_status(void)
Definition: rl_server.c:130