From 51088892c24b4fc0c091ce3ab5523e904ba363cf Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Thu, 18 Nov 2021 14:18:08 -0500 Subject: [PATCH 01/12] Possibly fixed delays on spi --- src/bsp/src/stm32/include/SpiEsp.h | 2 +- src/bsp/src/stm32/src/SpiEsp.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bsp/src/stm32/include/SpiEsp.h b/src/bsp/src/stm32/include/SpiEsp.h index 3d0f43eea..27abf97ea 100644 --- a/src/bsp/src/stm32/include/SpiEsp.h +++ b/src/bsp/src/stm32/include/SpiEsp.h @@ -51,7 +51,7 @@ class SpiEsp : public ICommInterface { std::array m_data; CircularBuff m_circularBuf; - TaskHandle_t m_receivingTaskHandle, m_sendingTaskHandle = nullptr; + TaskHandle_t m_receivingTaskHandle, m_sendingTaskHandle, m_driverTaskHandle = nullptr; EspHeader::Header m_outboundHeader; EspHeader::Header* m_inboundHeader; diff --git a/src/bsp/src/stm32/src/SpiEsp.cpp b/src/bsp/src/stm32/src/SpiEsp.cpp index abec4e95b..b51a6cce1 100644 --- a/src/bsp/src/stm32/src/SpiEsp.cpp +++ b/src/bsp/src/stm32/src/SpiEsp.cpp @@ -5,7 +5,7 @@ #include void task(void* context) { - constexpr uint16_t loopRate = 20; + constexpr uint16_t loopRate = 1; while (true) { static_cast(context)->execute(); Task::delay(loopRate); @@ -84,6 +84,9 @@ void SpiEsp::execute() { uint32_t txLengthBytes = 0; uint32_t rxLengthBytes = 0; auto* txBuffer = (uint8_t*)&m_outboundHeader; // Send header by default; + if (m_driverTaskHandle == nullptr) { + m_driverTaskHandle = xTaskGetCurrentTaskHandle(); + } switch (m_rxState) { case receiveState::IDLE: @@ -223,6 +226,7 @@ void SpiEsp::execute() { m_inboundMessage.m_data.fill(0); EspSpi_TransmitReceiveDma(txBuffer, m_inboundMessage.m_data.data(), finalSize, SpiEsp::espTxRxCallback, this); + ulTaskNotifyTake(pdTRUE, 20); } } @@ -265,6 +269,9 @@ void SpiEsp::espTxRxCallback(void* context) { instance->m_outboundMessage.m_payloadSize = 0; instance->m_hasSentPayload = true; } + BaseType_t yield; + vTaskNotifyGiveFromISR(instance->m_driverTaskHandle, &yield); + portYIELD_FROM_ISR(yield); } ConnectionType SpiEsp::getType() const { return ConnectionType::SPI; } From a2121b4e8b22803e28c5cf534017add85751e1e5 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Tue, 23 Nov 2021 21:57:24 -0500 Subject: [PATCH 02/12] Can now handle remote HM host api calls (possibly) --- .../src/HiveMindHostApiRequestHandler.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/message-handler/src/HiveMindHostApiRequestHandler.cpp b/src/message-handler/src/HiveMindHostApiRequestHandler.cpp index fb42ca0c5..67150bf4b 100644 --- a/src/message-handler/src/HiveMindHostApiRequestHandler.cpp +++ b/src/message-handler/src/HiveMindHostApiRequestHandler.cpp @@ -30,6 +30,9 @@ bool HiveMindHostApiRequestHandler::handleHiveMindHostApiRequest( uint16_t requestId, const MessageDTO& message, const HiveMindHostApiRequestDTO& request) { if (std::holds_alternative(request.getRequest())) { + if (m_bsp.getUUId() != message.getSourceId()) { + return m_remoteQueue.push(message); + } return m_hostQueue.push(message); } @@ -48,6 +51,9 @@ bool HiveMindHostApiRequestHandler::handleHiveMindHostApiRequest( HiveMindHostApiResponseDTO hmResp(neighborResp); ResponseDTO resp(requestId, hmResp); MessageDTO msg(m_bsp.getUUId(), message.getSourceId(), resp); + if (m_bsp.getUUId() != message.getSourceId()) { + return m_remoteQueue.push(msg); + } return m_hostQueue.push(msg); } @@ -65,6 +71,9 @@ bool HiveMindHostApiRequestHandler::handleHiveMindHostApiRequest( HiveMindHostApiResponseDTO hmResp(neighborResp); ResponseDTO resp(requestId, hmResp); MessageDTO msg(m_bsp.getUUId(), message.getSourceId(), resp); + if (m_bsp.getUUId() != message.getSourceId()) { + return m_remoteQueue.push(msg); + } return m_hostQueue.push(msg); } From 88e949fff0266033929bf6448ece5e203d62bde3 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Tue, 23 Nov 2021 21:58:09 -0500 Subject: [PATCH 03/12] Changed back bzz script to blinky --- src/bittybuzz/buzz_scripts/main.bzz | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bittybuzz/buzz_scripts/main.bzz b/src/bittybuzz/buzz_scripts/main.bzz index 31cfb1f9e..5080dfefb 100644 --- a/src/bittybuzz/buzz_scripts/main.bzz +++ b/src/bittybuzz/buzz_scripts/main.bzz @@ -1,4 +1,4 @@ -include "behaviors/follow_leader.bzz" +include "behaviors/blinky.bzz" function init() { exec = create_exec(100); From 3bccb06760dec7a31fe266a9f2aa994e7c16d616 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Thu, 2 Dec 2021 09:16:23 -0500 Subject: [PATCH 04/12] Added code for metrics --- src/Main.cpp | 284 ++++++++++++------ src/bittybuzz/buzz_scripts/main.bzz | 2 +- .../message-handler/MessageDispatcher.h | 2 +- 3 files changed, 189 insertions(+), 99 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index a2309331f..3dea6d813 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -34,32 +34,32 @@ using commInterfaceGetter = std::optional using connectionStateSetter = void (*)(ConnectionState state); class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { - public: +public: BittyBuzzTask(const char* taskName, UBaseType_t priority, IDeviceStateUI& deviceStateUI, IButtonCallbackRegister& buttonCallbackRegister) : - AbstractTask(taskName, priority), - m_logger(LoggerContainer::getLogger()), - m_deviceStateUI(deviceStateUI), - m_buttonCallbackRegister(buttonCallbackRegister), - m_bytecode(BittyBuzzFactory::createBittyBuzzBytecode(m_logger)), - m_stringResolver(BittyBuzzFactory::createBittyBuzzStringResolver(m_logger)), - m_bittybuzzVm(m_bytecode, - m_stringResolver, - BittyBuzzContainer::getBBZMessageHandler(), - BittyBuzzContainer::getBBZClosureRegister(), - BittyBuzzContainer::getBBZMessageService(), - BittyBuzzContainer::getBBZNeighborsManager(), - ApplicationInterfaceContainer::getUserUI(), - BSPContainer::getBSP(), - m_logger, - BSPContainer::getUserInterface()) {} + AbstractTask(taskName, priority), + m_logger(LoggerContainer::getLogger()), + m_deviceStateUI(deviceStateUI), + m_buttonCallbackRegister(buttonCallbackRegister), + m_bytecode(BittyBuzzFactory::createBittyBuzzBytecode(m_logger)), + m_stringResolver(BittyBuzzFactory::createBittyBuzzStringResolver(m_logger)), + m_bittybuzzVm(m_bytecode, + m_stringResolver, + BittyBuzzContainer::getBBZMessageHandler(), + BittyBuzzContainer::getBBZClosureRegister(), + BittyBuzzContainer::getBBZMessageService(), + BittyBuzzContainer::getBBZNeighborsManager(), + ApplicationInterfaceContainer::getUserUI(), + BSPContainer::getBSP(), + m_logger, + BSPContainer::getUserInterface()) {} ~BittyBuzzTask() override = default; - private: +private: ILogger& m_logger; IDeviceStateUI& m_deviceStateUI; IButtonCallbackRegister& m_buttonCallbackRegister; @@ -86,7 +86,7 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { auto uiLib = BittyBuzzFactory::createBittyBuzzUILib(); std::array, 3> buzzLibraries{ - {globalLib, mathLib, uiLib}}; + {globalLib, mathLib, uiLib}}; // register btn function m_buttonCallbackRegister.setCallback(resetVmButtonCallback, this); @@ -110,27 +110,27 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { if (m_bittybuzzVm.getState() == BBZVM_STATE_READY) { BBVMRet statusCode = m_bittybuzzVm.step(); switch (statusCode) { - case BBVMRet::Ok: - m_deviceStateUI.setDeviceState(DeviceState::Ok); - break; - case BBVMRet::Stopped: { - m_logger.log(LogLevel::Warn, "BBZVM is stopped, cannot step"); - m_deviceStateUI.setDeviceState(DeviceState::Error); - break; - } - case BBVMRet::OutMsgErr: { - m_logger.log(LogLevel::Warn, "Buzz could not sent message"); - m_deviceStateUI.setDeviceState(DeviceState::Error); - break; - } - case BBVMRet::VmErr: { - m_logger.log(LogLevel::Error, "BBZVM failed to step. state: %s err: %s", - BittyBuzzSystem::getStateString(m_bittybuzzVm.getState()), - BittyBuzzSystem::getErrorString(m_bittybuzzVm.getError())); - m_deviceStateUI.setDeviceState( - vmErrorToDeviceState(m_bittybuzzVm.getError())); - break; - } + case BBVMRet::Ok: + m_deviceStateUI.setDeviceState(DeviceState::Ok); + break; + case BBVMRet::Stopped: { + m_logger.log(LogLevel::Warn, "BBZVM is stopped, cannot step"); + m_deviceStateUI.setDeviceState(DeviceState::Error); + break; + } + case BBVMRet::OutMsgErr: { + m_logger.log(LogLevel::Warn, "Buzz could not sent message"); + m_deviceStateUI.setDeviceState(DeviceState::Error); + break; + } + case BBVMRet::VmErr: { + m_logger.log(LogLevel::Error, "BBZVM failed to step. state: %s err: %s", + BittyBuzzSystem::getStateString(m_bittybuzzVm.getState()), + BittyBuzzSystem::getErrorString(m_bittybuzzVm.getError())); + m_deviceStateUI.setDeviceState( + vmErrorToDeviceState(m_bittybuzzVm.getError())); + break; + } } } Task::delayUntil(prevWake, (uint16_t)stepDelay); @@ -146,21 +146,21 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { }; class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { - public: +public: MessageDispatcherTask(const char* taskName, UBaseType_t priority, ICommInterface* stream, ICircularQueue& streamQueue) : - AbstractTask(taskName, priority), - m_stream(stream), - m_streamQueue(streamQueue), - m_logger(LoggerContainer::getLogger()) {} + AbstractTask(taskName, priority), + m_stream(stream), + m_streamQueue(streamQueue), + m_logger(LoggerContainer::getLogger()) {} ~MessageDispatcherTask() override = default; void setStream(ICommInterface* stream) { m_stream = stream; } - private: +private: ICommInterface* m_stream; ICircularQueue& m_streamQueue; ILogger& m_logger; @@ -171,13 +171,13 @@ class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> HiveMindHostDeserializer deserializer(*m_stream); HiveMindHostAccumulatorSerializer serializer(*m_stream); HiveMindHostApiRequestHandler hivemindApiReqHandler = - MessageHandlerContainer::createHiveMindHostApiRequestHandler(); + MessageHandlerContainer::createHiveMindHostApiRequestHandler(); HiveConnectHiveMindApiMessageHandler hiveconnectApiMessageHandler = - MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); + MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); GreetSender greetSender(m_streamQueue, BSPContainer::getBSP()); MessageDispatcher messageDispatcher = MessageHandlerContainer::createMessageDispatcher( - deserializer, hivemindApiReqHandler, hiveconnectApiMessageHandler, greetSender); + deserializer, hivemindApiReqHandler, hiveconnectApiMessageHandler, greetSender); while (m_stream->isConnected()) { if (!messageDispatcher.deserializeAndDispatch()) { @@ -190,24 +190,24 @@ class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> }; class MessageSenderTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { - public: +public: MessageSenderTask(const char* taskName, UBaseType_t priority, ICommInterface* stream, INotificationQueue& streamQueue, bool keepRunning = false) : - AbstractTask(taskName, priority), - m_stream(stream), - m_streamQueue(streamQueue), - m_logger(LoggerContainer::getLogger()), - m_keepRunning(keepRunning) {} + AbstractTask(taskName, priority), + m_stream(stream), + m_streamQueue(streamQueue), + m_logger(LoggerContainer::getLogger()), + m_keepRunning(keepRunning) {} ~MessageSenderTask() override = default; void setStream(ICommInterface* stream) { m_stream = stream; } void setSerializer(IHiveMindHostSerializer* serializer) { m_serializer = serializer; } - private: +private: ICommInterface* m_stream; INotificationQueue& m_streamQueue; ILogger& m_logger; @@ -236,7 +236,7 @@ class MessageSenderTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { template class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { - public: +public: CommMonitoringTask(const char* taskName, UBaseType_t priority, MessageDispatcherTask& dispatcherTask, @@ -244,15 +244,15 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { IHandshakeUI& handshakeUI, commInterfaceGetter commInterfaceGetter, connectionStateSetter connectionStateSetter) : - AbstractTask(taskName, priority), - m_dispatcherTask(dispatcherTask), - m_senderTask(senderTask), - m_handshakeUI(handshakeUI), - m_commInterfaceGetter(commInterfaceGetter), - m_connectionStateSetter(connectionStateSetter), - m_logger(LoggerContainer::getLogger()) {} - - private: + AbstractTask(taskName, priority), + m_dispatcherTask(dispatcherTask), + m_senderTask(senderTask), + m_handshakeUI(handshakeUI), + m_commInterfaceGetter(commInterfaceGetter), + m_connectionStateSetter(connectionStateSetter), + m_logger(LoggerContainer::getLogger()) {} + +private: MessageDispatcherTask& m_dispatcherTask; MessageSenderTask& m_senderTask; IHandshakeUI& m_handshakeUI; @@ -292,11 +292,11 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { Task::delay(1000); if (m_dispatcherTask.isRunning() != m_senderTask.isRunning()) { const char* taskStuckRuning = - m_dispatcherTask.isRunning() + m_dispatcherTask.isRunning() ? m_dispatcherTask.getTaskName() : m_senderTask.getTaskName(); const char* taskEndedRuning = - !m_dispatcherTask.isRunning() + !m_dispatcherTask.isRunning() ? m_dispatcherTask.getTaskName() : m_senderTask.getTaskName(); m_logger.log(LogLevel::Warn, @@ -316,26 +316,26 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { }; class HardwareInterlocTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { - public: +public: HardwareInterlocTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority) {} + AbstractTask(taskName, priority) {} ~HardwareInterlocTask() override = default; - private: +private: void task() override { BSPContainer::getInterlocManager().startInterloc(); } }; class InterlocMessageHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { - public: +public: InterlocMessageHandlerTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), - m_interlocMessageQueue(MessageHandlerContainer::getInterlocMsgQueue()), - m_interlocMessageHandler(InterlocContainer::getInterlocMessageHandler()) {} + AbstractTask(taskName, priority), + m_interlocMessageQueue(MessageHandlerContainer::getInterlocMsgQueue()), + m_interlocMessageHandler(InterlocContainer::getInterlocMessageHandler()) {} ~InterlocMessageHandlerTask() override = default; - private: +private: NotificationQueue& m_interlocMessageQueue; IInterlocMessageHandler& m_interlocMessageHandler; @@ -351,13 +351,13 @@ class InterlocMessageHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_ }; class InterlocDataHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { - public: +public: InterlocDataHandlerTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), m_interloc(InterlocContainer::getInterloc()) {} + AbstractTask(taskName, priority), m_interloc(InterlocContainer::getInterloc()) {} ~InterlocDataHandlerTask() override = default; - private: +private: IInterloc& m_interloc; void task() override { @@ -368,15 +368,15 @@ class InterlocDataHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZ }; class LogInterlocTask : public AbstractTask<4 * configMINIMAL_STACK_SIZE> { - public: +public: LogInterlocTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), - m_interloc(InterlocContainer::getInterloc()), - m_logger(LoggerContainer::getLogger()) {} + AbstractTask(taskName, priority), + m_interloc(InterlocContainer::getInterloc()), + m_logger(LoggerContainer::getLogger()) {} ~LogInterlocTask() override = default; - private: +private: IInterloc& m_interloc; ILogger& m_logger; @@ -392,6 +392,74 @@ class LogInterlocTask : public AbstractTask<4 * configMINIMAL_STACK_SIZE> { Task::delay(1000); } } +}; + +class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { +public: + Metrics(const char* taskName, UBaseType_t priority, ILogger& logger, IBSP& bsp, + IHiveMindHostSerializer& hostSerializer, IHiveMindHostSerializer& remoteSerializer, + IMessageDispatcher& hostDispatcher, IMessageDispatcher& remoteDispatcher): + AbstractTask(taskName, priority), m_logger(logger), m_bsp(bsp), + m_hostSerializer(hostSerializer), m_remoteSerializer(remoteSerializer), + m_hostDispatcher(hostDispatcher), m_remoteDispatcher(remoteDispatcher) {} + + ~Metrics() override = default; + + Task::Time m_averageHostTime; + Task::Time m_averageRemoteTime; + + + void task() override { + // This handles greetings + m_logger.log(LogLevel::Warn, "Waiting for greetings"); + m_hostDispatcher.deserializeAndDispatch(); + m_logger.log(LogLevel::Warn, "Got host greeting"); + m_remoteDispatcher.deserializeAndDispatch(); + m_logger.log(LogLevel::Warn, "Got remote greeting"); + while (true) { + uint8_t timingCounts = 10; + // Testing host + FunctionCallRequestDTO call("getStatus", nullptr, 0); + UserCallRequestDTO userCallRequestDto(UserCallTargetDTO::BUZZ, UserCallTargetDTO::HOST, call); + RequestDTO requestDto(0, userCallRequestDto); + MessageDTO hostMessageDto(m_bsp.getUUId(),m_bsp.getUUId(), requestDto); + for (uint8_t i = 0; i < timingCounts; i++) { + auto start = Task::getTime(); + m_hostSerializer.serializeToStream(hostMessageDto); + m_hostDispatcher.deserializeAndDispatch(); + auto finish = Task::getTime(); + m_averageHostTime += (finish - start) / timingCounts; + } + m_logger.log(LogLevel::Warn, "Host took %d milliseconds per message", m_averageHostTime); + // Testing remote + GetAgentsListRequestDTO request; + HiveConnectHiveMindApiDTO hiveConnectHiveMindApiDto(0, request); + MessageDTO remoteMessage(m_bsp.getUUId(), m_bsp.getUUId(), hiveConnectHiveMindApiDto); + for (uint8_t i = 0; i < timingCounts; i++) { + auto start = Task::getTime(); + m_remoteSerializer.serializeToStream(hostMessageDto); + m_remoteDispatcher.deserializeAndDispatch(); + auto finish = Task::getTime(); + m_averageRemoteTime += (finish - start) / timingCounts; + } + m_logger.log(LogLevel::Warn, "Remote took %d milliseconds per message", m_averageRemoteTime); + m_logger.log(LogLevel::Warn, "Metrics obtained, restarting in 5 seconds"); + Task::delay(5000); + } + } + + +private: + ILogger& m_logger; + IBSP& m_bsp; + IHiveMindHostSerializer& m_hostSerializer; + IHiveMindHostSerializer& m_remoteSerializer; + IMessageDispatcher& m_hostDispatcher; + IMessageDispatcher& m_remoteDispatcher; + + + + }; // Gets the comm interface for the host and sets the UI for wich one was obtained @@ -403,14 +471,14 @@ std::optional> hostInterfaceGetter() { if (commInterface) { ConnectionType type = commInterface.value().get().getType(); switch (type) { - case ConnectionType::Ethernet: - connectionStateUI.setConnectionState(ConnectionState::Ethernet); - break; - case ConnectionType::USB: - connectionStateUI.setConnectionState(ConnectionState::USB); - break; - default: - connectionStateUI.setConnectionState(ConnectionState::Error); + case ConnectionType::Ethernet: + connectionStateUI.setConnectionState(ConnectionState::Ethernet); + break; + case ConnectionType::USB: + connectionStateUI.setConnectionState(ConnectionState::USB); + break; + default: + connectionStateUI.setConnectionState(ConnectionState::Error); } } return commInterface; @@ -432,9 +500,9 @@ int main(int argc, char** argv) { bsp.initChip((void*)&cmdLineArgs); ApplicationInterfaceContainer::getConnectionStateUI().setConnectionState( - ConnectionState::Booting); + ConnectionState::Booting); - __attribute__((section(".cmbss"))) static BittyBuzzTask s_bittybuzzTask( + /*__attribute__((section(".cmbss"))) static BittyBuzzTask s_bittybuzzTask( "bittybuzz", gc_taskNormalPriority, ApplicationInterfaceContainer::getDeviceStateUI(), ApplicationInterfaceContainer::getButton1CallbackRegister()); @@ -465,15 +533,37 @@ int main(int argc, char** argv) { static CommMonitoringTask s_remoteMonitorTask( "remote_monitor", gc_taskNormalPriority, s_remoteDispatchTask, s_remoteMessageSender, ApplicationInterfaceContainer::getRemoteHandshakeUI(), BSPContainer::getRemoteCommInterface, - setRemoteConnectionState); + setRemoteConnectionState);*/ - s_bittybuzzTask.start(); + while (!BSPContainer::getHostCommInterface().has_value() || !BSPContainer::getRemoteCommInterface().has_value()) { + LoggerContainer::getLogger().log(LogLevel::Warn, "Waiting for communication interfaces..."); + Task::delay(500); + } + static HiveMindHostSerializer s_hostSerializer(BSPContainer::getHostCommInterface().value()); + static HiveMindHostSerializer s_remoteSerializer(BSPContainer::getRemoteCommInterface().value()); + static HiveMindHostDeserializer s_hostDeserializer(BSPContainer::getHostCommInterface().value()); + static HiveMindHostDeserializer s_remoteDeserializer(BSPContainer::getRemoteCommInterface().value()); + static GreetSender s_hostGreetSender(MessageHandlerContainer::getHostMsgQueue(), BSPContainer::getBSP()); + static GreetSender s_remoteGreetSender(MessageHandlerContainer::getRemoteMsgQueue(), BSPContainer::getBSP()); + static HiveMindHostApiRequestHandler s_hmHandler = MessageHandlerContainer::createHiveMindHostApiRequestHandler(); + static HiveConnectHiveMindApiMessageHandler s_hcHandler = MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); + + static MessageDispatcher s_hostMessageDispatcher = MessageHandlerContainer::createMessageDispatcher( + s_hostDeserializer, s_hmHandler, s_hcHandler, s_hostGreetSender); + static MessageDispatcher s_remoteMessageDispatcher = MessageHandlerContainer::createMessageDispatcher( + s_remoteDeserializer, s_hmHandler, s_hcHandler, s_remoteGreetSender); + static Metrics s_metrics("metrics", gc_taskHighPriority, LoggerContainer::getLogger(), + BSPContainer::getBSP(), s_hostSerializer, s_remoteSerializer, + s_hostMessageDispatcher, s_remoteMessageDispatcher); + + /*s_bittybuzzTask.start(); s_hardwareInterlocTask.start(); s_interlocDataTask.start(); s_interlocMessageTask.start(); s_logInterlocTask.start(); s_hostMonitorTask.start(); - s_remoteMonitorTask.start(); + s_remoteMonitorTask.start();*/ + s_metrics.start(); Task::startScheduler(); return 0; diff --git a/src/bittybuzz/buzz_scripts/main.bzz b/src/bittybuzz/buzz_scripts/main.bzz index 5080dfefb..f99174043 100644 --- a/src/bittybuzz/buzz_scripts/main.bzz +++ b/src/bittybuzz/buzz_scripts/main.bzz @@ -1,7 +1,7 @@ include "behaviors/blinky.bzz" function init() { - exec = create_exec(100); + exec = create_exec(2000); } function step() { diff --git a/src/message-handler/include/message-handler/MessageDispatcher.h b/src/message-handler/include/message-handler/MessageDispatcher.h index 7f3945af5..fcce1e9dd 100644 --- a/src/message-handler/include/message-handler/MessageDispatcher.h +++ b/src/message-handler/include/message-handler/MessageDispatcher.h @@ -11,7 +11,7 @@ #include #include -class MessageDispatcher : IMessageDispatcher { +class MessageDispatcher : public IMessageDispatcher { public: MessageDispatcher(ICircularQueue& buzzOutputQ, ICircularQueue& hostOutputQ, From 2312ba3fe84bb3731d1ee37c2e78ab2312b2f4b5 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Thu, 2 Dec 2021 13:38:53 -0500 Subject: [PATCH 05/12] Reworked task creation for metrics --- src/Main.cpp | 56 +++++++------------ .../message-handler/MessageHandlerContainer.h | 5 ++ .../src/MessageHandlerContainer.cpp | 46 +++++++++++++++ 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index 3dea6d813..d3bd25757 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -396,25 +396,29 @@ class LogInterlocTask : public AbstractTask<4 * configMINIMAL_STACK_SIZE> { class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { public: - Metrics(const char* taskName, UBaseType_t priority, ILogger& logger, IBSP& bsp, - IHiveMindHostSerializer& hostSerializer, IHiveMindHostSerializer& remoteSerializer, - IMessageDispatcher& hostDispatcher, IMessageDispatcher& remoteDispatcher): - AbstractTask(taskName, priority), m_logger(logger), m_bsp(bsp), - m_hostSerializer(hostSerializer), m_remoteSerializer(remoteSerializer), - m_hostDispatcher(hostDispatcher), m_remoteDispatcher(remoteDispatcher) {} + Metrics(const char* taskName, UBaseType_t priority, ILogger& logger, IBSP& bsp): + AbstractTask(taskName, priority), m_logger(logger), m_bsp(bsp) {} ~Metrics() override = default; Task::Time m_averageHostTime; Task::Time m_averageRemoteTime; + void acquireInterfaces() { + m_hostDispatcher = &MessageHandlerContainer::createHostDispatcher(); + m_hostSerializer = &MessageHandlerContainer::createHostSerializer(); + m_remoteDispatcher = &MessageHandlerContainer::createRemoteDispatcher(); + m_remoteSerializer = &MessageHandlerContainer::createRemoteSerializer(); + } + void task() override { + acquireInterfaces(); // This handles greetings m_logger.log(LogLevel::Warn, "Waiting for greetings"); - m_hostDispatcher.deserializeAndDispatch(); + m_hostDispatcher->deserializeAndDispatch(); m_logger.log(LogLevel::Warn, "Got host greeting"); - m_remoteDispatcher.deserializeAndDispatch(); + m_remoteDispatcher->deserializeAndDispatch(); m_logger.log(LogLevel::Warn, "Got remote greeting"); while (true) { uint8_t timingCounts = 10; @@ -425,8 +429,8 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { MessageDTO hostMessageDto(m_bsp.getUUId(),m_bsp.getUUId(), requestDto); for (uint8_t i = 0; i < timingCounts; i++) { auto start = Task::getTime(); - m_hostSerializer.serializeToStream(hostMessageDto); - m_hostDispatcher.deserializeAndDispatch(); + m_hostSerializer->serializeToStream(hostMessageDto); + m_hostDispatcher->deserializeAndDispatch(); auto finish = Task::getTime(); m_averageHostTime += (finish - start) / timingCounts; } @@ -437,8 +441,8 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { MessageDTO remoteMessage(m_bsp.getUUId(), m_bsp.getUUId(), hiveConnectHiveMindApiDto); for (uint8_t i = 0; i < timingCounts; i++) { auto start = Task::getTime(); - m_remoteSerializer.serializeToStream(hostMessageDto); - m_remoteDispatcher.deserializeAndDispatch(); + m_remoteSerializer->serializeToStream(hostMessageDto); + m_remoteDispatcher->deserializeAndDispatch(); auto finish = Task::getTime(); m_averageRemoteTime += (finish - start) / timingCounts; } @@ -452,10 +456,10 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { private: ILogger& m_logger; IBSP& m_bsp; - IHiveMindHostSerializer& m_hostSerializer; - IHiveMindHostSerializer& m_remoteSerializer; - IMessageDispatcher& m_hostDispatcher; - IMessageDispatcher& m_remoteDispatcher; + IHiveMindHostSerializer* m_hostSerializer; + IHiveMindHostSerializer* m_remoteSerializer; + IMessageDispatcher* m_hostDispatcher; + IMessageDispatcher* m_remoteDispatcher; @@ -535,26 +539,8 @@ int main(int argc, char** argv) { ApplicationInterfaceContainer::getRemoteHandshakeUI(), BSPContainer::getRemoteCommInterface, setRemoteConnectionState);*/ - while (!BSPContainer::getHostCommInterface().has_value() || !BSPContainer::getRemoteCommInterface().has_value()) { - LoggerContainer::getLogger().log(LogLevel::Warn, "Waiting for communication interfaces..."); - Task::delay(500); - } - static HiveMindHostSerializer s_hostSerializer(BSPContainer::getHostCommInterface().value()); - static HiveMindHostSerializer s_remoteSerializer(BSPContainer::getRemoteCommInterface().value()); - static HiveMindHostDeserializer s_hostDeserializer(BSPContainer::getHostCommInterface().value()); - static HiveMindHostDeserializer s_remoteDeserializer(BSPContainer::getRemoteCommInterface().value()); - static GreetSender s_hostGreetSender(MessageHandlerContainer::getHostMsgQueue(), BSPContainer::getBSP()); - static GreetSender s_remoteGreetSender(MessageHandlerContainer::getRemoteMsgQueue(), BSPContainer::getBSP()); - static HiveMindHostApiRequestHandler s_hmHandler = MessageHandlerContainer::createHiveMindHostApiRequestHandler(); - static HiveConnectHiveMindApiMessageHandler s_hcHandler = MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); - - static MessageDispatcher s_hostMessageDispatcher = MessageHandlerContainer::createMessageDispatcher( - s_hostDeserializer, s_hmHandler, s_hcHandler, s_hostGreetSender); - static MessageDispatcher s_remoteMessageDispatcher = MessageHandlerContainer::createMessageDispatcher( - s_remoteDeserializer, s_hmHandler, s_hcHandler, s_remoteGreetSender); static Metrics s_metrics("metrics", gc_taskHighPriority, LoggerContainer::getLogger(), - BSPContainer::getBSP(), s_hostSerializer, s_remoteSerializer, - s_hostMessageDispatcher, s_remoteMessageDispatcher); + BSPContainer::getBSP()); /*s_bittybuzzTask.start(); s_hardwareInterlocTask.start(); diff --git a/src/message-handler/include/message-handler/MessageHandlerContainer.h b/src/message-handler/include/message-handler/MessageHandlerContainer.h index 1b7387c33..5c7728a2a 100644 --- a/src/message-handler/include/message-handler/MessageHandlerContainer.h +++ b/src/message-handler/include/message-handler/MessageHandlerContainer.h @@ -32,6 +32,11 @@ namespace MessageHandlerContainer { IHiveConnectHiveMindApiMessageHandler& hiveconnectApiMessageHandler, IGreetSender& greetSender); + MessageDispatcher& createHostDispatcher(); + MessageDispatcher& createRemoteDispatcher(); + IHiveMindHostSerializer& createHostSerializer(); + IHiveMindHostSerializer& createRemoteSerializer(); + /** *@brief get the buzz message queue *@return A reference to the buzz message queue */ diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index c97bd2612..b8f748dbb 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -6,6 +6,11 @@ #include #include #include +#include +#include +#include +#include "GreetSender.h" +#include "Task.h" constexpr uint16_t gc_queueMaxSize = 16; @@ -32,6 +37,47 @@ MessageDispatcher MessageHandlerContainer::createMessageDispatcher( LoggerContainer::getLogger()); } +MessageDispatcher& MessageHandlerContainer::createHostDispatcher() { + while (!BSPContainer::getHostCommInterface().has_value()) { + LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); + + } + static HiveMindHostDeserializer s_hostDeserializer(BSPContainer::getHostCommInterface().value()); + static GreetSender s_hostGreeter(getHostMsgQueue(), BSPContainer::getBSP()); + static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); + static HiveConnectHiveMindApiMessageHandler s_hcHandler(createHiveConnectHiveMindApiMessageHandler()); + static MessageDispatcher s_hostDispatcher( + createMessageDispatcher(s_hostDeserializer,s_hmHandler, s_hcHandler, s_hostGreeter)); + return s_hostDispatcher; + +} +MessageDispatcher& MessageHandlerContainer::createRemoteDispatcher() { + while (!BSPContainer::getRemoteCommInterface().has_value()) { + LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); + } + static HiveMindHostDeserializer s_remoteDeserializer(BSPContainer::getRemoteCommInterface().value()); + static GreetSender s_remoteGreeter(getRemoteMsgQueue(), BSPContainer::getBSP()); + static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); + static HiveConnectHiveMindApiMessageHandler s_hcHandler(createHiveConnectHiveMindApiMessageHandler()); + static MessageDispatcher s_remoteDispatcher( + createMessageDispatcher(s_remoteDeserializer,s_hmHandler, s_hcHandler, s_remoteGreeter)); + return s_remoteDispatcher; +} +IHiveMindHostSerializer& MessageHandlerContainer::createHostSerializer() { + while (!BSPContainer::getHostCommInterface().has_value()) { + LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); + } + static HiveMindHostAccumulatorSerializer s_hostSerializer(BSPContainer::getHostCommInterface().value()); + return s_hostSerializer; +} +IHiveMindHostSerializer& MessageHandlerContainer::createRemoteSerializer() { + while (!BSPContainer::getRemoteCommInterface().has_value()) { + LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); + } + static HiveMindHostAccumulatorSerializer s_remoteSerializer(BSPContainer::getRemoteCommInterface().value()); + return s_remoteSerializer; +} + ThreadSafeQueue& MessageHandlerContainer::getBuzzMsgQueue() { __attribute__((section(".cmbss"))) static Mutex s_mutex(10); __attribute__((section(".cmbss"))) static CircularQueueStack From 7948afe64d16641d43e9788e19226017c2611f70 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Thu, 2 Dec 2021 14:51:01 -0500 Subject: [PATCH 06/12] Fixes for metrics code --- src/Main.cpp | 12 +++++++----- src/message-handler/src/MessageHandlerContainer.cpp | 3 ++- src/os/freertos/include/freertos/FreeRTOSConfig.h | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index d3bd25757..c6025d397 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -415,11 +415,11 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { void task() override { acquireInterfaces(); // This handles greetings - m_logger.log(LogLevel::Warn, "Waiting for greetings"); + m_logger.log(LogLevel::Info, "Waiting for greetings"); m_hostDispatcher->deserializeAndDispatch(); - m_logger.log(LogLevel::Warn, "Got host greeting"); + m_logger.log(LogLevel::Info, "Got host greeting"); m_remoteDispatcher->deserializeAndDispatch(); - m_logger.log(LogLevel::Warn, "Got remote greeting"); + m_logger.log(LogLevel::Info, "Got remote greeting"); while (true) { uint8_t timingCounts = 10; // Testing host @@ -432,8 +432,9 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { m_hostSerializer->serializeToStream(hostMessageDto); m_hostDispatcher->deserializeAndDispatch(); auto finish = Task::getTime(); - m_averageHostTime += (finish - start) / timingCounts; + m_averageHostTime += (finish - start) ; } + m_averageHostTime /= timingCounts; m_logger.log(LogLevel::Warn, "Host took %d milliseconds per message", m_averageHostTime); // Testing remote GetAgentsListRequestDTO request; @@ -444,8 +445,9 @@ class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { m_remoteSerializer->serializeToStream(hostMessageDto); m_remoteDispatcher->deserializeAndDispatch(); auto finish = Task::getTime(); - m_averageRemoteTime += (finish - start) / timingCounts; + m_averageRemoteTime += (finish - start); } + m_averageRemoteTime /= timingCounts; m_logger.log(LogLevel::Warn, "Remote took %d milliseconds per message", m_averageRemoteTime); m_logger.log(LogLevel::Warn, "Metrics obtained, restarting in 5 seconds"); Task::delay(5000); diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index b8f748dbb..f2d5e71ef 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -40,7 +40,7 @@ MessageDispatcher MessageHandlerContainer::createMessageDispatcher( MessageDispatcher& MessageHandlerContainer::createHostDispatcher() { while (!BSPContainer::getHostCommInterface().has_value()) { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); - + Task::delay(300); } static HiveMindHostDeserializer s_hostDeserializer(BSPContainer::getHostCommInterface().value()); static GreetSender s_hostGreeter(getHostMsgQueue(), BSPContainer::getBSP()); @@ -54,6 +54,7 @@ MessageDispatcher& MessageHandlerContainer::createHostDispatcher() { MessageDispatcher& MessageHandlerContainer::createRemoteDispatcher() { while (!BSPContainer::getRemoteCommInterface().has_value()) { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); + Task::delay(300); } static HiveMindHostDeserializer s_remoteDeserializer(BSPContainer::getRemoteCommInterface().value()); static GreetSender s_remoteGreeter(getRemoteMsgQueue(), BSPContainer::getBSP()); diff --git a/src/os/freertos/include/freertos/FreeRTOSConfig.h b/src/os/freertos/include/freertos/FreeRTOSConfig.h index ccffed50f..f676ec908 100644 --- a/src/os/freertos/include/freertos/FreeRTOSConfig.h +++ b/src/os/freertos/include/freertos/FreeRTOSConfig.h @@ -64,6 +64,7 @@ #define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_STATIC_ALLOCATION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configRECORD_STACK_HIGH_ADDRESS 1 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 From 8a1880ddeb8d41f31d91ec8d804c33c35b8f27da Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 16:50:30 -0500 Subject: [PATCH 07/12] Reduced quality of service tom simplify code and improve stability --- src/Main.cpp | 12 ++-- src/bsp/src/stm32/hal/include/hal/esp_spi.h | 6 ++ src/bsp/src/stm32/hal/src/esp_spi.c | 2 + src/bsp/src/stm32/include/SpiEsp.h | 5 +- src/bsp/src/stm32/src/SpiEsp.cpp | 68 +++++---------------- 5 files changed, 29 insertions(+), 64 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index c6025d397..ab6c73f7f 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -508,7 +508,7 @@ int main(int argc, char** argv) { ApplicationInterfaceContainer::getConnectionStateUI().setConnectionState( ConnectionState::Booting); - /*__attribute__((section(".cmbss"))) static BittyBuzzTask s_bittybuzzTask( + __attribute__((section(".cmbss"))) static BittyBuzzTask s_bittybuzzTask( "bittybuzz", gc_taskNormalPriority, ApplicationInterfaceContainer::getDeviceStateUI(), ApplicationInterfaceContainer::getButton1CallbackRegister()); @@ -539,19 +539,15 @@ int main(int argc, char** argv) { static CommMonitoringTask s_remoteMonitorTask( "remote_monitor", gc_taskNormalPriority, s_remoteDispatchTask, s_remoteMessageSender, ApplicationInterfaceContainer::getRemoteHandshakeUI(), BSPContainer::getRemoteCommInterface, - setRemoteConnectionState);*/ + setRemoteConnectionState); - static Metrics s_metrics("metrics", gc_taskHighPriority, LoggerContainer::getLogger(), - BSPContainer::getBSP()); - - /*s_bittybuzzTask.start(); + s_bittybuzzTask.start(); s_hardwareInterlocTask.start(); s_interlocDataTask.start(); s_interlocMessageTask.start(); s_logInterlocTask.start(); s_hostMonitorTask.start(); - s_remoteMonitorTask.start();*/ - s_metrics.start(); + s_remoteMonitorTask.start(); Task::startScheduler(); return 0; diff --git a/src/bsp/src/stm32/hal/include/hal/esp_spi.h b/src/bsp/src/stm32/hal/include/hal/esp_spi.h index eda79a9f6..c4b0e2348 100644 --- a/src/bsp/src/stm32/hal/include/hal/esp_spi.h +++ b/src/bsp/src/stm32/hal/include/hal/esp_spi.h @@ -73,6 +73,12 @@ void EspSpi_WriteCS(bool state); */ bool EspSpi_ReadCS(); +/** + * Read the USER0 pin + * @return Status of the pin + */ +bool EspSpi_ReadUser0(); + /** * @brief Callback used when reception has finished. Calls the user callback provided in * espSpiTransmitDma() diff --git a/src/bsp/src/stm32/hal/src/esp_spi.c b/src/bsp/src/stm32/hal/src/esp_spi.c index c46717d97..d1029c163 100644 --- a/src/bsp/src/stm32/hal/src/esp_spi.c +++ b/src/bsp/src/stm32/hal/src/esp_spi.c @@ -71,6 +71,8 @@ void EspSpi_WriteCS(bool state) { bool EspSpi_ReadCS() { return HAL_GPIO_ReadPin(ESP_CS_GPIO_Port, ESP_CS_Pin) == GPIO_PIN_SET; } +bool EspSpi_ReadUser0() { return HAL_GPIO_ReadPin(ESP_USER0_Port, ESP_USER0_Pin) == GPIO_PIN_SET;} + void EspSpi_RxCallback() { if (rxCpltCallbackFct != NULL && rxCallbackContext != NULL) { rxCpltCallbackFct(rxCallbackContext); diff --git a/src/bsp/src/stm32/include/SpiEsp.h b/src/bsp/src/stm32/include/SpiEsp.h index 27abf97ea..68e15da9c 100644 --- a/src/bsp/src/stm32/include/SpiEsp.h +++ b/src/bsp/src/stm32/include/SpiEsp.h @@ -33,14 +33,13 @@ class SpiEsp : public ICommInterface { ICRC& m_crc; ILogger& m_logger; - enum class transmitState { IDLE, SENDING_HEADER, SENDING_PAYLOAD, ERROR } m_txState; + enum class transmitState { IDLE, SENDING_HEADER, SENDING_PAYLOAD } m_txState; enum class receiveState { IDLE, RECEIVING_HEADER, PARSING_HEADER, RECEIVING_PAYLOAD, - VALIDATE_CRC, - ERROR + VALIDATE_CRC } m_rxState; struct message { diff --git a/src/bsp/src/stm32/src/SpiEsp.cpp b/src/bsp/src/stm32/src/SpiEsp.cpp index b51a6cce1..5d47390aa 100644 --- a/src/bsp/src/stm32/src/SpiEsp.cpp +++ b/src/bsp/src/stm32/src/SpiEsp.cpp @@ -5,7 +5,8 @@ #include void task(void* context) { - constexpr uint16_t loopRate = 1; + // This is to give time for ESP to be ready for next transaction + constexpr uint16_t loopRate = 3; while (true) { static_cast(context)->execute(); Task::delay(loopRate); @@ -54,14 +55,13 @@ bool SpiEsp::send(const uint8_t* buffer, uint16_t length) { m_txState = transmitState::SENDING_HEADER; // Wait for transmission to be over. Will be notified when ACK received or upon error m_sendingTaskHandle = xTaskGetCurrentTaskHandle(); - ulTaskNotifyTake(pdTRUE, portMAX_DELAY); - if (m_txState == transmitState::ERROR) { - m_logger.log(LogLevel::Error, "Error occurred..."); - return false; + m_hasSentPayload = false; + while (!m_hasSentPayload) { + ulTaskNotifyTake(pdTRUE, 20); } m_logger.log(LogLevel::Debug, "Payload sent!"); m_sendingTaskHandle = nullptr; - return m_crcOK; + return true; } bool SpiEsp::receive(uint8_t* buffer, uint16_t length) { if (buffer == nullptr || length > ESP_SPI_MAX_MESSAGE_LENGTH) { @@ -82,7 +82,7 @@ bool SpiEsp::isConnected() const { return m_isConnected; } void SpiEsp::execute() { uint32_t txLengthBytes = 0; - uint32_t rxLengthBytes = 0; + uint32_t rxLengthBytes = EspHeader::sizeBytes; auto* txBuffer = (uint8_t*)&m_outboundHeader; // Send header by default; if (m_driverTaskHandle == nullptr) { m_driverTaskHandle = xTaskGetCurrentTaskHandle(); @@ -90,16 +90,12 @@ void SpiEsp::execute() { switch (m_rxState) { case receiveState::IDLE: - if (!m_inboundRequest) { - m_inboundRequest = EspSpi_ReadCS(); - } + m_inboundRequest = EspSpi_ReadUser0(); if (m_inboundRequest || m_txState != transmitState::IDLE) { - rxLengthBytes = EspHeader::sizeBytes; m_rxState = receiveState::RECEIVING_HEADER; } break; case receiveState::RECEIVING_HEADER: - rxLengthBytes = EspHeader::sizeBytes; break; case receiveState::PARSING_HEADER: m_inboundHeader = (EspHeader::Header*)m_inboundMessage.m_data.data(); @@ -109,10 +105,8 @@ void SpiEsp::execute() { m_logger.log(LogLevel::Debug, "Bytes were: | %d | %d | %d | %d |", m_inboundMessage.m_data[0], m_inboundMessage.m_data[1], m_inboundMessage.m_data[2], m_inboundMessage.m_data[3]); - m_rxState = receiveState::ERROR; - if (m_hasSentPayload) { - m_txState = transmitState::ERROR; - } + m_inboundMessage.m_sizeBytes = 0; + m_rxState = receiveState::RECEIVING_HEADER; m_isConnected = false; break; } @@ -138,17 +132,8 @@ void SpiEsp::execute() { m_outboundHeader.systemState.stmSystemState.failedCrc = 0; m_rxState = receiveState::RECEIVING_PAYLOAD; } else { - rxLengthBytes = EspHeader::sizeBytes; m_rxState = receiveState::RECEIVING_HEADER; } - // Payload has been sent. Check crc and notify sending task - if (m_hasSentPayload) { - m_hasSentPayload = false; - m_crcOK = !m_inboundHeader->systemState.stmSystemState.failedCrc; - if (m_sendingTaskHandle != nullptr) { - xTaskNotifyGive(m_sendingTaskHandle); - } - } break; case receiveState::RECEIVING_PAYLOAD: rxLengthBytes = m_inboundHeader->txSizeBytes; @@ -175,17 +160,6 @@ void SpiEsp::execute() { m_inboundMessage.m_payloadSize = 0; m_inboundMessage.m_sizeBytes = 0; m_rxState = receiveState::RECEIVING_HEADER; - rxLengthBytes = EspHeader::sizeBytes; - break; - case receiveState::ERROR: - rxLengthBytes = EspHeader::sizeBytes; - m_inboundMessage.m_sizeBytes = 0; - m_rxState = receiveState::RECEIVING_HEADER; - CircularBuff_clear(&m_circularBuf); - if (m_receivingTaskHandle != nullptr) { - xTaskNotifyGive(m_receivingTaskHandle); - } - m_logger.log(LogLevel::Debug, "Error within Spi driver ESP - RX"); break; } if (m_inboundRequest && m_txState == transmitState::IDLE) { @@ -204,23 +178,12 @@ void SpiEsp::execute() { case transmitState::SENDING_PAYLOAD: txLengthBytes = m_outboundMessage.m_sizeBytes; txBuffer = m_outboundMessage.m_data.data(); - m_hasSentPayload = false; - m_crcOK = false; - break; - case transmitState::ERROR: m_crcOK = false; - EspSpi_WriteCS(true); - if (m_sendingTaskHandle != nullptr) { - xTaskNotifyGive(m_sendingTaskHandle); - } - m_txState = transmitState::SENDING_HEADER; - m_logger.log(LogLevel::Debug, "Error within Spi driver ESP - TX"); break; } - if ((m_inboundRequest || m_outboundMessage.m_sizeBytes != 0 || - m_inboundMessage.m_sizeBytes != 0) && - m_txState != transmitState::ERROR && m_rxState != receiveState::ERROR) { + if (m_inboundRequest || m_outboundMessage.m_sizeBytes != 0 || m_inboundMessage.m_sizeBytes != 0) { + EspSpi_WriteCS(false); uint32_t finalSize = std::max(txLengthBytes, rxLengthBytes); m_inboundMessage.m_data.fill(0); @@ -241,7 +204,7 @@ void SpiEsp::updateOutboundHeader() { void SpiEsp::espInterruptCallback(void* context) { auto* instance = static_cast(context); // Interrupt is on both falling edge and rising edge. - instance->m_inboundRequest = EspSpi_ReadCS(); + instance->m_inboundRequest = EspSpi_ReadUser0(); } void SpiEsp::espTxRxCallback(void* context) { @@ -259,17 +222,16 @@ void SpiEsp::espTxRxCallback(void* context) { // This should never be called. The state machine should never be in any other state during // the ISR. instance->m_logger.log(LogLevel::Error, "Interrupted called on invalid state"); - instance->m_txState = transmitState::ERROR; break; } - + BaseType_t yield; if (instance->m_txState == transmitState::SENDING_PAYLOAD) { instance->m_txState = transmitState::IDLE; instance->m_outboundMessage.m_sizeBytes = 0; instance->m_outboundMessage.m_payloadSize = 0; instance->m_hasSentPayload = true; + vTaskNotifyGiveFromISR(instance->m_sendingTaskHandle, &yield); } - BaseType_t yield; vTaskNotifyGiveFromISR(instance->m_driverTaskHandle, &yield); portYIELD_FROM_ISR(yield); } From 9c81f6cb9e712710d34ab66c775d6d9f1c72c459 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 16:56:14 -0500 Subject: [PATCH 08/12] Format --- src/Main.cpp | 186 +++++++++--------- src/bsp/src/stm32/hal/src/esp_spi.c | 2 +- src/bsp/src/stm32/src/SpiEsp.cpp | 3 +- .../src/MessageHandlerContainer.cpp | 29 +-- 4 files changed, 113 insertions(+), 107 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index ab6c73f7f..276a7b555 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -34,32 +34,32 @@ using commInterfaceGetter = std::optional using connectionStateSetter = void (*)(ConnectionState state); class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { -public: + public: BittyBuzzTask(const char* taskName, UBaseType_t priority, IDeviceStateUI& deviceStateUI, IButtonCallbackRegister& buttonCallbackRegister) : - AbstractTask(taskName, priority), - m_logger(LoggerContainer::getLogger()), - m_deviceStateUI(deviceStateUI), - m_buttonCallbackRegister(buttonCallbackRegister), - m_bytecode(BittyBuzzFactory::createBittyBuzzBytecode(m_logger)), - m_stringResolver(BittyBuzzFactory::createBittyBuzzStringResolver(m_logger)), - m_bittybuzzVm(m_bytecode, - m_stringResolver, - BittyBuzzContainer::getBBZMessageHandler(), - BittyBuzzContainer::getBBZClosureRegister(), - BittyBuzzContainer::getBBZMessageService(), - BittyBuzzContainer::getBBZNeighborsManager(), - ApplicationInterfaceContainer::getUserUI(), - BSPContainer::getBSP(), - m_logger, - BSPContainer::getUserInterface()) {} + AbstractTask(taskName, priority), + m_logger(LoggerContainer::getLogger()), + m_deviceStateUI(deviceStateUI), + m_buttonCallbackRegister(buttonCallbackRegister), + m_bytecode(BittyBuzzFactory::createBittyBuzzBytecode(m_logger)), + m_stringResolver(BittyBuzzFactory::createBittyBuzzStringResolver(m_logger)), + m_bittybuzzVm(m_bytecode, + m_stringResolver, + BittyBuzzContainer::getBBZMessageHandler(), + BittyBuzzContainer::getBBZClosureRegister(), + BittyBuzzContainer::getBBZMessageService(), + BittyBuzzContainer::getBBZNeighborsManager(), + ApplicationInterfaceContainer::getUserUI(), + BSPContainer::getBSP(), + m_logger, + BSPContainer::getUserInterface()) {} ~BittyBuzzTask() override = default; -private: + private: ILogger& m_logger; IDeviceStateUI& m_deviceStateUI; IButtonCallbackRegister& m_buttonCallbackRegister; @@ -86,7 +86,7 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { auto uiLib = BittyBuzzFactory::createBittyBuzzUILib(); std::array, 3> buzzLibraries{ - {globalLib, mathLib, uiLib}}; + {globalLib, mathLib, uiLib}}; // register btn function m_buttonCallbackRegister.setCallback(resetVmButtonCallback, this); @@ -110,27 +110,27 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { if (m_bittybuzzVm.getState() == BBZVM_STATE_READY) { BBVMRet statusCode = m_bittybuzzVm.step(); switch (statusCode) { - case BBVMRet::Ok: - m_deviceStateUI.setDeviceState(DeviceState::Ok); - break; - case BBVMRet::Stopped: { - m_logger.log(LogLevel::Warn, "BBZVM is stopped, cannot step"); - m_deviceStateUI.setDeviceState(DeviceState::Error); - break; - } - case BBVMRet::OutMsgErr: { - m_logger.log(LogLevel::Warn, "Buzz could not sent message"); - m_deviceStateUI.setDeviceState(DeviceState::Error); - break; - } - case BBVMRet::VmErr: { - m_logger.log(LogLevel::Error, "BBZVM failed to step. state: %s err: %s", - BittyBuzzSystem::getStateString(m_bittybuzzVm.getState()), - BittyBuzzSystem::getErrorString(m_bittybuzzVm.getError())); - m_deviceStateUI.setDeviceState( - vmErrorToDeviceState(m_bittybuzzVm.getError())); - break; - } + case BBVMRet::Ok: + m_deviceStateUI.setDeviceState(DeviceState::Ok); + break; + case BBVMRet::Stopped: { + m_logger.log(LogLevel::Warn, "BBZVM is stopped, cannot step"); + m_deviceStateUI.setDeviceState(DeviceState::Error); + break; + } + case BBVMRet::OutMsgErr: { + m_logger.log(LogLevel::Warn, "Buzz could not sent message"); + m_deviceStateUI.setDeviceState(DeviceState::Error); + break; + } + case BBVMRet::VmErr: { + m_logger.log(LogLevel::Error, "BBZVM failed to step. state: %s err: %s", + BittyBuzzSystem::getStateString(m_bittybuzzVm.getState()), + BittyBuzzSystem::getErrorString(m_bittybuzzVm.getError())); + m_deviceStateUI.setDeviceState( + vmErrorToDeviceState(m_bittybuzzVm.getError())); + break; + } } } Task::delayUntil(prevWake, (uint16_t)stepDelay); @@ -146,21 +146,21 @@ class BittyBuzzTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { }; class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { -public: + public: MessageDispatcherTask(const char* taskName, UBaseType_t priority, ICommInterface* stream, ICircularQueue& streamQueue) : - AbstractTask(taskName, priority), - m_stream(stream), - m_streamQueue(streamQueue), - m_logger(LoggerContainer::getLogger()) {} + AbstractTask(taskName, priority), + m_stream(stream), + m_streamQueue(streamQueue), + m_logger(LoggerContainer::getLogger()) {} ~MessageDispatcherTask() override = default; void setStream(ICommInterface* stream) { m_stream = stream; } -private: + private: ICommInterface* m_stream; ICircularQueue& m_streamQueue; ILogger& m_logger; @@ -171,13 +171,13 @@ class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> HiveMindHostDeserializer deserializer(*m_stream); HiveMindHostAccumulatorSerializer serializer(*m_stream); HiveMindHostApiRequestHandler hivemindApiReqHandler = - MessageHandlerContainer::createHiveMindHostApiRequestHandler(); + MessageHandlerContainer::createHiveMindHostApiRequestHandler(); HiveConnectHiveMindApiMessageHandler hiveconnectApiMessageHandler = - MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); + MessageHandlerContainer::createHiveConnectHiveMindApiMessageHandler(); GreetSender greetSender(m_streamQueue, BSPContainer::getBSP()); MessageDispatcher messageDispatcher = MessageHandlerContainer::createMessageDispatcher( - deserializer, hivemindApiReqHandler, hiveconnectApiMessageHandler, greetSender); + deserializer, hivemindApiReqHandler, hiveconnectApiMessageHandler, greetSender); while (m_stream->isConnected()) { if (!messageDispatcher.deserializeAndDispatch()) { @@ -190,24 +190,24 @@ class MessageDispatcherTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> }; class MessageSenderTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { -public: + public: MessageSenderTask(const char* taskName, UBaseType_t priority, ICommInterface* stream, INotificationQueue& streamQueue, bool keepRunning = false) : - AbstractTask(taskName, priority), - m_stream(stream), - m_streamQueue(streamQueue), - m_logger(LoggerContainer::getLogger()), - m_keepRunning(keepRunning) {} + AbstractTask(taskName, priority), + m_stream(stream), + m_streamQueue(streamQueue), + m_logger(LoggerContainer::getLogger()), + m_keepRunning(keepRunning) {} ~MessageSenderTask() override = default; void setStream(ICommInterface* stream) { m_stream = stream; } void setSerializer(IHiveMindHostSerializer* serializer) { m_serializer = serializer; } -private: + private: ICommInterface* m_stream; INotificationQueue& m_streamQueue; ILogger& m_logger; @@ -236,7 +236,7 @@ class MessageSenderTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { template class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { -public: + public: CommMonitoringTask(const char* taskName, UBaseType_t priority, MessageDispatcherTask& dispatcherTask, @@ -244,15 +244,15 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { IHandshakeUI& handshakeUI, commInterfaceGetter commInterfaceGetter, connectionStateSetter connectionStateSetter) : - AbstractTask(taskName, priority), - m_dispatcherTask(dispatcherTask), - m_senderTask(senderTask), - m_handshakeUI(handshakeUI), - m_commInterfaceGetter(commInterfaceGetter), - m_connectionStateSetter(connectionStateSetter), - m_logger(LoggerContainer::getLogger()) {} - -private: + AbstractTask(taskName, priority), + m_dispatcherTask(dispatcherTask), + m_senderTask(senderTask), + m_handshakeUI(handshakeUI), + m_commInterfaceGetter(commInterfaceGetter), + m_connectionStateSetter(connectionStateSetter), + m_logger(LoggerContainer::getLogger()) {} + + private: MessageDispatcherTask& m_dispatcherTask; MessageSenderTask& m_senderTask; IHandshakeUI& m_handshakeUI; @@ -292,11 +292,11 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { Task::delay(1000); if (m_dispatcherTask.isRunning() != m_senderTask.isRunning()) { const char* taskStuckRuning = - m_dispatcherTask.isRunning() + m_dispatcherTask.isRunning() ? m_dispatcherTask.getTaskName() : m_senderTask.getTaskName(); const char* taskEndedRuning = - !m_dispatcherTask.isRunning() + !m_dispatcherTask.isRunning() ? m_dispatcherTask.getTaskName() : m_senderTask.getTaskName(); m_logger.log(LogLevel::Warn, @@ -316,26 +316,26 @@ class CommMonitoringTask : public AbstractTask<15 * configMINIMAL_STACK_SIZE> { }; class HardwareInterlocTask : public AbstractTask<20 * configMINIMAL_STACK_SIZE> { -public: + public: HardwareInterlocTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority) {} + AbstractTask(taskName, priority) {} ~HardwareInterlocTask() override = default; -private: + private: void task() override { BSPContainer::getInterlocManager().startInterloc(); } }; class InterlocMessageHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { -public: + public: InterlocMessageHandlerTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), - m_interlocMessageQueue(MessageHandlerContainer::getInterlocMsgQueue()), - m_interlocMessageHandler(InterlocContainer::getInterlocMessageHandler()) {} + AbstractTask(taskName, priority), + m_interlocMessageQueue(MessageHandlerContainer::getInterlocMsgQueue()), + m_interlocMessageHandler(InterlocContainer::getInterlocMessageHandler()) {} ~InterlocMessageHandlerTask() override = default; -private: + private: NotificationQueue& m_interlocMessageQueue; IInterlocMessageHandler& m_interlocMessageHandler; @@ -351,13 +351,13 @@ class InterlocMessageHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_ }; class InterlocDataHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { -public: + public: InterlocDataHandlerTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), m_interloc(InterlocContainer::getInterloc()) {} + AbstractTask(taskName, priority), m_interloc(InterlocContainer::getInterloc()) {} ~InterlocDataHandlerTask() override = default; -private: + private: IInterloc& m_interloc; void task() override { @@ -368,15 +368,15 @@ class InterlocDataHandlerTask : public AbstractTask<10 * configMINIMAL_STACK_SIZ }; class LogInterlocTask : public AbstractTask<4 * configMINIMAL_STACK_SIZE> { -public: + public: LogInterlocTask(const char* taskName, UBaseType_t priority) : - AbstractTask(taskName, priority), - m_interloc(InterlocContainer::getInterloc()), - m_logger(LoggerContainer::getLogger()) {} + AbstractTask(taskName, priority), + m_interloc(InterlocContainer::getInterloc()), + m_logger(LoggerContainer::getLogger()) {} ~LogInterlocTask() override = default; -private: + private: IInterloc& m_interloc; ILogger& m_logger; @@ -477,14 +477,14 @@ std::optional> hostInterfaceGetter() { if (commInterface) { ConnectionType type = commInterface.value().get().getType(); switch (type) { - case ConnectionType::Ethernet: - connectionStateUI.setConnectionState(ConnectionState::Ethernet); - break; - case ConnectionType::USB: - connectionStateUI.setConnectionState(ConnectionState::USB); - break; - default: - connectionStateUI.setConnectionState(ConnectionState::Error); + case ConnectionType::Ethernet: + connectionStateUI.setConnectionState(ConnectionState::Ethernet); + break; + case ConnectionType::USB: + connectionStateUI.setConnectionState(ConnectionState::USB); + break; + default: + connectionStateUI.setConnectionState(ConnectionState::Error); } } return commInterface; @@ -506,7 +506,7 @@ int main(int argc, char** argv) { bsp.initChip((void*)&cmdLineArgs); ApplicationInterfaceContainer::getConnectionStateUI().setConnectionState( - ConnectionState::Booting); + ConnectionState::Booting); __attribute__((section(".cmbss"))) static BittyBuzzTask s_bittybuzzTask( "bittybuzz", gc_taskNormalPriority, ApplicationInterfaceContainer::getDeviceStateUI(), diff --git a/src/bsp/src/stm32/hal/src/esp_spi.c b/src/bsp/src/stm32/hal/src/esp_spi.c index d1029c163..1581f3f2b 100644 --- a/src/bsp/src/stm32/hal/src/esp_spi.c +++ b/src/bsp/src/stm32/hal/src/esp_spi.c @@ -71,7 +71,7 @@ void EspSpi_WriteCS(bool state) { bool EspSpi_ReadCS() { return HAL_GPIO_ReadPin(ESP_CS_GPIO_Port, ESP_CS_Pin) == GPIO_PIN_SET; } -bool EspSpi_ReadUser0() { return HAL_GPIO_ReadPin(ESP_USER0_Port, ESP_USER0_Pin) == GPIO_PIN_SET;} +bool EspSpi_ReadUser0() { return HAL_GPIO_ReadPin(ESP_USER0_Port, ESP_USER0_Pin) == GPIO_PIN_SET; } void EspSpi_RxCallback() { if (rxCpltCallbackFct != NULL && rxCallbackContext != NULL) { diff --git a/src/bsp/src/stm32/src/SpiEsp.cpp b/src/bsp/src/stm32/src/SpiEsp.cpp index 5d47390aa..8e7b7fad1 100644 --- a/src/bsp/src/stm32/src/SpiEsp.cpp +++ b/src/bsp/src/stm32/src/SpiEsp.cpp @@ -182,7 +182,8 @@ void SpiEsp::execute() { break; } - if (m_inboundRequest || m_outboundMessage.m_sizeBytes != 0 || m_inboundMessage.m_sizeBytes != 0) { + if (m_inboundRequest || m_outboundMessage.m_sizeBytes != 0 || + m_inboundMessage.m_sizeBytes != 0) { EspSpi_WriteCS(false); uint32_t finalSize = std::max(txLengthBytes, rxLengthBytes); diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index f2d5e71ef..8ab4fc14d 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -1,5 +1,7 @@ #include "MessageHandlerContainer.h" +#include "GreetSender.h" #include "IGreetHandler.h" +#include "Task.h" #include #include #include @@ -7,10 +9,8 @@ #include #include #include -#include #include -#include "GreetSender.h" -#include "Task.h" +#include constexpr uint16_t gc_queueMaxSize = 16; @@ -42,40 +42,45 @@ MessageDispatcher& MessageHandlerContainer::createHostDispatcher() { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); Task::delay(300); } - static HiveMindHostDeserializer s_hostDeserializer(BSPContainer::getHostCommInterface().value()); + static HiveMindHostDeserializer s_hostDeserializer( + BSPContainer::getHostCommInterface().value()); static GreetSender s_hostGreeter(getHostMsgQueue(), BSPContainer::getBSP()); static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); - static HiveConnectHiveMindApiMessageHandler s_hcHandler(createHiveConnectHiveMindApiMessageHandler()); + static HiveConnectHiveMindApiMessageHandler s_hcHandler( + createHiveConnectHiveMindApiMessageHandler()); static MessageDispatcher s_hostDispatcher( - createMessageDispatcher(s_hostDeserializer,s_hmHandler, s_hcHandler, s_hostGreeter)); + createMessageDispatcher(s_hostDeserializer, s_hmHandler, s_hcHandler, s_hostGreeter)); return s_hostDispatcher; - } MessageDispatcher& MessageHandlerContainer::createRemoteDispatcher() { while (!BSPContainer::getRemoteCommInterface().has_value()) { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); Task::delay(300); } - static HiveMindHostDeserializer s_remoteDeserializer(BSPContainer::getRemoteCommInterface().value()); + static HiveMindHostDeserializer s_remoteDeserializer( + BSPContainer::getRemoteCommInterface().value()); static GreetSender s_remoteGreeter(getRemoteMsgQueue(), BSPContainer::getBSP()); static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); - static HiveConnectHiveMindApiMessageHandler s_hcHandler(createHiveConnectHiveMindApiMessageHandler()); + static HiveConnectHiveMindApiMessageHandler s_hcHandler( + createHiveConnectHiveMindApiMessageHandler()); static MessageDispatcher s_remoteDispatcher( - createMessageDispatcher(s_remoteDeserializer,s_hmHandler, s_hcHandler, s_remoteGreeter)); + createMessageDispatcher(s_remoteDeserializer, s_hmHandler, s_hcHandler, s_remoteGreeter)); return s_remoteDispatcher; } IHiveMindHostSerializer& MessageHandlerContainer::createHostSerializer() { while (!BSPContainer::getHostCommInterface().has_value()) { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); } - static HiveMindHostAccumulatorSerializer s_hostSerializer(BSPContainer::getHostCommInterface().value()); + static HiveMindHostAccumulatorSerializer s_hostSerializer( + BSPContainer::getHostCommInterface().value()); return s_hostSerializer; } IHiveMindHostSerializer& MessageHandlerContainer::createRemoteSerializer() { while (!BSPContainer::getRemoteCommInterface().has_value()) { LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); } - static HiveMindHostAccumulatorSerializer s_remoteSerializer(BSPContainer::getRemoteCommInterface().value()); + static HiveMindHostAccumulatorSerializer s_remoteSerializer( + BSPContainer::getRemoteCommInterface().value()); return s_remoteSerializer; } From 5b636ef47ee923997652d446bde9cbf13e50f2db Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 16:58:57 -0500 Subject: [PATCH 09/12] Removed unwanted code --- src/Main.cpp | 74 ------------------- .../message-handler/MessageHandlerContainer.h | 5 -- .../src/MessageHandlerContainer.cpp | 47 ------------ 3 files changed, 126 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index 276a7b555..a2309331f 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -392,80 +392,6 @@ class LogInterlocTask : public AbstractTask<4 * configMINIMAL_STACK_SIZE> { Task::delay(1000); } } -}; - -class Metrics : public AbstractTask<10 * configMINIMAL_STACK_SIZE> { -public: - Metrics(const char* taskName, UBaseType_t priority, ILogger& logger, IBSP& bsp): - AbstractTask(taskName, priority), m_logger(logger), m_bsp(bsp) {} - - ~Metrics() override = default; - - Task::Time m_averageHostTime; - Task::Time m_averageRemoteTime; - - void acquireInterfaces() { - m_hostDispatcher = &MessageHandlerContainer::createHostDispatcher(); - m_hostSerializer = &MessageHandlerContainer::createHostSerializer(); - m_remoteDispatcher = &MessageHandlerContainer::createRemoteDispatcher(); - m_remoteSerializer = &MessageHandlerContainer::createRemoteSerializer(); - } - - - void task() override { - acquireInterfaces(); - // This handles greetings - m_logger.log(LogLevel::Info, "Waiting for greetings"); - m_hostDispatcher->deserializeAndDispatch(); - m_logger.log(LogLevel::Info, "Got host greeting"); - m_remoteDispatcher->deserializeAndDispatch(); - m_logger.log(LogLevel::Info, "Got remote greeting"); - while (true) { - uint8_t timingCounts = 10; - // Testing host - FunctionCallRequestDTO call("getStatus", nullptr, 0); - UserCallRequestDTO userCallRequestDto(UserCallTargetDTO::BUZZ, UserCallTargetDTO::HOST, call); - RequestDTO requestDto(0, userCallRequestDto); - MessageDTO hostMessageDto(m_bsp.getUUId(),m_bsp.getUUId(), requestDto); - for (uint8_t i = 0; i < timingCounts; i++) { - auto start = Task::getTime(); - m_hostSerializer->serializeToStream(hostMessageDto); - m_hostDispatcher->deserializeAndDispatch(); - auto finish = Task::getTime(); - m_averageHostTime += (finish - start) ; - } - m_averageHostTime /= timingCounts; - m_logger.log(LogLevel::Warn, "Host took %d milliseconds per message", m_averageHostTime); - // Testing remote - GetAgentsListRequestDTO request; - HiveConnectHiveMindApiDTO hiveConnectHiveMindApiDto(0, request); - MessageDTO remoteMessage(m_bsp.getUUId(), m_bsp.getUUId(), hiveConnectHiveMindApiDto); - for (uint8_t i = 0; i < timingCounts; i++) { - auto start = Task::getTime(); - m_remoteSerializer->serializeToStream(hostMessageDto); - m_remoteDispatcher->deserializeAndDispatch(); - auto finish = Task::getTime(); - m_averageRemoteTime += (finish - start); - } - m_averageRemoteTime /= timingCounts; - m_logger.log(LogLevel::Warn, "Remote took %d milliseconds per message", m_averageRemoteTime); - m_logger.log(LogLevel::Warn, "Metrics obtained, restarting in 5 seconds"); - Task::delay(5000); - } - } - - -private: - ILogger& m_logger; - IBSP& m_bsp; - IHiveMindHostSerializer* m_hostSerializer; - IHiveMindHostSerializer* m_remoteSerializer; - IMessageDispatcher* m_hostDispatcher; - IMessageDispatcher* m_remoteDispatcher; - - - - }; // Gets the comm interface for the host and sets the UI for wich one was obtained diff --git a/src/message-handler/include/message-handler/MessageHandlerContainer.h b/src/message-handler/include/message-handler/MessageHandlerContainer.h index 5c7728a2a..1b7387c33 100644 --- a/src/message-handler/include/message-handler/MessageHandlerContainer.h +++ b/src/message-handler/include/message-handler/MessageHandlerContainer.h @@ -32,11 +32,6 @@ namespace MessageHandlerContainer { IHiveConnectHiveMindApiMessageHandler& hiveconnectApiMessageHandler, IGreetSender& greetSender); - MessageDispatcher& createHostDispatcher(); - MessageDispatcher& createRemoteDispatcher(); - IHiveMindHostSerializer& createHostSerializer(); - IHiveMindHostSerializer& createRemoteSerializer(); - /** *@brief get the buzz message queue *@return A reference to the buzz message queue */ diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index 8ab4fc14d..8d4aacb24 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -37,53 +37,6 @@ MessageDispatcher MessageHandlerContainer::createMessageDispatcher( LoggerContainer::getLogger()); } -MessageDispatcher& MessageHandlerContainer::createHostDispatcher() { - while (!BSPContainer::getHostCommInterface().has_value()) { - LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); - Task::delay(300); - } - static HiveMindHostDeserializer s_hostDeserializer( - BSPContainer::getHostCommInterface().value()); - static GreetSender s_hostGreeter(getHostMsgQueue(), BSPContainer::getBSP()); - static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); - static HiveConnectHiveMindApiMessageHandler s_hcHandler( - createHiveConnectHiveMindApiMessageHandler()); - static MessageDispatcher s_hostDispatcher( - createMessageDispatcher(s_hostDeserializer, s_hmHandler, s_hcHandler, s_hostGreeter)); - return s_hostDispatcher; -} -MessageDispatcher& MessageHandlerContainer::createRemoteDispatcher() { - while (!BSPContainer::getRemoteCommInterface().has_value()) { - LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); - Task::delay(300); - } - static HiveMindHostDeserializer s_remoteDeserializer( - BSPContainer::getRemoteCommInterface().value()); - static GreetSender s_remoteGreeter(getRemoteMsgQueue(), BSPContainer::getBSP()); - static HiveMindHostApiRequestHandler s_hmHandler(createHiveMindHostApiRequestHandler()); - static HiveConnectHiveMindApiMessageHandler s_hcHandler( - createHiveConnectHiveMindApiMessageHandler()); - static MessageDispatcher s_remoteDispatcher( - createMessageDispatcher(s_remoteDeserializer, s_hmHandler, s_hcHandler, s_remoteGreeter)); - return s_remoteDispatcher; -} -IHiveMindHostSerializer& MessageHandlerContainer::createHostSerializer() { - while (!BSPContainer::getHostCommInterface().has_value()) { - LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on host interface"); - } - static HiveMindHostAccumulatorSerializer s_hostSerializer( - BSPContainer::getHostCommInterface().value()); - return s_hostSerializer; -} -IHiveMindHostSerializer& MessageHandlerContainer::createRemoteSerializer() { - while (!BSPContainer::getRemoteCommInterface().has_value()) { - LoggerContainer::getLogger().log(LogLevel::Info, "Waiting on remote interface"); - } - static HiveMindHostAccumulatorSerializer s_remoteSerializer( - BSPContainer::getRemoteCommInterface().value()); - return s_remoteSerializer; -} - ThreadSafeQueue& MessageHandlerContainer::getBuzzMsgQueue() { __attribute__((section(".cmbss"))) static Mutex s_mutex(10); __attribute__((section(".cmbss"))) static CircularQueueStack From 8468d983bbc04d772e61116dc840dd172d30a358 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 17:00:16 -0500 Subject: [PATCH 10/12] Removed unwanted code --- src/message-handler/src/MessageHandlerContainer.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index 8d4aacb24..6591c6872 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -1,16 +1,11 @@ #include "MessageHandlerContainer.h" #include "GreetSender.h" -#include "IGreetHandler.h" -#include "Task.h" #include #include #include #include #include #include -#include -#include -#include constexpr uint16_t gc_queueMaxSize = 16; From aa3e5b8f7fded19c1f42a910e115ad1a0a099486 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 17:01:20 -0500 Subject: [PATCH 11/12] Removed unwanted code --- src/message-handler/src/MessageHandlerContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index 6591c6872..29ecf24fa 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -1,5 +1,5 @@ #include "MessageHandlerContainer.h" -#include "GreetSender.h" +#include "IGreetSender.h" #include #include #include From 2f6da0931fe5553a32363677b2320d99b41f6f32 Mon Sep 17 00:00:00 2001 From: Gabriel Lessard Date: Sat, 4 Dec 2021 17:02:24 -0500 Subject: [PATCH 12/12] Removed unwanted code --- src/message-handler/src/MessageHandlerContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/message-handler/src/MessageHandlerContainer.cpp b/src/message-handler/src/MessageHandlerContainer.cpp index 29ecf24fa..c97bd2612 100644 --- a/src/message-handler/src/MessageHandlerContainer.cpp +++ b/src/message-handler/src/MessageHandlerContainer.cpp @@ -1,5 +1,5 @@ #include "MessageHandlerContainer.h" -#include "IGreetSender.h" +#include "IGreetHandler.h" #include #include #include