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
00051 #ifndef TOPPERS_CYCLICHANDLER_HPP_
00052 #define TOPPERS_CYCLICHANDLER_HPP_
00053
00054 #include <toppers/context.hpp>
00055
00056 namespace toppers
00057 {
00058
00059 template <class Body> void cyclichandler_entry(VP_INT);
00060
00061 template <class Diagnostics, class Stub> class cyclichandler_body;
00062
00074 template <ID Id = 0,
00075 class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00076 class Stub = TOPPERS_DEFAULT_STUB >
00077 class cyclichandler : Diagnostics
00078 {
00079 typedef object_controller<Id, obj_cyclichandler, Stub> controller;
00080 object_id<Id> objid_;
00081
00082 public:
00084 typedef t_ccyc creation;
00086 typedef t_rcyc reference;
00088 typedef cyclichandler_body<Diagnostics, Stub> body;
00089
00092
00094 cyclichandler() {}
00096 explicit cyclichandler(ID id) : objid_(id) {}
00097
00099 template <ID Id2, class Diagnostics2, class Stub2>
00100 cyclichandler(const cyclichandler<Id2, Diagnostics2, Stub2>& other)
00101 : objid_(get_unsafe_id(other))
00102 {
00103 TOPPERS_STATIC_ASSERT(Id == 0);
00104 }
00105
00107
00110
00111
00112 ER create(creation* pk_cobj)
00113 {
00114 ER ercd = controller::create(objid_, pk_cobj);
00115 return handle_error(ercd);
00116 }
00118 ER create(const creation* pk_cobj)
00119 {
00120 ER ercd = controller::create(objid_, pk_cobj);
00121 return handle_error(ercd);
00122 }
00124 ER create(ATR cycatr, VP_INT exinf, void (*cychdr)(VP_INT), RELTIM cyctim = 1, RELTIM cycphs = 0)
00125 {
00126 creation packet;
00127 packet.cycatr = cycatr;
00128 packet.exinf = exinf;
00129 packet.cychdr = FP(cychdr);
00130 packet.cyctim = cyctim;
00131 packet.cycphs = cycphs;
00132 return create(&packet);
00133 }
00135 template <class Body>
00136 ER create(ATR cycatr = TA_STA, VP_INT exinf = 0, RELTIM cyctim = 1, RELTIM cycphs = 0)
00137 {
00138 return create(cycatr & ~TA_ASM | TA_HLNG, exinf, &cyclichandler_entry<Body>, cyctim, cycphs);
00139 }
00141 ER destroy()
00142 {
00143 ER ercd = controller::destroy(objid_);
00144 return handle_error(ercd);
00145 }
00146
00148
00151
00153 ER refer(reference* pk_robj) const
00154 {
00155 ER ercd = controller::refer(objid_, pk_robj);
00156 return handle_error(ercd);
00157 }
00158
00160
00163
00165 ER start() const
00166 {
00167 ER ercd = Stub::stub_sta_cyc(objid_.id());
00168 return handle_error(ercd);
00169 }
00171 ER stop() const
00172 {
00173 ER ercd = Stub::stub_stp_cyc(objid_.id());
00174 return handle_error(ercd);
00175 }
00176
00178
00180 friend ID get_unsafe_id(const cyclichandler<Id, Diagnostics, Stub>& obj)
00181 {
00182 return obj.objid_.id();
00183 }
00184 };
00185
00197 template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00198 class Stub = TOPPERS_DEFAULT_STUB >
00199 class cyclichandler_body : public non_task_context_body<Diagnostics, Stub>
00200 {
00201 VP_INT exinf_;
00202
00203 protected:
00205 ~cyclichandler_body() {}
00206
00207 public:
00209 explicit cyclichandler_body(VP_INT exinf) : exinf_(exinf) {}
00210
00212 VP_INT get_extended_info() const { return exinf_; }
00213 };
00214
00215
00226 template <class Body>
00227 inline void cyclichandler_entry(VP_INT exinf)
00228 {
00229 Body body(exinf);
00230 body.run();
00231 }
00232
00233 }
00234
00235 #endif // ! TOPPERS_CYCLICHANDLER_HPP_