
Interference current stimulation program with kaji-lab ES device.
Dependencies: mbed SerialInputReactionHandler AMPulseTrain SwArr16MOSFET StrCommandHandler KajiLabES
SerialCom/sigbind.cpp@0:19a67422961f, 2018-10-23 (annotated)
- 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?
User | Revision | Line number | New 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 |