3rd Repo, trying to figure this out.

Dependencies:   LPS25H hts221

Fork of SOFT253_Template_Weather_OS_54 by Stage-1 Students SoCEM

MessageLogger/MessageLogger.cpp

Committer:
aburch1
Date:
2017-04-27
Revision:
78:6c2b8ade8414
Parent:
77:db3384071634

File content as of revision 78:6c2b8ade8414:

#include "MessageLogger.h"

#define SIGNAL_printMessage 2

Mail<string, 16> message_mail;

        // constructor
        MessageLogger::MessageLogger()
        {
            hasError = false;
            messageCount = 0;
        }
        
        void MessageLogger::SetThread(Thread* logger)
        {
            loggingThread = logger;           
        }
       
        // public methods:
        void MessageLogger::SendError(string errorMessage)
        {
            fatalError << "ERROR: " << errorMessage << "\n\rTerminating Program...";
            loggingThread->signal_set(SIGNAL_printMessage);
            hasError = true;
        }
        
        void MessageLogger::SendMessage(string message)
        {
            string *messageObj = message_mail.alloc();           
                        
            if (messageObj == NULL) 
            {
               SendError("Message queue is full.");
               return;   
            }
            
            (*messageObj) = message;
    
            stat = message_mail.put(messageObj);
            
            //Check if succesful
            if (stat == osErrorResource) 
            {
                message_mail.free(messageObj);
                ostringstream error;
                error << stat << " - Failed to retrieve message from queue";
                SendError(error.str());
                return;
            }
            
            messageCount++;
            loggingThread->signal_set(SIGNAL_printMessage);
        }
        
        bool MessageLogger::GetError()
        {
            if(hasError)
            {
                PrintError();
                hasError = false;
                return true;
            }
            return false;
        }
        bool MessageLogger::GetMessage()
        {
            if(messageCount > 0)
            {
                PrintMessage();
                return true;
            }
            return false;     
        }
        
        void MessageLogger::PrintError()
        {
            printf("%s\n\r", fatalError.str().c_str());
        }
        
        void MessageLogger::PrintMessage()
        {
            osEvent evt = message_mail.get();
            
            //Check status
            if (evt.status == osEventMail) 
            {
                string *message = (string*)evt.value.p;   
                
                // Ask about cout as everyone on the internet recommends it as a type safe version of printf.
                //std::cout << message; 
                printf((*message).c_str());
                
                message_mail.free(message);
                messageCount--;
            } 
            else 
            {
                ostringstream error;
                error << evt.status << " - Failed to retrieve message from queue";
                SendError(error.str());
            }  
        }