nmeardr.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * =====================================================================================
  3. *
  4. * Filename: nmeardr.c
  5. *
  6. * Description: Nmea reader source file
  7. *
  8. * Version: 1.0
  9. * Created: 2018/8/15 16:58:58
  10. * Revision: none
  11. * Compiler: gcc
  12. *
  13. * Author: Jarod Lee
  14. * Organization:
  15. *
  16. * =====================================================================================
  17. */
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <stdio.h>
  21. #include <stdbool.h>
  22. #include "nmeardr.h"
  23. /*
  24. * Init nmea reader to zero
  25. * @r: the nmea reader
  26. */
  27. void nmea_reader_init(struct nmea_reader *r)
  28. {
  29. memset(r, 0, sizeof(struct nmea_reader));
  30. }
  31. /*
  32. * Add 1 byte to nmea reader
  33. * @r: the nmea reader
  34. * @c: the byte to be added
  35. */
  36. void nmea_reader_add(struct nmea_reader *r, char c)
  37. {
  38. if (c == '$') { // reset position if encounter '$'
  39. r->pos = 0;
  40. }
  41. r->buf[r->pos] = c;
  42. r->pos = (r->pos + 1) % MAX_NMEARDR_SIZE;
  43. }
  44. /*
  45. * Check if nmea reader's checksum if okay
  46. * @r: the nmea reader
  47. * @return: if checksum is correct return true, else return false
  48. */
  49. bool nmea_reader_check(struct nmea_reader *r)
  50. {
  51. unsigned char chk = 0;
  52. char tmp[4];
  53. char *p = r->buf;
  54. char *end = r->buf + r->pos;
  55. if (*p == '$') // skip leading '$'
  56. p++;
  57. while (*p != '*' && p < end) // xor the payload byte
  58. chk ^= *p++;
  59. if (*p == '*') { // compare with checksum in nmea sentence
  60. sprintf(tmp, "%02X", chk);
  61. return 0 == memcmp(tmp, p + 1, 2);
  62. }
  63. return false;
  64. }