//
///		NAME
//
///		SHORT DESCRIPTION
//
///		Description:
///			LONG DESCRIPTION
///
///		Return
///			VALUE and DESCRIPTION
//
STATUS SystemManager::triggerShutdown(void)
{
	SystemManagerMessage  message;
	MessageManager<SystemManagerMessage> messageManager;

	// Post an activate message
	message.major_type = SYSTEM_TRANSITION_TO_SHUTDOWN;
	messageManager.postMessage(SystemManager::queue_id, message, QUEUE_TIMEOUT_INFINITE);

	// Post an activate message
	message.major_type = SYSTEM_SHUTDOWN;
	messageManager.postMessage(SystemManager::queue_id, message, QUEUE_TIMEOUT_INFINITE);

	return STATUS_SUCCESS;
}
//
///     NAME
//
///     SHORT DESCRIPTION
//
///     Description:
///         LONG DESCRIPTION
///
///     Return
///         VALUE and DESCRIPTION
//
STATUS SystemManager::systemLoop(void) 
{
    STATUS                                  status = STATUS_FAILURE;
    MessageManager<SystemManagerMessage>    messageManager;
    SystemManagerMessage                    message;
    
    // Create a message queue
    QueueManager::createQueue(SystemManager::queue_id, MAX_QUEUE_SIZE_DEFAULT);
    
    // Post an activate message
    message.major_type = SYSTEM_ACTIVATE;
    messageManager.postMessage(SystemManager::queue_id, message, QUEUE_TIMEOUT_INFINITE);
    
    // Start loop
    while(1) 
    {
        status = messageManager.getMessage(SystemManager::queue_id,
                                           message,
                                           QUEUE_TIMEOUT_DEFAULT);
        
        if(status == STATUS_SUCCESS)
        {
            LogManager::logMessage(MODULE_SYSTEM_MANAGER,
                                   DEBUG_LEVEL,
                                   NULL,
                                   "Received Message, Major Type: %lu",
                                   message.major_type);
            
            switch(mState)
            {
                case SYSTEM_MANAGER_INIT:
                    status = initProcessing(message);
                    break;
                
                case SYSTEM_MANAGER_ACTIVE:
                    status = activeProcessing(message);
                    break;
                
                case SYSTEM_MANAGER_SHUTDOWN:
                    status = shutdownProcessing(message);
                    break;
                
                default:
                    break;
            }
            
            if(status == STATUS_SHUTDOWN_SUCCESS)
            {
                break;
            }
        }
    }
    
    mThreadGroup.join_all();
    
    LogManager::logMessage(MODULE_SYSTEM_MANAGER,
                           DEBUG_LEVEL,
                           NULL,
                           "All Threads Joined Succesfully.");
    
    return STATUS_SUCCESS;
}