Advertisement
Guest User

RayeR

a guest
Jul 7th, 2016
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. #include <stdio.h>                     // sprintf,...
  2. #include <stdlib.h>                    // definice standardnich funkci
  3. #include <string.h>                    // fce na praci s daty v pameti
  4. #include <avr/pgmspace.h>              // fce na praci s daty v prog. pameti
  5.  
  6. //***************** struktura UTC casu **************************************
  7. typedef struct {
  8.   uint8_t h;                              // hodiny [0-23]
  9.   uint8_t m;                              // minuty [0-59]
  10.   uint8_t s;                              // vteriny [0-59]
  11.   uint16_t d;                              // decimalni zlomky vteriny [0-999]
  12. } __attribute__((packed)) GPS_UTC_TIME;
  13.  
  14. //***************** struktura souradnice ************************************
  15. typedef struct {
  16.   uint8_t d;                              // stupne [0-90/180]
  17.   uint8_t m;                              // minuty [0-59]
  18.   uint32_t dd;                            // decimalni zlomky minut [0-99999]
  19.   char u;                              // typ <N|S|E|W>
  20. } __attribute__((packed)) GPS_COORDINATE;
  21.  
  22. //***************** struktura GPS dat ***************************************
  23. typedef struct {
  24.   GPS_UTC_TIME utc_time;               // UTC cas
  25.   GPS_COORDINATE latitude;             // zemepisna sirka severni/jizni
  26. } __attribute__((packed)) GPS_DATA;
  27.  
  28. GPS_DATA gps_data;                     // struktura pro ukladani prijatych GPS dat
  29.  
  30. //***************** zpracuje retezec GPS NMEA a pripadne nastavi prislusne polozky globalni struktury
  31. void gps_parse_string(char *str)       // vraci 0 pokud byl retezec zpracovan a byla nalezena platna data
  32. {
  33.   uint8_t param=0;
  34.  
  35.   if (strncasecmp_P(str,PSTR("$GPGGA"),6)==0) // Time, position and fix releated data
  36.     {
  37.     while ((str=strchr(str,','))!=NULL)// opakuj dokud retezec obsahuje carky
  38.       {
  39.       if (*(++str)!=',')               // pokud za carkou hned neni dalsi carka
  40.         {
  41.         switch (param)                 // dekoduj parametr
  42.           {                            // pro dany parametr pouzij specificky format
  43.           case 0 : sscanf_P(str,PSTR("%02u%02u%02u.%u"),&gps_data.utc_time.h,&gps_data.utc_time.m,&gps_data.utc_time.s,&gps_data.utc_time.d); break; // UTC time hhmmss.ddd
  44.           case 1 : sscanf_P(str,PSTR("%02u%02u.%lu"),&gps_data.latitude.d,&gps_data.latitude.m,&gps_data.latitude.dd); break; // latitude llmm.dddd(d)
  45. // More case branches removed. If you leave only one, it will compile without push_reload error
  46.           }                            // dalsi parametry ignoruj
  47.         }                              // jinak se parametr nenacte a v promenne zustane puvodni hodnota
  48.       param++;                         // inkrementuj pocitadlo parametru
  49.       }
  50.     }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement