mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-06-29 10:32:10 +08:00
562394e2ae
* start on panda abstraction layer * handle bulk transfer in library * Safety model abstraction * Abstract hw type into library * Handle disconnect * RTC stuff * Fan control * Health * Panda fw version * Read serial * Power saving * Power mode * Cleanup pigeon thread init * Rename safety setter variable name * Remove comment * Unused global cleanup * malloc -> new * whitespace * Use std::thread * Use std::thread for safety setter * Cleanup igntion_last global * Heartbeat * logd * More global cleanup * Put back sleep * ir pwr * Always broadcast health * init struct with zeroes * Fix eon build * fix race condition * fix Adeebs comments * abstract can send and receive old-commit-hash: 80acb328252d8ed80c18a98457c6d788073ed26e
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <ctime>
|
|
#include <cstdint>
|
|
#include <pthread.h>
|
|
|
|
#include <libusb-1.0/libusb.h>
|
|
|
|
#include "cereal/gen/cpp/car.capnp.h"
|
|
#include "cereal/gen/cpp/log.capnp.h"
|
|
|
|
// double the FIFO size
|
|
#define RECV_SIZE (0x1000)
|
|
#define TIMEOUT 0
|
|
|
|
// copied from panda/board/main.c
|
|
struct __attribute__((packed)) health_t {
|
|
uint32_t uptime;
|
|
uint32_t voltage;
|
|
uint32_t current;
|
|
uint32_t can_rx_errs;
|
|
uint32_t can_send_errs;
|
|
uint32_t can_fwd_errs;
|
|
uint32_t gmlan_send_errs;
|
|
uint32_t faults;
|
|
uint8_t ignition_line;
|
|
uint8_t ignition_can;
|
|
uint8_t controls_allowed;
|
|
uint8_t gas_interceptor_detected;
|
|
uint8_t car_harness_status;
|
|
uint8_t usb_power_mode;
|
|
uint8_t safety_model;
|
|
uint8_t fault_status;
|
|
uint8_t power_save_enabled;
|
|
};
|
|
|
|
class Panda {
|
|
private:
|
|
libusb_context *ctx = NULL;
|
|
libusb_device_handle *dev_handle = NULL;
|
|
pthread_mutex_t usb_lock;
|
|
void handle_usb_issue(int err, const char func[]);
|
|
void cleanup();
|
|
|
|
public:
|
|
Panda();
|
|
~Panda();
|
|
|
|
bool connected = true;
|
|
cereal::HealthData::HwType hw_type = cereal::HealthData::HwType::UNKNOWN;
|
|
bool is_pigeon = false;
|
|
bool has_rtc = false;
|
|
|
|
// HW communication
|
|
int usb_write(uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned int timeout=TIMEOUT);
|
|
int usb_read(uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout=TIMEOUT);
|
|
int usb_bulk_write(unsigned char endpoint, unsigned char* data, int length, unsigned int timeout=TIMEOUT);
|
|
int usb_bulk_read(unsigned char endpoint, unsigned char* data, int length, unsigned int timeout=TIMEOUT);
|
|
|
|
// Panda functionality
|
|
cereal::HealthData::HwType get_hw_type();
|
|
void set_safety_model(cereal::CarParams::SafetyModel safety_model, int safety_param=0);
|
|
void set_rtc(struct tm sys_time);
|
|
struct tm get_rtc();
|
|
void set_fan_speed(uint16_t fan_speed);
|
|
uint16_t get_fan_speed();
|
|
void set_ir_pwr(uint16_t ir_pwr);
|
|
health_t get_health();
|
|
void set_loopback(bool loopback);
|
|
const char* get_firmware_version();
|
|
const char* get_serial();
|
|
void set_power_saving(bool power_saving);
|
|
void set_usb_power_mode(cereal::HealthData::UsbPowerMode power_mode);
|
|
void send_heartbeat();
|
|
void can_send(capnp::List<cereal::CanData>::Reader can_data_list);
|
|
int can_receive(cereal::Event::Builder &event);
|
|
|
|
};
|