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-26
Revision:
77:db3384071634
Parent:
76:ee1f132e5744
Child:
78:6c2b8ade8414
Child:
79:4e6b53eb678b

File content as of revision 77:db3384071634:

#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 << errorMessage <<"\n\rTerminating Program...\n\r";
            loggingThread->signal_set(SIGNAL_printMessage);
            hasError = true;
        }
        
        void MessageLogger::SendMessage(string message)
        {
            string *messageObj = message_mail.alloc();           
                        
            if (messageObj == NULL) 
            {
               SendError("ERROR: 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 << "ERROR CODE: " << stat << ", Failed to retrieve message from queue";
                SendError(error.str());
                return;
            }
            
            messageCount++;
            loggingThread->signal_set(SIGNAL_printMessage);
        }
        
        bool MessageLogger::GetError()
        {
            if(hasError)
            {
                PrintError();
                return true;
            }
            return false;
        }
        bool MessageLogger::GetMessage()
        {
            if(messageCount > 0)
            {
                PrintMessage();
                return true;
            }
            return false;     
        }
        
        void MessageLogger::PrintError()
        {
            printf("%s", fatalError.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("%s", (*message));
                
                message_mail.free(message);
                messageCount--;
            } 
            else 
            {
                ostringstream error;
                error << "ERROR CODE: " << evt.status << ", Failed to retrieve message from queue";
                SendError(error.str());
            }  
        }