TestOrd.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef TEST_ORD_H
  14. #define TEST_ORD_H
  15. #include "SignalData.hpp"
  16. /**
  17.  * Send by API to preform TEST ON / TEST OFF
  18.  *
  19.  * SENDER:  API
  20.  * RECIVER: SimBlockCMCtrBlck
  21.  */
  22. class TestOrd {
  23.   friend class Ndb;
  24.   friend class Cmvmi;
  25.   friend class MgmtSrvr;
  26. public:
  27.   enum Command {
  28.     KeepUnchanged = 0,
  29.     On            = 1,
  30.     Off           = 2,
  31.     Toggle        = 3,
  32.     COMMAND_MASK  = 3
  33.   };
  34.   
  35.   enum SignalLoggerSpecification {
  36.     InputSignals       = 1,
  37.     OutputSignals      = 2,
  38.     InputOutputSignals = 3,
  39.     LOG_MASK           = 3
  40.   };
  41.   enum TraceSpecification {
  42.     TraceALL              = 0,
  43.     TraceAPI              = 1,
  44.     TraceGlobalCheckpoint = 2,
  45.     TraceLocalCheckpoint  = 4,
  46.     TraceDisconnect       = 8,
  47.     TRACE_MASK            = 15
  48.   };
  49. private:
  50.   STATIC_CONST( SignalLength = 25 );
  51.   /**
  52.    * Clear Signal
  53.    */
  54.   void clear();
  55.   /**
  56.    * Set/Get test command
  57.    */
  58.   void setTestCommand(Command);
  59.   void getTestCommand(Command&) const;
  60.   
  61.   /**
  62.    * Set trace command
  63.    */
  64.   void setTraceCommand(Command, TraceSpecification);
  65.   
  66.   /**
  67.    * Get trace command
  68.    */
  69.   void getTraceCommand(Command&, TraceSpecification&) const;
  70.   
  71.   /**
  72.    * Return no of signal logger commands 
  73.    *
  74.    * -1 Means apply command(0) to all blocks
  75.    * 
  76.    */
  77.   UintR getNoOfSignalLoggerCommands() const;
  78.   /**
  79.    * Add a signal logger command to a specific block
  80.    */
  81.   void addSignalLoggerCommand(BlockNumber, Command, SignalLoggerSpecification);
  82.   
  83.   /**
  84.    * Add a signal logger command to all blocks
  85.    *
  86.    * Note removes all previously added commands
  87.    *
  88.    */
  89.   void addSignalLoggerCommand(Command, SignalLoggerSpecification);
  90.   
  91.   /**
  92.    * Get Signal logger command
  93.    */
  94.   void getSignalLoggerCommand(int no, BlockNumber&, Command&, SignalLoggerSpecification&) const;
  95.   
  96.   UintR testCommand;              // DATA 0 
  97.   UintR traceCommand;             // DATA 1
  98.   UintR noOfSignalLoggerCommands; // DATA 2
  99.   UintR signalLoggerCommands[22]; // DATA 3 - 25
  100. };
  101. #define COMMAND_SHIFT  (0)
  102. #define TRACE_SHIFT    (2)
  103. #define LOG_SHIFT      (2)
  104. #define BLOCK_NO_SHIFT (16)
  105. #define BLOCK_NO_MASK  65535
  106. /**
  107.  * Clear Signal
  108.  */
  109. inline
  110. void
  111. TestOrd::clear(){
  112.   setTestCommand(KeepUnchanged);
  113.   setTraceCommand(KeepUnchanged, TraceAPI); // 
  114.   noOfSignalLoggerCommands = 0;
  115. }
  116. /**
  117.  * Set/Get test command
  118.  */
  119. inline
  120. void
  121. TestOrd::setTestCommand(Command cmd){
  122.   ASSERT_RANGE(cmd, 0, COMMAND_MASK, "TestOrd::setTestCommand");
  123.   testCommand = cmd;
  124. }
  125. inline
  126. void
  127. TestOrd::getTestCommand(Command & cmd) const{
  128.   cmd = (Command)(testCommand >> COMMAND_SHIFT);
  129. }
  130. /**
  131.  * Set trace command
  132.  */
  133. inline
  134. void
  135. TestOrd::setTraceCommand(Command cmd, TraceSpecification spec){
  136.   ASSERT_RANGE(cmd, 0, COMMAND_MASK, "TestOrd::setTraceCommand");
  137.   ASSERT_RANGE(spec, 0, TRACE_MASK, "TestOrd::setTraceCommand");
  138.   traceCommand = (cmd << COMMAND_SHIFT) | (spec << TRACE_SHIFT);
  139. }
  140. /**
  141.  * Get trace command
  142.  */
  143. inline
  144. void
  145. TestOrd::getTraceCommand(Command & cmd, TraceSpecification & spec) const{
  146.   cmd  = (Command)((traceCommand >> COMMAND_SHIFT) & COMMAND_MASK);
  147.   spec = (TraceSpecification)((traceCommand >> TRACE_SHIFT) & TRACE_MASK);
  148. }
  149. /**
  150.  * Return no of signal logger commands 
  151.  *
  152.  * -1 Means apply command(0) to all blocks
  153.  * 
  154.  */
  155. inline
  156. UintR
  157. TestOrd::getNoOfSignalLoggerCommands() const{
  158.   return noOfSignalLoggerCommands;
  159. }
  160. /**
  161.  * Add a signal logger command to a specific block
  162.  */
  163. inline
  164. void
  165. TestOrd::addSignalLoggerCommand(BlockNumber bnr, 
  166. Command cmd, SignalLoggerSpecification spec){
  167.   ASSERT_RANGE(cmd, 0, COMMAND_MASK, "TestOrd::addSignalLoggerCommand");
  168.   ASSERT_RANGE(spec, 0, LOG_MASK, "TestOrd::addSignalLoggerCommand");
  169.   //ASSERT_MAX(bnr, BLOCK_NO_MASK, "TestOrd::addSignalLoggerCommand");
  170.   signalLoggerCommands[noOfSignalLoggerCommands] =
  171.     (bnr << BLOCK_NO_SHIFT) | (cmd << COMMAND_SHIFT) | (spec << LOG_SHIFT);
  172.   noOfSignalLoggerCommands ++;
  173. }
  174. /**
  175.  * Add a signal logger command to all blocks
  176.  *
  177.  * Note removes all previously added commands
  178.  *
  179.  */
  180. inline
  181. void
  182. TestOrd::addSignalLoggerCommand(Command cmd, SignalLoggerSpecification spec){
  183.   ASSERT_RANGE(cmd, 0, COMMAND_MASK, "TestOrd::addSignalLoggerCommand");
  184.   ASSERT_RANGE(spec, 0, LOG_MASK, "TestOrd::addSignalLoggerCommand");
  185.   noOfSignalLoggerCommands = ~0;
  186.   signalLoggerCommands[0] = (cmd << COMMAND_SHIFT) | (spec << LOG_SHIFT);
  187. }
  188. /**
  189.  * Get Signal logger command
  190.  */
  191. inline
  192. void
  193. TestOrd::getSignalLoggerCommand(int no, BlockNumber & bnr, 
  194. Command & cmd, 
  195. SignalLoggerSpecification & spec) const{
  196.   bnr  = (BlockNumber)((signalLoggerCommands[no] >> BLOCK_NO_SHIFT) 
  197.        & BLOCK_NO_MASK);
  198.   cmd  = (Command)((signalLoggerCommands[no] >> COMMAND_SHIFT)  
  199.    & COMMAND_MASK);
  200.   spec = (SignalLoggerSpecification)((signalLoggerCommands[no] >> LOG_SHIFT) 
  201.      & LOG_MASK);
  202. }
  203. #endif