
Use this version as starting point. Tested on Show2Me_V1 PCB (minor patches required).
Dependencies: GPS Library QEI SDFileSystem mbed
main.cpp@0:5c5a3012dbfc, 2018-09-03 (annotated)
- Committer:
- walter76
- Date:
- Mon Sep 03 01:54:41 2018 +0000
- Revision:
- 0:5c5a3012dbfc
working code, initial version
Who changed what in which revision?
User | Revision | Line number | New 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 | // ========================================================================== |