/** * @brief Init camera frame buffer with fixed color in format RGB565 * using DMA2D service. * @param sizeX: Size in X of rectangular region of the Camera frame buffer to initialize (in pixels unit) * @param sizeY: Size in Y of rectangular region of the Camera frame buffer to initialize (in lines unit) * @param argb_Value : Initialization value (pattern ARGB8888) to be applied to all rectangular region selected. * @retval Status CAMERA_OK or CAMERA_ERROR */ static uint32_t AnimationCameraFrameBufferRgb565_Init(uint32_t sizeX, uint32_t sizeY, uint32_t argb8888_Value) { HAL_StatusTypeDef hal_status = HAL_OK; uint32_t status = CAMERA_ERROR; if((sizeX <= CAMERA_VGA_RES_X) && (sizeY <= CAMERA_VGA_RES_Y)) { /* Register to memory mode with RGB565 as colorMode */ hdma2d_eval.Init.Mode = DMA2D_R2M; /* Mode Register to Memory */ hdma2d_eval.Init.ColorMode = DMA2D_RGB565; /* Output color mode */ hdma2d_eval.Init.OutputOffset = 0x0; /* No offset in output */ hdma2d_eval.Instance = DMA2D; hal_status = HAL_DMA2D_Init(&hdma2d_eval); BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); hal_status = HAL_DMA2D_Start(&hdma2d_eval, argb8888_Value, /* Color value in Register to Memory DMA2D mode */ (uint32_t)CAMERA_FB_START_ADDR, /* DMA2D output buffer */ sizeX, /* width of buffer in pixels */ sizeY); /* height of buffer in lines */ BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); /* Polling For DMA transfer */ hal_status = HAL_DMA2D_PollForTransfer(&hdma2d_eval, 10); BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); status = CAMERA_OK; } return (status); }
/** * @brief Init camera frame buffer with fixed color in format RGB565 * to a LCD display frame buffer line in format ARGB8888 using DMA2D service. * @param sizeX: Size in X of rectangular region of the Camera frame buffer to initialize (in pixels unit) * @param sizeX: Size in X of rectangular region of the Camera frame buffer to initialize (in pixels unit) * @param argb_Value : Initialization value (pattern ARGB8888) to be applied to all rectangular region selected. * @retval Status CAMERA_OK or CAMERA_ERROR */ static uint32_t CameraFrameBufferRgb565_Init(uint32_t sizeX, uint32_t sizeY, uint32_t argb8888_Value) { HAL_StatusTypeDef hal_status = HAL_OK; uint32_t status = CAMERA_ERROR; if((sizeX <= CAMERA_VGA_RES_X) && (sizeY <= CAMERA_VGA_RES_Y)) { /* Register to memory mode with RGB565 as colorMode */ hdma2d_eval.Init.Mode = DMA2D_R2M; /* Mode Register to Memory */ hdma2d_eval.Init.ColorMode = DMA2D_RGB565; /* Output color mode */ hdma2d_eval.Init.OutputOffset = 0x0; /* No offset in output */ /* Set callback functions on transfer complete and transfer error */ hdma2d_eval.XferCpltCallback = Camera_FrameBuffer_Init_TransferComplete; hdma2d_eval.XferErrorCallback = Camera_FrameBuffer_Init_TransferError; hdma2d_eval.Instance = DMA2D; hal_status = HAL_DMA2D_Init(&hdma2d_eval); BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); hal_status = HAL_DMA2D_Start_IT(&hdma2d_eval, argb8888_Value, /* Color value in Register to Memory DMA2D mode */ (uint32_t)CAMERA_FB_START_ADDR, /* DMA2D output buffer */ sizeX, /* width of buffer in pixels */ sizeY); /* height of buffer in lines */ BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); status = CAMERA_OK; } return (status); }
/** * @brief Touchscreen Demo3 : test touchscreen single and dual touch in interrupt mode * @param None * @retval None */ void Touchscreen_demo3(void) { uint8_t exitTsUseCase = 0; uint32_t ts_status = TS_OK; /* Reset touch data information */ BSP_TEST_APPLI_ASSERT(BSP_TS_ResetTouchData(&TS_State)); /* If calibration is not yet done, this is an error : touchscreen demo 1 should have been run before anyway */ if (TouchScreen_IsCalibrationDone() == 0) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR : touchscreen not yet calibrated.", CENTER_MODE); ts_status = TS_ERROR; } if(ts_status == TS_OK) { /* Display touch screen demo3 description */ Touchscreen_SetHint_Demo(TOUCHSCREEN_DEMO_3); /* Set touchscreen in Interrupt mode and program MFX accordingly to receipt INT falling edge from MFX */ /* and generate EXTI when occurs */ ts_status = BSP_TS_ITConfig(); BSP_TEST_APPLI_ASSERT(ts_status != TS_OK); while (exitTsUseCase == 0) { /* In order to avoid using I2C to ask MFX when not need (e.g. BSP_TS_ITGetStatus) */ /* check first if EXTI occurred */ /* Note : variable 'ts_exti_received' is set to 1b1' by HAL_GPIO_EXTI_Callback() */ if(mfx_exti_received == 1) { mfx_exti_received = 0; if(BSP_TS_ITGetStatus() == TS_IRQ_PENDING) { /* Clear first BSP TS IRQ */ BSP_TS_ITClear(); /* Handle the new touch */ Touchscreen_Handle_NewTouch(); } } /* Wait for a key button press to switch to next test case of BSP validation application */ /* Otherwise stay in the test */ exitTsUseCase = CheckForUserInput(); HAL_Delay(10); } /* of while (exitTsUseCase == 0) */ } /* of if(status == TS_OK) */ }
/** * @brief Converts a camera buffer line of format RGB565 * to a LCD display frame buffer column in format ARGB8888 using DMA2D service. * This handles the rotation of 90 degrees hour direction of camera buffer. * @param pSrc: Pointer to source buffer * @param pDst: Pointer to destination buffer * @param xSize: Buffer width * @param lineStridePixels: line stride in pixels unit * @retval None */ static void ConvertCameraLineRgb565ToLcdColumnARGB8888(void *pSrc, void *pDst, uint32_t xSize, uint32_t lineStridePixels) { HAL_StatusTypeDef hal_status = HAL_OK; /* Configure the DMA2D Mode, Color Mode and output offset */ hdma2d_eval.Init.Mode = DMA2D_M2M_PFC; hdma2d_eval.Init.ColorMode = DMA2D_ARGB8888; hdma2d_eval.Init.OutputOffset = lineStridePixels; /* Foreground Configuration */ hdma2d_eval.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; hdma2d_eval.LayerCfg[1].InputAlpha = 0xFF; hdma2d_eval.LayerCfg[1].InputColorMode = DMA2D_RGB565; hdma2d_eval.LayerCfg[1].InputOffset = 0; hdma2d_eval.Instance = DMA2D; /* DMA2D Initialization */ if (HAL_DMA2D_Init(&hdma2d_eval) == HAL_OK) { if (HAL_DMA2D_ConfigLayer(&hdma2d_eval, 1) == HAL_OK) { /* xSize x 1 = size in pixels to copy */ /* Width = 1, Height = xSize */ if (HAL_DMA2D_Start(&hdma2d_eval, (uint32_t)pSrc, (uint32_t)pDst, 1, xSize) == HAL_OK) { /* Polling For DMA transfer */ hal_status = HAL_DMA2D_PollForTransfer(&hdma2d_eval, 10); BSP_TEST_APPLI_ASSERT(hal_status != HAL_OK); } } } }
/** * @brief Touchscreen Demo2 : test touchscreen single and dual touch in polling mode * @param None * @retval None */ void Touchscreen_demo2(void) { uint8_t exitTsUseCase = 0; uint32_t ts_status = TS_OK; /* Reset touch data information */ BSP_TEST_APPLI_ASSERT(BSP_TS_ResetTouchData(&TS_State)); /* If calibration is not yet done, this is an error : touchscreen demo 1 should have been run before anyway */ if (TouchScreen_IsCalibrationDone() == 1) { } /* of if (TouchScreen_IsCalibrationDone() == 1) */ else { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR : touchscreen not yet calibrated.", CENTER_MODE); ts_status = TS_ERROR; } if(ts_status == TS_OK) { /* Display touch screen demo2 description */ Touchscreen_SetHint_Demo(TOUCHSCREEN_DEMO_2); while (exitTsUseCase == 0) { Touchscreen_Handle_NewTouch(); /* Wait for a key button press to switch to next test case of BSP validation application */ /* Otherwise stay in the test */ exitTsUseCase = CheckForUserInput(); HAL_Delay(100); } /* of while (exitTsUseCase == 0) */ } /* of if(status == TS_OK) */ }
/** * @brief LCD Log demo * @param None * @retval None */ void Log_demo(void) { TS_ActionTypeDef ts_action = TS_ACT_NONE; uint8_t ts_status = TS_OK; uint8_t i = 0; /* Wait For User inputs */ while (CheckForUserInput() == 0); if (TouchScreen_IsCalibrationDone() == 0) { ts_status = Touchscreen_Calibration(); if(ts_status == TS_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"Touchscreen calibration success.", CENTER_MODE); } else { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR : touchscreen not yet calibrated.", CENTER_MODE); ts_status = TS_ERROR; } } /* of if (TouchScreen_IsCalibrationDone() == 0) */ /* Initialize LCD Log module */ LCD_LOG_Init(); /* Show Header and Footer texts */ LCD_LOG_SetHeader((uint8_t *)"Log Example"); LCD_LOG_SetFooter((uint8_t *)"Use touch up/down to scroll"); /* Output User logs */ for (i = 0; i < 10; i++) { LCD_UsrLog ("This is Line %d \n", i); } HAL_Delay(1000); /* Clear Old logs */ LCD_LOG_ClearTextZone(); /* Output new user logs */ for (i = 0; i < 30; i++) { LCD_UsrLog ("This is Line %d \n", i); } if(ts_status == TS_OK) { /* Set touchscreen in Interrupt mode and program EXTI accordingly on falling edge of TS_INT pin */ ts_status = BSP_TS_ITConfig(); BSP_TEST_APPLI_ASSERT(ts_status != TS_OK); Touchscreen_DrawBackground_Circle_Buttons(32); BSP_LCD_SetFont(&Font12); } /* Check for joystick user input for scroll (back and forward) */ while (1) { ts_action = (TS_ActionTypeDef) TouchScreen_GetTouchPosition(); switch (ts_action) { case TS_ACT_SCROLL_UP: LCD_LOG_ScrollBack(); break; case TS_ACT_SCROLL_DOWN: LCD_LOG_ScrollForward(); break; default: break; } if (CheckForUserInput() > 0) { return; } HAL_Delay (10); } }
/** * @brief Audio Play demo * @param None * @retval None */ void AudioPlay_demo (void) { uint8_t ts_status = TS_OK; uint32_t *AudioFreq_ptr; AudioFreq_ptr = AudioFreq+6; /*AF_48K*/ uint8_t FreqStr[256] = {0}; Point Points2[] = {{100, 140}, {160, 180}, {100, 220}}; uwPauseEnabledStatus = 1; /* 0 when audio is running, 1 when Pause is on */ uwVolume = AUDIO_DEFAULT_VOLUME; if (TouchScreen_IsCalibrationDone() == 0) { ts_status = Touchscreen_Calibration(); if(ts_status == TS_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"Touchscreen calibration success.", CENTER_MODE); } else { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *)"ERROR : touchscreen not yet calibrated.", CENTER_MODE); ts_status = TS_ERROR; } } /* of if (TouchScreen_IsCalibrationDone() == 0) */ AudioPlay_SetHint(); BSP_LCD_SetFont(&Font20); /* if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_SPEAKER, uwVolume, *AudioFreq_ptr) == 0) if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, uwVolume, *AudioFreq_ptr) == 0)*/ if(BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, uwVolume, *AudioFreq_ptr) == 0) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)" AUDIO CODEC OK ", CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)" AUDIO CODEC FAIL ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(7), (uint8_t *)" Try to reset board ", CENTER_MODE); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (DISCOVERY_AUDIO_TransferComplete_CallBack() or DISCOVERY_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Play_Start((uint32_t *)AUDIO_SRC_FILE_ADDRESS, (uint32_t)AUDIO_FILE_SIZE); /* Display the state on the screen */ BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PLAYING... ", CENTER_MODE); sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); BSP_LCD_SetFont(&Font16); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 40, (uint8_t *)"Hear nothing ? Have you copied the audio file with STM-LINK UTILITY ?", CENTER_MODE); if(ts_status == TS_OK) { /* Set touchscreen in Interrupt mode and program EXTI accordingly on falling edge of TS_INT pin */ ts_status = BSP_TS_ITConfig(); BSP_TEST_APPLI_ASSERT(ts_status != TS_OK); Touchscreen_DrawBackground_Circle_Buttons(16); } BSP_LCD_SetFont(&Font20); /* draw play triangle */ BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillPolygon(Points2, 3); /* IMPORTANT: AUDIO_Play_Process() is called by the SysTick Handler, as it should be called within a periodic process */ /* Infinite loop */ while (1) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); /* Get the TouchScreen State */ ts_action = (TS_ActionTypeDef) TouchScreen_GetTouchPosition(); switch (ts_action) { case TS_ACT_VOLUME_UP: /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_VOLUME_DOWN: /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; sprintf((char*)FreqStr, " VOL: %3lu ", uwVolume); BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_FREQ_DOWN: /*Decrease Frequency */ if (*AudioFreq_ptr != 8000) { AudioFreq_ptr--; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_FREQ_UP: /* Increase Frequency */ if (*AudioFreq_ptr != 96000) { AudioFreq_ptr++; sprintf((char*)FreqStr, " FREQ: %6lu ", *AudioFreq_ptr); BSP_AUDIO_OUT_Pause(); BSP_AUDIO_OUT_SetFrequency(*AudioFreq_ptr); BSP_AUDIO_OUT_Resume(); BSP_AUDIO_OUT_SetVolume(uwVolume); } BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)FreqStr, CENTER_MODE); break; case TS_ACT_PAUSE: /* Set Pause / Resume */ if (uwPauseEnabledStatus == 1) { /* Pause is enabled, call Resume */ BSP_AUDIO_OUT_Resume(); uwPauseEnabledStatus = 0; BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PLAYING... ", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_FillPolygon(Points2, 3); BSP_LCD_SetTextColor(LCD_COLOR_BLACK); BSP_LCD_FillRect(100, 140, 25 , 80); BSP_LCD_FillRect(140, 140, 25 , 80); } else { /* Pause the playback */ BSP_AUDIO_OUT_Pause(); uwPauseEnabledStatus = 1; BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" PAUSE ... ", CENTER_MODE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_FillRect(100, 140, 80 , 80); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillPolygon(Points2, 3); } HAL_Delay(200); break; default: break; } /* Toggle LED4 */ BSP_LED_Toggle(LED4); /* Insert 100 ms delay */ HAL_Delay(100); if (CheckForUserInput() > 0) { /* Set LED4 */ BSP_LED_On(LED4); BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); return; } } }
/** * @brief Animation demo * @param None * @retval None */ void Animation_demo (void) { uint32_t exit = 0; uint32_t CameraChangeResolutionAsked = 1; #ifdef USE_CAMERA_IN_ANIMATION uint32_t camera_status = CAMERA_OK; uint32_t argb8888_Value = 0x00556677; uint32_t CameraResX = CAMERA_VGA_RES_X; uint32_t CameraResY = CAMERA_VGA_RES_Y; #endif /* USE_CAMERA_IN_ANIMATION */ Animation_SetHint(); /*## Camera Initialization and start capture ############################*/ BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); #ifdef USE_CAMERA_IN_ANIMATION BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - ANIMATION_STATUS_TEXT_POS, (uint8_t *)"Wait for camera initialization...", CENTER_MODE); #endif /* USE_CAMERA_IN_ANIMATION */ /* Infinite loop */ while (exit == 0) { if(CameraChangeResolutionAsked) /* A camera change resolution has been asked */ { CameraChangeResolutionAsked = 0; BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); #ifdef USE_CAMERA_IN_ANIMATION /* Initialize the Camera */ camera_status = BSP_CAMERA_Init(RESOLUTION_R640x480); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - ANIMATION_STATUS_TEXT_POS, (uint8_t *)" VGA camera stream ", CENTER_MODE); if (camera_status != CAMERA_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - ANIMATION_STATUS_TEXT_POS - 15, (uint8_t *)" CAMERA INIT ERROR ", CENTER_MODE); } #endif /* USE_CAMERA_IN_ANIMATION */ /* Clear first the LCD */ BSP_LCD_Clear(LCD_COLOR_WHITE); #ifdef USE_CAMERA_IN_ANIMATION /* Init or Re-Init Camera frame buffer by using DMA2D engine in mode Register to Memory */ camera_status = AnimationCameraFrameBufferRgb565_Init(CameraResX, CameraResY, argb8888_Value); BSP_TEST_APPLI_ASSERT(camera_status != CAMERA_OK); /* Start / Restart camera stream */ BSP_CAMERA_ContinuousStart((uint8_t *)CAMERA_FB_START_ADDR); #endif /* USE_CAMERA_IN_ANIMATION */ /* Forbid in that case the DMA2D copy from Camera frame buffer to LCD Frame buffer location by BSP_CAMERA_LineEventCallback() */ Camera_AllowDma2dCopyCamFrmBuffToLcdFrmBuff = 0; } /* of if (CameraChangeResolutionAsked) */ /* Toggle LED4 */ BSP_LED_Toggle(LED4); /* Insert 100 ms delay */ HAL_Delay(100); /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 400 ms delay */ HAL_Delay(400); if(CheckForUserInput() > 0) { exit = 1; } anime_draw_scene(anime_lcd_frame_buffer); } /* of while (exit == 0) */ #ifdef USE_CAMERA_IN_ANIMATION /* Stop camera stream */ camera_status = BSP_CAMERA_Stop(); BSP_TEST_APPLI_ASSERT(camera_status != CAMERA_OK); #endif /* USE_CAMERA_IN_ANIMATION */ }
/** * @brief Touchscreen Demo1 : test touchscreen calibration and single touch in polling mode * @param None * @retval None */ void Touchscreen_demo1(void) { uint16_t x1, y1; uint8_t state = 0; uint8_t exitTsUseCase = 0; uint32_t ts_status = TS_OK; /* Reset touch data information */ BSP_TEST_APPLI_ASSERT(BSP_TS_ResetTouchData(&TS_State)); /* If calibration is not yet done, proceed with calibration */ if (TouchScreen_IsCalibrationDone() == 0) { ts_status = Touchscreen_Calibration(); if (ts_status == TS_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *) "Touchscreen calibration success.", CENTER_MODE); } } /* of if (TouchScreen_IsCalibrationDone() == 0) */ if(ts_status == TS_OK) { /* Display touch screen demo description */ Touchscreen_SetHint_Demo(TOUCHSCREEN_DEMO_1); Touchscreen_DrawBackground_Demo1(state); while (exitTsUseCase == 0) { if (ts_status == TS_OK) { /* Check in polling mode in touch screen the touch status and coordinates */ /* of touches if touch occurred */ ts_status = BSP_TS_GetState(&TS_State); if(TS_State.touchDetected) { /* One or dual touch have been detected */ /* Only take into account the first touch so far */ /* Get X and Y position of the first touch post calibrated */ x1 = TouchScreen_Get_Calibrated_X(TS_State.touchX[0]); y1 = TouchScreen_Get_Calibrated_Y(TS_State.touchY[0]); if ((y1 > (CIRCLE_YPOS(1) - CIRCLE_RADIUS)) && (y1 < (CIRCLE_YPOS(1) + CIRCLE_RADIUS))) { if ((x1 > (CIRCLE_XPOS(1) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(1) + CIRCLE_RADIUS))) { if ((state & 1) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_FillCircle(CIRCLE_XPOS(1), CIRCLE_YPOS(1), CIRCLE_RADIUS); state = 1; } } if ((x1 > (CIRCLE_XPOS(2) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(2) + CIRCLE_RADIUS))) { if ((state & 2) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_FillCircle(CIRCLE_XPOS(2), CIRCLE_YPOS(2), CIRCLE_RADIUS); state = 2; } } if ((x1 > (CIRCLE_XPOS(3) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(3) + CIRCLE_RADIUS))) { if ((state & 4) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_YELLOW); BSP_LCD_FillCircle(CIRCLE_XPOS(3), CIRCLE_YPOS(3), CIRCLE_RADIUS); state = 4; } } if ((x1 > (CIRCLE_XPOS(4) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(4) + CIRCLE_RADIUS))) { if ((state & 8) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillCircle(CIRCLE_XPOS(4), CIRCLE_YPOS(3), CIRCLE_RADIUS); state = 8; } } } } /* of if(TS_State.TouchDetected) */ } /* of if (ts_status == TS_OK) */ /* Wait for a key button press to switch to next test case of BSP validation application */ /* Otherwise stay in the test */ exitTsUseCase = CheckForUserInput(); HAL_Delay(20); } /* of while (exitTsUseCase == 0) */ } /* of if(status == TS_OK) */ }
/** * @brief Camera demo * @param None * @retval None */ void Camera_demo (void) { uint8_t status = 0; uint32_t exit = 0; uint32_t camera_status = CAMERA_OK; uint32_t argb8888_Value = 0x00556677; Camera_SetHint(); /* Activate joystick as used for contrast, brightness and visual effect settings */ /* on image from camera sensor */ status = BSP_JOY_Init(JOY_MODE_GPIO); if (status != IO_OK) { BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)"ERROR", CENTER_MODE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS - 15, (uint8_t *)"Joystick cannot be initialized", CENTER_MODE); } /*## Camera Initialization and start capture ############################*/ BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)"Wait for camera initialization...", CENTER_MODE); CameraResIndex = CAMERA_R160x120; /* Set QQVGA default resolution */ CameraChangeResolutionAsked = 1; CameraResX = CAMERA_QQVGA_RES_X; CameraResY = CAMERA_QQVGA_RES_Y; /* Infinite loop */ while (exit == 0) { if (CameraChangeResolutionAsked) /* A camera change resolution has been asked */ { CameraChangeResolutionAsked = 0; if (CameraResIndex > CAMERA_R160x120) { /* If camera stream already started, it has to be stopped before reconfiguration */ /* Stop camera stream */ refresh_authorized = 0; camera_status = BSP_CAMERA_Stop(); BSP_TEST_APPLI_ASSERT(camera_status != CAMERA_OK); /* Clear screen */ Camera_SetHint(); BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)"Wait for camera initialization...", CENTER_MODE); } BSP_LCD_SetBackColor(LCD_COLOR_WHITE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); switch (CameraResIndex) { case CAMERA_R160x120: CameraResX = CAMERA_QQVGA_RES_X; CameraResY = CAMERA_QQVGA_RES_Y; /* Initialize the Camera */ camera_status = BSP_CAMERA_Init(RESOLUTION_R160x120); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" QQVGA camera stream ", CENTER_MODE); break; case CAMERA_R320x240: CameraResX = CAMERA_QVGA_RES_X; CameraResY = CAMERA_QVGA_RES_Y; /* Initialize the Camera */ camera_status = BSP_CAMERA_Init(RESOLUTION_R320x240); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" QVGA camera stream ", CENTER_MODE); break; case CAMERA_R480x272: CameraResX = CAMERA_480x272_RES_X; CameraResY = CAMERA_480x272_RES_Y; /* Initialize the Camera */ camera_status = BSP_CAMERA_Init(RESOLUTION_R480x272); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" 480x272 camera stream ", CENTER_MODE); break; case CAMERA_R640x480: CameraResX = CAMERA_VGA_RES_X; CameraResY = CAMERA_VGA_RES_Y; /* Initialize the Camera */ camera_status = BSP_CAMERA_Init(RESOLUTION_R640x480); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" VGA camera stream ", CENTER_MODE); break; default : break; } if (camera_status != CAMERA_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS - 15, (uint8_t *)" CAMERA INIT ERROR ", CENTER_MODE); } offset_cam = 0; offset_lcd = 0; display_line_counter = 0; display_rotated_line_counter = 0; special_effect = CAMERA_BLACK_WHITE; /* No special effect applied */ color_effect = CAMERA_BLACK_WHITE_NORMAL; contrast = CAMERA_CONTRAST_LEVEL2; /* Mid-level brightness */ brightness = CAMERA_BRIGHTNESS_LEVEL2; /* Mid-level contrast */ refresh_authorized = 1; CameraFrameBufferInitComplete = 0; CameraFrameBufferInitError = 0; if(CameraResIndex == CAMERA_R640x480) { /* Clear first the LCD */ BSP_LCD_Clear(LCD_COLOR_WHITE); } /* Init or Re-Init Camera frame buffer by using DMA2D engine in mode Register to Memory */ camera_status = CameraFrameBufferRgb565_Init(CAMERA_VGA_RES_X, CAMERA_VGA_RES_Y, argb8888_Value); BSP_TEST_APPLI_ASSERT(camera_status != CAMERA_OK); /* Wait end of DMA2D operation of error : via IT callback update */ while((CameraFrameBufferInitComplete == 0) && (CameraFrameBufferInitError == 0)) {;} /* Assert if error : no transfer complete */ BSP_TEST_APPLI_ASSERT(CameraFrameBufferInitComplete != 1); /* Start / Restart camera stream */ BSP_CAMERA_ContinuousStart((uint8_t *)CAMERA_FB_START_ADDR); /* Allow DMA2D copy from Camera frame buffer to LCD Frame buffer location */ Camera_AllowDma2dCopyCamFrmBuffToLcdFrmBuff = 1; } /* (CameraResIndex != CameraCurrentResIndex) */ /* Get the Joystick State */ JoyState = BSP_JOY_GetState(); switch (JoyState) { case JOY_UP: if (brightness < CAMERA_BRIGHTNESS_MAX) { brightness++; } else { JoyState = JOY_NONE; /* Cancel brightness change */ } break; case JOY_DOWN: if (brightness > CAMERA_BRIGHTNESS_MIN) { brightness--; } else { JoyState = JOY_NONE; /* Cancel brightness change */ } break; case JOY_LEFT: if (contrast > CAMERA_CONTRAST_MIN) { contrast--; } else { JoyState = JOY_NONE; /* Cancel contrast change */ } break; case JOY_RIGHT: if (contrast < CAMERA_CONTRAST_MAX) { contrast++; } else { JoyState = JOY_NONE; /* Cancel contrast change */ } break; case JOY_SEL: switch (special_effect) { case CAMERA_BLACK_WHITE : if (color_effect < CAMERA_BLACK_WHITE_NORMAL) { /* From BW effect to another BW effect */ color_effect++; } else { /* From BW or none effect to color effect */ special_effect = CAMERA_COLOR_EFFECT; color_effect = CAMERA_COLOR_EFFECT_ANTIQUE; } break; case CAMERA_COLOR_EFFECT : if (color_effect < CAMERA_COLOR_EFFECT_RED) { /* From color effect to another color effect */ color_effect++; } else { /* From color effect to BW effect */ special_effect = CAMERA_BLACK_WHITE; color_effect = CAMERA_BLACK_WHITE_BW; } break; default : /* None effect */ special_effect = CAMERA_BLACK_WHITE; color_effect = CAMERA_BLACK_WHITE_NORMAL; break; } break; default: break; } if ((JoyState == JOY_UP) || (JoyState == JOY_DOWN) || (JoyState == JOY_LEFT) || (JoyState == JOY_RIGHT)) { /* A brightness change has been asked */ BSP_CAMERA_ContrastBrightnessConfig(contrast, brightness); if ((JoyState == JOY_UP) || (JoyState == JOY_DOWN)) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Brightness change ", CENTER_MODE); } else { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Contrast change ", CENTER_MODE); } } if (JoyState == JOY_SEL) { /* A color effect change has been asked */ switch (special_effect) { case CAMERA_BLACK_WHITE : BSP_CAMERA_BlackWhiteConfig(color_effect); switch (color_effect) { case CAMERA_BLACK_WHITE_NORMAL : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" No effect applied ", CENTER_MODE); break; case CAMERA_BLACK_WHITE_BW : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Black and white effect applied ", CENTER_MODE); break; case CAMERA_BLACK_WHITE_NEGATIVE : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Negative effect applied ", CENTER_MODE); break; case CAMERA_BLACK_WHITE_BW_NEGATIVE : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" BW negative effect applied ", CENTER_MODE); break; } break; case CAMERA_COLOR_EFFECT : BSP_CAMERA_ColorEffectConfig(color_effect); switch (color_effect) { case CAMERA_COLOR_EFFECT_ANTIQUE : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Sepia color effect applied ", CENTER_MODE); break; case CAMERA_COLOR_EFFECT_BLUE : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Blue color effect applied ", CENTER_MODE); break; case CAMERA_COLOR_EFFECT_GREEN : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Green color effect applied ", CENTER_MODE); break; case CAMERA_COLOR_EFFECT_RED : BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - CAMERA_STATUS_TEXT_POS, (uint8_t *)" Red color effect applied ", CENTER_MODE); break; } break; } } /* Toggle LED4 */ BSP_LED_Toggle(LED3); /* Insert 100 ms delay */ HAL_Delay(100); /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 100 ms delay */ HAL_Delay(100); if (CheckForUserInput() > 0) { if (CameraResIndex < CAMERA_RES_INDEX_MAX) { CameraResIndex++; /* Switch to higher resolution */ CameraChangeResolutionAsked = 1; /* Disallow DMA2D copy from Camera frame buffer to LCD Frame buffer location */ Camera_AllowDma2dCopyCamFrmBuffToLcdFrmBuff = 0; /* Insert 10 ms delay */ HAL_Delay(10); } else { BSP_CAMERA_DeInit(); exit = 1; } } } /* Stop camera stream */ camera_status = BSP_CAMERA_Stop(); BSP_TEST_APPLI_ASSERT(camera_status != CAMERA_OK); /* End of camera demo */ }