The software that runs on the Sentinel base station. This code is for the LPC1768.
Dependencies: XBEE_900HP_SPI mbed-rtos mbed
main.cpp@0:1e026f2c8707, 2015-05-01 (annotated)
- Committer:
- ottaviano3
- Date:
- Fri May 01 15:57:01 2015 +0000
- Revision:
- 0:1e026f2c8707
- Child:
- 1:dd8228f2263c
First;
Who changed what in which revision?
User | Revision | Line number | New 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, °rees); |
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, °rees); |
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 | } |