00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __WPROGRAM_H__
00025 #include <WaspClasses.h>
00026 #endif
00027
00028 #include <inttypes.h>
00029
00030
00031
00032
00033 WaspUtils::WaspUtils (void)
00034 {
00035 }
00036
00037
00038
00039
00040 uint32_t WaspUtils::strtolong(const char* str)
00041 {
00042 uint32_t l = 0;
00043 while(*str >= '0' && *str <= '9')
00044 l = l * 10 + (*str++ - '0');
00045
00046 return l;
00047 }
00048
00049
00050
00051
00052
00053
00054
00055 int WaspUtils::sizeOf(const char* str)
00056 {
00057 int cont = 0;
00058 while(*str++) cont++;
00059 if (*str == '\0')
00060 return cont--;
00061 return cont;
00062 }
00063
00064
00065
00066
00067
00068
00069
00070 uint8_t WaspUtils::strCmp(const char* str1, const char* str2, uint8_t size)
00071 {
00072 uint8_t cmp = 0;
00073 for (int i = 0; i < size; i++)
00074 if (str1[i] != str2[i]) cmp = 1;
00075 return cmp;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 void WaspUtils::strCp(char* str1, char* str2)
00085 {
00086 uint16_t size = sizeOf(str1);
00087 for (int i = 0; i < size; i++)
00088 str2[i] = str1[i];
00089 }
00090
00091
00092
00093
00094 void WaspUtils::clearArguments(void)
00095 {
00096 for (int index = 0; index < MAX_ARGS; index++)
00097 for (int count = 0; count < MAX_ARG_LENGTH; count++)
00098 arguments[index][count] = '\0';
00099 }
00100
00101
00102
00103
00104 void WaspUtils::strExplode(const char* str, char separator){
00105 int count = 0, index = 0, sIndex = 0;
00106 int theSize = Utils.sizeOf(str);
00107 clearArguments();
00108 while (theSize >= sIndex + 1){
00109 if (*str != separator)
00110 {
00111 arguments[index][count] = *str;
00112 *str++;
00113 count++;
00114 }
00115 else
00116 {
00117 *str++;
00118 count = 0;
00119 index++;
00120 }
00121 sIndex++;
00122 }
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 uint8_t WaspUtils::getFreeMemory(void)
00134 {
00135 char* resul2[90];
00136 int i=0;
00137 int error=2;
00138
00139 while(1)
00140 {
00141 resul2[i]= (char*) calloc(100,sizeof(char));
00142 if(resul2[i]==NULL)
00143 {
00144 int b=i*100;
00145 freeMemory = b;
00146 error=0;
00147 break;
00148 }
00149 i++;
00150 }
00151 for(int a=0;a<i;a++)
00152 {
00153 free(resul2[a]);
00154 resul2[a]=NULL;
00155 }
00156 return freeMemory;
00157 }
00158
00159
00160
00161
00162
00163
00164
00165 long WaspUtils::parse_decimal(char *str)
00166 {
00167 bool isneg = *str == '-';
00168 if (isneg) *str++;
00169 unsigned long ret = 100UL * gpsatol(str);
00170 while (gpsisdigit(*str)) ++str;
00171 if (*str == '.')
00172 {
00173 if (gpsisdigit(str[1]))
00174 {
00175 ret += 10 * (str[1] - '0');
00176 if (gpsisdigit(str[2]))
00177 ret += str[2] - '0';
00178 }
00179 }
00180 return isneg ? -ret : ret;
00181 }
00182
00183
00184
00185
00186
00187
00188
00189 double WaspUtils::parse_degrees(char *str)
00190 {
00191 unsigned long left = gpsatol(str);
00192 unsigned long tenk_minutes = (left % 100UL) * 10000UL;
00193 while (gpsisdigit(*str)) ++str;
00194 if (*str == '.')
00195 {
00196 unsigned long mult = 1000;
00197 while (gpsisdigit(*++str))
00198 {
00199 tenk_minutes += mult * (*str - '0');
00200 mult /= 10;
00201 }
00202 }
00203 double aux=0.0;
00204 long aux2=0;
00205 aux=(double) tenk_minutes / 6;
00206 aux2=((left / 100) * 100000);
00207 aux = aux + aux2;
00208 return aux;
00209 }
00210
00211
00212
00213
00214
00215
00216
00217 long WaspUtils::gpsatol(char *str)
00218 {
00219 long ret = 0;
00220 while (gpsisdigit(*str))
00221 ret = 10 * ret + *str++ - '0';
00222 return ret;
00223 }
00224
00225
00226 double WaspUtils::parse_latitude(char *str)
00227 {
00228 double aux=0;
00229 double aux2=0.0;
00230
00231 aux=(double) parse_degrees(str);
00232 aux2=(double) aux/100000;
00233 aux2=aux2*M_PI/180;
00234 return aux2;
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 void WaspUtils::setLED(uint8_t led, uint8_t state)
00276 {
00277 pinMode(led,OUTPUT);
00278 if(state==LED_ON)
00279 {
00280 digitalWrite(led,HIGH);
00281 }
00282 if(state==LED_OFF)
00283 {
00284 digitalWrite(led,LOW);
00285 }
00286 }
00287
00288
00289
00290
00291
00292
00293 uint8_t WaspUtils::getLED(uint8_t led)
00294 {
00295 return digitalRead(led);
00296 }
00297
00298
00299
00300
00301
00302
00303 void WaspUtils::blinkLEDs(uint16_t time)
00304 {
00305 setLED(LED0,LED_ON);
00306 setLED(LED1,LED_ON);
00307 delay(time);
00308 setLED(LED0,LED_OFF);
00309 setLED(LED1,LED_OFF);
00310 delay(time);
00311 }
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 long WaspUtils::map(long x, long in_min, long in_max, long out_min, long out_max)
00322 {
00323 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 void WaspUtils::setMux(uint8_t MUX_LOW, uint8_t MUX_HIGH)
00338 {
00339 pinMode(MUX_PW, OUTPUT);
00340 pinMode(MUX0, OUTPUT);
00341 pinMode(MUX1, OUTPUT);
00342 digitalWrite(MUX_PW, HIGH);
00343 digitalWrite(MUX0, MUX_LOW);
00344 digitalWrite(MUX1, MUX_HIGH);
00345 }
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 void WaspUtils::setMuxGPS()
00359 {
00360 pinMode(MUX_PW, OUTPUT);
00361 pinMode(MUX0, OUTPUT);
00362 pinMode(MUX1, OUTPUT);
00363 digitalWrite(MUX_PW, HIGH);
00364 digitalWrite(MUX0, LOW);
00365 digitalWrite(MUX1, HIGH);
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379 void WaspUtils::setMuxGPRS()
00380 {
00381 pinMode(MUX_PW, OUTPUT);
00382 pinMode(MUX0, OUTPUT);
00383 pinMode(MUX1, OUTPUT);
00384 digitalWrite(MUX_PW, HIGH);
00385 digitalWrite(MUX0, HIGH);
00386 digitalWrite(MUX1, HIGH);
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 void WaspUtils::setMuxAux1()
00401 {
00402 pinMode(MUX_PW, OUTPUT);
00403 pinMode(MUX0, OUTPUT);
00404 pinMode(MUX1, OUTPUT);
00405 digitalWrite(MUX_PW, HIGH);
00406 digitalWrite(MUX0, HIGH);
00407 digitalWrite(MUX1, LOW);
00408 }
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 void WaspUtils::setMuxAux2()
00422 {
00423 pinMode(MUX_PW, OUTPUT);
00424 pinMode(MUX0, OUTPUT);
00425 pinMode(MUX1, OUTPUT);
00426 digitalWrite(MUX_PW, HIGH);
00427 digitalWrite(MUX0, LOW);
00428 digitalWrite(MUX1, LOW);
00429 }
00430
00431
00432
00433
00434
00435
00436
00437
00438 uint8_t WaspUtils::readEEPROM(int address)
00439 {
00440 return eeprom_read_byte((unsigned char *) address);
00441 }
00442
00443
00444
00445
00446
00447
00448
00449
00450 void WaspUtils::writeEEPROM(int address, uint8_t value)
00451 {
00452 eeprom_write_byte((unsigned char *) address, value);
00453 }
00454
00455 uint8_t WaspUtils::dec2hex(uint8_t number)
00456 {
00457 int aux=0, aux2=0;
00458 aux=number/16;
00459 aux2=number-(aux*16);
00460 return (aux*10+aux2);
00461 }
00462
00463
00464 void WaspUtils::hex2str(uint8_t* number, char* macDest)
00465 {
00466 hex2str(number,macDest,8);
00467 }
00468
00469
00470 void WaspUtils::hex2str(uint8_t* number, char* macDest, uint8_t length)
00471 {
00472 uint8_t aux_1=0;
00473 uint8_t aux_2=0;
00474
00475 for(int i=0;i<length;i++){
00476 aux_1=number[i]/16;
00477 aux_2=number[i]%16;
00478 if (aux_1<10){
00479 macDest[2*i]=aux_1+'0';
00480 }
00481 else{
00482 macDest[2*i]=aux_1+('A'-10);
00483 }
00484 if (aux_2<10){
00485 macDest[2*i+1]=aux_2+'0';
00486 }
00487 else{
00488 macDest[2*i+1]=aux_2+('A'-10);
00489 }
00490 }
00491 macDest[length*2]='\0';
00492 }
00493
00494
00495
00496
00497
00498 long WaspUtils::array2long(char* num)
00499 {
00500 int j=0;
00501 long resul=0;
00502 long aux=1;
00503 uint8_t counter=0;
00504
00505 while( (num[counter]>='0') && (num[counter]<='9') ){
00506 counter++;
00507 }
00508 while( (num[j]>='0') && (num[j]<='9') ){
00509 for(int a=0;a<counter-1;a++)
00510 {
00511 aux=aux*10;
00512 }
00513 resul=resul+(num[j]-'0')*aux;
00514 counter--;
00515 j++;
00516 aux=1;
00517 }
00518 return resul;
00519 }
00520
00521
00522
00523
00524
00525 uint8_t WaspUtils::long2array(long num, char* numb)
00526 {
00527 long aux=num;
00528 uint8_t i=0;
00529
00530 if( num<0 )
00531 {
00532 num = ~(num);
00533 num+=1;
00534 numb[i]='-';
00535 i++;
00536 }
00537 aux=num;
00538 while(aux>=10)
00539 {
00540 aux=aux/10;
00541 i++;
00542 }
00543 numb[i+1]='\0';
00544 aux=num;
00545 while(aux>=10)
00546 {
00547 numb[i]=aux%10 + '0';
00548 aux=aux/10;
00549 i--;
00550 }
00551 numb[i]=aux + '0';
00552 return i;
00553 }
00554
00555
00556
00557
00558 uint8_t WaspUtils::str2hex(char* str)
00559 {
00560 int aux=0, aux2=0;
00561
00562
00563 if( (*str>='0') && (*str<='9') )
00564 {
00565 aux=*str++-'0';
00566 }
00567 else if( (*str>='A') && (*str<='F') )
00568 {
00569 aux=*str++-'A'+10;
00570 }
00571 if( (*str>='0') && (*str<='9') )
00572 {
00573 aux2=*str-'0';
00574 }
00575 else if( (*str>='A') && (*str<='F') )
00576 {
00577 aux2=*str-'A'+10;
00578 }
00579 return aux*16+aux2;
00580 }
00581
00582
00583
00584
00585
00586 uint8_t WaspUtils::str2hex(uint8_t* str)
00587 {
00588 int aux=0, aux2=0;
00589
00590
00591 if( (*str>='0') && (*str<='9') )
00592 {
00593 aux=*str++-'0';
00594 }
00595 else if( (*str>='A') && (*str<='F') )
00596 {
00597 aux=*str++-'A'+10;
00598 }
00599 if( (*str>='0') && (*str<='9') )
00600 {
00601 aux2=*str-'0';
00602 }
00603 else if( (*str>='A') && (*str<='F') )
00604 {
00605 aux2=*str-'A'+10;
00606 }
00607 return aux*16+aux2;
00608 }
00609
00610
00611
00612
00613
00614 uint8_t WaspUtils::converter(uint8_t conv1, uint8_t conv2)
00615 {
00616 uint8_t aux=0;
00617 uint8_t aux2=0;
00618 uint8_t resul=0;
00619
00620 switch(conv1)
00621 {
00622 case 48: aux=0;
00623 break;
00624 case 49: aux=1;
00625 break;
00626 case 50: aux=2;
00627 break;
00628 case 51: aux=3;
00629 break;
00630 case 52: aux=4;
00631 break;
00632 case 53: aux=5;
00633 break;
00634 case 54: aux=6;
00635 break;
00636 case 55: aux=7;
00637 break;
00638 case 56: aux=8;
00639 break;
00640 case 57: aux=9;
00641 break;
00642 case 65: aux=10;
00643 break;
00644 case 66: aux=11;
00645 break;
00646 case 67: aux=12;
00647 break;
00648 case 68: aux=13;
00649 break;
00650 case 69: aux=14;
00651 break;
00652 case 70: aux=15;
00653 break;
00654 }
00655 switch(conv2)
00656 {
00657 case 48: aux2=0;
00658 break;
00659 case 49: aux2=1;
00660 break;
00661 case 50: aux2=2;
00662 break;
00663 case 51: aux2=3;
00664 break;
00665 case 52: aux2=4;
00666 break;
00667 case 53: aux2=5;
00668 break;
00669 case 54: aux2=6;
00670 break;
00671 case 55: aux2=7;
00672 break;
00673 case 56: aux2=8;
00674 break;
00675 case 57: aux2=9;
00676 break;
00677 case 65: aux2=10;
00678 break;
00679 case 66: aux2=11;
00680 break;
00681 case 67: aux2=12;
00682 break;
00683 case 68: aux2=13;
00684 break;
00685 case 69: aux2=14;
00686 break;
00687 case 70: aux2=15;
00688 break;
00689 default: aux2=100;
00690 break;
00691 }
00692 if(aux2==100)
00693 {
00694 resul=aux;
00695 }
00696 else
00697 {
00698 resul=(aux*16)+aux2;
00699 }
00700 return resul;
00701 }
00702
00703
00704 void WaspUtils::float2String (float fl, char str[], int N) {
00705
00706 boolean neg = false;
00707
00708 if( fl<0 ){
00709 neg = true;
00710 fl*=-1;
00711 }
00712
00713 float numeroFloat=fl;
00714
00715 int parteEntera[10];
00716 int cifra;
00717 long numero=(long)numeroFloat;
00718 int size=0;
00719
00720 while(1){
00721 size=size+1;
00722 cifra=numero%10;
00723 numero=numero/10;
00724 parteEntera[size-1]=cifra;
00725 if (numero==0){
00726 break;
00727 }
00728 }
00729
00730
00731 int indice=0;
00732 if( neg ){
00733 indice++;
00734 str[0]='-';
00735 }
00736 for (int i=size-1; i>=0; i--)
00737 { str[indice]=parteEntera[i]+'0';
00738 indice++;
00739 }
00740
00741
00742 str[indice]=',';
00743 indice++;
00744
00745
00746 numeroFloat=(numeroFloat-(int)numeroFloat);
00747 for (int i=1; i<=N ; i++)
00748 {
00749 numeroFloat=numeroFloat*10;
00750 cifra= (long)numeroFloat;
00751 numeroFloat=numeroFloat-cifra;
00752 str[indice]=char(cifra)+48;
00753 indice++;
00754 }
00755 }
00756
00757
00758 WaspUtils Utils = WaspUtils();