Interference current stimulation program with kaji-lab ES device.

Dependencies:   mbed SerialInputReactionHandler AMPulseTrain SwArr16MOSFET StrCommandHandler KajiLabES

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