RocketLogger 2.1.1
rl_lib.c
Go to the documentation of this file.
1
32#include <errno.h>
33#include <stdbool.h>
34#include <string.h>
35
36#include <signal.h>
37#include <sys/ipc.h>
38#include <sys/shm.h>
39#include <sys/types.h>
40#include <unistd.h>
41
42#include "log.h"
43#include "rl.h"
44#include "rl_hw.h"
45#include "rl_socket.h"
46#include "util.h"
47
48#include "rl_lib.h"
49
57static void rl_signal_handler(int signal_number);
58
59bool rl_is_sampling(void) {
60 rl_status_t status;
61 rl_status_reset(&status);
62
63 int res = rl_get_status(&status);
64 if (res < 0) {
65 // if shared memory does not exists, RocketLogger is not sampling
66 if (errno == ENOENT) {
67 return false;
68 }
70 "failed getting status to check sampling state; %d message: %s",
71 errno, strerror(errno));
72 }
73
74 return status.sampling;
75}
76
77int rl_get_status(rl_status_t *const status) {
78 // get the status from the shared memory
79 int res = rl_status_read(status);
80 if (res < 0) {
81 // on error return reset value
82 rl_status_reset(status);
83 return res;
84 }
85
86 // get file system state
87 int64_t disk_free = fs_space_free(RL_CONFIG_FILE_DIR_DEFAULT);
88 int64_t disk_total = fs_space_total(RL_CONFIG_FILE_DIR_DEFAULT);
89
90 status->disk_free = disk_free;
91 if (disk_total > 0) {
92 status->disk_free_permille = (1000 * disk_free) / disk_total;
93 } else {
94 status->disk_free_permille = 0;
95 }
96
97 return res;
98}
99
100int rl_run(rl_config_t *const config) {
101 if (rl_is_sampling()) {
103 "cannot run measurement, RocketLogger is already running.");
104 return ERROR;
105 }
106
107 // register signal handler for SIGTERM and SIGINT (for stopping)
108 struct sigaction sigterm_action_backup;
109 struct sigaction sigint_action_backup;
110 struct sigaction signal_action;
111 signal_action.sa_handler = rl_signal_handler;
112 sigemptyset(&signal_action.sa_mask);
113 signal_action.sa_flags = 0;
114
115 int ret;
116 ret = sigaction(SIGTERM, &signal_action, &sigterm_action_backup);
117 if (ret < 0) {
119 "can't register signal handler for SIGTERM; %d message: %s",
120 errno, strerror(errno));
121 return ERROR;
122 }
123 ret = sigaction(SIGINT, &signal_action, &sigint_action_backup);
124 if (ret < 0) {
126 "can't register signal handler for SIGINT; %d message: %s",
127 errno, strerror(errno));
128 return ERROR;
129 }
130
131 // INITIATION
132
133 // init status
135 rl_status.config = config;
136
137 // init status publishing and publish (to not be received, see zeromq docs)
140
141 // init hardware
142 hw_init(config);
143
144 // initialize socket if webserver enabled
145 if (config->web_enable) {
147 rl_socket_metadata(config);
148 }
149
150 // check ambient sensor available
151 if (config->ambient_enable && rl_status.sensor_count == 0) {
152 config->ambient_enable = false;
153 rl_log(RL_LOG_WARNING, "No ambient sensor found. Disabling ambient...");
154 }
155
156 // SAMPLING
157 rl_log(RL_LOG_INFO, "sampling start");
158 hw_sample(config);
159 rl_log(RL_LOG_INFO, "sampling finished");
160
161 // FINISH
162 if (config->web_enable) {
164 }
166 hw_deinit(config);
167
168 // restore signal handlers for SIGTERM and SIGINT
169 ret = sigaction(SIGTERM, &sigterm_action_backup, NULL);
170 if (ret < 0) {
172 "can't restore signal handler for SIGTERM; %d message: %s",
173 errno, strerror(errno));
174 }
175 ret = sigaction(SIGINT, &sigint_action_backup, NULL);
176 if (ret < 0) {
178 "can't restore signal handler for SIGINT; %d message: %s", errno,
179 strerror(errno));
180 }
181
182 return SUCCESS;
183}
184
185int rl_stop(void) {
186 if (!rl_is_sampling()) {
187 rl_log(RL_LOG_ERROR, "RocketLogger is not running.");
188 return ERROR;
189 }
190
191 // get pid and send termination signal
192 pid_t pid = rl_pid_get();
193 if (pid < 0) {
194 rl_log(RL_LOG_ERROR, "RocketLogger PID file not found; %d message: %s",
195 errno, strerror(errno));
196 return ERROR;
197 }
198 kill(pid, SIGTERM);
199
200 return SUCCESS;
201}
202
203static void rl_signal_handler(int signal_number) {
204 // signal generated by stop function
205 if (signal_number == SIGTERM) {
206 // stop sampling
207 rl_status.sampling = false;
208 }
209
210 // signal generated by interactive user (ctrl+C)
211 if (signal_number == SIGINT) {
212 signal(signal_number, SIG_IGN);
213 rl_status.sampling = false;
214 }
215}
int rl_log(rl_log_level_t log_level, char const *const format,...)
Definition log.c:82
@ RL_LOG_ERROR
Error.
Definition log.h:49
@ RL_LOG_WARNING
Warning.
Definition log.h:50
@ RL_LOG_INFO
Information.
Definition log.h:51
void rl_status_reset(rl_status_t *const status)
Definition rl.c:535
int rl_status_pub_init(void)
Definition rl.c:539
int rl_status_write(rl_status_t *const status)
Definition rl.c:641
int rl_status_read(rl_status_t *const status)
Definition rl.c:602
pid_t rl_pid_get(void)
Definition rl.c:508
int rl_status_pub_deinit(void)
Definition rl.c:554
#define RL_CONFIG_FILE_DIR_DEFAULT
Configuration data file directory default.
Definition rl.h:103
#define ERROR
Function return value for errors (use errno to indicate the error)
Definition rl.h:46
#define SUCCESS
Function return value for successful completion.
Definition rl.h:44
void hw_deinit(rl_config_t const *const config)
Definition rl_hw.c:93
void hw_init(rl_config_t const *const config)
Definition rl_hw.c:51
int hw_sample(rl_config_t const *const config)
Definition rl_hw.c:127
int rl_stop(void)
Definition rl_lib.c:185
bool rl_is_sampling(void)
Definition rl_lib.c:59
int rl_run(rl_config_t *const config)
Definition rl_lib.c:100
int rl_get_status(rl_status_t *const status)
Definition rl_lib.c:77
int rl_socket_init(void)
Definition rl_socket.c:56
int rl_socket_metadata(rl_config_t const *const config)
Definition rl_socket.c:82
int rl_socket_deinit(void)
Definition rl_socket.c:71
bool ambient_enable
Enable logging of ambient sensor.
Definition rl.h:180
bool web_enable
Enable web interface connection.
Definition rl.h:176
uint64_t disk_free
Time stamp of last calibration run.
Definition rl.h:215
rl_config_t const * config
(local) reference to current config
Definition rl.h:225
uint16_t disk_free_permille
Time stamp of last calibration run.
Definition rl.h:217
bool sampling
Sampling state, true: sampling, false: idle.
Definition rl.h:203
uint16_t sensor_count
Number of sensors found connected to the system.
Definition rl.h:221
int64_t fs_space_free(char const *const path)
Definition util.c:125
int64_t fs_space_total(char const *const path)
Definition util.c:137