new Xadow GPS module

Dependents:   xadow_smartstrap_for_pebble Avnet_ATT_Cellular_IOT Xadow-M0_Xadow-OLED_Accelerometer

Files at this revision

API Documentation at this revision

Comitter:
KillingJacky
Date:
Wed Nov 04 10:01:05 2015 +0000
Parent:
0:0cbe7e15999a
Child:
2:cf4d22190de4
Commit message:
init commit

Changed in this revision

XadowGPS.cpp Show annotated file Show diff for this revision Revisions of this file
XadowGPS.h Show annotated file Show diff for this revision Revisions of this file
--- a/XadowGPS.cpp	Wed Nov 04 09:50:28 2015 +0000
+++ b/XadowGPS.cpp	Wed Nov 04 10:01:05 2015 +0000
@@ -1,14 +1,16 @@
 
-
+#include <stdlib.h>
 #include "mbed.h"
 #include "XadowGPS.h"
+#include "USBSerial.h"
 
 
 
 unsigned char gps_utc_date_time[GPS_UTC_DATE_TIME_SIZE] = {0};
-char cmd[2];
+static char cmd[2];
 
 extern I2C i2c;
+extern USBSerial dbg_serial;
 
 
 unsigned char gps_check_online(void)
@@ -17,37 +19,38 @@
     unsigned char i;
 
     //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
-
     //dlc_i2c_send_byte(GPS_SCAN_ID);
     cmd[0] = GPS_SCAN_ID;
     i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
     for(i=0;i<(GPS_SCAN_SIZE+2);i++)
     {
-        //data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
-    i2c.read(GPS_DEVICE_ADDR, (char *)data, GPS_SCAN_SIZE+2);
 
-    if(data[5] == GPS_DEVICE_ADDR)return 1;
+    if(data[5] == (GPS_DEVICE_ADDR>>1))return 1;
     else return 0;
 }
