Charles Young's development fork. Going forward I only want to push mature code to main repository.

Dependencies:   mbed

Fork of GEO_COUNTER_L432KC by Geo Electronics "Geo Counter"

Committer:
Charles David Young
Date:
Thu Sep 06 11:53:09 2018 -0700
Revision:
46:c7ce8fccb712
Parent:
45:b9e1b3d4a752
Child:
47:f004b4612069
debug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walter76 2:ac0ed3d84d44 1 // GEO COUNTER V1 firmware
walter76 2:ac0ed3d84d44 2 // This FW provides a basic operation of GEO-COUNTER
walter76 2:ac0ed3d84d44 3 //
walter76 2:ac0ed3d84d44 4 // Latest review: August 27, 2018 - Walter Trovo
walter76 1:75827d765e34 5 //
Charles David Young 25:0161bf1adc81 6 // Sep 5, 2018: Charles Young: Created LED7segDisplay class
charlesdavidyoung 24:db7494389c03 7 // Sep 5, 2018: Charles Young: Still developing mode selection. LEDs turn off
charlesdavidyoung 24:db7494389c03 8 // when not in mode selection. Pressing once enters mode selection.
charlesdavidyoung 24:db7494389c03 9 // Pressing again enters submode. Temporarily the rotary switch
charlesdavidyoung 24:db7494389c03 10 // adjusts the display brightness. This is just for testing.
charlesdavidyoung 24:db7494389c03 11 // Sep 4, 2018: Charles Young: Created RotarySwitch class to manage mode selection
walter76 1:75827d765e34 12 // Feb 14, 2018: initial release aimed to test the counters, the serial port
walter76 1:75827d765e34 13 // the PWM output and the MAX7219 operation.
walter76 1:75827d765e34 14 // Feb 15, 2018: Removed MAX7219 libray (replaced with custom routine).
walter76 1:75827d765e34 15 // Added 74HC595 routine. Added beep. Added Gate_write
walter76 1:75827d765e34 16 //
walter76 2:ac0ed3d84d44 17
walter76 1:75827d765e34 18
walter76 1:75827d765e34 19 // this block includes key libraries
walter76 1:75827d765e34 20 #include <string> // strings management
charlesdavidyoung 24:db7494389c03 21 #include "RotarySwitch.hpp"
Charles David Young 25:0161bf1adc81 22 #include "LED7segDisplay.hpp"
charlesdavidyoung 20:fb73eaaf0894 23
charlesdavidyoung 24:db7494389c03 24 // Everything associated with the rotary switch and the associated LEDs
charlesdavidyoung 24:db7494389c03 25 // is hidden in this class.
charlesdavidyoung 20:fb73eaaf0894 26 RotarySwitch ModeSwitch;
Charles David Young 25:0161bf1adc81 27 LED7segDisplay DigitsDisplay;
walter76 1:75827d765e34 28
Charles David Young 34:10550b327e3d 29 enum Modes {
Charles David Young 34:10550b327e3d 30 CNT1,
Charles David Young 34:10550b327e3d 31 CNT2,
Charles David Young 34:10550b327e3d 32 PROSPECT,
Charles David Young 34:10550b327e3d 33 NULL1,
Charles David Young 37:6f7bb913e08b 34 NULL2,
Charles David Young 38:1642320d83a0 35 VOLTS,
Charles David Young 38:1642320d83a0 36 VOLUME,
Charles David Young 34:10550b327e3d 37 DIM,
Charles David Young 34:10550b327e3d 38 NumberOfModes
Charles David Young 34:10550b327e3d 39 };
Charles David Young 38:1642320d83a0 40 uint8_t currentMode = CNT1;
Charles David Young 38:1642320d83a0 41 uint8_t currentModeToDisplay = CNT1;
Charles David Young 34:10550b327e3d 42
charlesdavidyoung 5:4f90b458dbdf 43 // LED on processor board
charlesdavidyoung 5:4f90b458dbdf 44 DigitalOut led1(LED1);
walter76 1:75827d765e34 45
walter76 1:75827d765e34 46 // definitions of peripherals and devices
Charles David Young 7:9f975e00600c 47
charlesdavidyoung 17:6eed17197004 48 I2C i2c(D4, D5); // I2C port
charlesdavidyoung 17:6eed17197004 49 Ticker SecTenth_Beat; // .1 second ticker
walter76 1:75827d765e34 50 Ticker Sec_Beat; // 1 second ticker
walter76 1:75827d765e34 51 Serial PC(USBTX, USBRX); // Virtual COM via USB (PC connection)
walter76 1:75827d765e34 52 Serial GPS(D1, D0); // Serial port for GPS module
walter76 0:6d1742703713 53
walter76 0:6d1742703713 54 // Global variables
walter76 1:75827d765e34 55 time_t seconds; // Real-Time Clock (RTC) timestamp
walter76 1:75827d765e34 56 unsigned int value = 0; // displayed value on the 6-digits of the display
Charles David Young 44:a26ca542ae5e 57
walter76 1:75827d765e34 58 uint32_t Count1, Count2; // pulse counters (32-bit)
Charles David Young 46:c7ce8fccb712 59 int32_t TickerCorrection = 0;
Charles David Young 44:a26ca542ae5e 60 const int16_t TickerCorrectionMax = 99;
Charles David Young 44:a26ca542ae5e 61 const int16_t TickerCorrectionMin = -99;
Charles David Young 44:a26ca542ae5e 62
walter76 1:75827d765e34 63 char Text[40]=""; // used to send messages over the serial port
walter76 1:75827d765e34 64 uint8_t Disp_mode = 0x01, Disp_unit = 0xA0; // status of 1st row and 2nd rows of LEDs
kd5byb 4:b17c6556cf1f 65 bool Stopped = 0; // status of counting activity
charlesdavidyoung 5:4f90b458dbdf 66 bool StartStopPressed = 0;// status of counting activity
walter76 1:75827d765e34 67 double ADC_val; // used to read ADC value
charlesdavidyoung 24:db7494389c03 68 float direction = 0;
walter76 0:6d1742703713 69
Charles David Young 38:1642320d83a0 70 #define maxVolume 10
Charles David Young 38:1642320d83a0 71 uint8_t volume = maxVolume;
Charles David Young 38:1642320d83a0 72
walter76 1:75827d765e34 73 // ----- Prototypes of routines (defined below the main) -------------------
Charles David Young 16:b2e77eb76ab4 74 void UpdateInput(void); // periodically called by the ticker
Charles David Young 16:b2e77eb76ab4 75 void UpdateOutput(void); // periodically called by the ticker
walter76 1:75827d765e34 76 void Count1_up(void); // called every time an edge is detected on TRIG1 pin
walter76 1:75827d765e34 77 void Count2_up(void); // called every time an edge is detected on TRIG2 pin
walter76 1:75827d765e34 78 void Beep(void); // used to generate a short beep (buzzer)
walter76 0:6d1742703713 79
walter76 0:6d1742703713 80 //==============================================================================
walter76 0:6d1742703713 81 //==============================================================================
walter76 0:6d1742703713 82
walter76 0:6d1742703713 83 int main()
walter76 0:6d1742703713 84 {
walter76 0:6d1742703713 85
Charles David Young 28:c81d00ec28a3 86 PC.baud(115200); // set baud-rate of virtual COM port (PC connection)
Charles David Young 28:c81d00ec28a3 87 PC.printf("\nGEO COUNTER V1 2108");
Charles David Young 28:c81d00ec28a3 88 PC.printf(__DATE__);
Charles David Young 28:c81d00ec28a3 89 PC.printf(" ");
Charles David Young 28:c81d00ec28a3 90 PC.printf(__TIME__);
walter76 1:75827d765e34 91
Charles David Young 28:c81d00ec28a3 92 GPS.baud(9600); // set the baud-rate of the serial port dedicated to the GPS
walter76 0:6d1742703713 93
Charles David Young 28:c81d00ec28a3 94 CS1 = 1; // presets CS of MAX7219
Charles David Young 28:c81d00ec28a3 95 CS2 = 1; // preset CS of 74HC595
walter76 1:75827d765e34 96
Charles David Young 28:c81d00ec28a3 97 DigitsDisplay.Display_6D_write(0x543210);
Charles David Young 28:c81d00ec28a3 98 DigitsDisplay.Display_2D_write(0);
walter76 0:6d1742703713 99
Charles David Young 28:c81d00ec28a3 100 // RTC is supposed to be loose time at power down (no backup battery)
Charles David Young 28:c81d00ec28a3 101 // An initialization is performed anyway
Charles David Young 28:c81d00ec28a3 102 set_time(0); // Set time
charlesdavidyoung 24:db7494389c03 103
Charles David Young 28:c81d00ec28a3 104 PWM.period_ms(3); // set the PWM period
Charles David Young 28:c81d00ec28a3 105 PWM.write(0.8); // set the PWM duty-cycle
walter76 1:75827d765e34 106
Charles David Young 28:c81d00ec28a3 107 Beep(); // initial beep
walter76 1:75827d765e34 108
Charles David Young 28:c81d00ec28a3 109 // set the 1 sec ticker to periodically call the Update() routine
Charles David Young 28:c81d00ec28a3 110 // NOTE: this is also the 1-sec time base for counters. A better approach
Charles David Young 28:c81d00ec28a3 111 // would replace the ticker with an interrupt from the RTC (to be implemented)
Charles David Young 28:c81d00ec28a3 112 SecTenth_Beat.attach_us(&UpdateInput, 100000);
Charles David Young 28:c81d00ec28a3 113 Sec_Beat.attach_us(&UpdateOutput, 1000000);
Charles David Young 28:c81d00ec28a3 114 //RTC::attach(&Update, RTC::Second);
Charles David Young 28:c81d00ec28a3 115 //RTC::detach(RTC::Second);
walter76 1:75827d765e34 116
Charles David Young 28:c81d00ec28a3 117 // main loop does nothing as all activities are interrupt driven
Charles David Young 28:c81d00ec28a3 118 while(1)
Charles David Young 28:c81d00ec28a3 119 {
Charles David Young 28:c81d00ec28a3 120 // dance (or drink a beer)
Charles David Young 28:c81d00ec28a3 121 }
walter76 0:6d1742703713 122 }
walter76 0:6d1742703713 123
walter76 0:6d1742703713 124
walter76 1:75827d765e34 125 //-------- END OF MAIN --------------
walter76 0:6d1742703713 126 //==============================================================================
walter76 0:6d1742703713 127
walter76 1:75827d765e34 128 // Definition of routines
walter76 1:75827d765e34 129
walter76 1:75827d765e34 130 //---------------------------------------------------------------------------
walter76 1:75827d765e34 131 // Update values to be displayed
Charles David Young 10:f48cc6be5ae8 132 void logToPC()
Charles David Young 10:f48cc6be5ae8 133 {
Charles David Young 10:f48cc6be5ae8 134 PC.printf("\nADC: %.02f", ADC_val);
Charles David Young 10:f48cc6be5ae8 135 PC.printf(Stopped ? " stopped" : " started");
Charles David Young 10:f48cc6be5ae8 136 // Timestamp to PC (debug)
Charles David Young 10:f48cc6be5ae8 137 seconds = time(NULL); // get current time
Charles David Young 10:f48cc6be5ae8 138 strftime(Text, 50, "%H:%M:%S", localtime(&seconds));
Charles David Young 10:f48cc6be5ae8 139 PC.printf(" RTC: %s, CNT1: %7d CNT2: %7d",Text, Count1, Count2);
charlesdavidyoung 24:db7494389c03 140 PC.printf(" wheel %f", direction);
Charles David Young 10:f48cc6be5ae8 141 }
walter76 1:75827d765e34 142
Charles David Young 16:b2e77eb76ab4 143 void UpdateOutput()
charlesdavidyoung 18:ef5678ab1889 144 {
Charles David Young 28:c81d00ec28a3 145 // This must be called periodically to update the LEDs
Charles David Young 28:c81d00ec28a3 146 ModeSwitch.UpdateOutput();
charlesdavidyoung 24:db7494389c03 147
Charles David Young 38:1642320d83a0 148 switch (currentModeToDisplay) {
Charles David Young 34:10550b327e3d 149 case CNT1:
Charles David Young 34:10550b327e3d 150 DigitsDisplay.Display_6D_write(Count1);
Charles David Young 41:08bf3ea5eba4 151 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 152 break;
Charles David Young 34:10550b327e3d 153 case CNT2:
Charles David Young 34:10550b327e3d 154 DigitsDisplay.Display_6D_write(Count2);
Charles David Young 41:08bf3ea5eba4 155 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 156 break;
Charles David Young 34:10550b327e3d 157 case PROSPECT:
Charles David Young 44:a26ca542ae5e 158 if (Count1)
Charles David Young 44:a26ca542ae5e 159 DigitsDisplay.Display_6D_write(Count1);
Charles David Young 44:a26ca542ae5e 160 else
Charles David Young 44:a26ca542ae5e 161 DigitsDisplay.Display_6D_write(Count2);
Charles David Young 41:08bf3ea5eba4 162 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 163 break;
Charles David Young 34:10550b327e3d 164 case NULL1:
Charles David Young 34:10550b327e3d 165 DigitsDisplay.Display_6D_write(0);
Charles David Young 41:08bf3ea5eba4 166 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 167 break;
Charles David Young 37:6f7bb913e08b 168 case NULL2:
Charles David Young 34:10550b327e3d 169 DigitsDisplay.Display_6D_write(0);
Charles David Young 41:08bf3ea5eba4 170 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 171 break;
Charles David Young 38:1642320d83a0 172 case VOLTS:
Charles David Young 34:10550b327e3d 173 DigitsDisplay.Display_6D_write(0);
Charles David Young 41:08bf3ea5eba4 174 DigitsDisplay.Display_2D_Blank();
Charles David Young 34:10550b327e3d 175 break;
Charles David Young 38:1642320d83a0 176 case VOLUME:
Charles David Young 34:10550b327e3d 177 case DIM:
Charles David Young 34:10550b327e3d 178 default:
Charles David Young 34:10550b327e3d 179 break;
Charles David Young 34:10550b327e3d 180 }
Charles David Young 34:10550b327e3d 181
Charles David Young 16:b2e77eb76ab4 182 if(Stopped)
Charles David Young 16:b2e77eb76ab4 183 {
Charles David Young 16:b2e77eb76ab4 184 // disable interrupts on TRIG1 and TRIG2
Charles David Young 16:b2e77eb76ab4 185 TRIG1.rise(NULL);
Charles David Young 16:b2e77eb76ab4 186 TRIG2.rise(NULL);
Charles David Young 16:b2e77eb76ab4 187 }
Charles David Young 16:b2e77eb76ab4 188 else
Charles David Young 16:b2e77eb76ab4 189 {
Charles David Young 34:10550b327e3d 190 // Enable interrupts on rising edge of digital inputs TRIG1 & TRIG2
Charles David Young 34:10550b327e3d 191 TRIG1.rise(&Count1_up);
Charles David Young 34:10550b327e3d 192 TRIG2.rise(&Count2_up);
Charles David Young 7:9f975e00600c 193
Charles David Young 28:c81d00ec28a3 194 Count1 = 0; // clear both counters
Charles David Young 28:c81d00ec28a3 195 Count2 = 0;
Charles David Young 16:b2e77eb76ab4 196 }
Charles David Young 16:b2e77eb76ab4 197 }
Charles David Young 16:b2e77eb76ab4 198
Charles David Young 16:b2e77eb76ab4 199 void UpdateInput()
charlesdavidyoung 24:db7494389c03 200 {
charlesdavidyoung 24:db7494389c03 201 // This must be called periodically to monitor switch input
Charles David Young 38:1642320d83a0 202 direction = ModeSwitch.UpdateInput();
Charles David Young 34:10550b327e3d 203 currentMode = ModeSwitch.GetPosition();
Charles David Young 34:10550b327e3d 204
Charles David Young 34:10550b327e3d 205 switch (currentMode) {
Charles David Young 34:10550b327e3d 206 case CNT1:
Charles David Young 34:10550b327e3d 207 case CNT2:
Charles David Young 44:a26ca542ae5e 208 currentModeToDisplay = currentMode;
Charles David Young 44:a26ca542ae5e 209
Charles David Young 44:a26ca542ae5e 210 if ( (direction > 0)
Charles David Young 44:a26ca542ae5e 211 && (TickerCorrection < TickerCorrectionMax))
Charles David Young 44:a26ca542ae5e 212 {
Charles David Young 44:a26ca542ae5e 213 TickerCorrection++;
Charles David Young 46:c7ce8fccb712 214 Sec_Beat.attach_us(&UpdateOutput, 1000000 + 1000*TickerCorrection);
Charles David Young 44:a26ca542ae5e 215 }
Charles David Young 44:a26ca542ae5e 216 else
Charles David Young 44:a26ca542ae5e 217 if ( (direction < 0)
Charles David Young 44:a26ca542ae5e 218 && (TickerCorrection > TickerCorrectionMin))
Charles David Young 44:a26ca542ae5e 219 {
Charles David Young 44:a26ca542ae5e 220 TickerCorrection--;
Charles David Young 46:c7ce8fccb712 221 Sec_Beat.attach_us(&UpdateOutput, 1000000 + 1000*TickerCorrection);
Charles David Young 44:a26ca542ae5e 222 }
Charles David Young 45:b9e1b3d4a752 223 DigitsDisplay.Display_2D_write(TickerCorrection);
Charles David Young 44:a26ca542ae5e 224 break;
Charles David Young 34:10550b327e3d 225 case PROSPECT:
Charles David Young 34:10550b327e3d 226 case VOLTS:
Charles David Young 38:1642320d83a0 227 currentModeToDisplay = currentMode;
Charles David Young 34:10550b327e3d 228 break;
Charles David Young 34:10550b327e3d 229 case NULL1:
Charles David Young 37:6f7bb913e08b 230 case NULL2:
Charles David Young 34:10550b327e3d 231 break;
Charles David Young 38:1642320d83a0 232 case VOLUME:
Charles David Young 39:dee91966b45c 233 if ( (direction > 0)
Charles David Young 39:dee91966b45c 234 && (volume < maxVolume))
Charles David Young 39:dee91966b45c 235 volume++;
Charles David Young 39:dee91966b45c 236 else
Charles David Young 39:dee91966b45c 237 if ( (direction < 0)
Charles David Young 39:dee91966b45c 238 && (volume > 0))
Charles David Young 39:dee91966b45c 239 volume--;
Charles David Young 39:dee91966b45c 240
Charles David Young 38:1642320d83a0 241 DigitsDisplay.Display_2D_write(volume);
Charles David Young 34:10550b327e3d 242 break;
Charles David Young 34:10550b327e3d 243 case DIM:
Charles David Young 39:dee91966b45c 244 if (direction > 0)
Charles David Young 39:dee91966b45c 245 DigitsDisplay.Display_brightness_up();
Charles David Young 39:dee91966b45c 246 else
Charles David Young 39:dee91966b45c 247 if (direction < 0)
Charles David Young 39:dee91966b45c 248 DigitsDisplay.Display_brightness_down();
Charles David Young 39:dee91966b45c 249
Charles David Young 38:1642320d83a0 250 DigitsDisplay.Display_2D_write(DigitsDisplay.GetBrightness());
Charles David Young 34:10550b327e3d 251 break;
Charles David Young 34:10550b327e3d 252 default:
Charles David Young 34:10550b327e3d 253 break;
charlesdavidyoung 24:db7494389c03 254 }
Charles David Young 34:10550b327e3d 255
Charles David Young 16:b2e77eb76ab4 256 ADC_val = KEYB.read(); // read voltage from keyboard
Charles David Young 16:b2e77eb76ab4 257 if ( (ADC_val<0.1) // START/STOP pushbutton pressed
Charles David Young 16:b2e77eb76ab4 258 && (!StartStopPressed))
Charles David Young 16:b2e77eb76ab4 259 {
Charles David Young 16:b2e77eb76ab4 260 StartStopPressed = true;
Charles David Young 16:b2e77eb76ab4 261 Stopped=!Stopped; // toggle status
Charles David Young 16:b2e77eb76ab4 262 }
Charles David Young 16:b2e77eb76ab4 263 else
Charles David Young 16:b2e77eb76ab4 264 StartStopPressed = false;
charlesdavidyoung 5:4f90b458dbdf 265
Charles David Young 16:b2e77eb76ab4 266 if((ADC_val>0.6)&&(ADC_val<0.7)) // CLEAR pushbutton pressed
Charles David Young 16:b2e77eb76ab4 267 {
Charles David Young 16:b2e77eb76ab4 268 Count1 = 0; // clear counters
Charles David Young 16:b2e77eb76ab4 269 Count2 = 0;
charlesdavidyoung 5:4f90b458dbdf 270 }
Charles David Young 16:b2e77eb76ab4 271 logToPC();
Charles David Young 16:b2e77eb76ab4 272 return;
Charles David Young 16:b2e77eb76ab4 273 }
walter76 1:75827d765e34 274
walter76 0:6d1742703713 275 //---------------------------------------------------------------------------
walter76 1:75827d765e34 276 // Increment CNT1 every time a rising edge is detected on TRIG1 (interrupt)
walter76 1:75827d765e34 277
walter76 1:75827d765e34 278 void Count1_up(void)
walter76 1:75827d765e34 279 {
Charles David Young 33:35e3ab4d5ba7 280 //Beep();
Charles David Young 28:c81d00ec28a3 281 Count1++;
Charles David Young 28:c81d00ec28a3 282 return;
walter76 1:75827d765e34 283 }
walter76 1:75827d765e34 284
walter76 1:75827d765e34 285 //---------------------------------------------------------------------------
walter76 1:75827d765e34 286 // Increment CNT1 every time a rising edge is detected on TRIG2 (interrupt)
walter76 1:75827d765e34 287
walter76 1:75827d765e34 288 void Count2_up(void)
walter76 1:75827d765e34 289 {
Charles David Young 33:35e3ab4d5ba7 290 //Beep();
Charles David Young 28:c81d00ec28a3 291 Count2++;
Charles David Young 28:c81d00ec28a3 292 return;
walter76 1:75827d765e34 293 }
walter76 1:75827d765e34 294
walter76 1:75827d765e34 295
walter76 1:75827d765e34 296 //---------------------------------------------------------------------------
walter76 1:75827d765e34 297 //Generates a short beep via BUZZ
walter76 1:75827d765e34 298
walter76 1:75827d765e34 299 void Beep(void)
walter76 1:75827d765e34 300 {
Charles David Young 28:c81d00ec28a3 301 BUZZ = 1; // turn-on the buzzer
Charles David Young 33:35e3ab4d5ba7 302 wait_us(100); // wait
Charles David Young 28:c81d00ec28a3 303 BUZZ = 0; // turn-off the buzzer
Charles David Young 28:c81d00ec28a3 304 return;
walter76 0:6d1742703713 305 }
walter76 0:6d1742703713 306
walter76 1:75827d765e34 307 //-------- END OF FILE --------------
walter76 1:75827d765e34 308 //==============================================================================