Uchida Masayuki
/
FootileSoftware
test
Footile.cpp@0:03cdee95fb5a, 2018-05-30 (annotated)
- Committer:
- Uchida0923
- Date:
- Wed May 30 02:34:33 2018 +0000
- Revision:
- 0:03cdee95fb5a
???????;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Uchida0923 | 0:03cdee95fb5a | 1 | #include "Footile.h" |
Uchida0923 | 0:03cdee95fb5a | 2 | #include <math.h> |
Uchida0923 | 0:03cdee95fb5a | 3 | |
Uchida0923 | 0:03cdee95fb5a | 4 | //myFootile(P0_8, P0_9, P0_10, P0_11, P0_12, P0_19, P0_18, P0_7, P0_17, P0_5, P0_4, P0_22); |
Uchida0923 | 0:03cdee95fb5a | 5 | Footile::Footile(PinName led1, PinName led2, PinName led3, PinName trg, PinName ad, PinName tx, PinName rx, PinName io1, PinName io2, PinName sda, PinName scl, PinName en): |
Uchida0923 | 0:03cdee95fb5a | 6 | _led1(led1), _led2(led2), _led3(led3), _trg(trg), _prssr(ad), _bt(tx, rx), _btDummy1(io1), _btDummy2(io2), _Vibration(sda, scl, en) |
Uchida0923 | 0:03cdee95fb5a | 7 | { |
Uchida0923 | 0:03cdee95fb5a | 8 | |
Uchida0923 | 0:03cdee95fb5a | 9 | //_Vibration.i2cWriteByte(LIBRARY_SELECTION, _Vibration.LRA_LIB); |
Uchida0923 | 0:03cdee95fb5a | 10 | //_Vibration.i2cWriteByte(MODE, _Vibration.PWM_ANALOG); |
Uchida0923 | 0:03cdee95fb5a | 11 | |
Uchida0923 | 0:03cdee95fb5a | 12 | |
Uchida0923 | 0:03cdee95fb5a | 13 | _led1 = 1; |
Uchida0923 | 0:03cdee95fb5a | 14 | _led2 = 1; |
Uchida0923 | 0:03cdee95fb5a | 15 | _led3 = 1; |
Uchida0923 | 0:03cdee95fb5a | 16 | _volumeBuf=255; |
Uchida0923 | 0:03cdee95fb5a | 17 | |
Uchida0923 | 0:03cdee95fb5a | 18 | //flag |
Uchida0923 | 0:03cdee95fb5a | 19 | /* |
Uchida0923 | 0:03cdee95fb5a | 20 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 21 | SinewaveMode=true; |
Uchida0923 | 0:03cdee95fb5a | 22 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 23 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 24 | ConnectCheck=false; |
Uchida0923 | 0:03cdee95fb5a | 25 | snowMode=false; |
Uchida0923 | 0:03cdee95fb5a | 26 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 27 | */ |
Uchida0923 | 0:03cdee95fb5a | 28 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 29 | SinewaveMode=false; |
Uchida0923 | 0:03cdee95fb5a | 30 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 31 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 32 | snowMode=true; |
Uchida0923 | 0:03cdee95fb5a | 33 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 34 | |
Uchida0923 | 0:03cdee95fb5a | 35 | _sens=0.8; |
Uchida0923 | 0:03cdee95fb5a | 36 | |
Uchida0923 | 0:03cdee95fb5a | 37 | _countSize=0; |
Uchida0923 | 0:03cdee95fb5a | 38 | |
Uchida0923 | 0:03cdee95fb5a | 39 | _on=0; |
Uchida0923 | 0:03cdee95fb5a | 40 | |
Uchida0923 | 0:03cdee95fb5a | 41 | _trans.attach(this,&Footile::_transmission,0.5); |
Uchida0923 | 0:03cdee95fb5a | 42 | _bt.attach(this, &Footile::_onReceive, Serial::RxIrq); |
Uchida0923 | 0:03cdee95fb5a | 43 | _btDummy1 = 0; |
Uchida0923 | 0:03cdee95fb5a | 44 | _btDummy2 = 0; |
Uchida0923 | 0:03cdee95fb5a | 45 | |
Uchida0923 | 0:03cdee95fb5a | 46 | |
Uchida0923 | 0:03cdee95fb5a | 47 | //_Vibration.rtp((char)(255)); |
Uchida0923 | 0:03cdee95fb5a | 48 | |
Uchida0923 | 0:03cdee95fb5a | 49 | _heart.attach(this, &Footile::_beat, 2.0); |
Uchida0923 | 0:03cdee95fb5a | 50 | } |
Uchida0923 | 0:03cdee95fb5a | 51 | |
Uchida0923 | 0:03cdee95fb5a | 52 | |
Uchida0923 | 0:03cdee95fb5a | 53 | |
Uchida0923 | 0:03cdee95fb5a | 54 | void Footile::doFunctions() |
Uchida0923 | 0:03cdee95fb5a | 55 | { |
Uchida0923 | 0:03cdee95fb5a | 56 | static int prv_on = 0,Volume=0; |
Uchida0923 | 0:03cdee95fb5a | 57 | |
Uchida0923 | 0:03cdee95fb5a | 58 | |
Uchida0923 | 0:03cdee95fb5a | 59 | |
Uchida0923 | 0:03cdee95fb5a | 60 | // make hysteresis |
Uchida0923 | 0:03cdee95fb5a | 61 | if(_prssr > _sens) |
Uchida0923 | 0:03cdee95fb5a | 62 | _on = 1; |
Uchida0923 | 0:03cdee95fb5a | 63 | if(_prssr < 0.2) |
Uchida0923 | 0:03cdee95fb5a | 64 | _on = 0; |
Uchida0923 | 0:03cdee95fb5a | 65 | |
Uchida0923 | 0:03cdee95fb5a | 66 | if(_on && !prv_on||ChangeFlag==true) { |
Uchida0923 | 0:03cdee95fb5a | 67 | _trg = 1; |
Uchida0923 | 0:03cdee95fb5a | 68 | _led1 = 0; |
Uchida0923 | 0:03cdee95fb5a | 69 | Volume=_volumeBuf; |
Uchida0923 | 0:03cdee95fb5a | 70 | if(SinewaveMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 71 | _Vibration.rtp((char)(Volume)); |
Uchida0923 | 0:03cdee95fb5a | 72 | } |
Uchida0923 | 0:03cdee95fb5a | 73 | _bt.printf("%d\n",_prssr); |
Uchida0923 | 0:03cdee95fb5a | 74 | } |
Uchida0923 | 0:03cdee95fb5a | 75 | if(!_on && prv_on||ChangeFlag==true) { |
Uchida0923 | 0:03cdee95fb5a | 76 | _trg = 0; |
Uchida0923 | 0:03cdee95fb5a | 77 | _countSize=0; |
Uchida0923 | 0:03cdee95fb5a | 78 | if(SteadyMode==false&&SinewaveMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 79 | Volume=0;//When Not c=125 |
Uchida0923 | 0:03cdee95fb5a | 80 | _Vibration.rtp((char)(Volume)); |
Uchida0923 | 0:03cdee95fb5a | 81 | } |
Uchida0923 | 0:03cdee95fb5a | 82 | } |
Uchida0923 | 0:03cdee95fb5a | 83 | |
Uchida0923 | 0:03cdee95fb5a | 84 | prv_on = _on; |
Uchida0923 | 0:03cdee95fb5a | 85 | |
Uchida0923 | 0:03cdee95fb5a | 86 | |
Uchida0923 | 0:03cdee95fb5a | 87 | if(snowMode==true||grassMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 88 | _viber.attach(this, &Footile::VibeTimer,0.001); |
Uchida0923 | 0:03cdee95fb5a | 89 | } else{ |
Uchida0923 | 0:03cdee95fb5a | 90 | _viber.detach(); |
Uchida0923 | 0:03cdee95fb5a | 91 | } |
Uchida0923 | 0:03cdee95fb5a | 92 | |
Uchida0923 | 0:03cdee95fb5a | 93 | ChangeFlag=false; |
Uchida0923 | 0:03cdee95fb5a | 94 | |
Uchida0923 | 0:03cdee95fb5a | 95 | if(CorrespondMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 96 | _Vibration.rtp((char)(_volumeBuf*_prssr)); |
Uchida0923 | 0:03cdee95fb5a | 97 | } |
Uchida0923 | 0:03cdee95fb5a | 98 | wait(0.001); |
Uchida0923 | 0:03cdee95fb5a | 99 | } |
Uchida0923 | 0:03cdee95fb5a | 100 | |
Uchida0923 | 0:03cdee95fb5a | 101 | |
Uchida0923 | 0:03cdee95fb5a | 102 | void Footile::OnVibe(const float* wave, int size){ |
Uchida0923 | 0:03cdee95fb5a | 103 | if(_countSize < size){ |
Uchida0923 | 0:03cdee95fb5a | 104 | _Vibration.rtp((char)(wave[_countSize]*255)); |
Uchida0923 | 0:03cdee95fb5a | 105 | _countSize++; |
Uchida0923 | 0:03cdee95fb5a | 106 | } |
Uchida0923 | 0:03cdee95fb5a | 107 | else { |
Uchida0923 | 0:03cdee95fb5a | 108 | _Vibration.rtp((char)0); |
Uchida0923 | 0:03cdee95fb5a | 109 | } |
Uchida0923 | 0:03cdee95fb5a | 110 | } |
Uchida0923 | 0:03cdee95fb5a | 111 | |
Uchida0923 | 0:03cdee95fb5a | 112 | |
Uchida0923 | 0:03cdee95fb5a | 113 | void Footile::VibeTimer(){ |
Uchida0923 | 0:03cdee95fb5a | 114 | if(_on==1&&snowMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 115 | OnVibe(snowwave500, (int)(sizeof(snowwave500)/sizeof(snowwave500[0]))); |
Uchida0923 | 0:03cdee95fb5a | 116 | }else if(_on==1&&grassMode==true){ |
Uchida0923 | 0:03cdee95fb5a | 117 | OnVibe(grasswave, (int)(sizeof(grasswave)/sizeof(grasswave[0]))); |
Uchida0923 | 0:03cdee95fb5a | 118 | } |
Uchida0923 | 0:03cdee95fb5a | 119 | else if(_on==0){ |
Uchida0923 | 0:03cdee95fb5a | 120 | _Vibration.rtp((char)0); |
Uchida0923 | 0:03cdee95fb5a | 121 | } |
Uchida0923 | 0:03cdee95fb5a | 122 | } |
Uchida0923 | 0:03cdee95fb5a | 123 | |
Uchida0923 | 0:03cdee95fb5a | 124 | |
Uchida0923 | 0:03cdee95fb5a | 125 | |
Uchida0923 | 0:03cdee95fb5a | 126 | |
Uchida0923 | 0:03cdee95fb5a | 127 | |
Uchida0923 | 0:03cdee95fb5a | 128 | |
Uchida0923 | 0:03cdee95fb5a | 129 | |
Uchida0923 | 0:03cdee95fb5a | 130 | |
Uchida0923 | 0:03cdee95fb5a | 131 | |
Uchida0923 | 0:03cdee95fb5a | 132 | |
Uchida0923 | 0:03cdee95fb5a | 133 | // interruption on receiving |
Uchida0923 | 0:03cdee95fb5a | 134 | void Footile::_onReceive(void) |
Uchida0923 | 0:03cdee95fb5a | 135 | { |
Uchida0923 | 0:03cdee95fb5a | 136 | unsigned short num[5]; |
Uchida0923 | 0:03cdee95fb5a | 137 | unsigned short data_index = 0; |
Uchida0923 | 0:03cdee95fb5a | 138 | unsigned short index; |
Uchida0923 | 0:03cdee95fb5a | 139 | unsigned short data=0; |
Uchida0923 | 0:03cdee95fb5a | 140 | |
Uchida0923 | 0:03cdee95fb5a | 141 | ConnectCheck=true; |
Uchida0923 | 0:03cdee95fb5a | 142 | |
Uchida0923 | 0:03cdee95fb5a | 143 | for(int i=0;i<sizeof(num);i++){ |
Uchida0923 | 0:03cdee95fb5a | 144 | num[i]=0; |
Uchida0923 | 0:03cdee95fb5a | 145 | } |
Uchida0923 | 0:03cdee95fb5a | 146 | |
Uchida0923 | 0:03cdee95fb5a | 147 | while(1) { |
Uchida0923 | 0:03cdee95fb5a | 148 | if (!_bt.readable()) continue; |
Uchida0923 | 0:03cdee95fb5a | 149 | |
Uchida0923 | 0:03cdee95fb5a | 150 | char let = _bt.getc(); |
Uchida0923 | 0:03cdee95fb5a | 151 | //_bt.printf("%c",let); |
Uchida0923 | 0:03cdee95fb5a | 152 | data_index++; |
Uchida0923 | 0:03cdee95fb5a | 153 | |
Uchida0923 | 0:03cdee95fb5a | 154 | if (let == '\n') |
Uchida0923 | 0:03cdee95fb5a | 155 | { |
Uchida0923 | 0:03cdee95fb5a | 156 | // num[data_index-1] = 0; |
Uchida0923 | 0:03cdee95fb5a | 157 | break; |
Uchida0923 | 0:03cdee95fb5a | 158 | }else{ |
Uchida0923 | 0:03cdee95fb5a | 159 | num[data_index]=let-'0'; |
Uchida0923 | 0:03cdee95fb5a | 160 | } |
Uchida0923 | 0:03cdee95fb5a | 161 | } |
Uchida0923 | 0:03cdee95fb5a | 162 | |
Uchida0923 | 0:03cdee95fb5a | 163 | index=data_index-1; |
Uchida0923 | 0:03cdee95fb5a | 164 | |
Uchida0923 | 0:03cdee95fb5a | 165 | for(int i=0;i<data_index-1;i++){ |
Uchida0923 | 0:03cdee95fb5a | 166 | data+=(unsigned short)(pow(10.0,(double)i))*num[index];//get unsigned short values |
Uchida0923 | 0:03cdee95fb5a | 167 | index--; |
Uchida0923 | 0:03cdee95fb5a | 168 | } |
Uchida0923 | 0:03cdee95fb5a | 169 | |
Uchida0923 | 0:03cdee95fb5a | 170 | data_index = 0; |
Uchida0923 | 0:03cdee95fb5a | 171 | // echo back |
Uchida0923 | 0:03cdee95fb5a | 172 | _bt.printf("%d",data); |
Uchida0923 | 0:03cdee95fb5a | 173 | _modeChange(data); |
Uchida0923 | 0:03cdee95fb5a | 174 | data=0; |
Uchida0923 | 0:03cdee95fb5a | 175 | |
Uchida0923 | 0:03cdee95fb5a | 176 | } |
Uchida0923 | 0:03cdee95fb5a | 177 | |
Uchida0923 | 0:03cdee95fb5a | 178 | |
Uchida0923 | 0:03cdee95fb5a | 179 | |
Uchida0923 | 0:03cdee95fb5a | 180 | |
Uchida0923 | 0:03cdee95fb5a | 181 | |
Uchida0923 | 0:03cdee95fb5a | 182 | |
Uchida0923 | 0:03cdee95fb5a | 183 | |
Uchida0923 | 0:03cdee95fb5a | 184 | |
Uchida0923 | 0:03cdee95fb5a | 185 | |
Uchida0923 | 0:03cdee95fb5a | 186 | |
Uchida0923 | 0:03cdee95fb5a | 187 | |
Uchida0923 | 0:03cdee95fb5a | 188 | |
Uchida0923 | 0:03cdee95fb5a | 189 | void Footile:: _modeChange(unsigned short c){ |
Uchida0923 | 0:03cdee95fb5a | 190 | |
Uchida0923 | 0:03cdee95fb5a | 191 | // PWM mode |
Uchida0923 | 0:03cdee95fb5a | 192 | if(c == 0) { |
Uchida0923 | 0:03cdee95fb5a | 193 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 194 | SinewaveMode=true; |
Uchida0923 | 0:03cdee95fb5a | 195 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 196 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 197 | snowMode=false; |
Uchida0923 | 0:03cdee95fb5a | 198 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 199 | /*_Vibration.i2cWriteByte(MODE, _Vibration.PWM_ANALOG); |
Uchida0923 | 0:03cdee95fb5a | 200 | _heart.attach(this, &Footile::_beat, 1.0); |
Uchida0923 | 0:03cdee95fb5a | 201 | ChangeFlag=true;*/ |
Uchida0923 | 0:03cdee95fb5a | 202 | // Wavefrom sequencer mode |
Uchida0923 | 0:03cdee95fb5a | 203 | } else if (0 < c && c <= 123) { //Change waveform |
Uchida0923 | 0:03cdee95fb5a | 204 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 205 | SinewaveMode=false; |
Uchida0923 | 0:03cdee95fb5a | 206 | ChangeFlag=false; |
Uchida0923 | 0:03cdee95fb5a | 207 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 208 | snowMode=false; |
Uchida0923 | 0:03cdee95fb5a | 209 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 210 | _Vibration.i2cWriteByte(WAVEFORM_SEQUENCER_1, c); |
Uchida0923 | 0:03cdee95fb5a | 211 | _Vibration.i2cWriteByte(MODE, _Vibration.EXTERNAL_LEVEL); |
Uchida0923 | 0:03cdee95fb5a | 212 | _heart.attach(this, &Footile::_beat, 1.0); |
Uchida0923 | 0:03cdee95fb5a | 213 | // Standby mode |
Uchida0923 | 0:03cdee95fb5a | 214 | |
Uchida0923 | 0:03cdee95fb5a | 215 | }else if(c==124){ //SteadyMode |
Uchida0923 | 0:03cdee95fb5a | 216 | SteadyMode=true; |
Uchida0923 | 0:03cdee95fb5a | 217 | SinewaveMode=true; |
Uchida0923 | 0:03cdee95fb5a | 218 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 219 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 220 | snowMode=false; |
Uchida0923 | 0:03cdee95fb5a | 221 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 222 | }else if (125<=c&&c<=255) { //Change Magnituide |
Uchida0923 | 0:03cdee95fb5a | 223 | if(SteadyMode==false&&SinewaveMode==false){ |
Uchida0923 | 0:03cdee95fb5a | 224 | ChangeFlag=false; |
Uchida0923 | 0:03cdee95fb5a | 225 | }else{ |
Uchida0923 | 0:03cdee95fb5a | 226 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 227 | } |
Uchida0923 | 0:03cdee95fb5a | 228 | _volumeBuf=(c-125)*255/(255-125); |
Uchida0923 | 0:03cdee95fb5a | 229 | |
Uchida0923 | 0:03cdee95fb5a | 230 | }else if(c==256){ //Change Amplitude Mode |
Uchida0923 | 0:03cdee95fb5a | 231 | CorrespondMode=true; |
Uchida0923 | 0:03cdee95fb5a | 232 | ChangeFlag=false; |
Uchida0923 | 0:03cdee95fb5a | 233 | }else if(257<=c&&c<=261){ //Change Sensitvty(257<=c<=266) |
Uchida0923 | 0:03cdee95fb5a | 234 | _sens=(c-257)*0.5/4.0+0.3; |
Uchida0923 | 0:03cdee95fb5a | 235 | }else if(262<=c&&c<=266){ |
Uchida0923 | 0:03cdee95fb5a | 236 | _sens=(c-262)*0.15/4.0+0.8; |
Uchida0923 | 0:03cdee95fb5a | 237 | } |
Uchida0923 | 0:03cdee95fb5a | 238 | |
Uchida0923 | 0:03cdee95fb5a | 239 | else if(c==267){ |
Uchida0923 | 0:03cdee95fb5a | 240 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 241 | SinewaveMode=false; |
Uchida0923 | 0:03cdee95fb5a | 242 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 243 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 244 | snowMode=true; |
Uchida0923 | 0:03cdee95fb5a | 245 | grassMode=false; |
Uchida0923 | 0:03cdee95fb5a | 246 | }else if(c==268){ |
Uchida0923 | 0:03cdee95fb5a | 247 | SteadyMode=false; |
Uchida0923 | 0:03cdee95fb5a | 248 | SinewaveMode=false; |
Uchida0923 | 0:03cdee95fb5a | 249 | CorrespondMode=false; |
Uchida0923 | 0:03cdee95fb5a | 250 | ChangeFlag=true; |
Uchida0923 | 0:03cdee95fb5a | 251 | snowMode=false; |
Uchida0923 | 0:03cdee95fb5a | 252 | grassMode=true; |
Uchida0923 | 0:03cdee95fb5a | 253 | } |
Uchida0923 | 0:03cdee95fb5a | 254 | else { |
Uchida0923 | 0:03cdee95fb5a | 255 | _Vibration.i2cWriteByte(MODE, _Vibration.STANDBY); |
Uchida0923 | 0:03cdee95fb5a | 256 | _heart.attach(this, &Footile::_beat, 2.0); |
Uchida0923 | 0:03cdee95fb5a | 257 | } |
Uchida0923 | 0:03cdee95fb5a | 258 | |
Uchida0923 | 0:03cdee95fb5a | 259 | |
Uchida0923 | 0:03cdee95fb5a | 260 | |
Uchida0923 | 0:03cdee95fb5a | 261 | } |
Uchida0923 | 0:03cdee95fb5a | 262 | |
Uchida0923 | 0:03cdee95fb5a | 263 | void Footile::_transmission(void) |
Uchida0923 | 0:03cdee95fb5a | 264 | { |
Uchida0923 | 0:03cdee95fb5a | 265 | _bt.printf("a"); |
Uchida0923 | 0:03cdee95fb5a | 266 | |
Uchida0923 | 0:03cdee95fb5a | 267 | if(ConnectCheck==true){ |
Uchida0923 | 0:03cdee95fb5a | 268 | _trans.detach(); |
Uchida0923 | 0:03cdee95fb5a | 269 | } |
Uchida0923 | 0:03cdee95fb5a | 270 | } |
Uchida0923 | 0:03cdee95fb5a | 271 | |
Uchida0923 | 0:03cdee95fb5a | 272 | |
Uchida0923 | 0:03cdee95fb5a | 273 | // heart beat |
Uchida0923 | 0:03cdee95fb5a | 274 | void Footile::_beat(void) |
Uchida0923 | 0:03cdee95fb5a | 275 | { |
Uchida0923 | 0:03cdee95fb5a | 276 | _led2 = !_led2; |
Uchida0923 | 0:03cdee95fb5a | 277 | } |