fdhwlib  2.0.25
/home/kopmann/git-mirror/fdhwlib/fdhwlib/akutil/keyboard.h
Go to the documentation of this file.
00001 /***************************************************************************
00002 
00003     keyboard.h  -  description
00004 
00005 
00006 
00007     begin                : Mon Jul 31 2000
00008 
00009     copyright            : (C) 2000 by Andreas Kopmann
00010 
00011     email                : kopmann@hpe.fzk.de
00012 
00013     status               :
00014 
00015     test                 :
00016 
00017     history              :
00018 
00019  ***************************************************************************/
00020 
00021 
00022 
00023 #ifndef _INC_KEYBOARD_39253AB201E3_INCLUDED
00024 #define _INC_KEYBOARD_39253AB201E3_INCLUDED
00025 
00026 
00027 
00028 #ifdef __GNUC__
00029 # include <cstdio>
00030 # include <unistd.h>
00031 # include <termios.h>
00032 #else
00033 # include <conio.h>
00034 #endif // __GNUC__
00035 
00036 
00037 
00038 
00039 
00047 //##ModelId=3991220101D7
00048 
00049 class keyboard {
00050 
00051 public:
00052 
00053         //##ModelId=3991220101E4
00054 
00055   keyboard();
00056 
00057         //##ModelId=3991220101E3
00058 
00059   ~keyboard();
00060 
00061 
00062 
00063         //##ModelId=3991220101E2
00064 
00065   inline bool hit();
00066 
00068   inline bool hit(char key);
00069 
00070         //##ModelId=3991220101E1
00071 
00072   inline char getchar();
00073 
00075   inline char *getpasswd();
00076 
00077 
00079   char passwd[20];
00080   
00081 private:
00082 
00083 
00084 #ifdef __GNUC__
00085 
00086 
00087         //##ModelId=399125540343
00088 
00089   struct termios orig;
00090 
00091 
00092 
00093         //##ModelId=399125540339
00094 
00095   struct termios newt;
00096 
00097         //##ModelId=3991220101D8
00098 
00099   int peek;
00100 
00101 #else
00102 
00103   char key;
00104 
00105 #endif
00106 
00107 
00108 
00109 };
00110 
00111 
00112 
00113 
00114 
00115 inline keyboard::keyboard()
00116 
00117 {
00118 
00119 
00120 
00121 #ifdef __GNUC__
00122 
00123   peek = -1;
00124 
00125 
00126 
00127   tcgetattr(0, &orig);
00128 
00129   newt = orig;
00130 
00131   newt.c_lflag &= ~ICANON;
00132 
00133   newt.c_lflag &= ~ECHO;
00134 
00135   newt.c_lflag &= ~ISIG;
00136 
00137   newt.c_cc[VMIN] = 1;
00138 
00139   newt.c_cc[VTIME] = 0;
00140 
00141   tcsetattr(0, TCSANOW, &newt);
00142 
00143 #endif
00144 
00145 
00146 
00147 }
00148 
00149 
00150 
00151 inline keyboard::~keyboard()
00152 
00153 {
00154 
00155 #ifdef __GNUC__
00156 
00157   tcsetattr(0,TCSANOW, &orig);
00158 
00159 #endif
00160 
00161 }
00162 
00163 
00164 
00165 inline bool keyboard::hit()
00166 
00167 {
00168 
00169 
00170 
00171 #ifdef __GNUC__
00172 
00173 
00174   char ch;
00175   int nread;
00176 
00177 
00178 
00179   if(peek != -1) return 1;
00180 
00181   newt.c_cc[VMIN]=0;
00182 
00183   tcsetattr(0, TCSANOW, &newt);
00184 
00185   nread = read(0,&ch,1);
00186 
00187   newt.c_cc[VMIN]=1;
00188 
00189   tcsetattr(0, TCSANOW, &newt);
00190 
00191 
00192 
00193   if(nread == 1) {
00194 
00195    peek = ch;
00196 
00197    return 1;
00198 
00199   }
00200 
00201 
00202 
00203 #else
00204   
00205   //_kbhit(); // ??? Where is the difference
00206   if ( _kbhit() ) {
00207           key = _getch(); 
00208           return 1;
00209   }
00210 
00211 
00212 #endif
00213 
00214 
00215 
00216   return 0;
00217 
00218 
00219 }
00220 
00221 
00222 
00223 inline bool keyboard::hit(char key){
00224   if (hit())
00225     return( getchar() == key);
00226   else
00227     return(false);
00228 }
00229 
00230 
00231 
00232 inline char keyboard::getchar()
00233 
00234 {
00235 
00236 #ifdef __GNUC__
00237 
00238   char ch;
00239 
00240 
00241 
00242   if(peek != -1) {
00243 
00244     ch = peek;
00245 
00246     peek = -1;
00247 
00248     return ch;
00249 
00250   }
00251 
00252 
00253 
00254   read(0,&ch,1);
00255 
00256   return ch;
00257 
00258 #else
00259   return(key);
00260 
00261 #endif
00262 
00263 
00264 
00265 }
00266 
00267 
00268 inline char * keyboard::getpasswd(){
00269   char ch;
00270   int i;
00271   
00272   // Clear password
00273   fflush(stdout);  
00274   ch = 0;
00275   i = 0;
00276   while ((ch != '\n') && (ch != '\r') && (i<20)){
00277     if (hit()){
00278       ch = getchar();
00279       switch (ch){
00280         case '\n':
00281         case '\r':
00282           break;
00283         default:
00284           passwd[i] = ch;
00285           printf("*"); fflush(stdout);
00286           i++;
00287           break;
00288       }    
00289     }    
00290   }
00291     
00292   passwd[i] = 0;
00293   printf("\n");
00294 
00295   return(passwd);
00296   
00297 }  
00298 
00299 
00300 
00301 
00302 #endif
00303