// ----------------------------------------------------------------------------- /// @file Warning.c /// @brief Description // ----------------------------------------------------------------------------- // Micro-Key bv // Industrieweg 28, 9804 TG Noordhorn // Postbus 92, 9800 AB Zuidhorn // The Netherlands // Tel: +31 594 503020 // Fax: +31 594 505825 // Email: support@microkey.nl // Web: www.microkey.nl // ----------------------------------------------------------------------------- /// $Revision$ /// $Author$ /// $Date$ // (c) 2017 Micro-Key bv // ----------------------------------------------------------------------------- /// @file Warning.c /// @ingroup {group_name} // ----------------------------------------------------------------------------- // Include files // ----------------------------------------------------------------------------- #include "Warning.h" #include "platform.h" #include "Logger.h" // ----------------------------------------------------------------------------- // Constant and macro definitions // ----------------------------------------------------------------------------- #define WARNING_QUEUE_SIZE (10) // ----------------------------------------------------------------------------- // Type definitions // ----------------------------------------------------------------------------- struct WarningQueueItem { T_WarningCode warningCode; }; // ----------------------------------------------------------------------------- // File-scope variables // ----------------------------------------------------------------------------- static struct Observable observable; static TaskHandle_t warningTaskHandle; static QueueHandle_t warningQueue; // ----------------------------------------------------------------------------- // Function declarations // ----------------------------------------------------------------------------- static void WarningTask (void* parameters); // ----------------------------------------------------------------------------- // Function definitions // ----------------------------------------------------------------------------- ErrorStatus Warning_construct(void) { Observable_construct(&observable); warningQueue = xQueueCreate(WARNING_QUEUE_SIZE, sizeof(struct WarningQueueItem)); xTaskCreate(WarningTask, "ErrorTask", 300, NULL, 1, &warningTaskHandle); return SUCCESS; } struct Observable* Warning_getObservable(void) { return &observable; } void Warning_postWarning(T_WarningCode warningCode) { LOGGER_WARNING(mainLog, "WARNING POSTED WITH CODE %d", warningCode); struct WarningQueueItem queueItem; queueItem.warningCode = warningCode; xQueueSend(warningQueue, &queueItem, 0); } void Warning_postWarningFromISR(T_WarningCode warningCode) { portBASE_TYPE higherPriorityTaskWoken = pdFALSE; LOGGER_WARNING_ISR(mainLog, "WARNING POSTED FROM ISR"); struct WarningQueueItem queueItem; queueItem.warningCode = warningCode; xQueueSendFromISR(warningQueue, &queueItem, &higherPriorityTaskWoken); portEND_SWITCHING_ISR(higherPriorityTaskWoken); } static void WarningTask (void* parameters) { struct WarningQueueItem queueItem; while (1) { xQueueReceive(warningQueue, &queueItem, portMAX_DELAY); Observable_notifyObservers(&observable, (const void* const)queueItem.warningCode); } }