- ANALOG METER, initial offering - Emulation of an analog/mechanical meter using the SPI TFT display \"http://mbed.org/cookbook/SPI-driven-QVGA-TFT\" (touch not used) Meter takes an integer number from 0 - 100 and uses that number to position the meter\'s needle - An additional auto-scaling feature allows for + floating numbers from 0.0 - 10000.0 in \"NewfNumb\" Scaling is noted two ways a. Color of the meter body changes b. A text scale factor is displayed in the upper, right-hand corner, near the full scale reading Value of \"NewfNumb\" Meter_Body Scale_Factor < -0.0 Blue 0 0.1 - 9.9 Green x1 10.0 - 99.0 Yellow x10 100.0 - 999.0 Orange x100 1000.0 - 9990.0 Red x1k >= 10000.0 Red peg! - If NewfNumb is > 600.0, a flashing yellow warning message appears in the center of the meter movement - The date and time are displayed in the lower right corner of the display - The value of NewfNumb being shown in the movement is also displayed in the lower left coener of the display - A timer ISR automatically updates the meter\'s movement Other Stuff: - Additional demo test program, walks analog meter up and down through all auto scales by manipulating the value of NewfNumb - USB serial port used to dump a few messages. Not needed, set to 921600 BAUD - LED1 slowly gets brighter and dimmer as main loop runs - If for some reason, the \"MeterNumber\" int register ends up >100 or <0, a Purple display appears at 50% movement with a \"bad#\" scale factor - There is NO provision for setting the RTC. Note that TimeZone and DST are added to the RTC number

Dependencies:   mbed

