Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SerialInputReactionHandler AMPulseTrain SwArr16MOSFET StrCommandHandler KajiLabES
SerialCom/sigbind.cpp@1:b97639dad576, 2019-10-23 (annotated)
- 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?
| 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 | 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 |