version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

Committer:
Dannis_mbed
Date:
Tue Aug 11 08:38:55 2015 +0000
Revision:
2:f6d058931b17
Parent:
1:b4a0d63db637
Test version mainmodule

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Dannis_mbed 0:81b21910454e 1 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 2 // //
Dannis_mbed 0:81b21910454e 3 // File : systemVar.cpp //
Dannis_mbed 0:81b21910454e 4 // Version : 0.1 //
Dannis_mbed 0:81b21910454e 5 // Date : 23 june 2015 //
Dannis_mbed 0:81b21910454e 6 // Author : Dany Brugman //
Dannis_mbed 0:81b21910454e 7 // Comment : Class systemVar to manage and control system variables //
Dannis_mbed 0:81b21910454e 8 // //
Dannis_mbed 0:81b21910454e 9 // Changelog : //
Dannis_mbed 0:81b21910454e 10 // Date: Name: Comment: //
Dannis_mbed 0:81b21910454e 11 // 23/06/2015 DNB First version //
Dannis_mbed 0:81b21910454e 12 // //
Dannis_mbed 0:81b21910454e 13 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 14 #include "menu.h"
Dannis_mbed 0:81b21910454e 15 #include "systemVar.h"
Dannis_mbed 0:81b21910454e 16
Dannis_mbed 1:b4a0d63db637 17 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 18 // Defines //
Dannis_mbed 2:f6d058931b17 19 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 20 #define EXT_UI_HEIGHT 1020
Dannis_mbed 2:f6d058931b17 21
Dannis_mbed 2:f6d058931b17 22 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 23 // Variable limits //
Dannis_mbed 1:b4a0d63db637 24 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 25 #define MAXMAXROLL 30
Dannis_mbed 2:f6d058931b17 26 #define MAXMINPITCH 15
Dannis_mbed 2:f6d058931b17 27 #define MAXMAXPITCH 30
Dannis_mbed 2:f6d058931b17 28 #define MAXTAKEOFFSPEED 15
Dannis_mbed 2:f6d058931b17 29 #define MAXFOILBORNEHEIGHT 30
Dannis_mbed 2:f6d058931b17 30 #define MAXFOILASSISTHEIGHT 30
Dannis_mbed 2:f6d058931b17 31 #define MAXAOA 8
Dannis_mbed 2:f6d058931b17 32 #define MINMAXROLL 5
Dannis_mbed 2:f6d058931b17 33 #define MINMINPITCH 5
Dannis_mbed 2:f6d058931b17 34 #define MINMAXPITCH 5
Dannis_mbed 2:f6d058931b17 35 #define MINTAKEOFFSPEED 1
Dannis_mbed 2:f6d058931b17 36 #define MINFOILBORNEHEIGHT 1
Dannis_mbed 2:f6d058931b17 37 #define MINFOILASSISTHEIGHT 1
Dannis_mbed 2:f6d058931b17 38 #define MINAOA 1
Dannis_mbed 0:81b21910454e 39
Dannis_mbed 0:81b21910454e 40 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 41 // Contructor //
Dannis_mbed 0:81b21910454e 42 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 43 SystemVar::SystemVar() :
Dannis_mbed 0:81b21910454e 44 uiCounter(0),
Dannis_mbed 2:f6d058931b17 45 uiVarHeightFoilBorne(30),
Dannis_mbed 0:81b21910454e 46 bError(0)
Dannis_mbed 1:b4a0d63db637 47 {
Dannis_mbed 1:b4a0d63db637 48 init();
Dannis_mbed 1:b4a0d63db637 49 };
Dannis_mbed 0:81b21910454e 50
Dannis_mbed 0:81b21910454e 51 SystemVar::~SystemVar()
Dannis_mbed 0:81b21910454e 52 {
Dannis_mbed 0:81b21910454e 53 };
Dannis_mbed 0:81b21910454e 54
Dannis_mbed 1:b4a0d63db637 55 extern Serial debug;
Dannis_mbed 1:b4a0d63db637 56 extern CAN CANbus;
Dannis_mbed 0:81b21910454e 57
Dannis_mbed 1:b4a0d63db637 58 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 1:b4a0d63db637 59 // init //
Dannis_mbed 1:b4a0d63db637 60 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 1:b4a0d63db637 61 void SystemVar::init(void)
Dannis_mbed 1:b4a0d63db637 62 {
Dannis_mbed 1:b4a0d63db637 63 //init here
Dannis_mbed 1:b4a0d63db637 64 }
Dannis_mbed 1:b4a0d63db637 65
Dannis_mbed 0:81b21910454e 66 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 67 // set's //
Dannis_mbed 0:81b21910454e 68 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 69 void SystemVar::vSetRoll(Quaternion q1)
Dannis_mbed 0:81b21910454e 70 {
Dannis_mbed 0:81b21910454e 71 float fRoll;
Dannis_mbed 0:81b21910454e 72 uint32_t uiValue;
Dannis_mbed 0:81b21910454e 73 fRoll = atan2(2*(q1.v.x*q1.v.y + q1.w*q1.v.y), q1.w*q1.w + q1.v.x*q1.v.x - q1.v.y*q1.v.y - q1.v.y*q1.v.y);
Dannis_mbed 0:81b21910454e 74 fRoll *= 180/3.14;
Dannis_mbed 0:81b21910454e 75 if(fRoll >= 0) uiRoll[0] = 1;
Dannis_mbed 0:81b21910454e 76 else uiRoll[0] = 0;
Dannis_mbed 0:81b21910454e 77 uiValue = (uint32_t) abs(fRoll);
Dannis_mbed 0:81b21910454e 78 uiRoll[1] = uiValue;
Dannis_mbed 0:81b21910454e 79 }
Dannis_mbed 0:81b21910454e 80
Dannis_mbed 0:81b21910454e 81 void SystemVar::vSetPitch(Quaternion q1)
Dannis_mbed 0:81b21910454e 82 {
Dannis_mbed 0:81b21910454e 83 float fPitch;
Dannis_mbed 0:81b21910454e 84 uint32_t uiValue;
Dannis_mbed 0:81b21910454e 85 Vector3 euler = q1.getEulerAngles();
Dannis_mbed 0:81b21910454e 86 fPitch = euler.y;
Dannis_mbed 0:81b21910454e 87 fPitch *= 180/3.14;
Dannis_mbed 0:81b21910454e 88 if(fPitch >= 0) uiPitch[0] = 1;
Dannis_mbed 0:81b21910454e 89 else uiPitch[0] = 0;
Dannis_mbed 0:81b21910454e 90 uiValue = (uint32_t) abs(fPitch);
Dannis_mbed 0:81b21910454e 91 uiPitch[1] = uiValue;
Dannis_mbed 0:81b21910454e 92 }
Dannis_mbed 0:81b21910454e 93
Dannis_mbed 1:b4a0d63db637 94 void SystemVar::vVarHeightFoilBorne(uint32_t uiValue)
Dannis_mbed 1:b4a0d63db637 95 {
Dannis_mbed 1:b4a0d63db637 96 cMessage = uiValue;
Dannis_mbed 1:b4a0d63db637 97 CANbus.write(CANMessage(EXT_UI_HEIGHT, &cMessage, 1));
Dannis_mbed 2:f6d058931b17 98 uiVarHeightFoilBorne = uiValue;
Dannis_mbed 2:f6d058931b17 99 debug.printf("set height %i\t", uiVarHeightFoilBorne);
Dannis_mbed 1:b4a0d63db637 100 }
Dannis_mbed 1:b4a0d63db637 101
Dannis_mbed 0:81b21910454e 102 void SystemVar::vSetPHeight(uint32_t uiValue)
Dannis_mbed 0:81b21910454e 103 {
Dannis_mbed 0:81b21910454e 104 uiPHeight = uiValue;
Dannis_mbed 0:81b21910454e 105 }
Dannis_mbed 0:81b21910454e 106
Dannis_mbed 0:81b21910454e 107 void SystemVar::vSetSHeight(uint32_t uiValue)
Dannis_mbed 0:81b21910454e 108 {
Dannis_mbed 0:81b21910454e 109 uiSHeight = uiValue;
Dannis_mbed 0:81b21910454e 110 }
Dannis_mbed 0:81b21910454e 111
Dannis_mbed 0:81b21910454e 112 void SystemVar::vSetPCurrent(uint32_t uiValue)
Dannis_mbed 0:81b21910454e 113 {
Dannis_mbed 0:81b21910454e 114 uiPCurrent = uiValue;
Dannis_mbed 0:81b21910454e 115 }
Dannis_mbed 0:81b21910454e 116
Dannis_mbed 0:81b21910454e 117 void SystemVar::vSetSCurrent(uint32_t uiValue)
Dannis_mbed 0:81b21910454e 118 {
Dannis_mbed 0:81b21910454e 119 uiSCurrent = uiValue;
Dannis_mbed 0:81b21910454e 120 }
Dannis_mbed 0:81b21910454e 121
Dannis_mbed 0:81b21910454e 122 void SystemVar::vSetSpeed(uint32_t uiValue)
Dannis_mbed 0:81b21910454e 123 {
Dannis_mbed 0:81b21910454e 124 uiSpeed = uiValue;
Dannis_mbed 0:81b21910454e 125 }
Dannis_mbed 0:81b21910454e 126
Dannis_mbed 0:81b21910454e 127 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 128 // get's //
Dannis_mbed 0:81b21910454e 129 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 130 char* SystemVar::getValue(void)
Dannis_mbed 0:81b21910454e 131 {
Dannis_mbed 0:81b21910454e 132 static char* pValue;
Dannis_mbed 0:81b21910454e 133 pValue = cValue;
Dannis_mbed 0:81b21910454e 134 return pValue;
Dannis_mbed 0:81b21910454e 135 }
Dannis_mbed 0:81b21910454e 136
Dannis_mbed 0:81b21910454e 137 int SystemVar::iGetRollPolarity(void)
Dannis_mbed 0:81b21910454e 138 {
Dannis_mbed 0:81b21910454e 139 return uiRoll[0];
Dannis_mbed 0:81b21910454e 140 }
Dannis_mbed 0:81b21910454e 141
Dannis_mbed 0:81b21910454e 142 int SystemVar::iGetPitchPolarity(void)
Dannis_mbed 0:81b21910454e 143 {
Dannis_mbed 0:81b21910454e 144 return uiPitch[0];
Dannis_mbed 0:81b21910454e 145 }
Dannis_mbed 0:81b21910454e 146
Dannis_mbed 1:b4a0d63db637 147 uint32_t SystemVar::uiGetRoll(void)
Dannis_mbed 1:b4a0d63db637 148 {
Dannis_mbed 1:b4a0d63db637 149 return uiRoll[1];
Dannis_mbed 1:b4a0d63db637 150 }
Dannis_mbed 1:b4a0d63db637 151
Dannis_mbed 2:f6d058931b17 152 uint32_t SystemVar::uiGetPitch(void)
Dannis_mbed 2:f6d058931b17 153 {
Dannis_mbed 2:f6d058931b17 154 return uiPitch[1];
Dannis_mbed 2:f6d058931b17 155 }
Dannis_mbed 2:f6d058931b17 156
Dannis_mbed 1:b4a0d63db637 157 int32_t SystemVar::iGetHeightFoilBorne(void)
Dannis_mbed 1:b4a0d63db637 158 {
Dannis_mbed 2:f6d058931b17 159 return uiVarHeightFoilBorne;
Dannis_mbed 2:f6d058931b17 160 }
Dannis_mbed 2:f6d058931b17 161
Dannis_mbed 2:f6d058931b17 162 uint32_t SystemVar::uiGetVarMaxRoll(void)
Dannis_mbed 2:f6d058931b17 163 {
Dannis_mbed 2:f6d058931b17 164 return uiVarMaxRoll;
Dannis_mbed 2:f6d058931b17 165 }
Dannis_mbed 2:f6d058931b17 166
Dannis_mbed 2:f6d058931b17 167 uint32_t SystemVar::uiGetVarMinPitch(void)
Dannis_mbed 2:f6d058931b17 168 {
Dannis_mbed 2:f6d058931b17 169 return uiVarMinPitch;
Dannis_mbed 2:f6d058931b17 170 }
Dannis_mbed 2:f6d058931b17 171
Dannis_mbed 2:f6d058931b17 172 uint32_t SystemVar::uiGetVarMaxPitch(void)
Dannis_mbed 2:f6d058931b17 173 {
Dannis_mbed 2:f6d058931b17 174 return uiVarMaxPitch;
Dannis_mbed 1:b4a0d63db637 175 }
Dannis_mbed 1:b4a0d63db637 176
Dannis_mbed 2:f6d058931b17 177 uint32_t SystemVar::uiGetVarTakeOffSpeed(void)
Dannis_mbed 2:f6d058931b17 178 {
Dannis_mbed 2:f6d058931b17 179 return uiVarTakeOffSpeed;
Dannis_mbed 2:f6d058931b17 180 }
Dannis_mbed 2:f6d058931b17 181
Dannis_mbed 2:f6d058931b17 182 uint32_t SystemVar::uiGetVarHeightFoilBorne(void)
Dannis_mbed 2:f6d058931b17 183 {
Dannis_mbed 2:f6d058931b17 184 return uiVarHeightFoilBorne;
Dannis_mbed 2:f6d058931b17 185 }
Dannis_mbed 2:f6d058931b17 186
Dannis_mbed 2:f6d058931b17 187 uint32_t SystemVar::uiGetVarHeightFoilAssist(void)
Dannis_mbed 2:f6d058931b17 188 {
Dannis_mbed 2:f6d058931b17 189 return uiVarHeightFoilAssist;
Dannis_mbed 2:f6d058931b17 190 }
Dannis_mbed 2:f6d058931b17 191
Dannis_mbed 2:f6d058931b17 192 uint32_t SystemVar::uiGetVarAOAFoilAssist(void)
Dannis_mbed 2:f6d058931b17 193 {
Dannis_mbed 2:f6d058931b17 194 return uiVarAOAFoilAssist;
Dannis_mbed 2:f6d058931b17 195 }
Dannis_mbed 2:f6d058931b17 196
Dannis_mbed 2:f6d058931b17 197
Dannis_mbed 2:f6d058931b17 198
Dannis_mbed 2:f6d058931b17 199
Dannis_mbed 2:f6d058931b17 200
Dannis_mbed 0:81b21910454e 201 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 202 // convert value to char * //
Dannis_mbed 0:81b21910454e 203 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 204 void SystemVar::itoa( uint32_t value, char *str)
Dannis_mbed 0:81b21910454e 205 {
Dannis_mbed 0:81b21910454e 206 int i,j;
Dannis_mbed 0:81b21910454e 207 char temp[4];
Dannis_mbed 0:81b21910454e 208 for(i=0; value > 0; i++){
Dannis_mbed 0:81b21910454e 209 str[i] = value%10+'0';
Dannis_mbed 0:81b21910454e 210 value=value/10;
Dannis_mbed 0:81b21910454e 211 }
Dannis_mbed 0:81b21910454e 212 for(j=0;i>=0;j++,i--){
Dannis_mbed 0:81b21910454e 213 temp[j]=str[i-1];
Dannis_mbed 0:81b21910454e 214 }
Dannis_mbed 0:81b21910454e 215 for(i=0;i<j;i++){
Dannis_mbed 0:81b21910454e 216 str[i]=temp[i];
Dannis_mbed 0:81b21910454e 217 }
Dannis_mbed 0:81b21910454e 218 if(strcmp(str,"")== 0) str[0] = '0';
Dannis_mbed 0:81b21910454e 219
Dannis_mbed 0:81b21910454e 220 }
Dannis_mbed 0:81b21910454e 221
Dannis_mbed 0:81b21910454e 222 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 223 // show value //
Dannis_mbed 0:81b21910454e 224 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 225 void SystemVar::cShowValue(VALUE_t v)
Dannis_mbed 0:81b21910454e 226 {
Dannis_mbed 0:81b21910454e 227 value = v;
Dannis_mbed 0:81b21910454e 228 switch(value)
Dannis_mbed 0:81b21910454e 229 {
Dannis_mbed 0:81b21910454e 230 case _ROLL: itoa(uiRoll[1], cValue); break;
Dannis_mbed 0:81b21910454e 231
Dannis_mbed 0:81b21910454e 232 case _PITCH: itoa(uiPitch[1], cValue); break;
Dannis_mbed 0:81b21910454e 233
Dannis_mbed 2:f6d058931b17 234 //case _HEIGHTFOILBORNE: itoa(uiVarHeightFoilBorne, cValue); break;
Dannis_mbed 0:81b21910454e 235
Dannis_mbed 1:b4a0d63db637 236 case _PHEIGHT: itoa(uiPHeight, cValue); break;
Dannis_mbed 0:81b21910454e 237
Dannis_mbed 2:f6d058931b17 238 case _MAXROLL: itoa(uiVarMaxRoll, cValue); break;
Dannis_mbed 2:f6d058931b17 239
Dannis_mbed 2:f6d058931b17 240 case _MINPITCH: itoa(uiVarMinPitch, cValue); break;
Dannis_mbed 2:f6d058931b17 241
Dannis_mbed 2:f6d058931b17 242 case _MAXPITCH: itoa(uiVarMaxPitch, cValue); break;
Dannis_mbed 2:f6d058931b17 243
Dannis_mbed 2:f6d058931b17 244 case _TAKEOFFSPEED: itoa(uiVarTakeOffSpeed, cValue); break;
Dannis_mbed 2:f6d058931b17 245
Dannis_mbed 2:f6d058931b17 246 case _HEIGHTFOILBORNE: itoa(uiVarHeightFoilBorne, cValue); break;
Dannis_mbed 2:f6d058931b17 247
Dannis_mbed 2:f6d058931b17 248 case _HEIGHTFOILASSIST: itoa(uiVarHeightFoilAssist, cValue); break;
Dannis_mbed 2:f6d058931b17 249
Dannis_mbed 2:f6d058931b17 250 case _AOAFOILASSIST: itoa(uiVarAOAFoilAssist, cValue); break;
Dannis_mbed 0:81b21910454e 251 } // end switch
Dannis_mbed 0:81b21910454e 252
Dannis_mbed 0:81b21910454e 253 }
Dannis_mbed 0:81b21910454e 254
Dannis_mbed 2:f6d058931b17 255 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 256 // in-/decrease value //
Dannis_mbed 2:f6d058931b17 257 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 2:f6d058931b17 258 void SystemVar::vIncrease(VALUE_t v)
Dannis_mbed 2:f6d058931b17 259 {
Dannis_mbed 2:f6d058931b17 260 value = v;
Dannis_mbed 2:f6d058931b17 261 switch(value)
Dannis_mbed 2:f6d058931b17 262 {
Dannis_mbed 2:f6d058931b17 263 case _MAXROLL: if(uiVarMaxRoll >= MAXMAXROLL) uiVarMaxRoll++; break;
Dannis_mbed 2:f6d058931b17 264
Dannis_mbed 2:f6d058931b17 265 case _MINPITCH: if(uiVarMinPitch >= MAXMINPITCH) uiVarMinPitch++; break;
Dannis_mbed 2:f6d058931b17 266
Dannis_mbed 2:f6d058931b17 267 case _MAXPITCH: if(uiVarMaxPitch >= MAXMAXPITCH) uiVarMaxPitch++; break;
Dannis_mbed 2:f6d058931b17 268
Dannis_mbed 2:f6d058931b17 269 case _TAKEOFFSPEED: if(uiVarTakeOffSpeed >= MAXTAKEOFFSPEED) uiVarTakeOffSpeed++; break;
Dannis_mbed 2:f6d058931b17 270
Dannis_mbed 2:f6d058931b17 271 case _HEIGHTFOILBORNE: if(uiVarHeightFoilBorne >= MAXFOILBORNEHEIGHT) uiVarHeightFoilBorne++; break;
Dannis_mbed 2:f6d058931b17 272
Dannis_mbed 2:f6d058931b17 273 case _HEIGHTFOILASSIST: if(uiVarHeightFoilAssist >= MAXFOILASSISTHEIGHT) uiVarHeightFoilAssist++; break;
Dannis_mbed 2:f6d058931b17 274
Dannis_mbed 2:f6d058931b17 275 case _AOAFOILASSIST: if(uiVarAOAFoilAssist >= MAXAOA) uiVarAOAFoilAssist++; break;
Dannis_mbed 2:f6d058931b17 276 }//end switch
Dannis_mbed 2:f6d058931b17 277 }
Dannis_mbed 2:f6d058931b17 278
Dannis_mbed 2:f6d058931b17 279 void SystemVar::vDecrease(VALUE_t v)
Dannis_mbed 2:f6d058931b17 280 {
Dannis_mbed 2:f6d058931b17 281 value = v;
Dannis_mbed 2:f6d058931b17 282 switch(value)
Dannis_mbed 2:f6d058931b17 283 {
Dannis_mbed 2:f6d058931b17 284 case _MAXROLL: if(uiVarMaxRoll <= MINMAXROLL) uiVarMaxRoll--; break;
Dannis_mbed 2:f6d058931b17 285
Dannis_mbed 2:f6d058931b17 286 case _MINPITCH: if(uiVarMinPitch <= MINMINPITCH) uiVarMinPitch--; break;
Dannis_mbed 2:f6d058931b17 287
Dannis_mbed 2:f6d058931b17 288 case _MAXPITCH: if(uiVarMaxPitch <= MINMAXPITCH) uiVarMaxPitch--; break;
Dannis_mbed 2:f6d058931b17 289
Dannis_mbed 2:f6d058931b17 290 case _TAKEOFFSPEED: if(uiVarTakeOffSpeed <= MINTAKEOFFSPEED) uiVarTakeOffSpeed--; break;
Dannis_mbed 2:f6d058931b17 291
Dannis_mbed 2:f6d058931b17 292 case _HEIGHTFOILBORNE: if(uiVarHeightFoilBorne <= MINFOILBORNEHEIGHT) uiVarHeightFoilBorne--; break;
Dannis_mbed 2:f6d058931b17 293
Dannis_mbed 2:f6d058931b17 294 case _HEIGHTFOILASSIST: if(uiVarHeightFoilAssist <= MINFOILASSISTHEIGHT) uiVarHeightFoilAssist--; break;
Dannis_mbed 2:f6d058931b17 295
Dannis_mbed 2:f6d058931b17 296 case _AOAFOILASSIST: if(uiVarAOAFoilAssist <= MINAOA) uiVarAOAFoilAssist--; break;
Dannis_mbed 2:f6d058931b17 297 }//end switch
Dannis_mbed 2:f6d058931b17 298 }
Dannis_mbed 0:81b21910454e 299
Dannis_mbed 0:81b21910454e 300
Dannis_mbed 0:81b21910454e 301
Dannis_mbed 0:81b21910454e 302 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 303 // EOF //
Dannis_mbed 0:81b21910454e 304 //////////////////////////////////////////////////////////////////////////////////////