Committer:
loopsva
Date:
Tue Jan 31 19:40:57 2012 +0000
Revision:
0:fc70640071d2
100

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:fc70640071d2 1 /*
loopsva 0:fc70640071d2 2 Rev Date Changes:
loopsva 0:fc70640071d2 3 ------------------------------------------------------------------------------------------------------------------------------------------
loopsva 0:fc70640071d2 4 100 1/30/12 - ANALOG METER, initial offering
loopsva 0:fc70640071d2 5 - Emulation of an analog/mechanical meter using the SPI TFT display "http://mbed.org/cookbook/SPI-driven-QVGA-TFT" (touch not used)
loopsva 0:fc70640071d2 6 Meter takes an integer number from 0 - 100 and uses that number to position the meter's needle
loopsva 0:fc70640071d2 7 - An additional auto-scaling feature allows for + floating numbers from 0.0 - 10000.0 in "NewfNumb"
loopsva 0:fc70640071d2 8 Scaling is noted two ways
loopsva 0:fc70640071d2 9 a. Color of the meter body changes
loopsva 0:fc70640071d2 10 b. A text scale factor is displayed in the upper, right-hand corner, near the full scale reading
loopsva 0:fc70640071d2 11 Value of "NewfNumb" Meter_Body Scale_Factor
loopsva 0:fc70640071d2 12 < -0.0 Blue 0
loopsva 0:fc70640071d2 13 0.1 - 9.9 Green x1
loopsva 0:fc70640071d2 14 10.0 - 99.0 Yellow x10
loopsva 0:fc70640071d2 15 100.0 - 999.0 Orange x100
loopsva 0:fc70640071d2 16 1000.0 - 9990.0 Red x1k
loopsva 0:fc70640071d2 17 >= 10000.0 Red peg!
loopsva 0:fc70640071d2 18 - If NewfNumb is > 600.0, a flashing yellow warning message appears in the center of the meter movement
loopsva 0:fc70640071d2 19 - The date and time are displayed in the lower right corner of the display
loopsva 0:fc70640071d2 20 - The value of NewfNumb being shown in the movement is also displayed in the lower left coener of the display
loopsva 0:fc70640071d2 21 - A timer ISR automatically updates the meter's movement
loopsva 0:fc70640071d2 22 Other Stuff:
loopsva 0:fc70640071d2 23 - Additional demo test program, walks analog meter up and down through all auto scales by manipulating the value of NewfNumb
loopsva 0:fc70640071d2 24 - USB serial port used to dump a few messages. Not needed, set to 921600 BAUD
loopsva 0:fc70640071d2 25 - LED1 slowly gets brighter and dimmer as main loop runs
loopsva 0:fc70640071d2 26 - If for some reason, the "MeterNumber" int register ends up >100 or <0,
loopsva 0:fc70640071d2 27 a Purple display appears at 50% movement with a "bad#" scale factor
loopsva 0:fc70640071d2 28 ------------------------------------------------------------------------------------------------------------------------------------------
loopsva 0:fc70640071d2 29 */
loopsva 0:fc70640071d2 30 int revision = 100; // revision of this code
loopsva 0:fc70640071d2 31 #include "mbed.h"
loopsva 0:fc70640071d2 32 #include "SPI_TFT.h"
loopsva 0:fc70640071d2 33 #include "Arial12x12.h"
loopsva 0:fc70640071d2 34 #include "BookAntiqua19x19-14.h" // kb modified font created by GLCD_Font_Creator.1.20.exe
loopsva 0:fc70640071d2 35 #include "touch_tft.h"
loopsva 0:fc70640071d2 36
loopsva 0:fc70640071d2 37 #define Orange 0xFBE0 // I like this orange better than SPI_TFT.h
loopsva 0:fc70640071d2 38
loopsva 0:fc70640071d2 39 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 40 //I/O Pin Definitions
loopsva 0:fc70640071d2 41
loopsva 0:fc70640071d2 42 PwmOut led1(LED1, "led1"); // pwm LED1
loopsva 0:fc70640071d2 43 DigitalOut led2(LED2, "led2"); // simple on/off for LED2 - 4
loopsva 0:fc70640071d2 44 DigitalOut led3(LED3, "led3");
loopsva 0:fc70640071d2 45 DigitalOut led4(LED4, "led4");
loopsva 0:fc70640071d2 46 Serial pc(USBTX, USBRX); // Serial USB communications over mbed USB port
loopsva 0:fc70640071d2 47 touch_tft tt(p19, p15, p16, p17, p5, p6, p7, p9, p14,"TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs, reset
loopsva 0:fc70640071d2 48
loopsva 0:fc70640071d2 49 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 50 // Global Variables
loopsva 0:fc70640071d2 51
loopsva 0:fc70640071d2 52 int gDebug = 1; // display debog level (0 - 3)
loopsva 0:fc70640071d2 53 float Led1Pwm = 0.01; // LED1 brightness
loopsva 0:fc70640071d2 54 bool Led1Up = true; // LED1 auto up-down
loopsva 0:fc70640071d2 55 float gWait = 0.005; // Main loop wait timeout
loopsva 0:fc70640071d2 56 float const DISP_SLOW(2.0); // Long wait for LCD display
loopsva 0:fc70640071d2 57 float const DISP_FAST(0.5); // Faster wait for LCD
loopsva 0:fc70640071d2 58 char timebuf[16]; // local time format buffer hh:mm:ss
loopsva 0:fc70640071d2 59 char datebuf[16]; // local date format buffer mm/dd/yy
loopsva 0:fc70640071d2 60 int DST = 0; // Daylight Saving Time (or as defined in tft.ini)
loopsva 0:fc70640071d2 61 int TZone = -8; // Time Zone from UTC (or as defined in tft.ini)
loopsva 0:fc70640071d2 62 time_t ctTime; // get time structure
loopsva 0:fc70640071d2 63
loopsva 0:fc70640071d2 64
loopsva 0:fc70640071d2 65 // For analog meter
loopsva 0:fc70640071d2 66 int LineEndX = 0; // end of new line
loopsva 0:fc70640071d2 67 int LineEndY = 0; // end of new line
loopsva 0:fc70640071d2 68 bool onceBlack = true; // overwrite to black out text
loopsva 0:fc70640071d2 69 int MeterText = 3; // index pointer into MeterTextArray[]
loopsva 0:fc70640071d2 70 int MeterTextOld = 5;
loopsva 0:fc70640071d2 71 int MeterColor = Yellow; // Meter frame color
loopsva 0:fc70640071d2 72 int OldMeterText = MeterText; // Previous meter frame color
loopsva 0:fc70640071d2 73 int MeterTic = Green; // Meter tic color
loopsva 0:fc70640071d2 74 int MoveColor = White; // Meter armature color
loopsva 0:fc70640071d2 75 int MeterNumber = 0; // Meter scale (0 - 100)
loopsva 0:fc70640071d2 76 bool UpdateMove = true; // semifore between calling pgm and interrupt
loopsva 0:fc70640071d2 77 float NewfNumb = -1.0; // + floating number from 0.0 to 10000.0
loopsva 0:fc70640071d2 78
loopsva 0:fc70640071d2 79 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 80 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 81 // Analog meter scale text display
loopsva 0:fc70640071d2 82 const unsigned char MeterTextArray[] = {
loopsva 0:fc70640071d2 83 0x20, 0x20, 0x20, 0x30, // 0
loopsva 0:fc70640071d2 84 0x20, 0x20, 0x78, 0x31, // x1
loopsva 0:fc70640071d2 85 0x20, 0x78, 0x31, 0x30, // x10
loopsva 0:fc70640071d2 86 0x78, 0x31, 0x30, 0x30, // x100
loopsva 0:fc70640071d2 87 0x20, 0x78, 0x31, 0x4b, // x1K
loopsva 0:fc70640071d2 88 0x70, 0x65, 0x67, 0x21, // peg!
loopsva 0:fc70640071d2 89 0x62, 0x61, 0x64, 0x23 }; // bad#
loopsva 0:fc70640071d2 90
loopsva 0:fc70640071d2 91 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 92 // Analog meter text display
loopsva 0:fc70640071d2 93 void DispMeterText() {
loopsva 0:fc70640071d2 94 for(int i = MeterText * 4; i < MeterText * 4 + 4; i++) {
loopsva 0:fc70640071d2 95 tt.printf("%c", MeterTextArray[i]);
loopsva 0:fc70640071d2 96 if(gDebug > 2) pc.printf("%c", MeterTextArray[i]);
loopsva 0:fc70640071d2 97 }
loopsva 0:fc70640071d2 98 }
loopsva 0:fc70640071d2 99
loopsva 0:fc70640071d2 100 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 101 // Analog metet text display black-out
loopsva 0:fc70640071d2 102 void EraseMeterText() {
loopsva 0:fc70640071d2 103 for(int i = MeterTextOld * 4; i < MeterTextOld * 4 + 4; i++) {
loopsva 0:fc70640071d2 104 tt.printf("%c", MeterTextArray[i]);
loopsva 0:fc70640071d2 105 if(gDebug > 2) pc.printf("%c", MeterTextArray[i]);
loopsva 0:fc70640071d2 106 }
loopsva 0:fc70640071d2 107 }
loopsva 0:fc70640071d2 108
loopsva 0:fc70640071d2 109 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 110 //position the meter's movement
loopsva 0:fc70640071d2 111 void MeterMovement() {
loopsva 0:fc70640071d2 112 LineEndX = 240 * MeterNumber / 100 + 40; // ((280 - 40) * MeterNumber / 100) + 40;
loopsva 0:fc70640071d2 113 if(MeterNumber < 50) {
loopsva 0:fc70640071d2 114 LineEndY = 56 * MeterNumber / 100 + 177; // (((205 - 177) * 2) * MeterNumber / 100) + 177;
loopsva 0:fc70640071d2 115 } else {
loopsva 0:fc70640071d2 116 LineEndY = 56 * (100 - MeterNumber) / 100 + 177; // (((205 - 177) * 2) * (100 - MeterNumber) / 100) + 177;
loopsva 0:fc70640071d2 117 }
loopsva 0:fc70640071d2 118 }
loopsva 0:fc70640071d2 119
loopsva 0:fc70640071d2 120 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 121 //set up analog meter's inner guts
loopsva 0:fc70640071d2 122 void DispMeterTics() {
loopsva 0:fc70640071d2 123 tt.rect(20,130,50,190,MeterColor);
loopsva 0:fc70640071d2 124 tt.circle(35,160,10,MeterColor);
loopsva 0:fc70640071d2 125
loopsva 0:fc70640071d2 126 //inner box and cenerting circle are done, now paint the 11 tics in desired color
loopsva 0:fc70640071d2 127 tt.line(200,160,210,160,MeterTic); //50%
loopsva 0:fc70640071d2 128 tt.line(197,136,207,135,MeterTic); //40%
loopsva 0:fc70640071d2 129 tt.line(193,112,203,110,MeterTic);
loopsva 0:fc70640071d2 130 tt.line(188,88,198,84,MeterTic);
loopsva 0:fc70640071d2 131 tt.line(181,65,191,59,MeterTic);
loopsva 0:fc70640071d2 132 tt.line(172,45,182,36,MeterTic); // 0%
loopsva 0:fc70640071d2 133 tt.line(197,184,207,185,MeterTic); // 60%
loopsva 0:fc70640071d2 134 tt.line(193,208,203,210,MeterTic);
loopsva 0:fc70640071d2 135 tt.line(188,232,198,236,MeterTic);
loopsva 0:fc70640071d2 136 tt.line(181,255,191,261,MeterTic); // 90%
loopsva 0:fc70640071d2 137 tt.line(172,275,182,284,MeterTic); // 100%
loopsva 0:fc70640071d2 138 }
loopsva 0:fc70640071d2 139
loopsva 0:fc70640071d2 140 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 141 //set up analog meter's frame
loopsva 0:fc70640071d2 142 void DispMeterFrame() {
loopsva 0:fc70640071d2 143 //first erase and display the meter's scale number in upper-right corner
loopsva 0:fc70640071d2 144 tt.set_font((unsigned char*) Arial12x12);
loopsva 0:fc70640071d2 145 tt.foreground (Black);
loopsva 0:fc70640071d2 146 tt.set_orientation(1);
loopsva 0:fc70640071d2 147 tt.locate(260,30);
loopsva 0:fc70640071d2 148 EraseMeterText();
loopsva 0:fc70640071d2 149 tt.foreground (MeterColor);
loopsva 0:fc70640071d2 150 tt.locate(260,30);
loopsva 0:fc70640071d2 151 DispMeterText();
loopsva 0:fc70640071d2 152 MeterTextOld = MeterText;
loopsva 0:fc70640071d2 153
loopsva 0:fc70640071d2 154 //now paint the outer frame in the desired color
loopsva 0:fc70640071d2 155 tt.set_orientation(0);
loopsva 0:fc70640071d2 156 tt.rect(18,18,222,302,MeterColor);
loopsva 0:fc70640071d2 157 tt.rect(19,19,221,301,MeterColor);
loopsva 0:fc70640071d2 158 tt.rect(20,20,220,300,MeterColor);
loopsva 0:fc70640071d2 159 DispMeterTics();
loopsva 0:fc70640071d2 160 }
loopsva 0:fc70640071d2 161
loopsva 0:fc70640071d2 162 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 163 //Test program for the analog meter
loopsva 0:fc70640071d2 164 void DispMeterShell() {
loopsva 0:fc70640071d2 165 tt.cls();
loopsva 0:fc70640071d2 166 DispMeterFrame();
loopsva 0:fc70640071d2 167 MeterNumber = 0;
loopsva 0:fc70640071d2 168 for(int i = 0; i < 21; i++) {
loopsva 0:fc70640071d2 169 MeterMovement();
loopsva 0:fc70640071d2 170 DispMeterTics();
loopsva 0:fc70640071d2 171 tt.line(35,160,LineEndY,LineEndX,MoveColor);
loopsva 0:fc70640071d2 172 wait(DISP_FAST);
loopsva 0:fc70640071d2 173 tt.line(35,160,LineEndY,LineEndX,Black); //erase previous line
loopsva 0:fc70640071d2 174 MeterNumber = MeterNumber + 5;
loopsva 0:fc70640071d2 175 }
loopsva 0:fc70640071d2 176 MeterNumber = 0;
loopsva 0:fc70640071d2 177 MeterMovement();
loopsva 0:fc70640071d2 178 DispMeterTics();
loopsva 0:fc70640071d2 179 tt.line(35,160,LineEndY,LineEndX,MoveColor);
loopsva 0:fc70640071d2 180 wait(DISP_SLOW);
loopsva 0:fc70640071d2 181 }
loopsva 0:fc70640071d2 182
loopsva 0:fc70640071d2 183 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 184 // timer interrupt. Changes the position of the meter movement
loopsva 0:fc70640071d2 185 int oln = 0 ;
loopsva 0:fc70640071d2 186 int tmp = 0 ;
loopsva 0:fc70640071d2 187 int UpdateTics = 0;
loopsva 0:fc70640071d2 188
loopsva 0:fc70640071d2 189 void myIRQ() {
loopsva 0:fc70640071d2 190 LPC_TIM0->IR |= 1 << 0;
loopsva 0:fc70640071d2 191 if(UpdateMove == true) {
loopsva 0:fc70640071d2 192 UpdateMove = false;
loopsva 0:fc70640071d2 193 tt.set_orientation(0);
loopsva 0:fc70640071d2 194 tmp = MeterNumber;
loopsva 0:fc70640071d2 195 MeterNumber = oln;
loopsva 0:fc70640071d2 196 tt.line(35,160,LineEndY,LineEndX,Black); //erase previous line
loopsva 0:fc70640071d2 197 MeterNumber = tmp;
loopsva 0:fc70640071d2 198 MeterMovement(); //calculate new position
loopsva 0:fc70640071d2 199 tt.line(35,160,LineEndY,LineEndX,MoveColor);
loopsva 0:fc70640071d2 200 UpdateTics++;
loopsva 0:fc70640071d2 201 if(UpdateTics >= 3) { //only update tics every few int's
loopsva 0:fc70640071d2 202 DispMeterTics();
loopsva 0:fc70640071d2 203 UpdateTics = 0;
loopsva 0:fc70640071d2 204 }
loopsva 0:fc70640071d2 205 }
loopsva 0:fc70640071d2 206 oln = MeterNumber;
loopsva 0:fc70640071d2 207 }
loopsva 0:fc70640071d2 208
loopsva 0:fc70640071d2 209 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 210 // Updates the date/time and Number values on bottom of TFT and on Text LCD every second
loopsva 0:fc70640071d2 211 bool flashtext = false;
loopsva 0:fc70640071d2 212
loopsva 0:fc70640071d2 213 void UpdateLowerDisplayEverySec() {
loopsva 0:fc70640071d2 214 flashtext = !flashtext;
loopsva 0:fc70640071d2 215 tt.set_font((unsigned char*) Arial12x12);
loopsva 0:fc70640071d2 216 tt.foreground (Cyan);
loopsva 0:fc70640071d2 217 tt.set_orientation(1);
loopsva 0:fc70640071d2 218
loopsva 0:fc70640071d2 219 //first print date/time in lower-left side of analog meter
loopsva 0:fc70640071d2 220 tt.locate(238,205);
loopsva 0:fc70640071d2 221 tt.printf("%s", timebuf);
loopsva 0:fc70640071d2 222 tt.locate(238,192);
loopsva 0:fc70640071d2 223 tt.printf("%s", datebuf);
loopsva 0:fc70640071d2 224
loopsva 0:fc70640071d2 225 //display text number in lower-right corner
loopsva 0:fc70640071d2 226 tt.foreground (DarkGrey);
loopsva 0:fc70640071d2 227 tt.locate(30,205);
loopsva 0:fc70640071d2 228 tt.printf("%.1f YYZ ", NewfNumb);
loopsva 0:fc70640071d2 229
loopsva 0:fc70640071d2 230 //display WARNING!! if Number too high
loopsva 0:fc70640071d2 231 if((NewfNumb > 600.0) && (flashtext == false)) {
loopsva 0:fc70640071d2 232 tt.set_font((unsigned char*) Book_Antiqua19x19);
loopsva 0:fc70640071d2 233 tt.foreground (Yellow);
loopsva 0:fc70640071d2 234 tt.locate(80,110);
loopsva 0:fc70640071d2 235 tt.printf("Get the HELL");
loopsva 0:fc70640071d2 236 tt.locate(80,130);
loopsva 0:fc70640071d2 237 tt.printf("out of here !!!");
loopsva 0:fc70640071d2 238 onceBlack = false;
loopsva 0:fc70640071d2 239 } else if(((NewfNumb <= 600.0) && (onceBlack == false)) || ((NewfNumb > 600.0) && (flashtext == true))) {
loopsva 0:fc70640071d2 240 tt.set_font((unsigned char*) Book_Antiqua19x19);
loopsva 0:fc70640071d2 241 tt.foreground (Black);
loopsva 0:fc70640071d2 242 tt.locate(80,110);
loopsva 0:fc70640071d2 243 tt.printf("Get the HELL");
loopsva 0:fc70640071d2 244 tt.locate(80,130);
loopsva 0:fc70640071d2 245 tt.printf("out of here !!!");
loopsva 0:fc70640071d2 246 onceBlack = true;
loopsva 0:fc70640071d2 247 }
loopsva 0:fc70640071d2 248 tt.set_orientation(0);
loopsva 0:fc70640071d2 249
loopsva 0:fc70640071d2 250 //set color of meter frame (and meter scaling factor) based on NewfNumb scale
loopsva 0:fc70640071d2 251 if(NewfNumb < 10000.0) {
loopsva 0:fc70640071d2 252 MeterNumber = (int)(NewfNumb / 100.0);
loopsva 0:fc70640071d2 253 MeterColor = Red;
loopsva 0:fc70640071d2 254 MeterText = 4;
loopsva 0:fc70640071d2 255 } else {
loopsva 0:fc70640071d2 256 MeterNumber = 100;
loopsva 0:fc70640071d2 257 MeterColor = Red;
loopsva 0:fc70640071d2 258 MeterText = 5;
loopsva 0:fc70640071d2 259 }
loopsva 0:fc70640071d2 260 if(NewfNumb < 1000.0) {
loopsva 0:fc70640071d2 261 MeterNumber = (int)(NewfNumb / 10.0);
loopsva 0:fc70640071d2 262 MeterColor = Orange;
loopsva 0:fc70640071d2 263 MeterText = 3;
loopsva 0:fc70640071d2 264 }
loopsva 0:fc70640071d2 265 if(NewfNumb < 100.0) {
loopsva 0:fc70640071d2 266 MeterNumber = (int)(NewfNumb);
loopsva 0:fc70640071d2 267 MeterColor = Yellow;
loopsva 0:fc70640071d2 268 MeterText = 2;
loopsva 0:fc70640071d2 269 }
loopsva 0:fc70640071d2 270 if(NewfNumb < 10.0) {
loopsva 0:fc70640071d2 271 MeterNumber = (int)(NewfNumb * 10.0);
loopsva 0:fc70640071d2 272 MeterColor = DarkGreen;
loopsva 0:fc70640071d2 273 MeterText = 1;
loopsva 0:fc70640071d2 274 }
loopsva 0:fc70640071d2 275 if(NewfNumb <= 0.0) {
loopsva 0:fc70640071d2 276 MeterNumber = 0;
loopsva 0:fc70640071d2 277 MeterColor = Blue;
loopsva 0:fc70640071d2 278 MeterText = 0;
loopsva 0:fc70640071d2 279 }
loopsva 0:fc70640071d2 280 if((MeterNumber > 100) | (MeterNumber < 0)) {
loopsva 0:fc70640071d2 281 MeterNumber = 50;
loopsva 0:fc70640071d2 282 MeterColor = Purple;
loopsva 0:fc70640071d2 283 MeterText = 6;
loopsva 0:fc70640071d2 284 }
loopsva 0:fc70640071d2 285 //change meter frame color only if it's different from the previous color
loopsva 0:fc70640071d2 286 if(OldMeterText != MeterText) {
loopsva 0:fc70640071d2 287 OldMeterText = MeterText;
loopsva 0:fc70640071d2 288 tt.set_orientation(0);
loopsva 0:fc70640071d2 289 DispMeterFrame();
loopsva 0:fc70640071d2 290 }
loopsva 0:fc70640071d2 291 UpdateMove = true; // allow interrupt to make change to movement
loopsva 0:fc70640071d2 292 if(gDebug > 2) pc.printf("NewfNumb: %.3f MeterNumber: %d\n", NewfNumb, MeterNumber);
loopsva 0:fc70640071d2 293 }
loopsva 0:fc70640071d2 294
loopsva 0:fc70640071d2 295 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 296 // Test routing puts analog meter through its pases
loopsva 0:fc70640071d2 297 bool MeterUp = true;
loopsva 0:fc70640071d2 298 void TestMeter() {
loopsva 0:fc70640071d2 299 if(MeterUp == true) {
loopsva 0:fc70640071d2 300 if(NewfNumb >= 11000.0) {
loopsva 0:fc70640071d2 301 MeterUp = false;
loopsva 0:fc70640071d2 302 return;
loopsva 0:fc70640071d2 303 }else if(NewfNumb >= 1000.0) {
loopsva 0:fc70640071d2 304 NewfNumb = NewfNumb + 500.0;
loopsva 0:fc70640071d2 305 return;
loopsva 0:fc70640071d2 306 }else if(NewfNumb >= 100.0) {
loopsva 0:fc70640071d2 307 NewfNumb = NewfNumb + 50.0;
loopsva 0:fc70640071d2 308 return;
loopsva 0:fc70640071d2 309 }else if(NewfNumb >= 10.0) {
loopsva 0:fc70640071d2 310 NewfNumb = NewfNumb + 5.0;
loopsva 0:fc70640071d2 311 return;
loopsva 0:fc70640071d2 312 }else {
loopsva 0:fc70640071d2 313 NewfNumb = NewfNumb + 0.5;
loopsva 0:fc70640071d2 314 }
loopsva 0:fc70640071d2 315 }else {
loopsva 0:fc70640071d2 316 if(NewfNumb <= -1.5) {
loopsva 0:fc70640071d2 317 MeterUp = true;
loopsva 0:fc70640071d2 318 return;
loopsva 0:fc70640071d2 319 }else if(NewfNumb > 1000.0) {
loopsva 0:fc70640071d2 320 NewfNumb = NewfNumb - 500.0;
loopsva 0:fc70640071d2 321 return;
loopsva 0:fc70640071d2 322 }else if(NewfNumb > 100.0) {
loopsva 0:fc70640071d2 323 NewfNumb = NewfNumb - 50.0;
loopsva 0:fc70640071d2 324 return;
loopsva 0:fc70640071d2 325 }else if(NewfNumb > 10.0) {
loopsva 0:fc70640071d2 326 NewfNumb = NewfNumb - 5.0;
loopsva 0:fc70640071d2 327 return;
loopsva 0:fc70640071d2 328 }else {
loopsva 0:fc70640071d2 329 NewfNumb = NewfNumb - 0.5;
loopsva 0:fc70640071d2 330 }
loopsva 0:fc70640071d2 331 }
loopsva 0:fc70640071d2 332 if(gDebug > 1) pc.printf("RTN: %.1f\n",NewfNumb);
loopsva 0:fc70640071d2 333 }
loopsva 0:fc70640071d2 334
loopsva 0:fc70640071d2 335 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 336 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 337 int main() {
loopsva 0:fc70640071d2 338 int ResetState = LPC_WDT->WDMOD;
loopsva 0:fc70640071d2 339 pc.baud(921600); //set up USB serial speed
loopsva 0:fc70640071d2 340 ctTime = time(NULL);
loopsva 0:fc70640071d2 341 ctTime = ctTime + ((TZone + DST) * 3600);
loopsva 0:fc70640071d2 342 pc.printf("\n\n");
loopsva 0:fc70640071d2 343 pc.printf("-------------------------------------------------------------------\n");
loopsva 0:fc70640071d2 344 pc.printf("Scalable Analog Meter using TFT Rev: %d K Braun\n", revision);
loopsva 0:fc70640071d2 345 tt.cls();
loopsva 0:fc70640071d2 346 wait(DISP_FAST);
loopsva 0:fc70640071d2 347 int StartTime = ctTime;
loopsva 0:fc70640071d2 348 int xTime = ctTime;
loopsva 0:fc70640071d2 349 int LedDelay = 0;
loopsva 0:fc70640071d2 350
loopsva 0:fc70640071d2 351 pc.printf("Enabling Timer Interrupt\n");
loopsva 0:fc70640071d2 352 // LPC_SC->PCONP |= 1<<1; // Timer0 Power On
loopsva 0:fc70640071d2 353 LPC_TIM0->MR0 = 4800000; // Match count for 200ms (24000 per 1mS)
loopsva 0:fc70640071d2 354 LPC_TIM0->MCR = 3; // Interrupt and Reset on Match
loopsva 0:fc70640071d2 355 LPC_TIM0->TCR = 1; // Enable Timer0
loopsva 0:fc70640071d2 356 NVIC_SetVector(TIMER0_IRQn,(uint32_t)&myIRQ);
loopsva 0:fc70640071d2 357 NVIC_EnableIRQ(TIMER0_IRQn);
loopsva 0:fc70640071d2 358 pc.printf("Ready...\n");
loopsva 0:fc70640071d2 359
loopsva 0:fc70640071d2 360 /*--------------------------------------------------------------------------------------------------------------------------------------*/
loopsva 0:fc70640071d2 361 while (1) {
loopsva 0:fc70640071d2 362 wait_ms(3);
loopsva 0:fc70640071d2 363 ctTime = time(NULL);
loopsva 0:fc70640071d2 364 ctTime = ctTime + ((TZone + DST) * 3600);
loopsva 0:fc70640071d2 365 strftime(timebuf, 16, "%H:%M:%S", localtime(&ctTime));
loopsva 0:fc70640071d2 366 strftime(datebuf, 16, "%m/%d/%y", localtime(&ctTime));
loopsva 0:fc70640071d2 367 if(xTime != ctTime) {
loopsva 0:fc70640071d2 368 xTime = ctTime;
loopsva 0:fc70640071d2 369 if(gDebug > 1) pc.printf("%s ", timebuf);
loopsva 0:fc70640071d2 370 if(gDebug > 1) pc.printf("%s ", datebuf);
loopsva 0:fc70640071d2 371 TestMeter();
loopsva 0:fc70640071d2 372 UpdateLowerDisplayEverySec();
loopsva 0:fc70640071d2 373 if(gDebug > 1) pc.printf("cT: %d sT: %d\n", ctTime, StartTime);
loopsva 0:fc70640071d2 374 }
loopsva 0:fc70640071d2 375
loopsva 0:fc70640071d2 376 // Winking LED1
loopsva 0:fc70640071d2 377 LedDelay++;
loopsva 0:fc70640071d2 378 if(LedDelay >= 24) {
loopsva 0:fc70640071d2 379 LedDelay = 0;
loopsva 0:fc70640071d2 380 if(Led1Up == true) {
loopsva 0:fc70640071d2 381 Led1Pwm = Led1Pwm + 0.005;
loopsva 0:fc70640071d2 382 led1 = Led1Pwm;
loopsva 0:fc70640071d2 383 if(Led1Pwm >= 0.20) {
loopsva 0:fc70640071d2 384 Led1Up = false;
loopsva 0:fc70640071d2 385 }
loopsva 0:fc70640071d2 386 } else {
loopsva 0:fc70640071d2 387 Led1Pwm = Led1Pwm - 0.005;
loopsva 0:fc70640071d2 388 led1 = Led1Pwm;
loopsva 0:fc70640071d2 389 if(Led1Pwm <= 0.005) {
loopsva 0:fc70640071d2 390 Led1Up = true;
loopsva 0:fc70640071d2 391 }
loopsva 0:fc70640071d2 392 } //brighter else dimmer
loopsva 0:fc70640071d2 393 } //LedDelay > 24 (* 3ms from while loop)
loopsva 0:fc70640071d2 394 } //while loop
loopsva 0:fc70640071d2 395 } //main
loopsva 0:fc70640071d2 396