-/*
+
 unsigned char* gps_get_utc_date_time(void)
 {
     unsigned char data[GPS_UTC_DATE_TIME_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
-
-    dlc_i2c_send_byte(GPS_UTC_DATE_TIME_ID);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_UTC_DATE_TIME_ID);
+    
+    cmd[0] = GPS_UTC_DATE_TIME_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
     for(i=0;i<(GPS_UTC_DATE_TIME_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        //data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
     for(i=0;i<GPS_UTC_DATE_TIME_SIZE;i++)
-    gps_utc_date_time[i] = data[i+2];
+        gps_utc_date_time[i] = data[i+2];
 
     return gps_utc_date_time;
 }
@@ -57,12 +60,16 @@
     unsigned char data[GPS_STATUS_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_STATUS_ID);
+    
+    cmd[0] = GPS_STATUS_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_STATUS_ID);
     for(i=0;i<(GPS_STATUS_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        //data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
     return data[2];
@@ -73,15 +80,17 @@
     unsigned char data[GPS_LATITUDE_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
-
-    dlc_i2c_send_byte(GPS_LATITUDE_ID);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_LATITUDE_ID);
+    cmd[0] = GPS_LATITUDE_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
+    
     for(i=0;i<(GPS_LATITUDE_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return atof(&data[2]);
+    return atof((const char *)&data[2]);
 }
 
 unsigned char gps_get_ns(void)
@@ -89,12 +98,14 @@
     unsigned char data[GPS_NS_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_NS_ID);
+    cmd[0] = GPS_NS_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_NS_ID);
     for(i=0;i<(GPS_NS_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
     if(data[2] == 'N' || data[2] == 'S')return data[2];
@@ -107,15 +118,17 @@
     unsigned char data[GPS_LONGITUDE_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_LONGITUDE_ID);
+    cmd[0] = GPS_LONGITUDE_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_LONGITUDE_ID);
     for(i=0;i<(GPS_LONGITUDE_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return atof(&data[2]);
+    return atof((const char *)&data[2]);
 }
 
 unsigned char gps_get_ew(void)
@@ -123,12 +136,14 @@
     unsigned char data[GPS_EW_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_EW_ID);
+    cmd[0] = GPS_EW_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_EW_ID);
     for(i=0;i<(GPS_EW_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
     if(data[2] == 'E' || data[2] == 'W')return data[2];
@@ -140,15 +155,17 @@
     unsigned char data[GPS_SPEED_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_SPEED_ID);
+    cmd[0] = GPS_SPEED_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_SPEED_ID);
     for(i=0;i<(GPS_SPEED_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return atof(&data[2]);
+    return atof((const char *)&data[2]);
 }
 
 float gps_get_course(void)
@@ -156,15 +173,17 @@
     unsigned char data[GPS_COURSE_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_COURSE_ID);
+    cmd[0] = GPS_COURSE_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_COURSE_ID);
     for(i=0;i<(GPS_COURSE_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return atof(&data[2]);
+    return atof((const char *)&data[2]);
 }
 
 unsigned char gps_get_position_fix(void)
@@ -172,15 +191,17 @@
     unsigned char data[GPS_POSITION_FIX_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_POSITION_FIX_ID);
+    cmd[0] = GPS_POSITION_FIX_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_POSITION_FIX_ID);
     for(i=0;i<(GPS_POSITION_FIX_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return data[2];
+    return data[2] - '0';
 }
 
 unsigned char gps_get_sate_used(void)
@@ -189,17 +210,19 @@
     unsigned char i;
     unsigned char value;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_SATE_USED_ID);
+    cmd[0] = GPS_SATE_USED_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_SATE_USED_ID);
     for(i=0;i<(GPS_SATE_USED_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
+        //dbg_serial.printf("data[%d]: %02x ", i, data[i]);
     }
-
-    if(data[3] >= '0')value = (data[3] - '0') * 10;
+    if(data[3] >= '0' && data[3] <= '9' )value = (data[3] - '0') * 10;
     else value = 0;
-    if(data[2] >= '0')value += (data[2] - '0');
+    if(data[2] >= '0' && data[2] <= '9' )value += (data[2] - '0');
     else value += 0;
 
     return value;
@@ -210,28 +233,32 @@
     unsigned char data[GPS_ALTITUDE_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
-
-    dlc_i2c_send_byte(GPS_ALTITUDE_ID);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_ALTITUDE_ID);
+    cmd[0] = GPS_ALTITUDE_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
+ 
     for(i=0;i<(GPS_ALTITUDE_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return atof(&data[2]);
+    return atof((const char *)&data[2]);
 }
 
-unsigned char gps_get_mode(void)
+char gps_get_mode(void)
 {
-    unsigned char data[GPS_MODE_SIZE+2];
+    char data[GPS_MODE_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_MODE_ID);
+    cmd[0] = GPS_MODE_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_MODE_ID);
     for(i=0;i<(GPS_MODE_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
     return data[2];
@@ -242,14 +269,15 @@
     unsigned char data[GPS_MODE2_SIZE+2];
     unsigned char i;
 
-    dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_configure(GPS_DEVICE_ADDR, 100);
+    //dlc_i2c_send_byte(GPS_MODE2_ID);
+    cmd[0] = GPS_MODE2_ID;
+    i2c.write(GPS_DEVICE_ADDR, cmd, 1);
 
-    dlc_i2c_send_byte(GPS_MODE2_ID);
     for(i=0;i<(GPS_MODE2_SIZE+2);i++)
     {
-        data[i] = dlc_i2c_receive_byte();
+        i2c.read(GPS_DEVICE_ADDR, (char *)&data[i], 1);  //the gps module's i2c supports only 1 byte read/write per burst
     }
 
-    return data[2];
+    return data[2] - '0';
 }
-*/
\ No newline at end of file
--- a/XadowGPS.h	Wed Nov 04 09:50:28 2015 +0000
+++ b/XadowGPS.h	Wed Nov 04 10:01:05 2015 +0000
@@ -92,7 +92,7 @@
  * End
  */
 
-#define GPS_DEVICE_ADDR         0x05
+#define GPS_DEVICE_ADDR         (0x05<<1)
 
 #define GPS_SCAN_ID             0 // 4 bytes
 #define GPS_SCAN_SIZE           4 // 0,0,0,Device address
@@ -162,17 +162,17 @@
 unsigned char gps_get_status(void);
 
 /**
- *  \brief Get the altitude.
+ *  \brief Get the latitude.
  *
- *  \return Return altitude data. The format is dd.dddddd.
+ *  \return Return latitude data. The format is dd.dddddd.
  *
  */
 float gps_get_latitude(void);
 
 /**
- *  \brief Get the altitude direction.
+ *  \brief Get the latitude direction.
  *
- *  \return Return altitude direction data. The format is N/S. N is north, S is south.
+ *  \return Return latitude direction data. The format is N/S. N is north, S is south.
  *
  */
 unsigned char gps_get_ns(void);
@@ -212,7 +212,8 @@
 /**
  *  \brief Get the status of position fix.
  *
- *  \return Return course data. The format is 0,1,2,6.
+ *  \return Return the status of position fix. The format is 0,1,2,6.
+ *          0 - Invalid, 1 - GPS fix, 2 - DGPS fix, 6 - evaluation
  *
  */
 unsigned char gps_get_position_fix(void);
@@ -239,7 +240,7 @@
  *  \return Return mode of location. The format is A/M. A:automatic, M:manual.
  *
  */
-unsigned char gps_get_mode(void);
+char gps_get_mode(void);
 
 /**
  *  \brief Get the current status of GPS.