/* 
 * project:     ---
 * author:      Michael Strosche
 * email:       ---
 * description: message buffer
 * 
 */

#ifndef __MESSAGE_BUFFER_H__
  #define __MESSAGE_BUFFER_H__

  #include "config.h"

  #define MESSAGE_BUFFER_MSG_SIZE 16

  enum message_buffer_msg_source_t_ {
    MSG_SOURCE_TTYS0,         // serial interface
    MSG_SOURCE_TTYEXTDISPLAY, // interface of the graphic-display-card
    MSG_SOURCE_TTYINTDISPLAY, // interface of the hd44780-display
    MSG_SOURCE_SYSTEM         // internal message
  };
  typedef enum message_buffer_msg_source_t_ message_buffer_msg_source_t;

  #define MESSAGE_BUFFER_MESSAGE_SIZE 40

  typedef struct {
    uint8_t                       empty;
    message_buffer_msg_source_t   source;
    char                          message[MESSAGE_BUFFER_MESSAGE_SIZE];
  } message_buffer_msg_t;

  void message_buffer_init();

  // lock if buffer is full
  // lock if any other process is working on an entry
  void message_buffer_add(char *msg, message_buffer_msg_source_t src);

  uint8_t message_buffer_getNext(char *msg, message_buffer_msg_source_t *src);

  void message_buffer_routeAnswer(char *msg, message_buffer_msg_source_t dst);
#endif // __MESSAGE_BUFFER_H__
