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_ALARMHANDLER_HPP_
00052 #define TOPPERS_ALARMHANDLER_HPP_
00053
00054 #include <toppers/context.hpp>
00055
00056 namespace toppers
00057 {
00058
00059 template <class Body> void alarmhandler_entry(VP_INT);
00060
00061 template <class Diagnostics, class Stub> class alarmhandler_body;
00062
00074 template <ID Id = 0,
00075 class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00076 class Stub = TOPPERS_DEFAULT_STUB >
00077 class alarmhandler : Diagnostics
00078 {
00079 typedef object_controller<Id, obj_alarmhandler, Stub> controller;
00080 object_id<Id> objid_;
00081
00082 public:
00084 typedef t_calm creation;
00086 typedef t_ralm reference;
00088 typedef alarmhandler_body<Diagnostics, Stub> body;
00089
00092
00094 alarmhandler() {}
00096 explicit alarmhandler(ID id) : objid_(id) {}
00097
00099 template <ID Id2, class Diagnostics2, class Stub2>
00100 alarmhandler(const alarmhandler<Id2, Diagnostics2, Stub2>& other)
00101 : objid_(get_unsafe_id(other))
00102 {
00103 TOPPERS_STATIC_ASSERT(Id == 0);
00104 }
00106
00109
00110
00111 ER create(creation* pk_cobj)
00112 {
00113 ER ercd = controller::create(objid_, pk_cobj);
00114 return handle_error(ercd);
00115 }
00117 ER create(const creation* pk_cobj)
00118 {
00119 ER ercd = controller::create(objid_, pk_cobj);
00120 return handle_error(ercd);
00121 }
00123 ER create(ATR almatr, VP_INT exinf, void (*almhdr)(VP_INT))
00124 {
00125 creation packet;
00126 packet.almatr = almatr;
00127 packet.exinf = exinf;
00128 packet.almhdr = FP(almhdr);
00129 return create(&packet);
00130 }
00132 template <class Body>
00133 ER create(ATR almatr = 0, VP_INT exinf = 0)
00134 {
00135 return create(almatr & ~TA_ASM | TA_HLNG, exinf, &alarmhandler_entry<Body>);
00136 }
00138 ER destroy()
00139 {
00140 ER ercd = controller::destroy(objid_);
00141 return handle_error(ercd);
00142 }
00143
00145
00148
00150 ER refer(reference* pk_robj) const
00151 {
00152 ER ercd = controller::refer(objid_, pk_robj);
00153 return handle_error(ercd);
00154 }
00155
00157
00160
00162 ER start(RELTIM almtim) const
00163 {
00164 ER ercd = Stub::stub_sta_alm(objid_.id(), almtim);
00165 return handle_error(ercd);
00166 }
00168 ER stop() const
00169 {
00170 ER ercd = Stub::stub_stp_alm(objid_.id());
00171 return handle_error(ercd);
00172 }
00173
00175
00177 friend ID get_unsafe_id(const alarmhandler<Id, Diagnostics, Stub>& obj)
00178 {
00179 return obj.objid_.id();
00180 }
00181 };
00182
00194 template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00195 class Stub = TOPPERS_DEFAULT_STUB >
00196 class alarmhandler_body : public non_task_context_body<Diagnostics, Stub>
00197 {
00198 VP_INT exinf_;
00199
00200 protected:
00202 ~alarmhandler_body() {}
00203
00204 public:
00206 explicit alarmhandler_body(VP_INT exinf) : exinf_(exinf) {}
00207
00209 VP_INT get_extended_info() const { return exinf_; }
00210 };
00211
00222 template <class Body>
00223 inline void alarmhandler_entry(VP_INT exinf)
00224 {
00225 Body body(exinf);
00226 body.run();
00227 }
00228
00229 }
00230
00231 #endif // ! TOPPERS_ALARMHANDLER_HPP_