// SPDX-License-Identifier: Apache-2.0 // Copyright 2020 - 2021 Pionix GmbH and Contributors to EVerest #ifndef YETI_SERIAL #define YETI_SERIAL #include "yeti.pb.h" #include #include #include #include #include #include class evSerial { public: evSerial(); ~evSerial(); bool openDevice(const char* device, int baud); bool is_open() { return fd > 0; }; void readThread(); void run(); bool reset(const std::string& reset_chip, const int reset_line); void firmwareUpdate(bool rom); void keepAlive(); void setPWM(uint32_t dc); void allowPowerOn(bool p); void forceUnlock(); void set_number_of_phases(bool p); sigslot::signal signalKeepAliveLo; sigslot::signal signalPowerMeter; sigslot::signal signalCPState; sigslot::signal signalPPState; sigslot::signal signalErrorFlags; sigslot::signal signalRelaisState; sigslot::signal signalLockState; sigslot::signal<> signalSpuriousReset; sigslot::signal<> signalConnectionTimeout; private: // Serial interface bool setSerialAttributes(); int fd; int baud; // COBS de-/encoder void cobsDecodeReset(); void handlePacket(uint8_t* buf, int len); void cobsDecode(uint8_t* buf, int len); void cobsDecodeByte(uint8_t byte); size_t cobsEncode(const void* data, size_t length, uint8_t* buffer); uint8_t msg[2048]; uint8_t code; uint8_t block; uint8_t* decode; uint32_t crc32(uint8_t* buf, int len); // Read thread for serial port Everest::Thread readThreadHandle; Everest::Thread timeoutDetectionThreadHandle; bool linkWrite(EverestToMcu* m); volatile bool reset_done_flag; volatile bool forced_reset; bool serial_timed_out(); void timeoutDetectionThread(); std::chrono::time_point last_keep_alive_lo_timestamp; }; #endif