From 7b8b1ac0239f2b25db1052d9394edb0507041f0e Mon Sep 17 00:00:00 2001 From: Michael Colton Date: Sat, 26 Jul 2014 19:07:45 -0600 Subject: [PATCH] Starting to (slowly) make changes to the schematic for the next hardware version. Making/made a lot of changes to the graphics and some to the menu system. Want to do a commit before I change too much more, incase I screw things up, you see. Graphics look much better! --- Hardware/PSDR.sch | Bin 271752 -> 286922 bytes Source/include/images.h | 16 ++ Source/include/main.h | 8 + Source/src/Adafruit_GFX.c | 7 +- Source/src/images.c | 586 ++++++++++++++++++++++++++++---------- Source/src/main.c | 424 +++++++++------------------ 6 files changed, 610 insertions(+), 431 deletions(-) diff --git a/Hardware/PSDR.sch b/Hardware/PSDR.sch index 8057e6bed9be0f2c528bf65fcf75ffeb1eeea8cb..1784859e69fdb8a8c47e5769e0ce0192c419f3fc 100644 GIT binary patch delta 15778 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 fftMax) fftMax = mags; - if(mags < fftMin) fftMin = mags; - } - //logMax = log2(fftMax); - - if(fftMax > fftMaxMax) fftMaxMax += fftMax * 0.1; - logMax = log2(fftMaxMax); - fftMaxMax *= 0.99; - -// TODOne: SWITCH THESE AND FLIP THEM. So that higher frequencies appear higher on screen. -// TODO: Got rid of the first bin because it's just DC offset, right? -// but now narrow signal can disappear when they are right at the center.... -// Will that be better when I lower the sample frequency? Maybe I should do that next. - //uint16_t i; - for(i = 1; i < 120; i++) - { - mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 32; //Log needs to be at least 1 right? We could do a + (1-fftMin) maybe? Worth it? - //mags = magnitudes[i] / fftMaxMax * 32; - Adafruit_ILI9340_drawPixel(waterfallScanLine, (120 - i), gradient[(uint8_t) mags]); - } - - for(i = 135; i < 255; i++) - { - mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 32; - //mags = magnitudes[i] / fftMaxMax * 32; - Adafruit_ILI9340_drawPixel(waterfallScanLine, 359 - (i - 15), gradient[(uint8_t) mags]); - } - - waterfallScanLine++; - if(waterfallScanLine > 119) waterfallScanLine = 0; - Adafruit_ILI9340_setVertialScrollStartAddress((119 - waterfallScanLine) + 200); -// -// sampleRun = 0; -// } + drawWaterfall(); if(vfoAFrequency != vfoALastFreq) { @@ -963,45 +790,36 @@ main(int argc, char* argv[]) if(freqChar[0] != lastFreqChar[0]) { - Adafruit_GFX_setCursor(freqHOffset + 18*0, freqVOffset + 0); - Adafruit_GFX_write(freqChar[0]); + drawNumber(freqChar[0], freqHOffset + 16*0, freqVOffset + 0, getMenuPos() == 0 ? MASKRED : MASKWHITE); } if(freqChar[1] != lastFreqChar[1]) { - Adafruit_GFX_setCursor(freqHOffset + 18*1, freqVOffset + 0); - Adafruit_GFX_write(freqChar[1]); + drawNumber(freqChar[1], freqHOffset + 16*1, freqVOffset + 0, getMenuPos() == 0 ? MASKRED : MASKWHITE); } if(freqChar[2] != lastFreqChar[2]) { - Adafruit_GFX_setCursor(freqHOffset + 18*3, freqVOffset + 0); - Adafruit_GFX_write(freqChar[2]); + drawNumber(freqChar[2], freqHOffset + 16*3, freqVOffset + 0, getMenuPos() == 1 ? MASKRED : MASKWHITE); } if(freqChar[3] != lastFreqChar[3]) { - Adafruit_GFX_setCursor(freqHOffset + 18*4, freqVOffset + 0); - Adafruit_GFX_write(freqChar[3]); + drawNumber(freqChar[3], freqHOffset + 16*4, freqVOffset + 0, getMenuPos() == 2 ? MASKRED : MASKWHITE); } if(freqChar[4] != lastFreqChar[4]) { - Adafruit_GFX_setCursor(freqHOffset + 18*5, freqVOffset + 0); - Adafruit_GFX_write(freqChar[4]); + drawNumber(freqChar[4], freqHOffset + 16*5, freqVOffset + 0, getMenuPos() == 3 ? MASKRED : MASKWHITE); } - if(freqChar[5] != lastFreqChar[5]) { - Adafruit_GFX_setCursor(freqHOffset + 18*7, freqVOffset + 0); - Adafruit_GFX_write(freqChar[5]); + drawNumber(freqChar[5], freqHOffset + 16*7, freqVOffset + 0, getMenuPos() == 4 ? MASKRED : MASKWHITE); } if(freqChar[6] != lastFreqChar[6]) { - Adafruit_GFX_setCursor(freqHOffset + 18*8, freqVOffset + 0); - Adafruit_GFX_write(freqChar[6]); + drawNumber(freqChar[6], freqHOffset + 16*8, freqVOffset + 0, getMenuPos() == 5 ? MASKRED : MASKWHITE); } if(freqChar[7] != lastFreqChar[7]) { - Adafruit_GFX_setCursor(freqHOffset + 18*9, freqVOffset + 0); - Adafruit_GFX_write(freqChar[7]); + drawNumber(freqChar[7], freqHOffset + 16*9, freqVOffset + 0, getMenuPos() == 6 ? MASKRED : MASKWHITE); } vfoALastFreq = vfoAFrequency; @@ -1013,16 +831,62 @@ main(int argc, char* argv[]) } } +void drawWaterfall() +{ + static float magnitudes[FFT_SIZE]; + static float mags; + static uint8_t waterfallScanLine = 0; + + arm_cmplx_mag_f32(samplesDisplay, magnitudes, FFT_SIZE); + + float fftMax = 0; //AH! These are being reset each time! Static makes them persistant right? Does it also ensure they are + float fftMin = 100; //only initialized once? Have to try it when I get home. It would certainly be nice if the waterfall + static float fftMaxMax = 0; //didn't change in brightness so much. Later, I may want to fix these values, or at least, make them + static float logMax; //manually controllable, sorta, you know? + uint8_t i; + for(i = 1; i < 255; i++) //If bin 0 is the DC offset, should we skip it in this calculation? + { + float mags = magnitudes[i]; + if(mags > fftMax) fftMax = mags; + if(mags < fftMin) fftMin = mags; + } + //logMax = log2(fftMax); + + if(fftMax > fftMaxMax) fftMaxMax += fftMax * 0.1; + logMax = log2(fftMaxMax); + fftMaxMax *= 0.99; + if (fftMaxMax > fftMaxMaxMax) fftMaxMax = fftMaxMaxMax; + if (fftMaxMax < fftMaxMaxMin) fftMaxMax = fftMaxMaxMin; + + + // TODO: Got rid of the first bin because it's just DC offset, right? + // but now narrow signal can disappear when they are right at the center.... + // Will that be better when I lower the sample frequency? Maybe I should do that next. + + for(i = 1; i < 120; i++) + { + mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 100; //Log needs to be at least 1 right? We could do a + (1-fftMin) maybe? Worth it? + //mags = magnitudes[i] / fftMaxMax * 32; + Adafruit_ILI9340_drawPixel(waterfallScanLine, (120 - i), bitmapWebSdrGradient[(uint8_t) mags]); + } + + for(i = 135; i < 255; i++) + { + mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 100; + //mags = magnitudes[i] / fftMaxMax * 32; + Adafruit_ILI9340_drawPixel(waterfallScanLine, 359 - (i - 15), bitmapWebSdrGradient[(uint8_t) mags]); + } + + waterfallScanLine++; + if(waterfallScanLine > 119) waterfallScanLine = 0; + Adafruit_ILI9340_setVertialScrollStartAddress((119 - waterfallScanLine) + 200); +} + void processStream() { - - - - float fftMaxMax = 0; if(sampleRun) { - //timeMeasurement = millis; arm_cfft_radix4_instance_f32 fft_inst; //arm_cfft_radix4_init_q31(&fft_inst, FFT_SIZE, 0, 1); //arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, 0, 1); @@ -1032,9 +896,6 @@ void processStream() blink_led_on(); arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, 0, 1); - - //arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, 0, 2); - arm_cfft_radix4_f32(&fft_inst, samplesA); // Calculate magnitude of complex numbers output by the FFT. if(waterfallBusy != 1) @@ -1043,9 +904,6 @@ void processStream() for(i = 0; i < FFT_BUFFER_SIZE; i++) samplesDisplay[i] = samplesA[i]; //waterfallBusy = 1; } - //arm_cmplx_mag_f32(samplesA, magnitudes, FFT_SIZE); - - //arm_cmplx_mag_f32(samplesA, magnitudes, FFT_SIZE); applyCoeficient(samplesA, ifShift); @@ -1073,7 +931,6 @@ void processStream() blink_led_on(); arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, 0, 1); - //arm_cfft_radix4_init_f32(&fft_inst, FFT_SIZE, 0, 2); arm_cfft_radix4_f32(&fft_inst, samplesB); // Calculate magnitude of complex numbers output by the FFT. @@ -1131,45 +988,6 @@ void processStream() sampleBankCReady = 0; blink_led_off(); } - //timeMeasurement = millis - timeMeasurement; - - float fftMax = 0; - // float fftMin = 100; - // float logMax; - // uint8_t i; - // for(i = 0; i < 255; i++) - // { - // float mags = magnitudes[i]; - // if(mags > fftMax) fftMax = mags; - // if(mags < fftMin) fftMin = mags; - // } - // //logMax = log2(fftMax); - // - // if(fftMax > fftMaxMax) fftMaxMax = fftMax; - // logMax = log2(fftMaxMax); - - - //TODOne: SWITCH THESE AND FLIP THEM. So that higher frequencies appear higher on screen. - //TODO: Got rid of the first bin because it's just DC offset, right? - //but now narrow signal can disappear when they are right at the center.... - //Will that be better when I lower the sample frequency? Maybe I should do that next. - // for(i = 1; i < 120; i++) - // { - // mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 32; - // //mags = magnitudes[i] / fftMaxMax * 32; - // Adafruit_ILI9340_drawPixel(waterfallScanLine, (120 - i), gradient[(uint8_t) mags]); - // } - // - // for(i = 135; i < 255; i++) - // { - // mags = (log2(magnitudes[i] + 1)) / fftMaxMax * 32; - // //mags = magnitudes[i] / fftMaxMax * 32; - // Adafruit_ILI9340_drawPixel(waterfallScanLine, 359 - (i - 15), gradient[(uint8_t) mags]); - // } - // - // waterfallScanLine++; - // if(waterfallScanLine > 119) waterfallScanLine = 0; - // Adafruit_ILI9340_setVertialScrollStartAddress((119 - waterfallScanLine) + 200); sampleRun = 0; } @@ -1200,6 +1018,48 @@ void updateVfo() } } +void drawNumber(char c, uint16_t x, uint16_t y, uint16_t tintMask) +{ + switch(c) + { + case '.': + Adafruit_GFX_drawColorBitmap(x, y, bitmapPeriod, 15, 19, tintMask); + break; + case '1': + Adafruit_GFX_drawColorBitmap(x, y, bitmapOne, 15, 19, tintMask); + break; + case '2': + Adafruit_GFX_drawColorBitmap(x, y, bitmapTwo, 15, 19, tintMask); + break; + case '3': + Adafruit_GFX_drawColorBitmap(x, y, bitmapThree, 15, 19, tintMask); + break; + case '4': + Adafruit_GFX_drawColorBitmap(x, y, bitmapFour, 15, 19, tintMask); + break; + case '5': + Adafruit_GFX_drawColorBitmap(x, y, bitmapFive, 15, 19, tintMask); + break; + case '6': + Adafruit_GFX_drawColorBitmap(x, y, bitmapSix, 15, 19, tintMask); + break; + case '7': + Adafruit_GFX_drawColorBitmap(x, y, bitmapSeven, 15, 19, tintMask); + break; + case '8': + Adafruit_GFX_drawColorBitmap(x, y, bitmapEight, 15, 19, tintMask); + break; + case '9': + Adafruit_GFX_drawColorBitmap(x, y, bitmapNine, 15, 19,tintMask); + break; + case '0': + Adafruit_GFX_drawColorBitmap(x, y, bitmapZero, 15, 19, tintMask); + break; + default: + Adafruit_GFX_fillRect(x, y, 15, 19, ILI9340_BLACK); + } +} + //TIM_TimeBaseInitTypeDef timeBaseStructure; // //TIM_OC_InitTypeDef tsConfig; @@ -1309,7 +1169,7 @@ TIM_TypeDef timTimBase; void TIM_Try(void) { - uwPrescalerValue = (uint32_t) ((SystemCoreClock/2) / 21000000) - 1; + uwPrescalerValue = (uint32_t) ((SystemCoreClock/2) / 17500000) - 1; //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); __TIM3_CLK_ENABLE();