- 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
main.cpp@0:fc70640071d2, 2012-01-31 (annotated)
- Committer:
- loopsva
- Date:
- Tue Jan 31 19:40:57 2012 +0000
- Revision:
- 0:fc70640071d2
100
Who changed what in which revision?
User | Revision | Line number | New 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 |