Akifumi Takahashi / Mbed 2 deprecated Interference_Simple

Dependencies:   mbed SerialInputReactionHandler AMPulseTrain SwArr16MOSFET StrCommandHandler KajiLabES

Committer:
aktk
Date:
Wed Oct 23 20:08:31 2019 +0000
Revision:
1:b97639dad576
Parent:
0:19a67422961f
used at VRSJ24 DEMO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:19a67422961f 1 #include "sigbind.h"
aktk 0:19a67422961f 2 namespace aktk_sigbind
aktk 0:19a67422961f 3 {
aktk 0:19a67422961f 4 // To avoid pressing key too much
aktk 0:19a67422961f 5 enum Lock {UNLOCK, LOCK};
aktk 0:19a67422961f 6 Lock aktk_keylock = UNLOCK;
aktk 0:19a67422961f 7
aktk 1:b97639dad576 8 //private functions
aktk 1:b97639dad576 9 template<typename T>
aktk 1:b97639dad576 10 int scanValue(T* arg_val);
aktk 1:b97639dad576 11 void waitUnpress();
aktk 1:b97639dad576 12 void setPulseParam();
aktk 1:b97639dad576 13 void ArrowKeyBind(const char arg_c);
aktk 1:b97639dad576 14 //void printStimType();
aktk 1:b97639dad576 15 void printStatus(void);
aktk 1:b97639dad576 16 void keyBind()
aktk 1:b97639dad576 17 {
aktk 1:b97639dad576 18 //stimulator.DAAD(0);
aktk 1:b97639dad576 19 char sig = pc.getc();
aktk 1:b97639dad576 20 if (aktk_keylock == UNLOCK) {
aktk 1:b97639dad576 21 aktk_keylock = LOCK;
aktk 1:b97639dad576 22 switch(sig) {
aktk 1:b97639dad576 23 case 'w':
aktk 1:b97639dad576 24 spacing = WIDE_CONDITION;
aktk 1:b97639dad576 25 pc.printf("Wide condition\n");
aktk 1:b97639dad576 26 waitUnpress();
aktk 1:b97639dad576 27 break;
aktk 1:b97639dad576 28 case 'n':
aktk 1:b97639dad576 29 spacing = NARROW_CONDITION;
aktk 1:b97639dad576 30 pc.printf("Narrow condition\n");
aktk 1:b97639dad576 31 waitUnpress();
aktk 1:b97639dad576 32 break;
aktk 1:b97639dad576 33 case 'm':
aktk 1:b97639dad576 34 switch(pc.getc()) {
aktk 1:b97639dad576 35 case 'b':
aktk 1:b97639dad576 36 smode = BIPOLAR;
aktk 1:b97639dad576 37 pc.printf("BIPOLAR Stimulation\n");
aktk 1:b97639dad576 38 break;
aktk 1:b97639dad576 39 case 'a':
aktk 1:b97639dad576 40 smode = ANODIC;
aktk 1:b97639dad576 41 pc.printf("ANODIC Stimulation\n");
aktk 1:b97639dad576 42 break;
aktk 1:b97639dad576 43 case 'c':
aktk 1:b97639dad576 44 smode = CATHODIC;
aktk 1:b97639dad576 45 pc.printf("CATHODIC Stimulation\n");
aktk 1:b97639dad576 46 break;
aktk 1:b97639dad576 47 }
aktk 1:b97639dad576 48 waitUnpress();
aktk 1:b97639dad576 49 break;
aktk 1:b97639dad576 50 case 'p':
aktk 1:b97639dad576 51 printStatus();
aktk 1:b97639dad576 52 waitUnpress();
aktk 1:b97639dad576 53 break;
aktk 1:b97639dad576 54 case 'v':
aktk 1:b97639dad576 55 setPulseParam();
aktk 1:b97639dad576 56 waitUnpress();
aktk 1:b97639dad576 57 break;
aktk 1:b97639dad576 58 case 'a': //switch mbed-pc communication on/off
aktk 1:b97639dad576 59 if (pstate == MAIN_ROUTINE) {
aktk 1:b97639dad576 60 pstate = WAIT_A_CERTAIN_KEY;
aktk 1:b97639dad576 61 pc.printf("stop\n");
aktk 1:b97639dad576 62 } else if (pstate == WAIT_A_CERTAIN_KEY) {
aktk 1:b97639dad576 63 pstate = MAIN_ROUTINE;
aktk 1:b97639dad576 64 //printStimType();
aktk 1:b97639dad576 65 pc.printf("start\n");
aktk 1:b97639dad576 66 }
aktk 1:b97639dad576 67 waitUnpress();
aktk 1:b97639dad576 68 break;
aktk 1:b97639dad576 69 case 'E':
aktk 1:b97639dad576 70 pstate = TERMINATED;
aktk 1:b97639dad576 71 pc.printf("TERMINATED");
aktk 1:b97639dad576 72 waitUnpress();
aktk 1:b97639dad576 73 break;
aktk 1:b97639dad576 74 case 'S':// start
aktk 1:b97639dad576 75 if (pstate == WAIT_A_CERTAIN_KEY) {
aktk 1:b97639dad576 76 pstate = MAIN_ROUTINE;
aktk 1:b97639dad576 77 //printStimType();
aktk 1:b97639dad576 78 pc.printf("start\n");
aktk 1:b97639dad576 79 }
aktk 1:b97639dad576 80 waitUnpress();
aktk 1:b97639dad576 81 break;
aktk 1:b97639dad576 82 case 'P':// pause
aktk 1:b97639dad576 83 pstate = WAIT_A_CERTAIN_KEY;
aktk 1:b97639dad576 84 pc.printf("stop\n");
aktk 1:b97639dad576 85 waitUnpress();
aktk 1:b97639dad576 86 break;
aktk 1:b97639dad576 87 case 0x1b:
aktk 1:b97639dad576 88 if(pc.getc() == 0x5b) {
aktk 1:b97639dad576 89 ArrowKeyBind(pc.getc());
aktk 1:b97639dad576 90 pc.printf("Hight:%d\n",ph);//sc.getPH());
aktk 1:b97639dad576 91 }
aktk 1:b97639dad576 92 waitUnpress();
aktk 1:b97639dad576 93 break;
aktk 1:b97639dad576 94 default:
aktk 1:b97639dad576 95 printKBManual();
aktk 1:b97639dad576 96 pc.printf("Sent data was: %d(%c)\n", sig, sig);
aktk 1:b97639dad576 97 waitUnpress();
aktk 1:b97639dad576 98 break;
aktk 1:b97639dad576 99 }
aktk 1:b97639dad576 100 //aktk_keylock = UNLOCK;
aktk 1:b97639dad576 101 } else if (sig == 0x1B) //esc
aktk 1:b97639dad576 102 aktk_keylock = UNLOCK;
aktk 1:b97639dad576 103 }
aktk 1:b97639dad576 104
aktk 0:19a67422961f 105 void waitUnpress()
aktk 0:19a67422961f 106 {
aktk 0:19a67422961f 107 while (1) {
aktk 0:19a67422961f 108 if(! pc.readable()) {
aktk 0:19a67422961f 109 aktk_keylock = UNLOCK;
aktk 0:19a67422961f 110 break;
aktk 0:19a67422961f 111 }
aktk 0:19a67422961f 112 }
aktk 0:19a67422961f 113 }
aktk 1:b97639dad576 114
aktk 0:19a67422961f 115 template<typename T>
aktk 0:19a67422961f 116 int scanValue(T* arg_val)
aktk 0:19a67422961f 117 {
aktk 0:19a67422961f 118 char c = 0;
aktk 0:19a67422961f 119 char c_prevent = 0;
aktk 0:19a67422961f 120 double tmp = 0.0;
aktk 0:19a67422961f 121 double fig = 1.0;
aktk 0:19a67422961f 122 bool dot_flag = false;
aktk 0:19a67422961f 123 bool no_modified = true;
aktk 0:19a67422961f 124
aktk 0:19a67422961f 125 T arg_last_val = *arg_val;
aktk 0:19a67422961f 126
aktk 0:19a67422961f 127 do {
aktk 0:19a67422961f 128 c = pc.getc();
aktk 0:19a67422961f 129
aktk 0:19a67422961f 130 if ('0' <= c && c <= '9') {
aktk 0:19a67422961f 131 no_modified = false;
aktk 0:19a67422961f 132 pc.putc(c);
aktk 0:19a67422961f 133 if(! dot_flag) {
aktk 0:19a67422961f 134 tmp *= 10.0;
aktk 0:19a67422961f 135 tmp += (double)(c - '0');
aktk 0:19a67422961f 136 } else {
aktk 0:19a67422961f 137 fig *= 10.0;
aktk 0:19a67422961f 138 tmp += (double)(c - '0') / fig;
aktk 0:19a67422961f 139 }
aktk 0:19a67422961f 140 } else if (c == '.') {
aktk 0:19a67422961f 141 if(dot_flag == 0)pc.printf(".");
aktk 0:19a67422961f 142 dot_flag = true;
aktk 0:19a67422961f 143 } else if (c == 'k' || c == 'K') {
aktk 0:19a67422961f 144 pc.printf("(keep present value)\n");
aktk 0:19a67422961f 145 tmp = (double) arg_last_val;
aktk 0:19a67422961f 146 break;
aktk 0:19a67422961f 147 } else if (c == 0x10 || c == 0x08) {
aktk 0:19a67422961f 148 pc.putc(0x08);
aktk 0:19a67422961f 149 pc.putc(0x20);
aktk 0:19a67422961f 150 pc.putc(0x08);
aktk 0:19a67422961f 151 if(! dot_flag) {
aktk 0:19a67422961f 152 c_prevent = (double)(((int)tmp) % 10);
aktk 0:19a67422961f 153 tmp -= (double)(c_prevent);
aktk 0:19a67422961f 154 tmp /= 10;
aktk 0:19a67422961f 155 } else {
aktk 0:19a67422961f 156 if(fig == 1.0)
aktk 0:19a67422961f 157 dot_flag = false;
aktk 0:19a67422961f 158 else {
aktk 0:19a67422961f 159 c_prevent = (double)((int)(tmp * fig) % 10);
aktk 0:19a67422961f 160 tmp -= (double)(c_prevent) / fig;
aktk 0:19a67422961f 161 fig /= 10;
aktk 0:19a67422961f 162 }
aktk 0:19a67422961f 163 }
aktk 0:19a67422961f 164 if(tmp == 0) no_modified = true;
aktk 0:19a67422961f 165 } else if (c == 0x1b) {
aktk 0:19a67422961f 166 pc.printf("CANSELED\n");
aktk 0:19a67422961f 167 return -1;
aktk 0:19a67422961f 168 } else if (c == 0x0A || c == 0x0D) {
aktk 0:19a67422961f 169 pc.printf("\n");
aktk 0:19a67422961f 170 break;
aktk 0:19a67422961f 171 }
aktk 0:19a67422961f 172 } while(1);
aktk 0:19a67422961f 173
aktk 0:19a67422961f 174 waitUnpress();
aktk 0:19a67422961f 175
aktk 0:19a67422961f 176 if(no_modified) *arg_val = arg_last_val;
aktk 0:19a67422961f 177 else *arg_val = static_cast<T>(tmp);
aktk 0:19a67422961f 178 pc.printf("tmp:%f\n",tmp);
aktk 0:19a67422961f 179
aktk 0:19a67422961f 180 return 0;
aktk 0:19a67422961f 181 }
aktk 0:19a67422961f 182 //int scanValue<int>(int*);
aktk 0:19a67422961f 183 //int scanValue<double>(double*);
aktk 0:19a67422961f 184 //int scanValue<unsigned short>(unsigned short*);
aktk 0:19a67422961f 185
aktk 1:b97639dad576 186 void setPulseParam()
aktk 0:19a67422961f 187 {
aktk 1:b97639dad576 188 int lph, lpp, lpw;
aktk 1:b97639dad576 189
aktk 1:b97639dad576 190 lph = ph;//sc.getPH();
aktk 1:b97639dad576 191 lpp = pp;//sc.getPP();
aktk 1:b97639dad576 192 lpw = pw;//sc.getPW();
aktk 0:19a67422961f 193
aktk 1:b97639dad576 194 // read values
aktk 1:b97639dad576 195 pc.printf("set pulse Height:");
aktk 1:b97639dad576 196 if( scanValue<int>(&lph) ) goto BreakV;
aktk 1:b97639dad576 197 pc.printf("set pulse period:");
aktk 1:b97639dad576 198 if( scanValue<int>(&lpp) ) goto BreakV;
aktk 1:b97639dad576 199 pc.printf("set pulse width :");
aktk 1:b97639dad576 200 if( scanValue<int>(&lpw) ) goto BreakV;
aktk 1:b97639dad576 201
aktk 1:b97639dad576 202 // set values
aktk 1:b97639dad576 203 ph = lph;
aktk 1:b97639dad576 204 pp = lpp;
aktk 1:b97639dad576 205 pw = lpw;
aktk 0:19a67422961f 206 BreakV:
aktk 1:b97639dad576 207 waitUnpress();
aktk 1:b97639dad576 208 }
aktk 0:19a67422961f 209
aktk 1:b97639dad576 210 void ArrowKeyBind(const char arg_c)
aktk 1:b97639dad576 211 {
aktk 1:b97639dad576 212 switch(arg_c) {
aktk 1:b97639dad576 213 case 0x41 : {
aktk 1:b97639dad576 214 if(ph <= 4090) //if(sc.getPH()<4000)
aktk 1:b97639dad576 215 ph = ph + 5;//sc.setWaveParam(sc.getPH() + 5, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 216 else
aktk 1:b97639dad576 217 ph = 4095;
aktk 1:b97639dad576 218 pc.printf("up\n");
aktk 1:b97639dad576 219 break;
aktk 1:b97639dad576 220 }
aktk 1:b97639dad576 221 case 0x42 : {
aktk 1:b97639dad576 222 if(5 <= ph) //if(5<sc.getPH())
aktk 1:b97639dad576 223 ph = ph - 5;//sc.setWaveParam(sc.getPH() - 5, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 224 else
aktk 1:b97639dad576 225 ph = 0;//sc.setWaveParam(0, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 226 pc.printf("down\n");
aktk 1:b97639dad576 227 break;
aktk 1:b97639dad576 228 }
aktk 1:b97639dad576 229 case 0x43 : {
aktk 1:b97639dad576 230 if(ph <= 4045)//if(sc.getPH()<4000)
aktk 1:b97639dad576 231 ph = ph + 50;//sc.setWaveParam(sc.getPH() + 50, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 232 else
aktk 1:b97639dad576 233 ph = 4095;
aktk 1:b97639dad576 234 pc.printf("shift up\n");
aktk 1:b97639dad576 235 break;
aktk 1:b97639dad576 236 }
aktk 1:b97639dad576 237 case 0x44 : {
aktk 1:b97639dad576 238 if(50 <= ph)//if(50<sc.getPH())
aktk 1:b97639dad576 239 ph = ph - 50;//sc.setWaveParam(sc.getPH() - 50, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 240 else
aktk 1:b97639dad576 241 ph = 0;//sc.setWaveParam(0, sc.getPP(),sc.getPW());
aktk 1:b97639dad576 242 pc.printf("shift down\n");
aktk 1:b97639dad576 243 break;
aktk 1:b97639dad576 244 }
aktk 1:b97639dad576 245 default: {
aktk 1:b97639dad576 246 //pc.printf("default\n");
aktk 1:b97639dad576 247 break;
aktk 1:b97639dad576 248 }
aktk 1:b97639dad576 249 }
aktk 1:b97639dad576 250 }
aktk 0:19a67422961f 251
aktk 0:19a67422961f 252 void printKBManual(void)
aktk 0:19a67422961f 253 {
aktk 0:19a67422961f 254 pc.printf( "\n"
aktk 0:19a67422961f 255 "keybind are following:\n"
aktk 0:19a67422961f 256 " ---\n"
aktk 0:19a67422961f 257 " v: set all paramater by arbitrary value\n"
aktk 0:19a67422961f 258 " ---\n"
aktk 0:19a67422961f 259 " UP: pulse hight + 5\n"
aktk 0:19a67422961f 260 " Down: pulse hight - 5\n"
aktk 0:19a67422961f 261 " right: pulse hight +50\n"
aktk 0:19a67422961f 262 " left: pulse hight -50\n"
aktk 0:19a67422961f 263 " ---\n"
aktk 1:b97639dad576 264 " w: Wide condition\n"
aktk 1:b97639dad576 265 " n: Narrow condition\n"
aktk 1:b97639dad576 266 " ---\n"
aktk 1:b97639dad576 267 " mb: Bipolar stimulation\n"
aktk 1:b97639dad576 268 " ma: Anodic Stimulation\n"
aktk 1:b97639dad576 269 " mc: Cathodic Stimulation\n"
aktk 1:b97639dad576 270 " ---\n"
aktk 0:19a67422961f 271 " p: print wave parameter\n"
aktk 0:19a67422961f 272 " ---\n"
aktk 0:19a67422961f 273 " a: Start or Pause main loop\n"
aktk 0:19a67422961f 274 " S: Start or Resume Stimulation\n"
aktk 0:19a67422961f 275 " P: Pause Stimulation\n"
aktk 0:19a67422961f 276 " E(shift+a): terminate the loop\n"
aktk 0:19a67422961f 277 "\n");
aktk 0:19a67422961f 278 }
aktk 0:19a67422961f 279 void printStatus(void)
aktk 0:19a67422961f 280 {
aktk 0:19a67422961f 281 pc.printf(
aktk 0:19a67422961f 282 "PHeight:%05d "
aktk 0:19a67422961f 283 "PPeriod:%05d "
aktk 0:19a67422961f 284 "PWidth :%05d\n"
aktk 0:19a67422961f 285 //,(int)sc.getPH(), (int)sc.getPP(), (int)sc.getPW()
aktk 0:19a67422961f 286 ,ph,pp,pw);
aktk 0:19a67422961f 287 }
aktk 0:19a67422961f 288 }//end of name space