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