39#include <sys/reboot.h>
48#define RL_DAEMON_MIN_INTERVAL 1
51#define RL_CALIBRATION_DURATION_SEC 1
54#define RL_POWERUP_DELAY_US 5000
57#define RL_BUTTON_LONG_PRESS_SEC 3
60#define RL_BUTTON_VERY_LONG_PRESS_SEC 6
63#define RL_BUTTON_EXTRA_LONG_PRESS_SEC 10
122 int res =
rl_run(&rl_config_calibration);
140 static time_t timestamp_down = -1;
141 time_t timestamp = time(NULL);
145 timestamp_down = timestamp;
150 time_t duration = timestamp - timestamp_down;
154 if (duration > timestamp) {
168 "Registered extra long press, requesting system shutdown.");
176 "Registered very long press, requesting system reboot.");
184 "Registered long press, requesting daemon restart.");
192 char *cmd[3] = {
"rocketlogger", NULL, NULL};
203 errno, strerror(errno));
209 "Failed executing `rocketlogger %s`; %d message: %s", cmd,
210 errno, strerror(errno));
225static void signal_handler(
int signal_number) {
227 if (signal_number == SIGTERM) {
228 signal(signal_number, SIG_IGN);
251 errno, strerror(errno));
267 errno, strerror(errno));
296 struct sigaction signal_action;
297 signal_action.sa_handler = signal_handler;
298 sigemptyset(&signal_action.sa_mask);
299 signal_action.sa_flags = 0;
301 ret = sigaction(SIGTERM, &signal_action, NULL);
304 "can't register signal handler for SIGTERM; %d message: %s",
305 errno, strerror(errno));
351 reboot(RB_POWER_OFF);
int gpio_set_value(gpio_t *gpio, int value)
void gpio_release(gpio_t *gpio)
int gpio_wait_interrupt(gpio_t *gpio, const struct timespec *timeout)
gpio_t * gpio_setup_interrupt(int gpio_number, gpio_interrupt_t edge, const char *name)
gpio_t * gpio_setup(int gpio_number, gpio_mode_t mode, const char *name)
#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.
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.
uint64_t buffer_count
Number of buffers taken.
bool error
Whether the logger is in an error state.
bool sampling
Sampling state, true: sampling, false: idle.
uint64_t sample_count
Number of samples taken.