/**************************************************************************//** * @brief Updates the digital clock. * *****************************************************************************/ void digitalClockUpdate(struct tm *time, bool redraw) { char clockString[16]; if (redraw) { GLIB_setFont(&gc, (GLIB_Font_t *)&GLIB_FontNumber16x20); gc.backgroundColor = White; gc.foregroundColor = Black; GLIB_clear(&gc); } sprintf(clockString, "%02d:%02d:%02d", time->tm_hour, time->tm_min, time->tm_sec); GLIB_drawString(&gc, clockString, strlen(clockString), 1, 52, true); /* Update display */ DMD_updateDisplay(); }
/***************************************************************************//** * @brief * This function draws an error message and if it is fatal, loops forever. * This function assumes that TFT_init has been run prior to calling this * function. * @param fatal * If true, the display will show the error message and loop forever. * @param fmt * Format string to display. ******************************************************************************/ void SLIDES_showError(bool fatal, const char* fmt, ...) { va_list argp; char buffer[100]; va_start(argp, fmt); vsnprintf(buffer, 100, fmt, argp); va_end(argp); /* Clear screen */ GLIB_clear(&gc); /* Draw error string */ GLIB_drawString(&gc, buffer, sizeof(buffer), 10, 50, 1); /* If it is fatal, loop forever here. */ if (fatal) while (1) ; }
/**************************************************************************//** * @brief This function draws the initial display screen *****************************************************************************/ void GRAPHICS_ShowStatus(void) { GLIB_clear(&glibContext); GLIB_drawString(&glibContext, "EFR32 Sample App", 17, 5, 5, 0); DMD_updateDisplay(); }
/***************************************************************************//** * @brief * Main function. Setup ADC, FFT, clocks, PRS, DMA, Timer, * and process FFT forever. *******************************************************************************/ int main(void) { arm_status status; char buf[20]; bool redraw = false; int glibStatus; DMA_Init_TypeDef dmaInit; TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT; /* Initialize DVK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceEtmSetup(); /* Connect audio in to ADC */ BSP_PeripheralAccess(BSP_AUDIO_IN, true); /* Wait a while in order to let signal from audio-in stabilize after */ /* enabling audio-in peripheral. */ RTCDRV_Trigger(1000, NULL); EMU_EnterEM2(true); /* Initialize the CFFT/CIFFT module */ status = arm_rfft_init_f32(&rfft_instance, &cfft_instance, GUITAR_AUDIO_BUFFER_SAMPLES, 0, /* forward transform */ 1); /* normal, not bitreversed, order */ if (status != ARM_MATH_SUCCESS) { /* Error initializing RFFT module. */ while (1) ; } dataReadyForFFT = false; processingFFT = false; /* Use the HFXO. We still only manage to process about * a third the buffers through FFT */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) { while (1) ; } /* Enable clocks required */ CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); CMU_ClockEnable(cmuClock_PRS, true); CMU_ClockEnable(cmuClock_DMA, true); CMU_ClockEnable(cmuClock_TIMER0, true); NVIC_SetPriority(DMA_IRQn, 0); /* Highest priority */ /* Configure peripheral reflex system used by TIMER to trigger ADC/DAC */ guitarPRSConfig(GUITAR_PRS_CHANNEL); /* Configure general DMA issues */ dmaInit.hprot = 0; dmaInit.controlBlock = dmaControlBlock; DMA_Init(&dmaInit); /* Configure ADC used for audio-in */ guitarADCConfig(); /* Trigger sampling according to configured sample rate */ TIMER_TopSet(TIMER0, CMU_ClockFreqGet(cmuClock_HFPER) / GUITAR_AUDIO_SAMPLE_RATE); TIMER_Init(TIMER0, &timerInit); /* Wait until we have control over display */ while(!redraw) { redraw = TFT_AddressMappedInit(); } /* Init graphics context - abort on failure */ glibStatus = GLIB_contextInit(&gc); if (glibStatus != GLIB_OK) while (1) ; /* Clear the screen */ gc.backgroundColor = GLIB_rgbColor(0, 0, 0); GLIB_clear(&gc); while (1) { while (dataReadyForFFT) { float32_t freq; processingFFT = true; processFFT(); dataReadyForFFT = false; processingFFT = false; /* Get frequency and make string with one decimal accuracy */ freq = getFreq(); sprintf(buf, "%6.1f", freq); /* Check if we should control TFT display instead of AEM/board controller */ redraw = TFT_AddressMappedInit(); if (redraw) { gc.foregroundColor = GLIB_rgbColor(220, 220, 220); gc.backgroundColor = GLIB_rgbColor(0, 0, 0); /* Print the frequency somewhere in the middle of the screen */ GLIB_drawString(&gc, buf, strlen(buf), 100, 120, 1); } } EMU_EnterEM1(); } }