メインページ | モジュール | 名前空間一覧 | クラス階層 | 構成 | ファイル一覧 | 名前空間メンバ | 構成メンバ | ファイルメンバ | 関連ページ

toppers/cyclichandler.hpp

解説を見る。
00001 /*
00002  *  TOPPERS/C++ API Template Library
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      C++ API Template Library
00005  *
00006  *  Copyright (C) 2004 by TAKAGI Nobuhisa
00007  *
00008  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
00009  *  によって公表されている GNU General Public License の Version 2 に記
00010  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00011  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00012  *  利用と呼ぶ)することを無償で許諾する.
00013  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00014  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00015  *      スコード中に含まれていること.
00016  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00017  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00018  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00019  *      の無保証規定を掲載すること.
00020  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00021  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00022  *      と.
00023  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00024  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00025  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00026  *        報告すること.
00027  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00028  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00029  *
00030  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00031  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00032  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00033  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00034  *
00035  *  @(#) $Id: cyclichandler.hpp,v 1.1.1.1 2004/04/14 09:30:28 takagi-n Exp $
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_