#pragma once #include #include #include #include #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; }; void panda_set_power(bool power); 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_unsafe_mode(uint16_t unsafe_mode); 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::Reader can_data_list); int can_receive(cereal::Event::Builder &event); };