TO CHECKOUT

Dependencies:   mbed

Committer:
chrish
Date:
Tue Dec 02 13:29:16 2014 +0000
Revision:
1:6a77fc8e1389
Parent:
0:785c2b62c4d1
Nr2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chrish 0:785c2b62c4d1 1 /***************************************************************************
chrish 0:785c2b62c4d1 2 * Titel : LAB.C
chrish 0:785c2b62c4d1 3 *
chrish 0:785c2b62c4d1 4 * Description : Labormodul "DIBI"
chrish 0:785c2b62c4d1 5 *
chrish 0:785c2b62c4d1 6 * Revision List:
chrish 0:785c2b62c4d1 7 --------------------------------------------------------------------------
chrish 0:785c2b62c4d1 8 Date | Author | Change
chrish 0:785c2b62c4d1 9 --------------------------------------------------------------------------
chrish 0:785c2b62c4d1 10 15.11.13 | J. Altenburg | Ersterstellung
chrish 0:785c2b62c4d1 11 --------------------------------------------------------------------------
chrish 0:785c2b62c4d1 12 | |
chrish 0:785c2b62c4d1 13 --------------------------------------------------------------------------
chrish 0:785c2b62c4d1 14 ****************************************************************************/
chrish 0:785c2b62c4d1 15
chrish 0:785c2b62c4d1 16 /***************************************************************************
chrish 0:785c2b62c4d1 17 * HEADER-FILES (Only those that are needed in this file)
chrish 0:785c2b62c4d1 18 ****************************************************************************/
chrish 0:785c2b62c4d1 19 /* Own header */
chrish 0:785c2b62c4d1 20 #include "lab.h"
chrish 0:785c2b62c4d1 21
chrish 0:785c2b62c4d1 22 /* Foreign headerfiles */
chrish 0:785c2b62c4d1 23 #include "lcd.h"
chrish 0:785c2b62c4d1 24 #include "picture.h"
chrish 0:785c2b62c4d1 25 #include "mbed.h"
chrish 0:785c2b62c4d1 26
chrish 0:785c2b62c4d1 27 DigitalOut bLed2(LED4);
chrish 0:785c2b62c4d1 28 DigitalIn bBtn1(p8);
chrish 0:785c2b62c4d1 29 AnalogIn fpAnalog(p15); /* Analogeingang */
chrish 0:785c2b62c4d1 30
chrish 0:785c2b62c4d1 31 #define PROF
chrish 0:785c2b62c4d1 32
chrish 0:785c2b62c4d1 33 /***************************************************************************
chrish 0:785c2b62c4d1 34 * Variablen
chrish 0:785c2b62c4d1 35 ****************************************************************************/
chrish 0:785c2b62c4d1 36 byte abPicture[160][120]; /*
chrish 0:785c2b62c4d1 37 Description: Bildspeicher fuer Grauwertbild
chrish 0:785c2b62c4d1 38 */
chrish 0:785c2b62c4d1 39
chrish 0:785c2b62c4d1 40 word awHisto[64] = {0}; /*
chrish 0:785c2b62c4d1 41 Description : Histogramm-Vektor
chrish 0:785c2b62c4d1 42 */
chrish 0:785c2b62c4d1 43
chrish 0:785c2b62c4d1 44 lcd_t myLCD; /*
chrish 0:785c2b62c4d1 45 * Description : Zugriffstruktur für LCD
chrish 0:785c2b62c4d1 46 */
chrish 0:785c2b62c4d1 47
chrish 0:785c2b62c4d1 48 spi_t mySPI; /*
chrish 0:785c2b62c4d1 49 * Description : dito. fuer SPI
chrish 0:785c2b62c4d1 50 */
chrish 0:785c2b62c4d1 51
chrish 0:785c2b62c4d1 52 float fpAdcValue; /*
chrish 0:785c2b62c4d1 53 * Description : analoger Messwert
chrish 0:785c2b62c4d1 54 */
chrish 0:785c2b62c4d1 55
chrish 0:785c2b62c4d1 56 /***************************************************************************
chrish 0:785c2b62c4d1 57 * lokale Funktionsprototypen
chrish 0:785c2b62c4d1 58 ***************************************************************************/
chrish 0:785c2b62c4d1 59
chrish 0:785c2b62c4d1 60
chrish 0:785c2b62c4d1 61 /***************************************************************************
chrish 0:785c2b62c4d1 62 * Defines und Makros *
chrish 0:785c2b62c4d1 63 ***************************************************************************/
chrish 0:785c2b62c4d1 64
chrish 0:785c2b62c4d1 65
chrish 0:785c2b62c4d1 66 /***************************************************************************
chrish 0:785c2b62c4d1 67 * lokale Funktionen
chrish 0:785c2b62c4d1 68 ****************************************************************************/
chrish 0:785c2b62c4d1 69 /* Umrechnen eines Farbwertes in einen Grauwert */
chrish 0:785c2b62c4d1 70 byte bRGB565ToGray(word wColor){
chrish 0:785c2b62c4d1 71 byte bGray = 0;
chrish 0:785c2b62c4d1 72 byte r,g,b;
chrish 1:6a77fc8e1389 73
chrish 0:785c2b62c4d1 74 r = (wColor & 0xf800)>>11;
chrish 0:785c2b62c4d1 75 g = (wColor & 0x07E0) >>5;
chrish 0:785c2b62c4d1 76 b = (wColor & 0x001F) ;
chrish 1:6a77fc8e1389 77 #if 1
chrish 1:6a77fc8e1389 78 bGray = ((r+b)*2 + g)/3;
chrish 1:6a77fc8e1389 79
chrish 1:6a77fc8e1389 80 #else
chrish 0:785c2b62c4d1 81
chrish 1:6a77fc8e1389 82 bGray = (byte)
chrish 1:6a77fc8e1389 83 #endif
chrish 0:785c2b62c4d1 84 /*
chrish 0:785c2b62c4d1 85 .... hier eigenen Code eintragen
chrish 0:785c2b62c4d1 86 */
chrish 0:785c2b62c4d1 87 return bGray;
chrish 0:785c2b62c4d1 88 }
chrish 0:785c2b62c4d1 89
chrish 0:785c2b62c4d1 90 /* Umrechnen eines Grauwert in einen "unbunten" RGB565-Wert */
chrish 0:785c2b62c4d1 91 word wGrayToRGB565(byte bGray){
chrish 0:785c2b62c4d1 92 word wNoColor;
chrish 0:785c2b62c4d1 93 byte r,g,b;
chrish 0:785c2b62c4d1 94 r = bGray /2;
chrish 0:785c2b62c4d1 95 g= bGray;
chrish 0:785c2b62c4d1 96 b = bGray / 2;
chrish 0:785c2b62c4d1 97 wNoColor = (r <<11) + (g << 5) + b;
chrish 0:785c2b62c4d1 98 return wNoColor;
chrish 0:785c2b62c4d1 99 }
chrish 0:785c2b62c4d1 100
chrish 0:785c2b62c4d1 101
chrish 0:785c2b62c4d1 102 /* Umrechnen des Farbbildes in ein Grauwertbild
chrish 0:785c2b62c4d1 103 Parameterübergabe erfolgt über Zeiger
chrish 0:785c2b62c4d1 104 */
chrish 0:785c2b62c4d1 105 void vColorToGray(word *pColor, byte *pGray){
chrish 0:785c2b62c4d1 106 word w;
chrish 0:785c2b62c4d1 107 for(w = 0; w < 19200; w++){
chrish 0:785c2b62c4d1 108 *pGray = bRGB565ToGray(*pColor);
chrish 0:785c2b62c4d1 109 pGray++;
chrish 0:785c2b62c4d1 110 pColor++;
chrish 0:785c2b62c4d1 111 }
chrish 0:785c2b62c4d1 112 }
chrish 0:785c2b62c4d1 113
chrish 0:785c2b62c4d1 114 /* Grauwertbild in Sektor 2 plazieren */
chrish 0:785c2b62c4d1 115 void vGrayToScreen2(byte *pGray){
chrish 1:6a77fc8e1389 116 word wColor, v;
chrish 0:785c2b62c4d1 117 byte x, y;
chrish 0:785c2b62c4d1 118 x = y = 0;
chrish 0:785c2b62c4d1 119 for(v = 0; v < 19200; v++){
chrish 0:785c2b62c4d1 120 wColor = wGrayToRGB565(*pGray);
chrish 0:785c2b62c4d1 121 pGray++;
chrish 0:785c2b62c4d1 122 lcd_setPixel(&myLCD, 120 + y, 160 + x, wColor);
chrish 0:785c2b62c4d1 123 y++;
chrish 0:785c2b62c4d1 124 if(y > 119){
chrish 0:785c2b62c4d1 125 y = 0;
chrish 0:785c2b62c4d1 126 x++;
chrish 0:785c2b62c4d1 127 }
chrish 0:785c2b62c4d1 128 }
chrish 0:785c2b62c4d1 129 }
chrish 0:785c2b62c4d1 130
chrish 0:785c2b62c4d1 131 /* Grauwertbild in Sektor 3 plazieren */
chrish 0:785c2b62c4d1 132 void vGrayToScreen3(byte *pGray){
chrish 0:785c2b62c4d1 133
chrish 1:6a77fc8e1389 134 word wColor, v;
chrish 0:785c2b62c4d1 135 byte x, y;
chrish 0:785c2b62c4d1 136 x = y = 0;
chrish 0:785c2b62c4d1 137 for(v = 0; v < 19200; v++){
chrish 0:785c2b62c4d1 138 wColor = wGrayToRGB565(*pGray);
chrish 0:785c2b62c4d1 139 pGray++;
chrish 0:785c2b62c4d1 140 lcd_setPixel(&myLCD, y, 160 + x, wColor);
chrish 0:785c2b62c4d1 141 y++;
chrish 0:785c2b62c4d1 142 if(y > 119){
chrish 0:785c2b62c4d1 143 y = 0;
chrish 0:785c2b62c4d1 144 x++;
chrish 0:785c2b62c4d1 145 }
chrish 0:785c2b62c4d1 146 }
chrish 0:785c2b62c4d1 147 }
chrish 0:785c2b62c4d1 148
chrish 0:785c2b62c4d1 149
chrish 0:785c2b62c4d1 150
chrish 0:785c2b62c4d1 151 /* Histogramm in Sektor 4 zeichnen */
chrish 0:785c2b62c4d1 152 void vDrawHisto(byte *pGray){
chrish 1:6a77fc8e1389 153 word y, wMax = 0;
chrish 0:785c2b62c4d1 154 byte i, j, n;
chrish 0:785c2b62c4d1 155 /* Histogrammvektor initialisieren ... ihre Sache */
chrish 0:785c2b62c4d1 156
chrish 0:785c2b62c4d1 157 /* Histogrammvektor berechnen ... bitte tun */
chrish 0:785c2b62c4d1 158 /* Werte normieren ... wenn notwendig */
chrish 0:785c2b62c4d1 159
chrish 0:785c2b62c4d1 160 //word awHisto[64] = {0}; /*
chrish 0:785c2b62c4d1 161 //byte abPicture[160][120]; /*
chrish 0:785c2b62c4d1 162
chrish 0:785c2b62c4d1 163 for(i=0;i<64;i++) awHisto[i] = 0;
chrish 0:785c2b62c4d1 164
chrish 0:785c2b62c4d1 165
chrish 0:785c2b62c4d1 166 for(i=0;i<120;i++){
chrish 0:785c2b62c4d1 167 for(j=0;j<160;j++)awHisto[abPicture[i][j]] +=1;
chrish 0:785c2b62c4d1 168 }
chrish 0:785c2b62c4d1 169
chrish 0:785c2b62c4d1 170
chrish 0:785c2b62c4d1 171 /**ERmittlung des Maximalwertes */
chrish 0:785c2b62c4d1 172 wMax = awHisto[0];
chrish 0:785c2b62c4d1 173 for(i=1;i<64;i++){
chrish 0:785c2b62c4d1 174 if( awHisto[i] > wMax)wMax = awHisto[i];
chrish 0:785c2b62c4d1 175 }
chrish 0:785c2b62c4d1 176
chrish 0:785c2b62c4d1 177 /* ab hier Bildaufbau */
chrish 0:785c2b62c4d1 178 LCD_vFillRectangle(&myLCD, 10, 140, 128, 84, GRAY1); /* grauer Hintergrund */
chrish 0:785c2b62c4d1 179 //LCD_vSetPixel(&myLCD, 200,300, BRIGHT_RED)
chrish 0:785c2b62c4d1 180 // y x
chrish 0:785c2b62c4d1 181
chrish 0:785c2b62c4d1 182 for(i = 0; i < 128; i = i + 16){
chrish 0:785c2b62c4d1 183 LCD_vDrawVline(&myLCD, 20+i, 140, 84, GRAY2);
chrish 0:785c2b62c4d1 184 }
chrish 0:785c2b62c4d1 185 for(i = 0; i < 64; i++){ /* die möglichen Werte darstellen */
chrish 0:785c2b62c4d1 186 n = i*2;
chrish 0:785c2b62c4d1 187 y = i; // erzeugt einen Keil
chrish 0:785c2b62c4d1 188 for(j = 0; j < ( awHisto[i] * 64 / wMax) ; j++){
chrish 0:785c2b62c4d1 189 LCD_vSetPixel(&myLCD, 20+j, 10+n, BRIGHT_RED);
chrish 0:785c2b62c4d1 190 // LCD_vSetPixel(&myLCD, 20+j, 11+n, BRIGHT_RED);
chrish 0:785c2b62c4d1 191 }
chrish 0:785c2b62c4d1 192 }
chrish 0:785c2b62c4d1 193
chrish 0:785c2b62c4d1 194
chrish 0:785c2b62c4d1 195 // for(i = 0; i < 128; i = i + 16){
chrish 0:785c2b62c4d1 196 // LCD_vDrawVline(&myLCD, 20+i, 140, 84, GRAY2);
chrish 0:785c2b62c4d1 197 // }
chrish 0:785c2b62c4d1 198 for(i = 0; i < 128; i++){
chrish 0:785c2b62c4d1 199 LCD_vSetPixel(&myLCD, 84, 10+i, BLUE);
chrish 0:785c2b62c4d1 200 }
chrish 0:785c2b62c4d1 201 }
chrish 0:785c2b62c4d1 202
chrish 0:785c2b62c4d1 203
chrish 0:785c2b62c4d1 204
chrish 0:785c2b62c4d1 205 /* Grauwerte manipulieren
chrish 0:785c2b62c4d1 206 *pGray zeigt auf die Grauwerte
chrish 0:785c2b62c4d1 207 bValue bestimmt die Größenmanipulation
chrish 0:785c2b62c4d1 208 */
chrish 0:785c2b62c4d1 209 void vChangeGray(byte *pGray, byte bValue){
chrish 1:6a77fc8e1389 210 byte bGMin, bGMax, bWMax,bWMin;
chrish 1:6a77fc8e1389 211 word x,y,l,h;
chrish 1:6a77fc8e1389 212 word wColor ;
chrish 1:6a77fc8e1389 213 bWMax = 63;
chrish 1:6a77fc8e1389 214 bWMin = 0;
chrish 1:6a77fc8e1389 215
chrish 1:6a77fc8e1389 216 for(x=0;x<64;x++)if( awHisto[x] > 0){ bGMin = x; break;}
chrish 1:6a77fc8e1389 217 // Ermittlung von gMax
chrish 1:6a77fc8e1389 218 for(x=63;x>=0;x--)if( awHisto[x] > 0){ bGMax = x; break;}
chrish 1:6a77fc8e1389 219
chrish 1:6a77fc8e1389 220 lcd_drawNumber(&myLCD, bGMin, 1, 230, 1, BLACK);
chrish 1:6a77fc8e1389 221 lcd_drawNumber(&myLCD, bGMax, 50, 230, 1, BLACK);
chrish 0:785c2b62c4d1 222
chrish 1:6a77fc8e1389 223
chrish 1:6a77fc8e1389 224 byte abOnePiktureLine[160];
chrish 1:6a77fc8e1389 225 // Jetzt Ermittlung der Neuen Werte mit Transferfunktion
chrish 1:6a77fc8e1389 226 // gneu (g) = (g- gmin) * ( (wmax+ wmin) / ( gmax - gmin ) )
chrish 0:785c2b62c4d1 227 byte *ab= &abPicture[0][0];
chrish 1:6a77fc8e1389 228 #if 1
chrish 1:6a77fc8e1389 229 /**Überschreiben des Grauwertbildes Mit neuem Bild */
chrish 1:6a77fc8e1389 230 for(x = 0; x <19200; x++){
chrish 1:6a77fc8e1389 231 if( ( ( *(ab + x) - bGMin) * (bWMax/(bGMax-bGMin)) ) >=0)
chrish 1:6a77fc8e1389 232 *(pGray + x) = ( *(ab + x) - bGMin) * (bWMax/(bGMax-bGMin)) * bValue ;
chrish 0:785c2b62c4d1 233 else
chrish 0:785c2b62c4d1 234 *(pGray+x) =0;
chrish 0:785c2b62c4d1 235 }
chrish 0:785c2b62c4d1 236
chrish 0:785c2b62c4d1 237 #else
chrish 1:6a77fc8e1389 238 /** Keine Speicherung des Korregierten Bildes sondern Direkte Ausgabe aus screen */
chrish 1:6a77fc8e1389 239 // l = x h = y
chrish 1:6a77fc8e1389 240 l=0;
chrish 1:6a77fc8e1389 241 h=0;
chrish 1:6a77fc8e1389 242 for(x = 0; x <19200; x++){
chrish 1:6a77fc8e1389 243 if( ( ( *(ab + x) - bGMin) * (bWMax/(bGMax-bGMin)) ) >=0)
chrish 1:6a77fc8e1389 244 wColor = wGrayToRGB565(( *(ab + x) - bGMin) * (bWMax/(bGMax-bGMin)) ) /*bValue */ ;
chrish 0:785c2b62c4d1 245 else
chrish 1:6a77fc8e1389 246 wColor = wGrayToRGB565(0);
chrish 1:6a77fc8e1389 247
chrish 1:6a77fc8e1389 248 lcd_setPixel(&myLCD, h, 160 + l, wColor);
chrish 1:6a77fc8e1389 249 h++;
chrish 1:6a77fc8e1389 250 if(h > 119){
chrish 1:6a77fc8e1389 251 h= 0;
chrish 1:6a77fc8e1389 252 l++;
chrish 1:6a77fc8e1389 253 }
chrish 0:785c2b62c4d1 254 }
chrish 0:785c2b62c4d1 255 #endif
chrish 1:6a77fc8e1389 256
chrish 0:785c2b62c4d1 257 }
chrish 0:785c2b62c4d1 258
chrish 0:785c2b62c4d1 259
chrish 0:785c2b62c4d1 260 /***************************************************************************
chrish 0:785c2b62c4d1 261 * Initialisierung
chrish 0:785c2b62c4d1 262 * angeschlossene Hardware aktivieren
chrish 0:785c2b62c4d1 263 * Bildsektoren 1, 2 initialsieren
chrish 0:785c2b62c4d1 264 * Histogramm aufbauen
chrish 0:785c2b62c4d1 265 ****************************************************************************/
chrish 0:785c2b62c4d1 266 void LAB_vInit( void ){
chrish 0:785c2b62c4d1 267 spi_init(&mySPI, p11, p12, p13, NC);
chrish 0:785c2b62c4d1 268 spi_format(&mySPI, 8, 0, 0);
chrish 0:785c2b62c4d1 269 spi_frequency(&mySPI, 25000000);
chrish 0:785c2b62c4d1 270 LCD_vInit(&myLCD, &mySPI, p22, p23);
chrish 0:785c2b62c4d1 271 LCD_vSetMode(&myLCD, LANDSCAPE);
chrish 0:785c2b62c4d1 272 /* Blume in Sektor 1 zeichnen */
chrish 0:785c2b62c4d1 273 LCD_vFillSprite(&myLCD, 0, 0, 159, 119, (short int*)&awBlume[0]);
chrish 0:785c2b62c4d1 274 /* Grauwerte aus Farbbild ermitteln */
chrish 0:785c2b62c4d1 275 vColorToGray((word*)&awBlume[0], &abPicture[0][0]);
chrish 0:785c2b62c4d1 276 /* Grauwertbild in Sektor 2 zeichnen */
chrish 0:785c2b62c4d1 277 vGrayToScreen2(&abPicture[0][0]);
chrish 0:785c2b62c4d1 278 /* Histogramm in Sektor 4 zeichen */
chrish 0:785c2b62c4d1 279 vDrawHisto(&abPicture[0][0]);
chrish 0:785c2b62c4d1 280 }
chrish 0:785c2b62c4d1 281
chrish 0:785c2b62c4d1 282
chrish 0:785c2b62c4d1 283
chrish 0:785c2b62c4d1 284
chrish 0:785c2b62c4d1 285 /***************************************************************************
chrish 0:785c2b62c4d1 286 * MMI-Main
chrish 0:785c2b62c4d1 287 * diese Funktion wird alle 100 ms aufgerufen
chrish 0:785c2b62c4d1 288 ****************************************************************************/
chrish 0:785c2b62c4d1 289 void LAB_vMain( void ){
chrish 0:785c2b62c4d1 290 bLed2 = !bLed2;
chrish 0:785c2b62c4d1 291 // float bADCDATA;
chrish 0:785c2b62c4d1 292 byte i;
chrish 0:785c2b62c4d1 293
chrish 0:785c2b62c4d1 294 /* heir die Anzeige des Analogwertes einbauen */
chrish 0:785c2b62c4d1 295 byte abPictureCorrektet[120][160];
chrish 0:785c2b62c4d1 296
chrish 0:785c2b62c4d1 297 fpAdcValue = fpAnalog.read();
chrish 1:6a77fc8e1389 298 lcd_drawFloat(&myLCD,fpAdcValue*10, 3, 20, 125, 1, RED);
chrish 0:785c2b62c4d1 299 if(!bBtn1) {
chrish 0:785c2b62c4d1 300
chrish 1:6a77fc8e1389 301 // vChangeGray(&abPictureCorrektet[0][0], 4);
chrish 0:785c2b62c4d1 302 #if 0
chrish 0:785c2b62c4d1 303 vGrayToScreen3(&abPictureCorrektet[0][0]);
chrish 0:785c2b62c4d1 304 #else
chrish 1:6a77fc8e1389 305 vChangeGray(&abPicture[0][0], fpAdcValue*10);
chrish 1:6a77fc8e1389 306 vGrayToScreen3(&abPicture[0][0]);
chrish 1:6a77fc8e1389 307 vDrawHisto(&abPicture[0][0]);
chrish 1:6a77fc8e1389 308
chrish 0:785c2b62c4d1 309 #endif
chrish 0:785c2b62c4d1 310 }
chrish 0:785c2b62c4d1 311 }
chrish 0:785c2b62c4d1 312
chrish 0:785c2b62c4d1 313
chrish 0:785c2b62c4d1 314 /***************************************************************************
chrish 0:785c2b62c4d1 315 * EOF: TEMPLATE.C
chrish 0:785c2b62c4d1 316 ****************************************************************************/
chrish 0:785c2b62c4d1 317
chrish 0:785c2b62c4d1 318