Made calls to 'display_renderRows' and 'display_render' blocking, thus not requiring anymore to busy wiat on 'display_renderingInProgress'. Modifications involved only MDx display driver, the others were already blocking.
This commit is contained in:
parent
e0d5d8278d
commit
6ca3faceaf
|
|
@ -29,7 +29,8 @@
|
||||||
#include <hwconfig.h>
|
#include <hwconfig.h>
|
||||||
|
|
||||||
/* If battery level is below 0% draw low battery screen, wait and shutdown */
|
/* If battery level is below 0% draw low battery screen, wait and shutdown */
|
||||||
void check_battery() {
|
void check_battery()
|
||||||
|
{
|
||||||
OS_ERR os_err;
|
OS_ERR os_err;
|
||||||
|
|
||||||
// Check battery percentage
|
// Check battery percentage
|
||||||
|
|
@ -37,7 +38,8 @@ void check_battery() {
|
||||||
float charge = battery_getCharge(vbat);
|
float charge = battery_getCharge(vbat);
|
||||||
|
|
||||||
// Draw low battery screen
|
// Draw low battery screen
|
||||||
if (charge <= 0) {
|
if (charge <= 0)
|
||||||
|
{
|
||||||
ui_drawLowBatteryScreen();
|
ui_drawLowBatteryScreen();
|
||||||
gfx_render();
|
gfx_render();
|
||||||
|
|
||||||
|
|
@ -67,7 +69,6 @@ int main(void)
|
||||||
// Display splash screen
|
// Display splash screen
|
||||||
ui_drawSplashScreen();
|
ui_drawSplashScreen();
|
||||||
gfx_render();
|
gfx_render();
|
||||||
while(gfx_renderingInProgress());
|
|
||||||
|
|
||||||
// Wait 30ms before turning on backlight to hide random pixels on screen
|
// Wait 30ms before turning on backlight to hide random pixels on screen
|
||||||
OSTimeDlyHMSM(0u, 0u, 0u, 30u, OS_OPT_TIME_HMSM_STRICT, &os_err);
|
OSTimeDlyHMSM(0u, 0u, 0u, 30u, OS_OPT_TIME_HMSM_STRICT, &os_err);
|
||||||
|
|
@ -80,7 +81,8 @@ int main(void)
|
||||||
create_threads();
|
create_threads();
|
||||||
|
|
||||||
// Auxiliary functions loop
|
// Auxiliary functions loop
|
||||||
while(true) {
|
while(true)
|
||||||
|
{
|
||||||
check_battery();
|
check_battery();
|
||||||
OSTimeDlyHMSM(0u, 1u, 0u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
|
OSTimeDlyHMSM(0u, 1u, 0u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,6 @@ static void ui_task(void *arg)
|
||||||
// Initial GUI draw
|
// Initial GUI draw
|
||||||
ui_updateGUI(last_state);
|
ui_updateGUI(last_state);
|
||||||
gfx_render();
|
gfx_render();
|
||||||
while(gfx_renderingInProgress());
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
|
|
@ -112,7 +111,6 @@ static void ui_task(void *arg)
|
||||||
if(renderNeeded)
|
if(renderNeeded)
|
||||||
{
|
{
|
||||||
gfx_render();
|
gfx_render();
|
||||||
while(gfx_renderingInProgress());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't need a delay because we lock on incoming events
|
// We don't need a delay because we lock on incoming events
|
||||||
|
|
|
||||||
|
|
@ -92,12 +92,15 @@
|
||||||
* Pixel format is RGB565, 16 bit per pixel
|
* Pixel format is RGB565, 16 bit per pixel
|
||||||
*/
|
*/
|
||||||
static uint16_t frameBuffer[SCREEN_WIDTH * SCREEN_HEIGHT];
|
static uint16_t frameBuffer[SCREEN_WIDTH * SCREEN_HEIGHT];
|
||||||
|
OS_FLAG_GRP renderCompleted;
|
||||||
|
OS_ERR err;
|
||||||
|
|
||||||
void __attribute__((used)) DMA2_Stream7_IRQHandler()
|
void __attribute__((used)) DMA2_Stream7_IRQHandler()
|
||||||
{
|
{
|
||||||
OSIntEnter();
|
OSIntEnter();
|
||||||
DMA2->HIFCR |= DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTEIF7; /* Clear flags */
|
DMA2->HIFCR |= DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTEIF7; /* Clear flags */
|
||||||
gpio_setPin(LCD_CS);
|
gpio_setPin(LCD_CS);
|
||||||
|
OSFlagPost(&renderCompleted, 0x01, OS_OPT_POST_FLAG_SET, &err);
|
||||||
OSIntExit();
|
OSIntExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,6 +116,9 @@ static inline __attribute__((__always_inline__)) void writeData(uint8_t val)
|
||||||
|
|
||||||
void display_init()
|
void display_init()
|
||||||
{
|
{
|
||||||
|
/* Create flag for render completion wait */
|
||||||
|
OSFlagCreate(&renderCompleted, "", 0, &err);
|
||||||
|
|
||||||
/* Clear framebuffer, setting all pixels to 0xFFFF makes the screen white */
|
/* Clear framebuffer, setting all pixels to 0xFFFF makes the screen white */
|
||||||
memset(frameBuffer, 0xFF, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(uint16_t));
|
memset(frameBuffer, 0xFF, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(uint16_t));
|
||||||
|
|
||||||
|
|
@ -321,6 +327,8 @@ void display_init()
|
||||||
|
|
||||||
void display_terminate()
|
void display_terminate()
|
||||||
{
|
{
|
||||||
|
OSFlagDel(&renderCompleted, OS_OPT_DEL_NO_PEND, &err);
|
||||||
|
|
||||||
/* Shut off FSMC and deallocate framebuffer */
|
/* Shut off FSMC and deallocate framebuffer */
|
||||||
RCC->AHB3ENR &= ~RCC_AHB3ENR_FSMCEN;
|
RCC->AHB3ENR &= ~RCC_AHB3ENR_FSMCEN;
|
||||||
__DSB();
|
__DSB();
|
||||||
|
|
@ -386,6 +394,10 @@ void display_renderRows(uint8_t startRow, uint8_t endRow)
|
||||||
| DMA_SxCR_TCIE /* Transfer complete interrupt */
|
| DMA_SxCR_TCIE /* Transfer complete interrupt */
|
||||||
| DMA_SxCR_TEIE /* Transfer error interrupt */
|
| DMA_SxCR_TEIE /* Transfer error interrupt */
|
||||||
| DMA_SxCR_EN; /* Start transfer */
|
| DMA_SxCR_EN; /* Start transfer */
|
||||||
|
|
||||||
|
OSFlagPend(&renderCompleted, 0x01, 0, OS_OPT_PEND_FLAG_SET_ANY |
|
||||||
|
OS_OPT_PEND_FLAG_CONSUME |
|
||||||
|
OS_OPT_PEND_BLOCKING, NULL, &err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_render()
|
void display_render()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue