#ifndef LIVOXPROTO1_CORE_H #define LIVOXPROTO1_CORE_H #include #include #include #include #include #include #include "device.h" #include "broadcastListener.h" #include "udpCommandDemuxer.h" #include "livoxProto1.h" #include namespace livoxProto1 { class DeviceManager { public: DeviceManager(); ~DeviceManager() = default; static void deviceGoneAwayInd(const comms::DiscoveredDevice &device); void getOrCreateDeviceReq( const std::string &deviceIdentifier, const std::shared_ptr& componentThread, int commandTimeoutMs, int retryDelayMs, const std::string& smoIp, uint8_t smoSubnetNbits, uint16_t dataPort, uint16_t cmdPort, uint16_t imuPort, smo::Callback callback); void destroyDeviceReq( std::shared_ptr device, smo::Callback callback); std::optional> getDevice( const std::string &deviceIdentifier); std::optional> getDevice( const comms::DiscoveredDevice &device) { return getDevice(device.deviceIdentifier); } private: // Configuration static constexpr int RETRY_DELAY_SECONDS = 3; // seconds delay public: std::vector> devices; comms::BroadcastListener broadcastListener; comms::UdpCommandDemuxer udpCommandDemuxer; // Nested continuation class for async device creation class GetOrCreateDeviceReq; class DestroyDeviceReq; }; void main( const std::shared_ptr &componentThread, const smo::stim_buff::SmoCallbacks& smoCallbacks); void exit(void); // Global state structure struct ProtoState { bool isInitialized = false; std::shared_ptr componentThread; std::unique_ptr deviceManager; smo::stim_buff::SmoCallbacks smoCallbacks; }; // Access to global state for extern "C" functions ProtoState& getProtoState(); } // namespace livoxProto1 #endif // LIVOXPROTO1_CORE_H