00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00049 #ifndef TOPPERS_MESSAGEBUFFER_HPP_
00050 #define TOPPERS_MESSAGEBUFFER_HPP_
00051
00052 #include <toppers/object.hpp>
00053
00054 namespace toppers
00055 {
00056
00065 template <ID Id = 0,
00066 class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00067 class Stub = TOPPERS_DEFAULT_STUB >
00068 class messagebuffer : Diagnostics
00069 {
00070 typedef object_controller<Id, obj_messagebuffer, Stub> controller;
00071 object_id<Id> objid_;
00072
00073 public:
00075 typedef t_cmbf creation;
00077 typedef t_rmbf reference;
00078
00081
00083 messagebuffer() {}
00085 explicit messagebuffer(ID id) : objid_(id) {}
00086
00088 template <ID Id2, class Diagnostics2, class Stub2>
00089 messagebuffer(const messagebuffer<Id2, Diagnostics2, Stub2>& other)
00090 : objid_(get_unsafe_id(other))
00091 {
00092 TOPPERS_STATIC_ASSERT(Id == 0);
00093 }
00094
00096
00099
00100
00101 ER create(creation* pk_cobj)
00102 {
00103 ER ercd = controller::create(objid_, pk_cobj);
00104 return handle_error(ercd);
00105 }
00107 ER create(const creation* pk_cobj)
00108 {
00109 ER ercd = controller::create(objid_, pk_cobj);
00110 return handle_error(ercd);
00111 }
00113 ER create(ATR mbfatr = TA_TFIFO, UINT maxmsz = 256, SIZE mbfsz = 0, VP mbf = 0)
00114 {
00115 creation packet;
00116 packet.mbfatr = mbfatr;
00117 packet.maxmsz = maxmsz;
00118 packet.mbfsz = mbfsz;
00119 packet.mbf = mbf;
00120 return create(&packet);
00121 }
00123 ER destroy()
00124 {
00125 ER ercd = controller::destroy(objid_);
00126 return handle_error(ercd);
00127 }
00128
00130
00133
00135 ER refer(reference* pk_robj) const
00136 {
00137 ER ercd = controller::refer(objid_, pk_robj);
00138 return handle_error(ercd);
00139 }
00140
00142
00145
00147 ER send(const void* msg, UINT msgsz, forever_tag = forever) const
00148 {
00149 ER ercd = Stub::stub_snd_mbf(objid_.id(), msg, msgsz);
00150 return handle_error(ercd);
00151 }
00153 ER send(const void* msg, UINT msgsz, polling_tag) const
00154 {
00155 ER ercd = Stub::stub_psnd_mbf(objid_.id(), msg, msgsz);
00156 return handle_error(ercd);
00157 }
00159 ER send(const void* msg, UINT msgsz, TMO tmout) const
00160 {
00161 ER ercd = Stub::stub_tsnd_mbf(objid_.id(), msg, msgsz, tmout);
00162 return handle_error(ercd);
00163 }
00164
00166 ER_UINT receive(void* msg, forever_tag = forever) const
00167 {
00168 ER_UINT ercd = Stub::stub_rcv_mbf(objid_.id(), msg);
00169 return handle_error(ercd);
00170 }
00172 ER_UINT receive(void* msg, polling_tag) const
00173 {
00174 ER_UINT ercd = Stub::stub_prcv_mbf(objid_.id(), msg);
00175 return handle_error(ercd);
00176 }
00178 ER_UINT receive(void* msg, TMO tmout) const
00179 {
00180 ER_UINT ercd = Stub::stub_trcv_mbf(objid_.id(), msg, tmout);
00181 return handle_error(ercd);
00182 }
00183
00185
00187 friend ID get_unsafe_id(const messagebuffer<Id, Diagnostics, Stub>& obj)
00188 {
00189 return obj.objid_.id();
00190 }
00191 };
00192
00193 }
00194
00195 #endif // ! TOPPERS_MESSAGEBUFFER_HPP_