dumber/software/dumber3/Application/messages.c

169 lines
5 KiB
C

/**
******************************************************************************
* @file messages.c
* @brief messages handler body
* @author S. DI MERCURIO (dimercur@insa-toulouse.fr)
* @date December 2023
*
******************************************************************************
* @copyright Copyright 2023 INSA-GEI, Toulouse, France. All rights reserved.
* @copyright This project is released under the Lesser GNU Public License (LGPL-3.0-only).
*
* @copyright This file is part of "Dumber" project
*
* @copyright This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* @copyright This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* @copyright You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
******************************************************************************
*/
#include "messages.h"
#include "stdlib.h"
/** @addtogroup Application_Software
* @{
*/
/** @addtogroup MESSAGES
* Messages module handles mailbox and messages communication support between tasks
* @{
*/
/** @addtogroup MESSAGES_Private Private
* @{
*/
#define QUEUE_SIZE 5
QueueHandle_t LEDS_Mailbox;
QueueHandle_t MOTORS_Mailbox;
QueueHandle_t APPLICATION_Mailbox;
QueueHandle_t XBEE_Mailbox;
/**
* @brief Function for initializing messaging system
*
* @param None
* @return None
*/
void MESSAGE_Init(void) {
LEDS_Mailbox = xQueueCreate(QUEUE_SIZE, sizeof(MESSAGE_Typedef));
MOTORS_Mailbox = xQueueCreate(QUEUE_SIZE, sizeof(MESSAGE_Typedef));
APPLICATION_Mailbox = xQueueCreate(QUEUE_SIZE, sizeof(MESSAGE_Typedef));
XBEE_Mailbox = xQueueCreate(QUEUE_SIZE, sizeof(MESSAGE_Typedef));
}
/**
* @brief Return first message a given mailbox
*
* @param[in] mbx Mailbox reference
* @return First message in mailbox
*
* @remark This function is blocking until a message is received.
* If mailbox is not empty when calling the function, return immediatly with first message in mailbox
*/
MESSAGE_Typedef MESSAGE_ReadMailbox(QueueHandle_t mbx) {
MESSAGE_Typedef msg= {0};
char msg_received =0;
while (!msg_received) {
if (xQueueReceive(mbx, &msg, portMAX_DELAY)) { // un message à été reçu
msg_received=1;
return msg;
}
}
return msg;
}
/**
* @brief Return first message a given mailbox (non blocking)
*
* @param[in] mbx Mailbox reference
* @return First message in mailbox
*
* @remark This function is non blocking.
* If mailbox is empty when calling the function, a message structure is still returned with \ref MSG_ID_NO_MESSAGE
* in message id field
*/
MESSAGE_Typedef MESSAGE_ReadMailboxNoDelay(QueueHandle_t mbx) {
MESSAGE_Typedef msg= {0};
if (!xQueueReceive(mbx, &msg, 0)) // Pas de message dans la mailbox
msg.id=MSG_ID_NO_MESSAGE;
return msg;
}
/**
* @brief Post a message in a mailbox with given id and data
*
* @param[in] mbx_dest Destination mailbox
* @param[in] id id of message (as found in \ref msg_id_def "Message ID definitions")
* @param[in] mbx_sender Sender mailbox (may be null if no answer is expected)
* @param[in] data Reference to data to store in message structure
* @return None
*
* @remark This function is non blocking.
* If mailbox is full when calling the function, error will be ignored silently
*/
void MESSAGE_SendMailbox(QueueHandle_t mbx_dest, uint16_t id, QueueHandle_t mbx_sender, void *data){
MESSAGE_Typedef msg;
msg.id=id;
msg.sender = &mbx_sender;
msg.data=data;
if (!xQueueSend(mbx_dest, &msg, 0)) { // envoi sans attendre
//printf("Failed to send data, Queue full.\r\n");
}
}
/**
* @brief Post, from an ISR, a message in a mailbox with given id and data
*
* @param[in] mbx_dest Destination mailbox
* @param[in] id id of message (as found in \ref msg_id_def "Message ID definitions")
* @param[in] mbx_sender Sender mailbox (may be null if no answer is expected)
* @param[in] data Reference to data to store in message structure
* @param[in] xHigherPriorityTaskWoken Reference to flag indicating if a context switch is to be done at end of ISR
* @return None
*
* @remark This function is non blocking.
* If mailbox is full when calling the function, error will be ignored silently
*/
void MESSAGE_SendMailboxFromISR(QueueHandle_t mbx_dest, uint16_t id, QueueHandle_t mbx_sender, void *data, BaseType_t *xHigherPriorityTaskWoken) {
MESSAGE_Typedef msg;
msg.id=id;
msg.sender = &mbx_sender;
msg.data=data;
if (!xQueueSendFromISR( mbx_dest, &msg, xHigherPriorityTaskWoken)) { // envoi sans attendre
//printf("Failed to send data, Queue full.\r\n");
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/