The software that runs on the Sentinel base station. This code is for the LPC1768.

Dependencies:   XBEE_900HP_SPI mbed-rtos mbed

Committer:
ottaviano3
Date:
Fri May 01 15:57:01 2015 +0000
Revision:
0:1e026f2c8707
Child:
1:dd8228f2263c
First;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ottaviano3 0:1e026f2c8707 1 #include "mbed.h"
ottaviano3 0:1e026f2c8707 2 #include "xbee900hp.h"
ottaviano3 0:1e026f2c8707 3 #include "rtos.h"
ottaviano3 0:1e026f2c8707 4
ottaviano3 0:1e026f2c8707 5 // Serial output to PC
ottaviano3 0:1e026f2c8707 6 Serial pc(USBTX,USBRX);
ottaviano3 0:1e026f2c8707 7
ottaviano3 0:1e026f2c8707 8 // GPS to pc
ottaviano3 0:1e026f2c8707 9 Serial gps(p28,p27);
ottaviano3 0:1e026f2c8707 10
ottaviano3 0:1e026f2c8707 11 // setup xbee
ottaviano3 0:1e026f2c8707 12 xbee900hp xbee(p11,p12,p13, p8, p9);
ottaviano3 0:1e026f2c8707 13
ottaviano3 0:1e026f2c8707 14 DigitalOut led1(LED1);
ottaviano3 0:1e026f2c8707 15 DigitalOut led2(LED2);
ottaviano3 0:1e026f2c8707 16
ottaviano3 0:1e026f2c8707 17 // Buffer for reading in from xbee
ottaviano3 0:1e026f2c8707 18 char buffer[256];
ottaviano3 0:1e026f2c8707 19
ottaviano3 0:1e026f2c8707 20 // Predefine scanner thread
ottaviano3 0:1e026f2c8707 21 void xbeeScanner(void const *args);
ottaviano3 0:1e026f2c8707 22 void hostScanner(void const *args);
ottaviano3 0:1e026f2c8707 23 void getline();
ottaviano3 0:1e026f2c8707 24
ottaviano3 0:1e026f2c8707 25 char gpsmsg[256];
ottaviano3 0:1e026f2c8707 26
ottaviano3 0:1e026f2c8707 27
ottaviano3 0:1e026f2c8707 28 int main()
ottaviano3 0:1e026f2c8707 29 {
ottaviano3 0:1e026f2c8707 30 /*Configuration Area
ottaviano3 0:1e026f2c8707 31 */
ottaviano3 0:1e026f2c8707 32
ottaviano3 0:1e026f2c8707 33 // Set pc baud rate to pretty high for some speed
ottaviano3 0:1e026f2c8707 34 pc.baud(57600);
ottaviano3 0:1e026f2c8707 35 gps.baud(4800);
ottaviano3 0:1e026f2c8707 36
ottaviano3 0:1e026f2c8707 37 // Configure gps with default values.
ottaviano3 0:1e026f2c8707 38 unsigned int gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'0'^','^'1'^','^'4'^'8'^'0'^'0'^','^'8'^','^'1'^','^'0';
ottaviano3 0:1e026f2c8707 39 gps.printf("$PSRF100,1,4800,8,1,0*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 40
ottaviano3 0:1e026f2c8707 41 // Enable GGA
ottaviano3 0:1e026f2c8707 42 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'0'^','^'0'^','^'1'^','^'1';
ottaviano3 0:1e026f2c8707 43 gps.printf("$PSRF103,0,0,1,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 44
ottaviano3 0:1e026f2c8707 45 // Disable GLL
ottaviano3 0:1e026f2c8707 46 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'1'^','^'0'^','^'0'^','^'1';
ottaviano3 0:1e026f2c8707 47 gps.printf("$PSRF103,1,0,0,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 48
ottaviano3 0:1e026f2c8707 49 // Disable GSA
ottaviano3 0:1e026f2c8707 50 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'2'^','^'0'^','^'0'^','^'1';
ottaviano3 0:1e026f2c8707 51 gps.printf("$PSRF103,2,0,0,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 52
ottaviano3 0:1e026f2c8707 53 // Disable GSV
ottaviano3 0:1e026f2c8707 54 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'3'^','^'0'^','^'0'^','^'1';
ottaviano3 0:1e026f2c8707 55 gps.printf("$PSRF103,3,0,0,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 56
ottaviano3 0:1e026f2c8707 57 // Disable RMC
ottaviano3 0:1e026f2c8707 58 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'4'^','^'0'^','^'0'^','^'1';
ottaviano3 0:1e026f2c8707 59 gps.printf("$PSRF103,4,0,0,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 60
ottaviano3 0:1e026f2c8707 61 // Disable VTG
ottaviano3 0:1e026f2c8707 62 gpsxor = 'P'^'S'^'R'^'F'^'1'^'0'^'3'^','^'5'^','^'0'^','^'0'^','^'1';
ottaviano3 0:1e026f2c8707 63 gps.printf("$PSRF103,5,0,0,1*%i\r\n",gpsxor);
ottaviano3 0:1e026f2c8707 64
ottaviano3 0:1e026f2c8707 65 /*End Configuration Area
ottaviano3 0:1e026f2c8707 66 */
ottaviano3 0:1e026f2c8707 67 while (true) {
ottaviano3 0:1e026f2c8707 68 // Define Keys
ottaviano3 0:1e026f2c8707 69 char startkey[12] = "SentinelOn";
ottaviano3 0:1e026f2c8707 70 char endkey[13] = "SentinelOff";
ottaviano3 0:1e026f2c8707 71 char buffer[30];
ottaviano3 0:1e026f2c8707 72
ottaviano3 0:1e026f2c8707 73 do {
ottaviano3 0:1e026f2c8707 74 if (pc.readable() == true) {
ottaviano3 0:1e026f2c8707 75 // Get bytes from computer
ottaviano3 0:1e026f2c8707 76 pc.scanf("%s",buffer);
ottaviano3 0:1e026f2c8707 77 }
ottaviano3 0:1e026f2c8707 78
ottaviano3 0:1e026f2c8707 79 led1 = 1;
ottaviano3 0:1e026f2c8707 80 } while (strcmp( startkey, buffer ) != 0);
ottaviano3 0:1e026f2c8707 81 led1 = 0;
ottaviano3 0:1e026f2c8707 82
ottaviano3 0:1e026f2c8707 83 // Code to respond saying its started.
ottaviano3 0:1e026f2c8707 84 pc.printf("SLON\r\n");
ottaviano3 0:1e026f2c8707 85
ottaviano3 0:1e026f2c8707 86 xbee.clearBuff();
ottaviano3 0:1e026f2c8707 87
ottaviano3 0:1e026f2c8707 88 // Start xbeeScanner Thread
ottaviano3 0:1e026f2c8707 89 Thread xbscan(xbeeScanner);
ottaviano3 0:1e026f2c8707 90 Thread hostscan(hostScanner);
ottaviano3 0:1e026f2c8707 91
ottaviano3 0:1e026f2c8707 92 // Main runloop
ottaviano3 0:1e026f2c8707 93 do {
ottaviano3 0:1e026f2c8707 94 if (pc.readable() == true) {
ottaviano3 0:1e026f2c8707 95 // Get bytes from computer
ottaviano3 0:1e026f2c8707 96 pc.scanf("%s",buffer);
ottaviano3 0:1e026f2c8707 97 }
ottaviano3 0:1e026f2c8707 98
ottaviano3 0:1e026f2c8707 99 led2 = 1;
ottaviano3 0:1e026f2c8707 100 } while (strcmp( endkey, buffer ) != 0);
ottaviano3 0:1e026f2c8707 101 led2 = 0;
ottaviano3 0:1e026f2c8707 102
ottaviano3 0:1e026f2c8707 103 xbscan.terminate();
ottaviano3 0:1e026f2c8707 104 hostscan.terminate();
ottaviano3 0:1e026f2c8707 105 }
ottaviano3 0:1e026f2c8707 106 }
ottaviano3 0:1e026f2c8707 107
ottaviano3 0:1e026f2c8707 108 // Thread to update host position
ottaviano3 0:1e026f2c8707 109 void hostScanner(void const *args)
ottaviano3 0:1e026f2c8707 110 {
ottaviano3 0:1e026f2c8707 111 char nodeid[4] = "0";
ottaviano3 0:1e026f2c8707 112 char ns, ew;
ottaviano3 0:1e026f2c8707 113 int lock;
ottaviano3 0:1e026f2c8707 114 int satsused;
ottaviano3 0:1e026f2c8707 115 float hdop;
ottaviano3 0:1e026f2c8707 116 float latitude, longitude;
ottaviano3 0:1e026f2c8707 117 float altitude;
ottaviano3 0:1e026f2c8707 118 float time;
ottaviano3 0:1e026f2c8707 119
ottaviano3 0:1e026f2c8707 120 while (1) {
ottaviano3 0:1e026f2c8707 121 // update.
ottaviano3 0:1e026f2c8707 122 getline();
ottaviano3 0:1e026f2c8707 123 if(sscanf(gpsmsg, "GPGGA,%f,%f,%c,%f,%c,%i,%i,%f,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &satsused, &hdop, &altitude) >= 1) {
ottaviano3 0:1e026f2c8707 124 if((lock != 1) && (lock != 2) && (lock != 6)) {
ottaviano3 0:1e026f2c8707 125 pc.printf("DNLK,%s,NOLOCK\n",nodeid, latitude, longitude, altitude);
ottaviano3 0:1e026f2c8707 126 } else {
ottaviano3 0:1e026f2c8707 127 double degrees;
ottaviano3 0:1e026f2c8707 128 double minutes = modf(latitude/100.0f, &degrees);
ottaviano3 0:1e026f2c8707 129 minutes = (minutes*100.0f)/60.0f;
ottaviano3 0:1e026f2c8707 130 latitude = degrees + minutes;
ottaviano3 0:1e026f2c8707 131
ottaviano3 0:1e026f2c8707 132 minutes = modf(longitude/100.0f, &degrees);
ottaviano3 0:1e026f2c8707 133 minutes = (minutes*100.0f)/60.0f;
ottaviano3 0:1e026f2c8707 134 longitude = degrees + minutes;
ottaviano3 0:1e026f2c8707 135
ottaviano3 0:1e026f2c8707 136 if(ns == 'S') {
ottaviano3 0:1e026f2c8707 137 latitude *= -1.0;
ottaviano3 0:1e026f2c8707 138 }
ottaviano3 0:1e026f2c8707 139 if(ew == 'W') {
ottaviano3 0:1e026f2c8707 140 longitude *= -1.0;
ottaviano3 0:1e026f2c8707 141 }
ottaviano3 0:1e026f2c8707 142 pc.printf("DLIN,%s,%f,%f,%f\n",nodeid, latitude, longitude, altitude);
ottaviano3 0:1e026f2c8707 143 }
ottaviano3 0:1e026f2c8707 144 }
ottaviano3 0:1e026f2c8707 145 }
ottaviano3 0:1e026f2c8707 146 }
ottaviano3 0:1e026f2c8707 147
ottaviano3 0:1e026f2c8707 148 // Thread to scan the xbee
ottaviano3 0:1e026f2c8707 149 void xbeeScanner(void const *args)
ottaviano3 0:1e026f2c8707 150 {
ottaviano3 0:1e026f2c8707 151 // Main runloop
ottaviano3 0:1e026f2c8707 152 while (true) {
ottaviano3 0:1e026f2c8707 153 // check if xbee is flagging data to be read
ottaviano3 0:1e026f2c8707 154 while(xbee.attn() == 0) {
ottaviano3 0:1e026f2c8707 155 // Read in data and run all background checksum and validation stuff
ottaviano3 0:1e026f2c8707 156 if (xbee.readPacket(buffer) == 0) {
ottaviano3 0:1e026f2c8707 157 pc.printf("%s", buffer);
ottaviano3 0:1e026f2c8707 158 } else {
ottaviano3 0:1e026f2c8707 159 pc.printf("Packet Skipped\n\r");
ottaviano3 0:1e026f2c8707 160 xbee.clearBuff();
ottaviano3 0:1e026f2c8707 161 }
ottaviano3 0:1e026f2c8707 162 }
ottaviano3 0:1e026f2c8707 163 // Give up rest of timeslice to boost that performance
ottaviano3 0:1e026f2c8707 164 Thread::yield();
ottaviano3 0:1e026f2c8707 165 }
ottaviano3 0:1e026f2c8707 166 }
ottaviano3 0:1e026f2c8707 167
ottaviano3 0:1e026f2c8707 168 void getline()
ottaviano3 0:1e026f2c8707 169 {
ottaviano3 0:1e026f2c8707 170 while(gps.getc() != '$'); // wait for the start of a line
ottaviano3 0:1e026f2c8707 171 for(int i=0; i<256; i++) {
ottaviano3 0:1e026f2c8707 172 gpsmsg[i] = gps.getc();
ottaviano3 0:1e026f2c8707 173 if(gpsmsg[i] == '\r') {
ottaviano3 0:1e026f2c8707 174 gpsmsg[i] = 0;
ottaviano3 0:1e026f2c8707 175 return ;
ottaviano3 0:1e026f2c8707 176 }
ottaviano3 0:1e026f2c8707 177 }
ottaviano3 0:1e026f2c8707 178 error("Overflowed message limit");
ottaviano3 0:1e026f2c8707 179 }