mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-19 00:43:54 +08:00
* change LSM6DS3TR(-c) gyroscope and accelerometer to interrupt
* add pthread for linking
* add interrupt collector thread to fetch in parallel to non interrupt based sensors
* change get_event interface to return true on successful read
* fetch sensor interrupts via gpiochip
* avoid sending empty messages (interrupt only, non interupt magn can leave a gap in the orphan block)
* add verifier script to sensor interrupts (sensor_data_to_hist.py)
* add/update sensord testsweet (test_sensord.py)
* add poll timed out check
* unexport interrupt gpio pins
* gpiochip on both edges, but skip falling edge if rising edge is detected, this is handled in the sensor as the status flag is checked if new data is availble
* add test to sensord to verify 100Hz interrupt frequency
* add sensor shutdown/low power mode functionality on sensord exit
* relax test, will be readded in the splitup PR
Co-authored-by: Kurt Nistelberger <kurt.nistelberger@gmail.com>
old-commit-hash: 84a3c355e5
66 lines
1.9 KiB
C++
66 lines
1.9 KiB
C++
#include "common/gpio.h"
|
|
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
#include <cstring>
|
|
#include <linux/gpio.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include "common/util.h"
|
|
#include "common/swaglog.h"
|
|
|
|
int gpio_init(int pin_nr, bool output) {
|
|
char pin_dir_path[50];
|
|
int pin_dir_path_len = snprintf(pin_dir_path, sizeof(pin_dir_path),
|
|
"/sys/class/gpio/gpio%d/direction", pin_nr);
|
|
if(pin_dir_path_len <= 0) {
|
|
return -1;
|
|
}
|
|
const char *value = output ? "out" : "in";
|
|
return util::write_file(pin_dir_path, (void*)value, strlen(value));
|
|
}
|
|
|
|
int gpio_set(int pin_nr, bool high) {
|
|
char pin_val_path[50];
|
|
int pin_val_path_len = snprintf(pin_val_path, sizeof(pin_val_path),
|
|
"/sys/class/gpio/gpio%d/value", pin_nr);
|
|
if(pin_val_path_len <= 0) {
|
|
return -1;
|
|
}
|
|
return util::write_file(pin_val_path, (void*)(high ? "1" : "0"), 1);
|
|
}
|
|
|
|
int gpiochip_get_ro_value_fd(const char* consumer_label, int gpiochiop_id, int pin_nr) {
|
|
|
|
// Assumed that all interrupt pins are unexported and rights are given to
|
|
// read from gpiochip0.
|
|
std::string gpiochip_path = "/dev/gpiochip" + std::to_string(gpiochiop_id);
|
|
int fd = open(gpiochip_path.c_str(), O_RDONLY);
|
|
if (fd < 0) {
|
|
LOGE("Error opening gpiochip0 fd")
|
|
return -1;
|
|
}
|
|
|
|
// Setup event
|
|
struct gpioevent_request rq;
|
|
rq.lineoffset = pin_nr;
|
|
rq.handleflags = GPIOHANDLE_REQUEST_INPUT;
|
|
|
|
/* Requesting both edges as the data ready pulse from the lsm6ds sensor is
|
|
very short(75us) and is mostly detected as falling edge instead of rising.
|
|
So if it is detected as rising the following falling edge is skipped. */
|
|
rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES;
|
|
|
|
strncpy(rq.consumer_label, consumer_label, std::size(rq.consumer_label) - 1);
|
|
int ret = ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &rq);
|
|
if (ret == -1) {
|
|
LOGE("Unable to get line event from ioctl : %s", strerror(errno));
|
|
close(fd);
|
|
return -1;
|
|
}
|
|
|
|
close(fd);
|
|
return rq.fd;
|
|
}
|