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-05-11
Revision:
82:668b51a39148
Parent:
81:996c0a3319b4
Child:
83:0d3572a8a851

File content as of revision 82:668b51a39148:

#include "MessageLogger.h"
#include "Message.h"

#define SIGNAL_printMessage 2


Mail<Message, 16> message_mail;

        // constructor
        MessageLogger::MessageLogger()
        {
            hasError = false;
            messageCount = 0;
            //messageLock = new Mutex();
        }
        
        void MessageLogger::SetThread(Thread* logger)
        {
            loggingThread = logger;           
        }
       
        // public methods:
        void MessageLogger::SendError(string errorMessage)
        {
            fatalError << errorMessage <<"Terminating Program...\r\n";
            loggingThread->signal_set(SIGNAL_printMessage);
            hasError = true;
        }
        
        Message *newMsg;
        
        void MessageLogger::SendMessage(char* message)
        {
             messageLock.lock();
             newMsg = message_mail.alloc();           
                        
            if (newMsg == NULL) 
            {
               SendError("ERROR: Message queue is full.\r\n");
               messageLock.unlock();
               return;   
            }
            
            newMsg->copy(message);
    
            stat = message_mail.put(newMsg);
            
            //Check if succesful
            if (stat == osErrorResource) 
            {
                message_mail.free(newMsg);
                ostringstream error;
                error << "ERROR CODE: " << stat << ", Failed to put message into queue\r\n";
                SendError(error.str());
                messageLock.unlock();
                return;
            }
            
            messageCount++;
            loggingThread->signal_set(SIGNAL_printMessage);
            
            printf("\033[1A\n");
            messageLock.unlock();
        }
        
        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().c_str());
            hasError = false;
        }
        
        Message *message; 
        char copyOfString[256];
        
        void MessageLogger::PrintMessage()
        {
            messageLock.lock();
            osEvent evt = message_mail.get();
            
            //Check status
            if (evt.status == osEventMail) 
            {
                message = (Message*)evt.value.p;  
                strncpy(copyOfString, message->getText(), 256);
                message_mail.free(message);
                // Ask about cout as everyone on the internet recommends it as a type safe version of printf.
                //std::cout << message; 
                printf("%s\033[2A\n", copyOfString);               
                
                messageCount--;
            } 
            else 
            {
                ostringstream error;
                error << "ERROR CODE: " << evt.status << ", Failed to retrieve message from queue\r\n";
                SendError(error.str());
            }  
            
            messageLock.unlock();
        }