Skip to content

Commit

Permalink
Broker: Rename task added
Browse files Browse the repository at this point in the history
  • Loading branch information
bcsanches committed Aug 14, 2024
1 parent 85ffdd0 commit affdef6
Show file tree
Hide file tree
Showing 22 changed files with 732 additions and 264 deletions.
2 changes: 2 additions & 0 deletions src/BrokerLib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ add_library(
sys/Thinker.h
sys/ZeroConfSystem.cpp
sys/ZeroConfSystem.h
terminal/DeviceRenameCmd.cpp
terminal/DeviceRenameCmd.h
terminal/ServiceCmdBase.cpp
terminal/ServiceCmdBase.h
terminal/ServoProgrammerCmds.cpp
Expand Down
55 changes: 52 additions & 3 deletions src/BrokerLib/dcc/DccLiteService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,13 +312,62 @@ namespace dcclite::broker
this->NotifyItemDestroyed(*session);
}

class DestroyUnregisteredDeviceEvent: public dcclite::broker::EventHub::IEvent
{
public:
DestroyUnregisteredDeviceEvent(DccLiteService &target, RName deviceName):
IEvent(target),
m_rnDeviceName{ deviceName }
{
//empty
}

void Fire() override
{
auto &service = static_cast<DccLiteService &>(this->GetTarget());

dcclite::Log::Info("[DccLiteService::DestroyUnregisteredDeviceEvent] Destroying {} device", m_rnDeviceName);

NetworkDevice *device = static_cast<NetworkDevice *>(service.m_pDevices->TryGetChild(m_rnDeviceName));
if (!device)
{
dcclite::Log::Info("[DccLiteService::DestroyUnregisteredDeviceEvent] Device {} not found!", m_rnDeviceName);

return;
}

if (device->IsConnectionStable())
{
dcclite::Log::Info("[DccLiteService::DestroyUnregisteredDeviceEvent] Device {} is connected, aborting!", m_rnDeviceName);

return;
}

auto item = service.m_pDevices->RemoveChild(m_rnDeviceName);
if (!item)
{
dcclite::Log::Warn("[DccLiteService::DestroyUnregisteredDeviceEvent] Device {} not found", m_rnDeviceName);

return;
}

service.NotifyItemDestroyed(*item.get());
}

private:
RName m_rnDeviceName;
};

void DccLiteService::Device_DestroyUnregistered(NetworkDevice &dev)
{
const auto name = dev.GetName();

if (dev.IsConnectionStable())
throw std::runtime_error(fmt::format("[DccLiteService::Device_DestroyUnregistered] Cannot destroy connected device {}", dev.GetName()));
throw std::runtime_error(fmt::format("[DccLiteService::Device_DestroyUnregistered] Cannot destroy connected device {}", name));

auto item = this->m_pDevices->RemoveChild(dev.GetName());
this->NotifyItemDestroyed(*item.get());
dcclite::Log::Info("[DccLiteService::Device_DestroyUnregistered] Requested to destroy {} device", name);
//fire a event to later destroy the device... to avoid functions touching a dead device under the callstack
EventHub::PostEvent<DestroyUnregisteredDeviceEvent>(std::ref(*this), name);
}

Decoder* DccLiteService::TryFindDecoder(const DccAddress address) const
Expand Down
2 changes: 2 additions & 0 deletions src/BrokerLib/dcc/DccLiteService.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@ namespace dcclite::broker

void Device_DestroyUnregistered(NetworkDevice &dev);

friend class DestroyUnregisteredDeviceEvent;

Decoder& Device_CreateDecoder(
IDevice_DecoderServices &dev,
const std::string &className,
Expand Down
44 changes: 32 additions & 12 deletions src/BrokerLib/dcc/NetworkDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace dcclite::broker
dcclite::Log::Warn("[Device::{}] [TimeoutController::OnThink] timeout", m_rclOwner.GetName());

//
//connection lost...
//connection lost...
m_rclOwner.GoOffline();
}

Expand Down Expand Up @@ -124,6 +124,17 @@ namespace dcclite::broker
return false;
}

