summaryrefslogtreecommitdiff
path: root/led/complex1/MessageQueueT.h
blob: ae86dd1c6580f0cf25297f19f54808a4d925dad3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
//  MessageQueue Template
//
//  $Id$
//

#ifndef __MessageQueueT_OE3_h
#define __MessageQueueT_OE3_h

#include <iostream>
#include <string>

#include "LocalMessageQueuePOSIX10031c.h"
namespace OSWrapper {

  template<
    typename QueueType
  >
  class MessageQueueTemplate {
    public:

    typedef void (*Converter_t)( const QueueType *src, QueueType *dest );

    private:

    typedef OSWrapper::LocalMessageQueuePOSIX10031c<QueueType> Queue_t;

    std::string    mName;
    Converter_t    mHTON;
    Converter_t    mNTOH;
    Queue_t       *mQueue;

    public:

    MessageQueueTemplate(
      std::string      name,
      unsigned int     depth,
      Converter_t      hton_f = NULL,
      Converter_t      ntoh_f = NULL
    )
    {
      mName = name;
      this->mHTON = hton_f;
      this->mNTOH = ntoh_f;

      // create the message queue
      mQueue = new Queue_t( name, depth );
    }

    MessageQueueTemplate()
    {
      // destroy the message queue object
      delete mQueue;

      // destroy anything else
    }

    bool IsAvailable(void)
    {
      return mQueue->IsAvailable();
    }

    bool Read(
      QueueType *buffer
    )
    {
      QueueType *b;

      // MessageClass *Receive( void )
      // Get the message
      try {

        b = mQueue->Receive();
        // read the message queue
        if ( !b ) {
          std::cerr << mName << " Queue not Read" << std::endl;
          return false;
        }
      } catch (...) {
        std::cerr << mName << " Queue not Read: Exception" << std::endl;
        return false;
      }

      // convert from network neutral
      if ( mNTOH )
        (*mNTOH)( b, buffer );
      else
        memcpy( buffer, b, sizeof(QueueType) );

      mQueue->Deallocate( b );

      return true;
    }

    bool Write(
      QueueType *buffer
    )
    {
      bool status;
      QueueType *b = mQueue->Allocate();
      
      // convert to network neutral
      if ( mHTON ) {
        (*mHTON)( buffer, b );
      } else {
        memcpy( b, buffer, sizeof(QueueType) );
      }

      // write the message
      status = mQueue->Send( b );
      if ( !status ) {
        std::cerr << mName << " Queue not Written " << std::endl;
        return false;
      }
      return true;
    }
  };

};


#endif