Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SOFT253_Template_Weather_OS_54 by
MessageLogger/MessageLogger.cpp
- Committer:
- aburch1
- Date:
- 2017-05-10
- Revision:
- 80:959151952153
- Parent:
- 79:4e6b53eb678b
- Child:
- 81:996c0a3319b4
File content as of revision 80:959151952153:
#include "MessageLogger.h"
#define SIGNAL_printMessage 2
Mail<string, 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 <<"\n\rTerminating Program...\r\n";
loggingThread->signal_set(SIGNAL_printMessage);
hasError = true;
}
string *messageObj;
void MessageLogger::SendMessage(string message)
{
messageLock->lock();
messageObj = message_mail.alloc();
if (messageObj == NULL)
{
SendError("ERROR: Message queue is full.");
messageLock->unlock();
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());
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());
hasError = false;
}
string *message;
void MessageLogger::PrintMessage()
{
messageLock->lock();
osEvent evt = message_mail.get();
//Check status
if (evt.status == osEventMail)
{
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\033[1A\n", (*message));
message_mail.free(message);
messageCount--;
}
else
{
ostringstream error;
error << "ERROR CODE: " << evt.status << ", Failed to retrieve message from queue";
SendError(error.str());
}
messageLock->unlock();
}
