blob: e430e01ddb82dd576c5a9ebc14f668f3728d1ceb [file] [log] [blame]
/**
* @file
* @brief User Interface core logic for demo.
*******************************************************************************
* # License
* <b>Copyright 2020 Silicon Laboratories Inc.
*www.silabs.com</b>
*******************************************************************************
*
* The licensor of this software is Silicon
*Laboratories Inc. Your use of this software is
*governed by the terms of Silicon Labs Master
*Software License Agreement (MSLA) available at
* www.silabs.com/about-us/legal/master-software-license-agreement.
*This software is distributed to you in Source Code
*format and is governed by the sections of the MSLA
*applicable to Source Code.
*
******************************************************************************/
#include "demo-ui.h"
#include "demo-ui-bitmaps.h"
#include "dmd/dmd.h"
#include "em_types.h"
#include "glib.h"
#include <stdio.h>
#include <string.h>
#if (defined(EFR32MG24) && defined(SL_WIFI))
#include "spi_multiplex.h"
#endif
// Main Logo and App image
#define SILICONLABS_X_POSITION ((glibContext.pDisplayGeometry->xSize - SILICONLABS_BITMAP_WIDTH) / 2)
#define SILICONLABS_Y_POSITION 0
#define APP_BITMAP_WIDTH 64
#define APP_BITMAP_HEIGHT 64
#define APP_X_POSITION ((glibContext.pDisplayGeometry->xSize - APP_BITMAP_WIDTH) / 2)
#define APP_Y_POSITION (glibContext.pDisplayGeometry->ySize - APP_BITMAP_HEIGHT - 5)
#define PROT1_ID_X_POSITION 1
#define PROT2_ID_X_POSITION 79
// Matter Logo
#define PROT2_BITMAP_WIDTH MATTER_LOGO_WIDTH
#define PROT2_BITMAP_HEIGHT MATTER_LOGO_HEIGHT
#define PROT2_X_POSITION 104
#define PROT2_Y_POSITION (APP_Y_POSITION + (APP_Y_POSITION / 2))
#define PROT2_BITMAP (matterLogoBitmap)
#define PROT2_BITMAP_CONN (matterLogoBitmap)
// Networking Protocol Logo
#ifdef SL_WIFI
#define PROT1_BITMAP_WIDTH WIFI_BITMAP_WIDTH
#define PROT1_BITMAP_HEIGHT WIFI_BITMAP_HEIGHT
#define PROT1_X_POSITION 8
#define PROT1_Y_POSITION (APP_Y_POSITION + (APP_Y_POSITION / 2))
#define PROT1_BITMAP (networkBitMap)
#define PROT1_BITMAP_CONN (networkBitMap)
#else
#define PROT1_BITMAP_WIDTH THREAD_BITMAP_WIDTH
#define PROT1_BITMAP_HEIGHT THREAD_BITMAP_HEIGHT
#define PROT1_X_POSITION 8
#define PROT1_Y_POSITION (APP_Y_POSITION + (APP_Y_POSITION / 2))
#define PROT1_BITMAP (networkBitMap)
#define PROT1_BITMAP_CONN (networkBitMap)
#endif
/*******************************************************************************
*************************** LOCAL VARIABLES ********************************
******************************************************************************/
static GLIB_Context_t glibContext; /* Global glib context */
static const uint8_t siliconlabsBitmap[] = { SILABS_BITMAP };
static const uint8_t matterLogoBitmap[] = { MATTER_LOGO_BITMAP };
static const uint8_t OnStateBitMap[] = { ON_DEMO_BITMAP };
static const uint8_t OffStateBitMap[] = { OFF_DEMO_BITMAP };
#ifdef SL_WIFI
static const uint8_t networkBitMap[] = { WIFI_BITMAP };
#else
static const uint8_t networkBitMap[] = { THREAD_BITMAP };
#endif
// Future usage
// static const uint8_t unconnectedBitMap[] = { QUESTION_MARK_BITMAP };
/*******************************************************************************
************************** LOCAL FUNCTIONS ********************************
******************************************************************************/
static void demoUIDisplayLogo(void)
{
GLIB_drawBitmap(&glibContext, SILICONLABS_X_POSITION, SILICONLABS_Y_POSITION, SILICONLABS_BITMAP_WIDTH,
SILICONLABS_BITMAP_HEIGHT, siliconlabsBitmap);
}
/*******************************************************************************
************************** GLOBAL FUNCTIONS *******************************
******************************************************************************/
void demoUIInit(GLIB_Context_t * context)
{
memcpy(&glibContext, context, sizeof(GLIB_Context_t));
}
sl_status_t updateDisplay(void)
{
#if (defined(EFR32MG24) && defined(SL_WIFI))
sl_wfx_host_pre_lcd_spi_transfer();
#endif
sl_status_t status = DMD_updateDisplay();
#if (defined(EFR32MG24) && defined(SL_WIFI))
sl_wfx_host_post_lcd_spi_transfer();
#endif
if (status != DMD_OK)
return SL_STATUS_FAIL;
return SL_STATUS_OK;
}
void demoUIDisplayHeader(char * name)
{
demoUIDisplayLogo();
if (APP_NAME_MAX_LENGTH >= strlen(name))
{
GLIB_drawStringOnLine(&glibContext, name, 5, GLIB_ALIGN_CENTER, 0, 0, true);
}
updateDisplay();
}
void demoUIDisplayApp(bool on)
{
GLIB_drawBitmap(&glibContext, APP_X_POSITION, APP_Y_POSITION, APP_BITMAP_WIDTH, APP_BITMAP_HEIGHT,
(on ? OnStateBitMap : OffStateBitMap));
updateDisplay();
}
void demoUIDisplayProtocol(demoUIProtocol protocol, bool isConnected)
{
GLIB_drawBitmap(&glibContext, (protocol == DEMO_UI_PROTOCOL1 ? PROT1_X_POSITION : PROT2_X_POSITION),
(protocol == DEMO_UI_PROTOCOL1 ? PROT1_Y_POSITION : PROT2_Y_POSITION),
(protocol == DEMO_UI_PROTOCOL1 ? PROT1_BITMAP_WIDTH : PROT2_BITMAP_WIDTH),
(protocol == DEMO_UI_PROTOCOL1 ? PROT1_BITMAP_HEIGHT : PROT2_BITMAP_HEIGHT),
(protocol == DEMO_UI_PROTOCOL1 ? (isConnected ? PROT1_BITMAP_CONN : PROT1_BITMAP)
: (isConnected ? PROT2_BITMAP_CONN : PROT2_BITMAP)));
updateDisplay();
}
void demoUIClearMainScreen(uint8_t * name)
{
GLIB_clear(&glibContext);
demoUIDisplayHeader((char *) name);
demoUIDisplayApp(false);
demoUIDisplayProtocol(DEMO_UI_PROTOCOL1, false);
demoUIDisplayProtocol(DEMO_UI_PROTOCOL2, false);
}