Use this version as starting point. Tested on Show2Me_V1 PCB (minor patches required).

Dependencies:   GPS Library QEI SDFileSystem mbed

Committer:
walter76
Date:
Mon Sep 03 01:54:41 2018 +0000
Revision:
0:5c5a3012dbfc
working code, initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walter76 0:5c5a3012dbfc 1 #include "mbed.h"
walter76 0:5c5a3012dbfc 2 #include "SDFileSystem.h"
walter76 0:5c5a3012dbfc 3 #include "ST7565_LCD.h"
walter76 0:5c5a3012dbfc 4 #include "QEI.h"
walter76 0:5c5a3012dbfc 5
walter76 0:5c5a3012dbfc 6 #define BAT_GAIN 5.0
walter76 0:5c5a3012dbfc 7 #define BKL_TH_OFF 0.83 // Ambient ligh threshold for auto backlight off
walter76 0:5c5a3012dbfc 8 #define BKL_TH_ON 0.81 // Ambient ligh threshold for auto backlight on
walter76 0:5c5a3012dbfc 9 #define BKL_LOW 0.0 // Ambient ligh offset for auto backlight
walter76 0:5c5a3012dbfc 10 #define FRM_ROW1 10 // Background frame, first horizontal line
walter76 0:5c5a3012dbfc 11 #define FRM_ROW2 60
walter76 0:5c5a3012dbfc 12 #define BUZZ_VOL 0.1 // Buzzer/speaker volume
walter76 0:5c5a3012dbfc 13
walter76 0:5c5a3012dbfc 14
walter76 0:5c5a3012dbfc 15 PwmOut BEEP (D2); // PA_10 Buzzer/speaker (PWM output)
walter76 0:5c5a3012dbfc 16 PwmOut BKL (D3); // PB_3 LCD backlight control (PMW output)
walter76 0:5c5a3012dbfc 17 DigitalOut KAL (PC_8); // PC_8 Keep-Alive/turn-off
walter76 0:5c5a3012dbfc 18 DigitalOut BTC (PC_4); // PC_4 Aux BT module control
walter76 0:5c5a3012dbfc 19 DigitalIn Button (D4); // PB_5 Pushbutton (digital input)
walter76 0:5c5a3012dbfc 20 AnalogIn BATT (A0); // PA_0 Battery monitor
walter76 0:5c5a3012dbfc 21 AnalogIn ALS (A1); // PA_1 Ambient Light sensor
walter76 0:5c5a3012dbfc 22 AnalogIn VCH1 (A2); // PA_4 Analog input 1
walter76 0:5c5a3012dbfc 23 AnalogIn VCH2 (A3); // PB_0 Analog input 2
walter76 0:5c5a3012dbfc 24 AnalogIn VCH3 (A4); // PC_1 Analog input 3
walter76 0:5c5a3012dbfc 25 AnalogIn VCH4 (A5); // PC_0 Analog input 4
walter76 0:5c5a3012dbfc 26 InterruptIn TRIG1 (PC_13); // PC_13 Counter 1 trigger
walter76 0:5c5a3012dbfc 27 InterruptIn TRIG2 (PC_2); // PC_2 Counter 2 trigger
walter76 0:5c5a3012dbfc 28 InterruptIn TRIG3 (PA_15); // PA_15 Counter 3 trigger
walter76 0:5c5a3012dbfc 29 DigitalOut PLED (PC_3); // PC_3 Pulse LED
walter76 0:5c5a3012dbfc 30 DigitalOut ALED (PC_9); // PC_9 Alarm LED
walter76 0:5c5a3012dbfc 31 DigitalIn CHRG (PC_10); // PC_10 Charge in progress
walter76 0:5c5a3012dbfc 32 DigitalIn EOCH (PC_12); // PC_12 Endo Of Charge
walter76 0:5c5a3012dbfc 33 DigitalOut SDPW (PB_2); // PB_2 SD-Card power enable
walter76 0:5c5a3012dbfc 34
walter76 0:5c5a3012dbfc 35 SDFileSystem sd(PB_15, PB_14, PB_13, PB_1, "sd"); // MOSI, MISO, SCK, CS
walter76 0:5c5a3012dbfc 36
walter76 0:5c5a3012dbfc 37 // Quadrature encoder
walter76 0:5c5a3012dbfc 38 QEI Wheel(D6, D5, NC, 16); // PB_10, PB_4
walter76 0:5c5a3012dbfc 39 // Tickers
walter76 0:5c5a3012dbfc 40 Ticker Sec_Beat; // Timer ticker
walter76 0:5c5a3012dbfc 41 Ticker Display_Refresh; // Display refresh ticker
walter76 0:5c5a3012dbfc 42
walter76 0:5c5a3012dbfc 43 //Serial ports
walter76 0:5c5a3012dbfc 44 Serial PC(USBTX, USBRX); // Virtual COM via USB
walter76 0:5c5a3012dbfc 45
walter76 0:5c5a3012dbfc 46 // GPS module
walter76 0:5c5a3012dbfc 47 Serial GPS(PA_11, PA_12, 9600); // PA_11=TX, PA_12=RX, default baud-rate
walter76 0:5c5a3012dbfc 48 I2C GPS_I2C(PB_9,PB_8); // SDA=PB_9, SCL=PB_8
walter76 0:5c5a3012dbfc 49
walter76 0:5c5a3012dbfc 50 extern unsigned int buffer[128*64/8]; // RAM buffer used by LCD
walter76 0:5c5a3012dbfc 51 time_t seconds; // timestamp
walter76 0:5c5a3012dbfc 52 char Text[40]=""; // Text string used by LCD
walter76 0:5c5a3012dbfc 53 float Vbatt, AmbLight; // battery votage and ambient light level
walter76 0:5c5a3012dbfc 54 uint16_t CNT1, CNT2, CNT3; // pulse counters
walter76 0:5c5a3012dbfc 55 uint8_t FLASH_Status;
walter76 0:5c5a3012dbfc 56 float V1, V2, V3, V4;
walter76 0:5c5a3012dbfc 57 bool Pulse=0, ExtPwr=0;
walter76 0:5c5a3012dbfc 58
walter76 0:5c5a3012dbfc 59 // used by GPS:
walter76 0:5c5a3012dbfc 60 double latitude = 0.0;
walter76 0:5c5a3012dbfc 61 double longitude = 0.0;
walter76 0:5c5a3012dbfc 62 double altitude = 0.0;
walter76 0:5c5a3012dbfc 63 int num_sat;
walter76 0:5c5a3012dbfc 64 float hori_dilute;
walter76 0:5c5a3012dbfc 65 float alt = 0.0;
walter76 0:5c5a3012dbfc 66 float geoid, GPS_time;
walter76 0:5c5a3012dbfc 67 char ns = 'N', ew='E';
walter76 0:5c5a3012dbfc 68 char GPS_stream[256]="none";
walter76 0:5c5a3012dbfc 69 char gu, hu;
walter76 0:5c5a3012dbfc 70 //const int GPS_addr = 0x42;
walter76 0:5c5a3012dbfc 71
walter76 0:5c5a3012dbfc 72 // ------------------- Prototypes -----------------------
walter76 0:5c5a3012dbfc 73 void Timer_tick(void);
walter76 0:5c5a3012dbfc 74 void Update_Display(void);
walter76 0:5c5a3012dbfc 75 void Set_Time(void);
walter76 0:5c5a3012dbfc 76 void Read_Voltages(void);
walter76 0:5c5a3012dbfc 77 void PowerOff(void);
walter76 0:5c5a3012dbfc 78 void DrawFrame(void);
walter76 0:5c5a3012dbfc 79 void CNT1_count(void);
walter76 0:5c5a3012dbfc 80 void CNT2_count(void);
walter76 0:5c5a3012dbfc 81 void CNT3_count(void);
walter76 0:5c5a3012dbfc 82 uint8_t WriteEEPROM(uint32_t, uint8_t);
walter76 0:5c5a3012dbfc 83 uint8_t ReadEEPROM(uint32_t);
walter76 0:5c5a3012dbfc 84 void SDCard_test(void);
walter76 0:5c5a3012dbfc 85 void EEPROM_test(void);
walter76 0:5c5a3012dbfc 86 void Init_All(void);
walter76 0:5c5a3012dbfc 87 int GPS_test(void);
walter76 0:5c5a3012dbfc 88 void GPS_getline(void);
walter76 0:5c5a3012dbfc 89 int GPS_get_stream(void);
walter76 0:5c5a3012dbfc 90
walter76 0:5c5a3012dbfc 91 int main()
walter76 0:5c5a3012dbfc 92 {
walter76 0:5c5a3012dbfc 93 Init_All();
walter76 0:5c5a3012dbfc 94
walter76 0:5c5a3012dbfc 95 if(Button) // if turn-on via pushbutton
walter76 0:5c5a3012dbfc 96 {
walter76 0:5c5a3012dbfc 97 KAL = 1; // self sustain power from battery
walter76 0:5c5a3012dbfc 98 ExtPwr=0;
walter76 0:5c5a3012dbfc 99 }
walter76 0:5c5a3012dbfc 100 else
walter76 0:5c5a3012dbfc 101 ExtPwr = 1; // otherwise power comes from USB
walter76 0:5c5a3012dbfc 102
walter76 0:5c5a3012dbfc 103 // debug: force
walter76 0:5c5a3012dbfc 104 //ExtPwr = 0;
walter76 0:5c5a3012dbfc 105
walter76 0:5c5a3012dbfc 106
walter76 0:5c5a3012dbfc 107 // enable LCD refresh ticker
walter76 0:5c5a3012dbfc 108 Display_Refresh.attach(&Update_Display, 0.1);
walter76 0:5c5a3012dbfc 109
walter76 0:5c5a3012dbfc 110 wait(1.5);
walter76 0:5c5a3012dbfc 111 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 112
walter76 0:5c5a3012dbfc 113 if(Button) // if pushbutton still pressed after splash-screen
walter76 0:5c5a3012dbfc 114 Set_Time(); // set RTC time and date
walter76 0:5c5a3012dbfc 115
walter76 0:5c5a3012dbfc 116 // launch self-tests
walter76 0:5c5a3012dbfc 117 SDCard_test();
walter76 0:5c5a3012dbfc 118 wait(1);
walter76 0:5c5a3012dbfc 119 //EEPROM_test();
walter76 0:5c5a3012dbfc 120
walter76 0:5c5a3012dbfc 121 // draw background frame
walter76 0:5c5a3012dbfc 122 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 123 DrawFrame();
walter76 0:5c5a3012dbfc 124
walter76 0:5c5a3012dbfc 125 if(ExtPwr) // if powered via USB, no need for backlight (recharge)
walter76 0:5c5a3012dbfc 126 BKL.write(0);
walter76 0:5c5a3012dbfc 127
walter76 0:5c5a3012dbfc 128 // enable sec-beat ticker
walter76 0:5c5a3012dbfc 129 Sec_Beat.attach(&Timer_tick, 1.113);
walter76 0:5c5a3012dbfc 130
walter76 0:5c5a3012dbfc 131 //tm t = RTC::getDefaultTM();
walter76 0:5c5a3012dbfc 132 //RTC::attach(&Sec_Beat, RTC::Second);
walter76 0:5c5a3012dbfc 133
walter76 0:5c5a3012dbfc 134 // enable & attach interrupts on rising edge of digital inputs
walter76 0:5c5a3012dbfc 135 TRIG1.rise(&CNT1_count);
walter76 0:5c5a3012dbfc 136 TRIG2.rise(&CNT2_count);
walter76 0:5c5a3012dbfc 137 TRIG3.rise(&CNT3_count);
walter76 0:5c5a3012dbfc 138
walter76 0:5c5a3012dbfc 139 while(1)
walter76 0:5c5a3012dbfc 140 {
walter76 0:5c5a3012dbfc 141
walter76 0:5c5a3012dbfc 142 if(Button)
walter76 0:5c5a3012dbfc 143 PowerOff(); // Power-off test
walter76 0:5c5a3012dbfc 144 /*
walter76 0:5c5a3012dbfc 145 // DEBUG: PC/GPS serial pass-through
walter76 0:5c5a3012dbfc 146 if(PC.readable())
walter76 0:5c5a3012dbfc 147 GPS.putc(PC.getc());
walter76 0:5c5a3012dbfc 148
walter76 0:5c5a3012dbfc 149 if(GPS.readable())
walter76 0:5c5a3012dbfc 150 PC.putc(GPS.getc());
walter76 0:5c5a3012dbfc 151 */
walter76 0:5c5a3012dbfc 152
walter76 0:5c5a3012dbfc 153 }
walter76 0:5c5a3012dbfc 154
walter76 0:5c5a3012dbfc 155 }
walter76 0:5c5a3012dbfc 156
walter76 0:5c5a3012dbfc 157
walter76 0:5c5a3012dbfc 158 //===========================================================================
walter76 0:5c5a3012dbfc 159
walter76 0:5c5a3012dbfc 160 // ------------- Called every second ----------------------
walter76 0:5c5a3012dbfc 161
walter76 0:5c5a3012dbfc 162 void Timer_tick()
walter76 0:5c5a3012dbfc 163 {
walter76 0:5c5a3012dbfc 164 seconds = time(NULL);
walter76 0:5c5a3012dbfc 165 strftime(Text, 50, "%d-%b-%Y %H:%M:%S", localtime(&seconds));
walter76 0:5c5a3012dbfc 166 LCD_drawstring(buffer, 0, 0, Text);
walter76 0:5c5a3012dbfc 167
walter76 0:5c5a3012dbfc 168 //TRIG1.rise(NULL); // detach counters
walter76 0:5c5a3012dbfc 169 //TRIG2.rise(NULL); //
walter76 0:5c5a3012dbfc 170 //TRIG3.rise(NULL); //
walter76 0:5c5a3012dbfc 171
walter76 0:5c5a3012dbfc 172 // read voltages
walter76 0:5c5a3012dbfc 173 if(ExtPwr)
walter76 0:5c5a3012dbfc 174 KAL = 1;
walter76 0:5c5a3012dbfc 175 Read_Voltages();
walter76 0:5c5a3012dbfc 176 if(ExtPwr)
walter76 0:5c5a3012dbfc 177 KAL = 0;
walter76 0:5c5a3012dbfc 178
walter76 0:5c5a3012dbfc 179
walter76 0:5c5a3012dbfc 180 if(!ExtPwr)
walter76 0:5c5a3012dbfc 181 if(AmbLight>BKL_TH_OFF)
walter76 0:5c5a3012dbfc 182 BKL.write(BKL_LOW);
walter76 0:5c5a3012dbfc 183 else
walter76 0:5c5a3012dbfc 184 if(AmbLight<BKL_TH_ON)
walter76 0:5c5a3012dbfc 185 BKL.write(AmbLight+(1-BKL_TH_ON));
walter76 0:5c5a3012dbfc 186
walter76 0:5c5a3012dbfc 187 // write values to buffer
walter76 0:5c5a3012dbfc 188 sprintf(Text,"VBATT= %4.2f", Vbatt);
walter76 0:5c5a3012dbfc 189 LCD_drawstring(buffer, 0, 2, Text);
walter76 0:5c5a3012dbfc 190 sprintf(Text,"%4.1f %4.1f %4.1f %4.1f", V1, V2, V3, V4 );
walter76 0:5c5a3012dbfc 191 LCD_drawstring(buffer, 0, 3, Text);
walter76 0:5c5a3012dbfc 192 sprintf(Text,"CPS1= %5d", CNT1);
walter76 0:5c5a3012dbfc 193 LCD_drawstring(buffer, 0, 4, Text);
walter76 0:5c5a3012dbfc 194 sprintf(Text,"CPS2= %5d", CNT2);
walter76 0:5c5a3012dbfc 195 LCD_drawstring(buffer, 0, 5, Text);
walter76 0:5c5a3012dbfc 196 sprintf(Text,"CPS3= %5d", CNT3);
walter76 0:5c5a3012dbfc 197 LCD_drawstring(buffer, 0, 6, Text);
walter76 0:5c5a3012dbfc 198
walter76 0:5c5a3012dbfc 199 CNT1=CNT2=CNT3=0;
walter76 0:5c5a3012dbfc 200
walter76 0:5c5a3012dbfc 201 //TRIG1.rise(&CNT1_count); //attach CNT1_count(); to TRIG1
walter76 0:5c5a3012dbfc 202 //TRIG2.rise(&CNT2_count); //attach CNT2_count(); to TRIG2
walter76 0:5c5a3012dbfc 203 //TRIG3.rise(&CNT3_count); //attach CNT3_count(); to TRIG3
walter76 0:5c5a3012dbfc 204
walter76 0:5c5a3012dbfc 205 GPS_get_stream(); // GPS test
walter76 0:5c5a3012dbfc 206
walter76 0:5c5a3012dbfc 207 return;
walter76 0:5c5a3012dbfc 208 }
walter76 0:5c5a3012dbfc 209
walter76 0:5c5a3012dbfc 210
walter76 0:5c5a3012dbfc 211 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 212 void Update_Display(void)
walter76 0:5c5a3012dbfc 213 {
walter76 0:5c5a3012dbfc 214
walter76 0:5c5a3012dbfc 215 if(Pulse)
walter76 0:5c5a3012dbfc 216 {
walter76 0:5c5a3012dbfc 217 PLED = 0;
walter76 0:5c5a3012dbfc 218 BEEP.write(0);
walter76 0:5c5a3012dbfc 219 Pulse = 0;
walter76 0:5c5a3012dbfc 220 }
walter76 0:5c5a3012dbfc 221 LCD_write_buffer(buffer); // LCD update
walter76 0:5c5a3012dbfc 222 return;
walter76 0:5c5a3012dbfc 223 }
walter76 0:5c5a3012dbfc 224
walter76 0:5c5a3012dbfc 225 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 226 void Set_Time(void)
walter76 0:5c5a3012dbfc 227 {
walter76 0:5c5a3012dbfc 228 uint8_t Year=0, Month=0, Day=0, Hours=0, Mins=0, Secs=0;
walter76 0:5c5a3012dbfc 229 time_t seconds;
walter76 0:5c5a3012dbfc 230 struct tm t;
walter76 0:5c5a3012dbfc 231
walter76 0:5c5a3012dbfc 232 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 233 sprintf(Text,"TIME & DATE SETTING");
walter76 0:5c5a3012dbfc 234 LCD_drawstring(buffer, 0, 0, Text);
walter76 0:5c5a3012dbfc 235
walter76 0:5c5a3012dbfc 236 // Set year
walter76 0:5c5a3012dbfc 237 while(Button);
walter76 0:5c5a3012dbfc 238 wait_ms(50);
walter76 0:5c5a3012dbfc 239
walter76 0:5c5a3012dbfc 240 while(!Button)
walter76 0:5c5a3012dbfc 241 {
walter76 0:5c5a3012dbfc 242 if(int(Wheel.getPulses())<0)
walter76 0:5c5a3012dbfc 243 Wheel.reset();
walter76 0:5c5a3012dbfc 244 Year = (uint8_t)(Wheel.getPulses());
walter76 0:5c5a3012dbfc 245
walter76 0:5c5a3012dbfc 246 if(Year>99)
walter76 0:5c5a3012dbfc 247 Wheel.reset();
walter76 0:5c5a3012dbfc 248
walter76 0:5c5a3012dbfc 249 sprintf(Text, "Year: %2d", Year);
walter76 0:5c5a3012dbfc 250 LCD_drawstring(buffer, 0, 2, Text);
walter76 0:5c5a3012dbfc 251
walter76 0:5c5a3012dbfc 252 }
walter76 0:5c5a3012dbfc 253
walter76 0:5c5a3012dbfc 254 // Set month
walter76 0:5c5a3012dbfc 255 while(Button);
walter76 0:5c5a3012dbfc 256 wait_ms(50);
walter76 0:5c5a3012dbfc 257 Wheel.reset();
walter76 0:5c5a3012dbfc 258 while(!Button)
walter76 0:5c5a3012dbfc 259 {
walter76 0:5c5a3012dbfc 260 if(int(Wheel.getPulses())<0)
walter76 0:5c5a3012dbfc 261 Wheel.reset();
walter76 0:5c5a3012dbfc 262 Month = (uint8_t)(Wheel.getPulses()/2);
walter76 0:5c5a3012dbfc 263
walter76 0:5c5a3012dbfc 264 if(Month>11)
walter76 0:5c5a3012dbfc 265 Wheel.reset();
walter76 0:5c5a3012dbfc 266
walter76 0:5c5a3012dbfc 267 sprintf(Text, "Month: %2d", Month+1);
walter76 0:5c5a3012dbfc 268 LCD_drawstring(buffer, 0, 3, Text);
walter76 0:5c5a3012dbfc 269
walter76 0:5c5a3012dbfc 270 }
walter76 0:5c5a3012dbfc 271
walter76 0:5c5a3012dbfc 272
walter76 0:5c5a3012dbfc 273 // Set day
walter76 0:5c5a3012dbfc 274 while(Button);
walter76 0:5c5a3012dbfc 275 wait_ms(50);
walter76 0:5c5a3012dbfc 276 Wheel.reset();
walter76 0:5c5a3012dbfc 277 while(!Button)
walter76 0:5c5a3012dbfc 278 {
walter76 0:5c5a3012dbfc 279 if(int(Wheel.getPulses())<0)
walter76 0:5c5a3012dbfc 280 Wheel.reset();
walter76 0:5c5a3012dbfc 281 Day = (uint8_t)(Wheel.getPulses()/2);
walter76 0:5c5a3012dbfc 282
walter76 0:5c5a3012dbfc 283 if(Day>30)
walter76 0:5c5a3012dbfc 284 Wheel.reset();
walter76 0:5c5a3012dbfc 285
walter76 0:5c5a3012dbfc 286 sprintf(Text, "Day: %2d", Day+1);
walter76 0:5c5a3012dbfc 287 LCD_drawstring(buffer, 0, 4, Text);
walter76 0:5c5a3012dbfc 288
walter76 0:5c5a3012dbfc 289 }
walter76 0:5c5a3012dbfc 290
walter76 0:5c5a3012dbfc 291 // Set hours
walter76 0:5c5a3012dbfc 292 while(Button);
walter76 0:5c5a3012dbfc 293 wait_ms(50);
walter76 0:5c5a3012dbfc 294 Wheel.reset();
walter76 0:5c5a3012dbfc 295 while(!Button)
walter76 0:5c5a3012dbfc 296 {
walter76 0:5c5a3012dbfc 297 if(int(Wheel.getPulses())<0)
walter76 0:5c5a3012dbfc 298 Wheel.reset();
walter76 0:5c5a3012dbfc 299 Hours = (uint8_t)(Wheel.getPulses()/2);
walter76 0:5c5a3012dbfc 300
walter76 0:5c5a3012dbfc 301 if(Hours>22)
walter76 0:5c5a3012dbfc 302 Wheel.reset();
walter76 0:5c5a3012dbfc 303
walter76 0:5c5a3012dbfc 304 sprintf(Text, "Hours: %2d", Hours);
walter76 0:5c5a3012dbfc 305 LCD_drawstring(buffer, 0, 5, Text);
walter76 0:5c5a3012dbfc 306
walter76 0:5c5a3012dbfc 307 }
walter76 0:5c5a3012dbfc 308 //Hours++;
walter76 0:5c5a3012dbfc 309
walter76 0:5c5a3012dbfc 310 // Set minutes
walter76 0:5c5a3012dbfc 311 while(Button);
walter76 0:5c5a3012dbfc 312 wait_ms(50);
walter76 0:5c5a3012dbfc 313 Wheel.reset();
walter76 0:5c5a3012dbfc 314 while(!Button)
walter76 0:5c5a3012dbfc 315 {
walter76 0:5c5a3012dbfc 316 if(int(Wheel.getPulses())<0)
walter76 0:5c5a3012dbfc 317 Wheel.reset();
walter76 0:5c5a3012dbfc 318 Mins = (uint8_t)(Wheel.getPulses()/2);
walter76 0:5c5a3012dbfc 319
walter76 0:5c5a3012dbfc 320 if(Mins>59)
walter76 0:5c5a3012dbfc 321 Wheel.reset();
walter76 0:5c5a3012dbfc 322
walter76 0:5c5a3012dbfc 323 sprintf(Text, "Minutes: %2d", Mins);
walter76 0:5c5a3012dbfc 324 LCD_drawstring(buffer, 0, 6, Text);
walter76 0:5c5a3012dbfc 325
walter76 0:5c5a3012dbfc 326 }
walter76 0:5c5a3012dbfc 327
walter76 0:5c5a3012dbfc 328 t.tm_year = Year + 100;
walter76 0:5c5a3012dbfc 329 t.tm_mon = Month;
walter76 0:5c5a3012dbfc 330 t.tm_mday = Day + 1;
walter76 0:5c5a3012dbfc 331 t.tm_hour = Hours;
walter76 0:5c5a3012dbfc 332 t.tm_min = Mins;
walter76 0:5c5a3012dbfc 333 t.tm_sec = Secs;
walter76 0:5c5a3012dbfc 334
walter76 0:5c5a3012dbfc 335 seconds = mktime(&t);
walter76 0:5c5a3012dbfc 336 set_time(seconds);
walter76 0:5c5a3012dbfc 337
walter76 0:5c5a3012dbfc 338 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 339
walter76 0:5c5a3012dbfc 340 return;
walter76 0:5c5a3012dbfc 341 }
walter76 0:5c5a3012dbfc 342
walter76 0:5c5a3012dbfc 343
walter76 0:5c5a3012dbfc 344 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 345 void Read_Voltages(void)
walter76 0:5c5a3012dbfc 346 {
walter76 0:5c5a3012dbfc 347
walter76 0:5c5a3012dbfc 348 double ADC_value;
walter76 0:5c5a3012dbfc 349 uint8_t smooth = 10; // Number of samples to smooth
walter76 0:5c5a3012dbfc 350 uint8_t i;
walter76 0:5c5a3012dbfc 351
walter76 0:5c5a3012dbfc 352 // Read battery voltage
walter76 0:5c5a3012dbfc 353
walter76 0:5c5a3012dbfc 354 ADC_value = BATT.read(); // cleanup
walter76 0:5c5a3012dbfc 355 wait_ms(5);
walter76 0:5c5a3012dbfc 356 ADC_value = 0;
walter76 0:5c5a3012dbfc 357 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 358 ADC_value += BATT.read();
walter76 0:5c5a3012dbfc 359
walter76 0:5c5a3012dbfc 360 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 361 Vbatt = (float)(ADC_value*BAT_GAIN);
walter76 0:5c5a3012dbfc 362
walter76 0:5c5a3012dbfc 363
walter76 0:5c5a3012dbfc 364 // Read Ambient Light Level
walter76 0:5c5a3012dbfc 365
walter76 0:5c5a3012dbfc 366 ADC_value = ALS.read(); // cleanup
walter76 0:5c5a3012dbfc 367 wait_ms(5);
walter76 0:5c5a3012dbfc 368 ADC_value = 0;
walter76 0:5c5a3012dbfc 369 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 370 ADC_value += ALS.read();
walter76 0:5c5a3012dbfc 371
walter76 0:5c5a3012dbfc 372 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 373 AmbLight = (float)(ADC_value);
walter76 0:5c5a3012dbfc 374
walter76 0:5c5a3012dbfc 375
walter76 0:5c5a3012dbfc 376 // Read AIN1
walter76 0:5c5a3012dbfc 377
walter76 0:5c5a3012dbfc 378 ADC_value = VCH1.read(); // cleanup
walter76 0:5c5a3012dbfc 379 wait_ms(5);
walter76 0:5c5a3012dbfc 380 ADC_value = 0;
walter76 0:5c5a3012dbfc 381 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 382 ADC_value += VCH1.read();
walter76 0:5c5a3012dbfc 383
walter76 0:5c5a3012dbfc 384 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 385 V1 = (float)(ADC_value);
walter76 0:5c5a3012dbfc 386
walter76 0:5c5a3012dbfc 387 // Read AIN2
walter76 0:5c5a3012dbfc 388
walter76 0:5c5a3012dbfc 389 ADC_value = VCH2.read(); // cleanup
walter76 0:5c5a3012dbfc 390 wait_ms(5);
walter76 0:5c5a3012dbfc 391 ADC_value = 0;
walter76 0:5c5a3012dbfc 392 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 393 ADC_value += VCH2.read();
walter76 0:5c5a3012dbfc 394
walter76 0:5c5a3012dbfc 395 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 396 V2 = (float)(ADC_value);
walter76 0:5c5a3012dbfc 397
walter76 0:5c5a3012dbfc 398 // Read AIN3
walter76 0:5c5a3012dbfc 399
walter76 0:5c5a3012dbfc 400 ADC_value = VCH3.read(); // cleanup
walter76 0:5c5a3012dbfc 401 wait_ms(5);
walter76 0:5c5a3012dbfc 402 ADC_value = 0;
walter76 0:5c5a3012dbfc 403 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 404 ADC_value += VCH3.read();
walter76 0:5c5a3012dbfc 405
walter76 0:5c5a3012dbfc 406 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 407 V3 = (float)(ADC_value);
walter76 0:5c5a3012dbfc 408
walter76 0:5c5a3012dbfc 409 // Read AIN4
walter76 0:5c5a3012dbfc 410
walter76 0:5c5a3012dbfc 411 ADC_value = VCH4.read(); // cleanup
walter76 0:5c5a3012dbfc 412 wait_ms(5);
walter76 0:5c5a3012dbfc 413 ADC_value = 0;
walter76 0:5c5a3012dbfc 414 for(i=0;i<smooth;i++)
walter76 0:5c5a3012dbfc 415 ADC_value += VCH4.read();
walter76 0:5c5a3012dbfc 416
walter76 0:5c5a3012dbfc 417 ADC_value = ADC_value/smooth;
walter76 0:5c5a3012dbfc 418 V4 = (float)(ADC_value);
walter76 0:5c5a3012dbfc 419
walter76 0:5c5a3012dbfc 420
walter76 0:5c5a3012dbfc 421 return;
walter76 0:5c5a3012dbfc 422 }
walter76 0:5c5a3012dbfc 423
walter76 0:5c5a3012dbfc 424
walter76 0:5c5a3012dbfc 425 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 426 void PowerOff(void)
walter76 0:5c5a3012dbfc 427 {
walter76 0:5c5a3012dbfc 428 BKL.write(1);
walter76 0:5c5a3012dbfc 429 Display_Refresh.detach();
walter76 0:5c5a3012dbfc 430 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 431 sprintf(Text,"POWERING OFF");
walter76 0:5c5a3012dbfc 432 LCD_drawstring(buffer, 30, 3, Text);
walter76 0:5c5a3012dbfc 433 LCD_write_buffer(buffer);
walter76 0:5c5a3012dbfc 434 wait(2);
walter76 0:5c5a3012dbfc 435 Clear_buffer(buffer);
walter76 0:5c5a3012dbfc 436 KAL = 0;
walter76 0:5c5a3012dbfc 437 }
walter76 0:5c5a3012dbfc 438
walter76 0:5c5a3012dbfc 439
walter76 0:5c5a3012dbfc 440 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 441 void DrawFrame(void)
walter76 0:5c5a3012dbfc 442 {
walter76 0:5c5a3012dbfc 443 uint8_t i;
walter76 0:5c5a3012dbfc 444
walter76 0:5c5a3012dbfc 445 for(i=0; i<128; i++)
walter76 0:5c5a3012dbfc 446 {
walter76 0:5c5a3012dbfc 447 LCD_setpixel(buffer, i, FRM_ROW1, 1);
walter76 0:5c5a3012dbfc 448 //LCD_setpixel(buffer, i, FRM_ROW2, 1);
walter76 0:5c5a3012dbfc 449 }
walter76 0:5c5a3012dbfc 450 return;
walter76 0:5c5a3012dbfc 451 }
walter76 0:5c5a3012dbfc 452
walter76 0:5c5a3012dbfc 453
walter76 0:5c5a3012dbfc 454 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 455 void CNT1_count(void)
walter76 0:5c5a3012dbfc 456 { //function to call upon interrupt
walter76 0:5c5a3012dbfc 457 CNT1++; //increment counter object
walter76 0:5c5a3012dbfc 458 PLED = 1;
walter76 0:5c5a3012dbfc 459 BEEP.write(BUZZ_VOL);
walter76 0:5c5a3012dbfc 460 Pulse = 1;
walter76 0:5c5a3012dbfc 461 return;
walter76 0:5c5a3012dbfc 462 }
walter76 0:5c5a3012dbfc 463
walter76 0:5c5a3012dbfc 464
walter76 0:5c5a3012dbfc 465 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 466 void CNT2_count(void)
walter76 0:5c5a3012dbfc 467 { //function to call upon interrupt
walter76 0:5c5a3012dbfc 468 CNT2++; //increment counter object
walter76 0:5c5a3012dbfc 469 return;
walter76 0:5c5a3012dbfc 470 }
walter76 0:5c5a3012dbfc 471
walter76 0:5c5a3012dbfc 472
walter76 0:5c5a3012dbfc 473 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 474 void CNT3_count(void)
walter76 0:5c5a3012dbfc 475 { //function to call upon interrupt
walter76 0:5c5a3012dbfc 476 CNT3++; //increment counter object
walter76 0:5c5a3012dbfc 477 return;
walter76 0:5c5a3012dbfc 478 }
walter76 0:5c5a3012dbfc 479
walter76 0:5c5a3012dbfc 480
walter76 0:5c5a3012dbfc 481 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 482 uint8_t WriteEEPROM(uint32_t address, uint8_t data)
walter76 0:5c5a3012dbfc 483 {
walter76 0:5c5a3012dbfc 484 HAL_StatusTypeDef status;
walter76 0:5c5a3012dbfc 485
walter76 0:5c5a3012dbfc 486 address = address + 0x08000000;
walter76 0:5c5a3012dbfc 487 HAL_FLASH_Unlock();
walter76 0:5c5a3012dbfc 488 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, data);
walter76 0:5c5a3012dbfc 489 HAL_FLASH_Lock();
walter76 0:5c5a3012dbfc 490
walter76 0:5c5a3012dbfc 491 return status;
walter76 0:5c5a3012dbfc 492 }
walter76 0:5c5a3012dbfc 493
walter76 0:5c5a3012dbfc 494
walter76 0:5c5a3012dbfc 495 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 496 uint8_t ReadEEPROM(uint32_t address)
walter76 0:5c5a3012dbfc 497 {
walter76 0:5c5a3012dbfc 498 uint8_t tmp = 0;
walter76 0:5c5a3012dbfc 499
walter76 0:5c5a3012dbfc 500 address = address + 0x08000000;
walter76 0:5c5a3012dbfc 501 tmp = *(__IO uint32_t*)address;
walter76 0:5c5a3012dbfc 502
walter76 0:5c5a3012dbfc 503 return tmp;
walter76 0:5c5a3012dbfc 504 }
walter76 0:5c5a3012dbfc 505
walter76 0:5c5a3012dbfc 506
walter76 0:5c5a3012dbfc 507
walter76 0:5c5a3012dbfc 508 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 509 void SDCard_test(void)
walter76 0:5c5a3012dbfc 510 {
walter76 0:5c5a3012dbfc 511 // SD-Card test
walter76 0:5c5a3012dbfc 512 printf("SD-Card test... ");
walter76 0:5c5a3012dbfc 513 //mkdir("/sd/system", 0777);
walter76 0:5c5a3012dbfc 514 FILE *fp = fopen("/sd/system/version.dat", "a");
walter76 0:5c5a3012dbfc 515 if(fp == NULL)
walter76 0:5c5a3012dbfc 516 {
walter76 0:5c5a3012dbfc 517 printf("ERROR\n");
walter76 0:5c5a3012dbfc 518 sprintf(Text,"SD-CARD ERROR");
walter76 0:5c5a3012dbfc 519 LCD_drawstring(buffer, 15, 2, Text);
walter76 0:5c5a3012dbfc 520 LCD_write_buffer(buffer);
walter76 0:5c5a3012dbfc 521 }
walter76 0:5c5a3012dbfc 522 else
walter76 0:5c5a3012dbfc 523 {
walter76 0:5c5a3012dbfc 524 printf("OK\n");
walter76 0:5c5a3012dbfc 525 sprintf(Text,"SD-CARD DETECTED");
walter76 0:5c5a3012dbfc 526 LCD_drawstring(buffer, 15, 2, Text);
walter76 0:5c5a3012dbfc 527 LCD_write_buffer(buffer);
walter76 0:5c5a3012dbfc 528 fprintf(fp, "Geo Electronics 2107\n");
walter76 0:5c5a3012dbfc 529 fprintf(fp, __DATE__);
walter76 0:5c5a3012dbfc 530 fprintf(fp, "\t");
walter76 0:5c5a3012dbfc 531 fprintf(fp, __TIME__);
walter76 0:5c5a3012dbfc 532 fprintf(fp, "\n");
walter76 0:5c5a3012dbfc 533 fclose(fp);
walter76 0:5c5a3012dbfc 534 }
walter76 0:5c5a3012dbfc 535 printf("SD-Card end of test\n");
walter76 0:5c5a3012dbfc 536
walter76 0:5c5a3012dbfc 537 return;
walter76 0:5c5a3012dbfc 538 }
walter76 0:5c5a3012dbfc 539
walter76 0:5c5a3012dbfc 540
walter76 0:5c5a3012dbfc 541 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 542 void EEPROM_test(void)
walter76 0:5c5a3012dbfc 543 {
walter76 0:5c5a3012dbfc 544 // internal EEPROM test
walter76 0:5c5a3012dbfc 545 PC.printf("Attempting to write to EEPROM...\n");
walter76 0:5c5a3012dbfc 546
walter76 0:5c5a3012dbfc 547 for (uint32_t i = 0; i < 8; i++)
walter76 0:5c5a3012dbfc 548 {
walter76 0:5c5a3012dbfc 549 FLASH_Status = WriteEEPROM(i,(uint8_t)(i));
walter76 0:5c5a3012dbfc 550 PC.printf("Writing %d at %d\n", i, i);
walter76 0:5c5a3012dbfc 551 }
walter76 0:5c5a3012dbfc 552 if(FLASH_Status == HAL_FLASH_ERROR_NONE)
walter76 0:5c5a3012dbfc 553 {PC.printf("Success!!\r\n");}
walter76 0:5c5a3012dbfc 554 else
walter76 0:5c5a3012dbfc 555 {PC.printf("Failed!!\r\n");}
walter76 0:5c5a3012dbfc 556
walter76 0:5c5a3012dbfc 557 for (uint32_t i = 0; i < 8; i++)
walter76 0:5c5a3012dbfc 558 {
walter76 0:5c5a3012dbfc 559 uint8_t storedValue = ReadEEPROM(i);
walter76 0:5c5a3012dbfc 560 PC.printf("Reading %d at %d\n", storedValue, i);
walter76 0:5c5a3012dbfc 561 }
walter76 0:5c5a3012dbfc 562
walter76 0:5c5a3012dbfc 563 // end of EEPROM test
walter76 0:5c5a3012dbfc 564 return;
walter76 0:5c5a3012dbfc 565
walter76 0:5c5a3012dbfc 566 }
walter76 0:5c5a3012dbfc 567
walter76 0:5c5a3012dbfc 568
walter76 0:5c5a3012dbfc 569 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 570 void Init_All(void)
walter76 0:5c5a3012dbfc 571 {
walter76 0:5c5a3012dbfc 572
walter76 0:5c5a3012dbfc 573 GPS_I2C.frequency(300000); // I2C GPS speed (400k max)
walter76 0:5c5a3012dbfc 574 //Button.mode(PullUp); // enable pushbutton pull-up
walter76 0:5c5a3012dbfc 575 BKL.period_ms(5); // set LCD backlight PWM
walter76 0:5c5a3012dbfc 576 BKL.write(1.0);
walter76 0:5c5a3012dbfc 577 BEEP.period_us(2000); // set initial buzzer period and duty-cycle
walter76 0:5c5a3012dbfc 578 BEEP.write(0);
walter76 0:5c5a3012dbfc 579 Wheel.reset(); // clear encoder
walter76 0:5c5a3012dbfc 580 LCD_reset();
walter76 0:5c5a3012dbfc 581 CNT1=CNT2=CNT3=0; // clear counters
walter76 0:5c5a3012dbfc 582 SDPW = 0; // Enable SC-card VDD
walter76 0:5c5a3012dbfc 583 // splash screen with date and time
walter76 0:5c5a3012dbfc 584 sprintf(Text,__DATE__);
walter76 0:5c5a3012dbfc 585 LCD_drawstring(buffer, 60, 5, Text);
walter76 0:5c5a3012dbfc 586 sprintf(Text,__TIME__);
walter76 0:5c5a3012dbfc 587 LCD_drawstring(buffer, 78, 6, Text);
walter76 0:5c5a3012dbfc 588 LCD_write_buffer(buffer);
walter76 0:5c5a3012dbfc 589
walter76 0:5c5a3012dbfc 590 // buzzer beep and blink LEDs
walter76 0:5c5a3012dbfc 591 BEEP.write(BUZZ_VOL);
walter76 0:5c5a3012dbfc 592 ALED = 1;
walter76 0:5c5a3012dbfc 593 wait(0.2);
walter76 0:5c5a3012dbfc 594 BEEP.period_us(1000);
walter76 0:5c5a3012dbfc 595 ALED = 0;
walter76 0:5c5a3012dbfc 596 PLED = 1;
walter76 0:5c5a3012dbfc 597 wait(0.2);
walter76 0:5c5a3012dbfc 598 BEEP.write(0);
walter76 0:5c5a3012dbfc 599 PLED = 0;
walter76 0:5c5a3012dbfc 600 // enable internal pull-ups for digital inputs
walter76 0:5c5a3012dbfc 601 TRIG1.mode(PullUp);
walter76 0:5c5a3012dbfc 602 TRIG2.mode(PullUp);
walter76 0:5c5a3012dbfc 603 TRIG3.mode(PullUp);
walter76 0:5c5a3012dbfc 604
walter76 0:5c5a3012dbfc 605 return;
walter76 0:5c5a3012dbfc 606
walter76 0:5c5a3012dbfc 607 }
walter76 0:5c5a3012dbfc 608
walter76 0:5c5a3012dbfc 609
walter76 0:5c5a3012dbfc 610
walter76 0:5c5a3012dbfc 611 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 612 int GPS_test()
walter76 0:5c5a3012dbfc 613 {
walter76 0:5c5a3012dbfc 614 //float time, hori_dilute, alt,geoid;
walter76 0:5c5a3012dbfc 615
walter76 0:5c5a3012dbfc 616 // $GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
walter76 0:5c5a3012dbfc 617 // $GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
walter76 0:5c5a3012dbfc 618
walter76 0:5c5a3012dbfc 619 int lock, n;
walter76 0:5c5a3012dbfc 620
walter76 0:5c5a3012dbfc 621 if(!GPS.readable())
walter76 0:5c5a3012dbfc 622 {
walter76 0:5c5a3012dbfc 623 return -1;
walter76 0:5c5a3012dbfc 624 }
walter76 0:5c5a3012dbfc 625
walter76 0:5c5a3012dbfc 626
walter76 0:5c5a3012dbfc 627 //PC.printf("Readable ");
walter76 0:5c5a3012dbfc 628
walter76 0:5c5a3012dbfc 629 GPS_stream[0] = '\0';
walter76 0:5c5a3012dbfc 630
walter76 0:5c5a3012dbfc 631 for (n = 0; n < 456; n++)
walter76 0:5c5a3012dbfc 632 {
walter76 0:5c5a3012dbfc 633 GPS_stream[n] = GPS.getc();
walter76 0:5c5a3012dbfc 634 if(GPS_stream[n] == '\r')
walter76 0:5c5a3012dbfc 635 {
walter76 0:5c5a3012dbfc 636 GPS_stream[n] = '\0';
walter76 0:5c5a3012dbfc 637 PC.printf("%s\n", GPS_stream);
walter76 0:5c5a3012dbfc 638 return;
walter76 0:5c5a3012dbfc 639 }
walter76 0:5c5a3012dbfc 640
walter76 0:5c5a3012dbfc 641 }
walter76 0:5c5a3012dbfc 642
walter76 0:5c5a3012dbfc 643
walter76 0:5c5a3012dbfc 644
walter76 0:5c5a3012dbfc 645
walter76 0:5c5a3012dbfc 646 while(GPS.readable())
walter76 0:5c5a3012dbfc 647 {
walter76 0:5c5a3012dbfc 648
walter76 0:5c5a3012dbfc 649 GPS_getline();
walter76 0:5c5a3012dbfc 650
walter76 0:5c5a3012dbfc 651 // Check if it is a GPGGA msg (matches both locked and non-locked msg)
walter76 0:5c5a3012dbfc 652 //wait(5);
walter76 0:5c5a3012dbfc 653
walter76 0:5c5a3012dbfc 654 PC.printf("GPS: %s\n", GPS_stream);
walter76 0:5c5a3012dbfc 655
walter76 0:5c5a3012dbfc 656 if(sscanf(GPS_stream, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f,%c", &GPS_time, &latitude, &ns, &longitude, &ew, &lock, &num_sat, &hori_dilute, &alt, &hu, &geoid, &gu/*, &age_diff, &diff_ID*/) >= 1)
walter76 0:5c5a3012dbfc 657 {
walter76 0:5c5a3012dbfc 658 if(!lock)
walter76 0:5c5a3012dbfc 659 {
walter76 0:5c5a3012dbfc 660 longitude = 0.0;
walter76 0:5c5a3012dbfc 661 latitude = 0.0;
walter76 0:5c5a3012dbfc 662 ns = 'Z';
walter76 0:5c5a3012dbfc 663 ew = 'Z';
walter76 0:5c5a3012dbfc 664 alt = 0.0;
walter76 0:5c5a3012dbfc 665 return 0;
walter76 0:5c5a3012dbfc 666 }
walter76 0:5c5a3012dbfc 667 else
walter76 0:5c5a3012dbfc 668 {
walter76 0:5c5a3012dbfc 669 //if(ns == 'S') { latitude *= -1.0; }
walter76 0:5c5a3012dbfc 670 // if(ew == 'W') { longitude *= -1.0; }
walter76 0:5c5a3012dbfc 671 // float degrees = trunc(latitude / 100.0f);
walter76 0:5c5a3012dbfc 672 // float minutes = latitude - (degrees * 100.0f);
walter76 0:5c5a3012dbfc 673 // latitude = degrees + minutes / 60.0f;
walter76 0:5c5a3012dbfc 674 // degrees = trunc(longitude / 100.0f * 0.01f);
walter76 0:5c5a3012dbfc 675 // minutes = longitude - (degrees * 100.0f);
walter76 0:5c5a3012dbfc 676 // longitude = degrees + minutes / 60.0f;
walter76 0:5c5a3012dbfc 677 // pc1.printf(msg);
walter76 0:5c5a3012dbfc 678 PC.printf("\n\rlongitude is %f\n\r", longitude);
walter76 0:5c5a3012dbfc 679 PC.printf("\n\rtime is %f\n\r", GPS_time);
walter76 0:5c5a3012dbfc 680 PC.printf("ns is %c\n\r", ns);
walter76 0:5c5a3012dbfc 681 PC.printf("ew is %c\n\r", ew);
walter76 0:5c5a3012dbfc 682 PC.printf("alt is %f\n\r", alt);
walter76 0:5c5a3012dbfc 683
walter76 0:5c5a3012dbfc 684 latitude /= 100;
walter76 0:5c5a3012dbfc 685 longitude /= 100;
walter76 0:5c5a3012dbfc 686
walter76 0:5c5a3012dbfc 687 return 1;
walter76 0:5c5a3012dbfc 688 }
walter76 0:5c5a3012dbfc 689
walter76 0:5c5a3012dbfc 690 }
walter76 0:5c5a3012dbfc 691
walter76 0:5c5a3012dbfc 692 return 0;
walter76 0:5c5a3012dbfc 693 }
walter76 0:5c5a3012dbfc 694
walter76 0:5c5a3012dbfc 695 return(-1);
walter76 0:5c5a3012dbfc 696
walter76 0:5c5a3012dbfc 697 }
walter76 0:5c5a3012dbfc 698
walter76 0:5c5a3012dbfc 699
walter76 0:5c5a3012dbfc 700 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 701 void GPS_getline()
walter76 0:5c5a3012dbfc 702 {
walter76 0:5c5a3012dbfc 703 int i;
walter76 0:5c5a3012dbfc 704 char a;
walter76 0:5c5a3012dbfc 705 int n;
walter76 0:5c5a3012dbfc 706
walter76 0:5c5a3012dbfc 707 //strcpy(GPS_stream, '\0');
walter76 0:5c5a3012dbfc 708 GPS_stream[0] = '\0';
walter76 0:5c5a3012dbfc 709
walter76 0:5c5a3012dbfc 710
walter76 0:5c5a3012dbfc 711 while(GPS.readable())
walter76 0:5c5a3012dbfc 712 {
walter76 0:5c5a3012dbfc 713
walter76 0:5c5a3012dbfc 714 i = 0;
walter76 0:5c5a3012dbfc 715 a = GPS.getc();
walter76 0:5c5a3012dbfc 716
walter76 0:5c5a3012dbfc 717 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 718
walter76 0:5c5a3012dbfc 719 if (a == '$')
walter76 0:5c5a3012dbfc 720 {
walter76 0:5c5a3012dbfc 721 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 722 a = GPS.getc();
walter76 0:5c5a3012dbfc 723 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 724 i++;
walter76 0:5c5a3012dbfc 725 if (a == 'G')
walter76 0:5c5a3012dbfc 726 {
walter76 0:5c5a3012dbfc 727 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 728 a = GPS.getc();
walter76 0:5c5a3012dbfc 729 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 730 i++;
walter76 0:5c5a3012dbfc 731 if (a == 'P')
walter76 0:5c5a3012dbfc 732 {
walter76 0:5c5a3012dbfc 733 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 734 a = GPS.getc();
walter76 0:5c5a3012dbfc 735 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 736 i++;
walter76 0:5c5a3012dbfc 737 if (a == 'G')
walter76 0:5c5a3012dbfc 738 {
walter76 0:5c5a3012dbfc 739 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 740 a = GPS.getc();
walter76 0:5c5a3012dbfc 741 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 742 i++;
walter76 0:5c5a3012dbfc 743 if (a == 'G')
walter76 0:5c5a3012dbfc 744 {
walter76 0:5c5a3012dbfc 745 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 746 a = GPS.getc();
walter76 0:5c5a3012dbfc 747 GPS_stream[i] = a;
walter76 0:5c5a3012dbfc 748 i++;
walter76 0:5c5a3012dbfc 749 if (a == 'A')
walter76 0:5c5a3012dbfc 750 {
walter76 0:5c5a3012dbfc 751 //PC.printf("%c",a);
walter76 0:5c5a3012dbfc 752 //a = GPS.getc();
walter76 0:5c5a3012dbfc 753 //msg[i] = a;
walter76 0:5c5a3012dbfc 754 //PC.printf(msg);
walter76 0:5c5a3012dbfc 755 //PC.printf("\r\n");
walter76 0:5c5a3012dbfc 756
walter76 0:5c5a3012dbfc 757 for (n = 5; n < 456; n++)
walter76 0:5c5a3012dbfc 758 {
walter76 0:5c5a3012dbfc 759 GPS_stream[n] = GPS.getc();
walter76 0:5c5a3012dbfc 760 //PC.printf("%c", GPS_stream[n]);
walter76 0:5c5a3012dbfc 761 if(GPS_stream[n] == '\r')
walter76 0:5c5a3012dbfc 762 {
walter76 0:5c5a3012dbfc 763 GPS_stream[n] = '0';
walter76 0:5c5a3012dbfc 764 return;
walter76 0:5c5a3012dbfc 765 }
walter76 0:5c5a3012dbfc 766 }
walter76 0:5c5a3012dbfc 767 }
walter76 0:5c5a3012dbfc 768 }
walter76 0:5c5a3012dbfc 769 }
walter76 0:5c5a3012dbfc 770 }
walter76 0:5c5a3012dbfc 771 }
walter76 0:5c5a3012dbfc 772 }
walter76 0:5c5a3012dbfc 773 // while(GPS.getc() != '$') {
walter76 0:5c5a3012dbfc 774 // //char a = GPS.getc();
walter76 0:5c5a3012dbfc 775 // for(i = 0; i < 256; i++) {
walter76 0:5c5a3012dbfc 776 // msg[i] = GPS.getc();
walter76 0:5c5a3012dbfc 777 // pc1.printf("%c", msg[i]);
walter76 0:5c5a3012dbfc 778 // if(msg[i] == '\r') {
walter76 0:5c5a3012dbfc 779 // msg[i] = 0;
walter76 0:5c5a3012dbfc 780 // return;
walter76 0:5c5a3012dbfc 781 // }
walter76 0:5c5a3012dbfc 782 // }
walter76 0:5c5a3012dbfc 783 //
walter76 0:5c5a3012dbfc 784 //
walter76 0:5c5a3012dbfc 785 // }
walter76 0:5c5a3012dbfc 786 // while(GPS.getc() != '$'); // wait for the start of a line
walter76 0:5c5a3012dbfc 787 // for(int i=0; i<256; i++) {
walter76 0:5c5a3012dbfc 788 // msg[i] = GPS.getc();
walter76 0:5c5a3012dbfc 789 // if(msg[i] == '\r') {
walter76 0:5c5a3012dbfc 790 // msg[i] = 0;
walter76 0:5c5a3012dbfc 791 // return;
walter76 0:5c5a3012dbfc 792 // }
walter76 0:5c5a3012dbfc 793 // }
walter76 0:5c5a3012dbfc 794 // error("Overflowed message limit");
walter76 0:5c5a3012dbfc 795 }
walter76 0:5c5a3012dbfc 796
walter76 0:5c5a3012dbfc 797 return;
walter76 0:5c5a3012dbfc 798 }
walter76 0:5c5a3012dbfc 799
walter76 0:5c5a3012dbfc 800
walter76 0:5c5a3012dbfc 801 //---------------------------------------------------------------------------
walter76 0:5c5a3012dbfc 802
walter76 0:5c5a3012dbfc 803 int GPS_get_stream(void)
walter76 0:5c5a3012dbfc 804 {
walter76 0:5c5a3012dbfc 805 char cmd[256];
walter76 0:5c5a3012dbfc 806 int i;
walter76 0:5c5a3012dbfc 807
walter76 0:5c5a3012dbfc 808 GPS_stream[0] = '\0'; // buffer cleanup
walter76 0:5c5a3012dbfc 809
walter76 0:5c5a3012dbfc 810 cmd[0] = 0xFF;
walter76 0:5c5a3012dbfc 811 GPS_I2C.write(0x42, cmd, 1);
walter76 0:5c5a3012dbfc 812 GPS_I2C.read(0x42, cmd, 100);
walter76 0:5c5a3012dbfc 813 //cmd[21] = '\0';
walter76 0:5c5a3012dbfc 814 i=0;
walter76 0:5c5a3012dbfc 815 while((i<100))
walter76 0:5c5a3012dbfc 816 {
walter76 0:5c5a3012dbfc 817 PC.printf("%c", cmd[i]);
walter76 0:5c5a3012dbfc 818 //if(cmd[i]=='\n')
walter76 0:5c5a3012dbfc 819 // i=100;
walter76 0:5c5a3012dbfc 820 //else
walter76 0:5c5a3012dbfc 821 i++;
walter76 0:5c5a3012dbfc 822 }
walter76 0:5c5a3012dbfc 823
walter76 0:5c5a3012dbfc 824
walter76 0:5c5a3012dbfc 825
walter76 0:5c5a3012dbfc 826 return 1;
walter76 0:5c5a3012dbfc 827 }
walter76 0:5c5a3012dbfc 828
walter76 0:5c5a3012dbfc 829 // ==========================================================================