39 #include <sys/reboot.h>
49 #define RL_DAEMON_MIN_INTERVAL 1
52 #define RL_CALIBRATION_DURATION_SEC 1
55 #define RL_POWERUP_DELAY_US 5000
58 #define RL_BUTTON_LONG_PRESS_SEC 3
61 #define RL_BUTTON_VERY_LONG_PRESS_SEC 6
64 #define RL_BUTTON_EXTRA_LONG_PRESS_SEC 10
123 int res =
rl_run(&rl_config_calibration);
139 static time_t timestamp_down = -1;
140 time_t timestamp = time(NULL);
144 timestamp_down = timestamp;
149 time_t duration = timestamp - timestamp_down;
153 if (duration > timestamp) {
167 "Registered extra long press, requesting system shutdown.");
175 "Registered very long press, requesting system reboot.");
183 "Registered long press, requesting daemon restart.");
191 char *cmd[3] = {
"rocketlogger", NULL, NULL};
202 errno, strerror(errno));
208 "Failed executing `rocketlogger %s`; %d message: %s", cmd,
209 errno, strerror(errno));
224 static void signal_handler(
int signal_number) {
226 if (signal_number == SIGTERM) {
227 signal(signal_number, SIG_IGN);
250 errno, strerror(errno));
266 errno, strerror(errno));
290 errno, strerror(errno));
302 struct sigaction signal_action;
303 signal_action.sa_handler = signal_handler;
304 sigemptyset(&signal_action.sa_mask);
305 signal_action.sa_flags = 0;
307 ret = sigaction(SIGTERM, &signal_action, NULL);
310 "can't register signal handler for SIGTERM; %d message: %s",
311 errno, strerror(errno));
349 reboot(RB_POWER_OFF);
gpio_t * gpio_setup(int gpio_number, gpio_mode_t mode, const char *name)
int gpio_set_value(gpio_t *gpio, int value)
gpio_t * gpio_setup_interrupt(int gpio_number, gpio_interrupt_t edge, const char *name)
void gpio_release(gpio_t *gpio)
int gpio_wait_interrupt(gpio_t *gpio, const struct timespec *timeout)
#define GPIO_POWER
GPIO number of RocketLogger cape power enable.
@ GPIO_INTERRUPT_BOTH
Interrupt on both edges.
@ GPIO_MODE_OUT
GPIO write mode.
#define GPIO_BUTTON
GPIO number of start/stop button.
int rl_log(rl_log_level_t log_level, char const *const format,...)
int rl_log_init(char const *const log_file, rl_log_level_t verbosity)
@ RL_LOG_INFO
Information.
void rl_status_reset(rl_status_t *const status)
int rl_status_write(rl_status_t *const status)
void rl_config_reset(rl_config_t *const config)
int rl_status_read(rl_status_t *const status)
int rl_status_shm_init(void)
int rl_status_shm_deinit(void)
rl_status_t rl_status
Global RocketLogger status variable.
#define RL_SAMPLE_RATE_MIN
Minimum native sample rate of the ADC in samples per second.
#define SUCCESS
Function return value for successful completion.
#define RL_DAEMON_LOG_FILE
RocketLogger daemon log file.
int rl_run(rl_config_t *const config)
gpio_t * gpio_power
GPIO handle for power switch.
#define RL_POWERUP_DELAY_US
Delay on cape power up (in microseconds)
#define RL_BUTTON_VERY_LONG_PRESS_SEC
Min duration of a very long button press (in seconds)
#define RL_BUTTON_LONG_PRESS_SEC
Min duration of a long button press (in seconds)
volatile bool daemon_shutdown
Flag to terminate the infinite daemon loop.
enum system_action system_action_t
void button_interrupt_handler(int value)
#define RL_DAEMON_MIN_INTERVAL
Minimal time interval between two interrupts (in seconds)
gpio_t * gpio_button
GPIO handle for user button.
int adc_calibrate(uint64_t duration)
@ SYSTEM_ACTION_POWEROFF
power off the system
@ SYSTEM_ACTION_REBOOT
reboot the system
@ SYSTEM_ACTION_NONE
perform no system action
#define RL_CALIBRATION_DURATION_SEC
Duration of calibration run (in seconds)
#define RL_BUTTON_EXTRA_LONG_PRESS_SEC
Min duration of an extra long button press (in seconds)
bool interactive_enable
Display measurement data interactively in CLI while sampling.
bool background_enable
Put the measurement process in background after successful start.
uint64_t sample_limit
Sample limit (0 for continuous)
bool web_enable
Enable web interface connection.
uint32_t sample_rate
Sampling rate.
bool file_enable
Enable storing measurements to file.
bool sampling
Sampling state, true: sampling, false: idle.