test

Dependencies:   mbed

Committer:
Uchida0923
Date:
Wed May 30 02:34:33 2018 +0000
Revision:
0:03cdee95fb5a
???????;

Who changed what in which revision?

UserRevisionLine numberNew 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 }