mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-08 21:43:44 +08:00
c1aeddbfea
Manage device power, parked services and vehicle-specific Panda wake behavior. Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com> Co-authored-by: Daniel Koepping <elkoled@gmail.com> Co-authored-by: firestarsdog <229254897+firestarsdog@users.noreply.github.com>
97 lines
3.4 KiB
C++
97 lines
3.4 KiB
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <cstdint>
|
|
#include <mutex>
|
|
#include <memory>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
|
|
#define TIMEOUT 0
|
|
#define SPI_BUF_SIZE 4096
|
|
|
|
|
|
class PandaCommsHandle {
|
|
public:
|
|
virtual ~PandaCommsHandle() = default;
|
|
std::string hw_serial;
|
|
std::atomic<bool> connected = true;
|
|
std::atomic<bool> comms_healthy = true;
|
|
virtual int control_write(uint8_t request, uint16_t param1, uint16_t param2, unsigned int timeout=TIMEOUT) = 0;
|
|
virtual int control_read(uint8_t request, uint16_t param1, uint16_t param2, unsigned char *data, uint16_t length, unsigned int timeout=TIMEOUT) = 0;
|
|
virtual int bulk_write(unsigned char endpoint, unsigned char *data, int length, unsigned int timeout=TIMEOUT) = 0;
|
|
virtual int bulk_read(unsigned char endpoint, unsigned char *data, int length, unsigned int timeout=TIMEOUT) = 0;
|
|
virtual void cleanup() = 0;
|
|
};
|
|
|
|
template <typename SpiFactory, typename UsbFactory>
|
|
std::unique_ptr<PandaCommsHandle> open_panda_handle(const std::string &serial, SpiFactory spi, UsbFactory usb) {
|
|
try {
|
|
return usb(serial);
|
|
} catch (const std::exception &) {
|
|
return spi(serial);
|
|
}
|
|
}
|
|
|
|
struct libusb_context;
|
|
struct libusb_device_handle;
|
|
|
|
class PandaUsbHandle : public PandaCommsHandle {
|
|
public:
|
|
explicit PandaUsbHandle(std::string serial);
|
|
~PandaUsbHandle() override;
|
|
int control_write(uint8_t request, uint16_t param1, uint16_t param2, unsigned int timeout=TIMEOUT) override;
|
|
int control_read(uint8_t request, uint16_t param1, uint16_t param2, unsigned char *data, uint16_t length, unsigned int timeout=TIMEOUT) override;
|
|
int bulk_write(unsigned char endpoint, unsigned char *data, int length, unsigned int timeout=TIMEOUT) override;
|
|
int bulk_read(unsigned char endpoint, unsigned char *data, int length, unsigned int timeout=TIMEOUT) override;
|
|
void cleanup() override;
|
|
static std::vector<std::string> list();
|
|
private:
|
|
libusb_context *ctx = nullptr;
|
|
libusb_device_handle *dev_handle = nullptr;
|
|
std::recursive_mutex hw_lock;
|
|
bool claimed = false;
|
|
void handle_usb_issue(int err);
|
|
};
|
|
|
|
class PandaSpiHandle : public PandaCommsHandle {
|
|
public:
|
|
PandaSpiHandle(std::string serial);
|
|
~PandaSpiHandle();
|
|
|
|
int control_write(uint8_t request, uint16_t param1, uint16_t param2, unsigned int timeout=TIMEOUT);
|
|
int control_read(uint8_t request, uint16_t param1, uint16_t param2, unsigned char *data, uint16_t length, unsigned int timeout=TIMEOUT);
|
|
int bulk_write(unsigned char endpoint, unsigned char* data, int length, unsigned int timeout=TIMEOUT);
|
|
int bulk_read(unsigned char endpoint, unsigned char* data, int length, unsigned int timeout=TIMEOUT);
|
|
void cleanup();
|
|
|
|
static std::vector<std::string> list();
|
|
|
|
private:
|
|
int spi_fd = -1;
|
|
uint8_t tx_buf[SPI_BUF_SIZE];
|
|
uint8_t rx_buf[SPI_BUF_SIZE];
|
|
inline static std::recursive_mutex hw_lock;
|
|
|
|
struct __attribute__((packed)) spi_header {
|
|
uint8_t endpoint;
|
|
uint32_t id;
|
|
uint16_t tx_len;
|
|
uint16_t rx_len;
|
|
};
|
|
struct __attribute__((packed)) spi_resp_header {
|
|
uint8_t status;
|
|
uint32_t id;
|
|
uint16_t len;
|
|
};
|
|
|
|
int spi_transfer(uint8_t endpoint, uint32_t id, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len, double deadline);
|
|
int spi_transfer_retry(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len, unsigned int timeout);
|
|
int lltransfer(struct spi_ioc_transfer &t);
|
|
|
|
spi_header header;
|
|
uint32_t xfer_count = 0;
|
|
};
|