1. /**
  2. * created by Samuel Brucksch
  3. *
  4. * parts of this code are not done by me
  5. **/
  6. #include "config.h"
  7. #include "inttypes.h"
  8. #include "SoftwareSerial.h"
  9. #include "defines.h";
  10. #include "GpsAdapter.h"
  11. #if defined(FRSKY_D)
  12. #include "Frsky.h"
  13. SoftwareSerial frsky(3, TELEMETRY_TX_PIN, true);
  14. #elif defined(FRSKY_X)
  15. #include "FrSkySportSensor.h"
  16. #include "CustomFrSkySportSensorGps.h"
  17. #include "FrSkySportSensorRpm.h"
  18. #include "FrSkySportSingleWireSerial.h"
  19. #include "FrSkySportTelemetry.h"
  20. CustomFrSkySportSensorGps gpsSensor;
  21. FrSkySportSensorRpm rpmSensor;
  22. FrSkySportTelemetry frsky;
  23. #endif
  24. long timer;
  25. long timer2;
  26. void setup() {
  27. initializeGps();
  28. #if defined(FRSKY_D)
  29. frsky.begin(9600);
  30. #elif defined(FRSKY_X)
  31. frsky.begin(TELEMETRY_TX_PIN, &gpsSensor, &rpmSensor);
  32. #endif
  33. pinMode(13, OUTPUT);
  34. timer = millis();
  35. timer2 = timer;
  36. }
  37. void loop() {
  38. if (millis() - timer > 10) {
  39. updateGps();
  40. timer = millis();
  41. }
  42. fix = getState();
  43. switch (fix) {
  44. case GPS_DETECTING:
  45. //blink with 4hz
  46. if (millis() % 500 < 250) {
  47. digitalWrite(13, HIGH);
  48. }
  49. else {
  50. digitalWrite(13, LOW);
  51. }
  52. break;
  53. case GPS_NOFIX:
  54. //no blinking
  55. digitalWrite(13, LOW);
  56. break;
  57. case GPS_FIX2D:
  58. case GPS_FIX3D:
  59. case GPS_FIX3DD:
  60. //solid
  61. digitalWrite(13, HIGH);
  62. break;
  63. }
  64. #if defined(FRSKY_D)
  65. //frsky_d needs to manually check for frequency
  66. if (millis() - timer2 > REFRESH_RATE_MILLIS) {
  67. timer2 = millis();
  68. #endif
  69. if (fix > GPS_NOFIX) {
  70. #if defined(FRSKY_D)
  71. float deg = abs(getLat() / 10000000.0f);
  72. lat = ((int)deg * 100) + (deg - (int)deg) * 60.0f;
  73. lat_dir = getLat() > 0 ? 'N' : 'S';
  74. deg = abs(getLon() / 10000000.0f);
  75. lon = ((int)deg * 100) + (deg - (int)deg) * 60.0f;
  76. lon_dir = getLon() > 0 ? 'E' : 'W';
  77. #elif defined(FRSKY_X)
  78. lat = getLat() / 10000000.0f;
  79. lon = getLon() / 10000000.0f;
  80. #endif
  81. gps_alt = getAlt() / 1000.0f;
  82. #if defined(FRSKY_D)
  83. groundspeed = getSpeed() * 0.01944f;
  84. #elif defined(FRSKY_X)
  85. groundspeed = getSpeed() / 100.0f;
  86. #endif
  87. heading = getCourse() / 10.0f;
  88. }
  89. sats = (getSats() * 10) + fix;
  90. #if defined(FRSKY_D)
  91. update_frsky();
  92. }
  93. #elif defined(FRSKY_X)
  94. rpmSensor.setData(0, 0, sats);
  95. gpsSensor.setData(lat, lon, gps_alt, groundspeed, heading, 0, 0, 0, 0, 0, 0);
  96. frsky.send();
  97. #endif
  98. }