void NetworkDevice::DisconnectDevice()
{
DevicePacket pkt{ dcclite::MsgTypes::DISCONNECT, m_SessionToken, m_ConfigToken };

m_clDccService.Device_SendPacket(m_RemoteAddress, pkt);

dcclite::Log::Warn("[Device::{}] [Disconnect] Sent disconnect packet", this->GetName());

this->GoOffline();
}

void NetworkDevice::OnUnload()
{
Device::OnUnload();
Expand All @@ -135,13 +146,7 @@ namespace dcclite::broker
if (m_kStatus == Status::OFFLINE)
return;

DevicePacket pkt{ dcclite::MsgTypes::DISCONNECT, m_SessionToken, m_ConfigToken };

m_clDccService.Device_SendPacket(m_RemoteAddress, pkt);

dcclite::Log::Warn("[Device::{}] [Disconnect] Sent disconnect packet", this->GetName());

this->GoOffline();
this->DisconnectDevice();
}

//
Expand Down Expand Up @@ -719,8 +724,11 @@ namespace dcclite::broker
m_clPinManager.Serialize(stream);
}

bool NetworkDevice::GoOffline()
void NetworkDevice::GoOffline()
{
if (m_kStatus == Status::OFFLINE)
return;

m_kStatus = Status::OFFLINE;

m_clDccService.Device_UnregisterSession(*this, m_SessionToken);
Expand All @@ -735,12 +743,10 @@ namespace dcclite::broker
m_clDccService.Device_NotifyStateChange(*this);

if (m_fRegistered)
return true;
return;

//kill ourselves...
m_clDccService.Device_DestroyUnregistered(*this);

return false;
}


Expand Down Expand Up @@ -930,6 +936,11 @@ namespace dcclite::broker
m_lstTasks.erase(it);
}

void NetworkDevice::TaskServices_Disconnect()
{
this->DisconnectDevice();
}

void NetworkDevice::AbortPendingTasks()
{
while (!m_lstTasks.empty())
Expand Down Expand Up @@ -973,4 +984,13 @@ namespace dcclite::broker

return task;
}

std::shared_ptr<NetworkTask> NetworkDevice::StartDeviceRenameTask(NetworkTask::IObserver *observer, RName newName)
{
auto task = detail::StartDeviceRenameTask(*this, ++g_u32TaskId, observer, newName);

m_lstTasks.push_back(task);

return task;
}
}
12 changes: 8 additions & 4 deletions src/BrokerLib/dcc/NetworkDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ namespace dcclite::broker

void TaskServices_FillPacketHeader(dcclite::Packet &packet, const uint32_t taskId, const NetworkTaskTypes taskType) const noexcept override;

void TaskServices_SendPacket(dcclite::Packet &packet) override;
void TaskServices_SendPacket(dcclite::Packet &packet) override;

void TaskServices_Disconnect() override;

bool IsConnectionStable() const noexcept override;

Expand All @@ -104,6 +106,7 @@ namespace dcclite::broker
//
[[nodiscard]] std::shared_ptr<NetworkTask> StartDownloadEEPromTask(NetworkTask::IObserver *observer, DownloadEEPromTaskResult_t &resultsStorage);
[[nodiscard]] std::shared_ptr<NetworkTask> StartServoTurnoutProgrammerTask(NetworkTask::IObserver *observer, RName servoDecoderName);
[[nodiscard]] std::shared_ptr<NetworkTask> StartDeviceRenameTask(NetworkTask::IObserver *observer, RName newName);

protected:
void OnUnload() override;
Expand All @@ -120,11 +123,10 @@ namespace dcclite::broker
* This methods sets the state as offline, such as in cases when a connection is dropped
*
* Also, if device is unregistered, the method maybe suicidal, device will be destroyed after going offline
*
* Returns true if still alive
*
*
*/
bool GoOffline();
void GoOffline();

template <typename T, class... Args>
void SetState(Args&&...args);
Expand All @@ -136,6 +138,8 @@ namespace dcclite::broker

void AbortPendingTasks();

void DisconnectDevice();

//
//INetworkDevice_DecoderServices
//
Expand Down
Loading

0 comments on commit affdef6

Please sign in to comment.