simplegui/VirtualSDK/Interface/src/SDKInterface.cpp
Polarix 84874dc85b 2020-03-19:
修改了SGUI_POINT的类型定义。
增加了VirtualSDK中对Delete键、Insert键和BackSpace键的键码定义。
增加了Curve组件。
2020-03-19 22:34:59 +08:00

483 lines
18 KiB
C++

/*************************************************************************/
/** Copyright. **/
/** FileName: SDKInterface.cpp **/
/** Author: Polarix **/
/** Description: SDK swap interface function defines. **/
/*************************************************************************/
//=======================================================================//
//= Include files. =//
//=======================================================================//
#include <wx/msgdlg.h>
#include "SDKInterface.h"
#include "LCDFrame.h"
#include "DemoProc.h"
//=======================================================================//
//= User definition. =//
//=======================================================================//
#define EventSyncLock() {s_clsEventSyncCS.Enter();}
#define EventSyncUnlock() {s_clsEventSyncCS.Leave();}
#define SDK_DEFAULT_EVENT_SYNC_TIMEOUT_MS (500)
//=======================================================================//
//= Static function declaration. =//
//=======================================================================//
static void SGUI_SDK_PrepareSDK(void);
static bool SGUI_SDK_SyncMainFrameEvent(wxEvent& clsEvent, ENV_FLAG_INDEX eSyncFlag, int iTimeOutMs);
//=======================================================================//
//= Data type definition. =//
//=======================================================================//
static bool s_barrEventFlag[ENV_FLAG_IDX_MAX];
static unsigned int s_uiKeyCode;
static wxCriticalSection s_clsEventSyncCS;
//=======================================================================//
//= Function define. =//
//=======================================================================//
/*************************************************************************/
/** Function Name: SGUI_SDK_SetPixel **/
/** Purpose: Set virtual device pixel register data. **/
/** Params: **/
/** @ iX[in]: Pixel x-coordinate on display panel. **/
/** @ iY[in]: Pixel y-coordinate on display panel. **/
/** @ iPixelValue[out]: Pixel value, 0 for clear, 1 for set. **/
/** Return: None. **/
/** Notice: None. **/
/*************************************************************************/
void SGUI_SDK_SetPixel(int iX, int iY, int iPixelValue)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
LCDFrame* pclsMainFrameObjectPtr;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
pclsMainFrameObjectPtr = LCDFrame::GetInstance();
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != pclsMainFrameObjectPtr)
{
pclsMainFrameObjectPtr->SetLCDPixel(iX, iY, iPixelValue);
}
}
/*************************************************************************/
/** Function Name: SGUI_SDK_GetPixel **/
/** Purpose: Get a pixel value form virtual device register. **/
/** Params: **/
/** @ iX[in]: Pixel x-coordinate on display panel. **/
/** @ iY[in]: Pixel y-coordinate on display panel. **/
/** Return: Pixel state, 0 for cleared, 1 for set. **/
/** Notice: None. **/
/*************************************************************************/
int SGUI_SDK_GetPixel(int iX, int iY)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
LCDFrame* pclsMainFrameObjectPtr;
int iPixelValue;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
pclsMainFrameObjectPtr = LCDFrame::GetInstance();
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != pclsMainFrameObjectPtr)
{
iPixelValue = pclsMainFrameObjectPtr->GetLCDPixel(iX, iY);
}
else
{
iPixelValue = 0;
}
return iPixelValue;
}
/*************************************************************************/
/** Function Name: SGUI_SDK_RefreshDisplay **/
/** Purpose: Refresh virtual device display. **/
/** Params: None. **/
/** Return: None. **/
/** Notice: None. **/
/*************************************************************************/
void SGUI_SDK_RefreshDisplay(void)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
LCDFrame* pclsMainFrameObjectPtr;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
pclsMainFrameObjectPtr = LCDFrame::GetInstance();
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != pclsMainFrameObjectPtr)
{
pclsMainFrameObjectPtr->RefreshLCD();
}
}
/*************************************************************************/
/** Function Name: SGUI_SDK_ClearDisplay **/
/** Purpose: Clear screen display. **/
/** Params: None. **/
/** Return: None. **/
/** Notice: None. **/
/*************************************************************************/
void SGUI_SDK_ClearDisplay(void)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
LCDFrame* pclsMainFrameObjectPtr;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
pclsMainFrameObjectPtr = LCDFrame::GetInstance();
/*----------------------------------*/
/* Process */
/*----------------------------------*/
if(NULL != pclsMainFrameObjectPtr)
{
pclsMainFrameObjectPtr->ClearLCD();
pclsMainFrameObjectPtr->RefreshLCD();
}
}
/*************************************************************************/
/** Function Name: SGUI_SDK_SyncMainFrameEvent **/
/** Purpose: Send a event to main frame and wait for process **/
/** complete. **/
/** Params: **/
/** @ clsEvent[in]: Event class object. **/
/** @ eSyncFlag[in]: Sync process flag. **/
/** @ iTimeOutMs[in]: Waiting time in millisecond. **/
/** Return: **/
/** @ true: Process successfully. **/
/** @ false: Waiting process timeout. **/
/** Notice: If iTimeOutMs parameter value is 0, then process **/
/** return immediately. **/
/*************************************************************************/
bool SGUI_SDK_SyncMainFrameEvent(wxEvent& clsEvent, ENV_FLAG_INDEX eSyncFlag, int iTimeOutMs)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
LCDFrame* pclsMainFrameObjectPtr;
TimerSetEvent clsEventObject;
bool bReturn;
int iWaitTimeMs;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
pclsMainFrameObjectPtr = LCDFrame::GetInstance();
bReturn = false;
iWaitTimeMs = iTimeOutMs;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
do
{
if(NULL == pclsMainFrameObjectPtr)
{
// No main frame instance.
break;
}
// Set window ID.
clsEvent.SetId(pclsMainFrameObjectPtr->GetId());
// Post event.
SGUI_SDK_SetEvnetSyncFlag(eSyncFlag, false);
wxPostEvent(pclsMainFrameObjectPtr, clsEvent);
// Wait for sync
if(iWaitTimeMs < 1)
{
// No wait, return immediately.
bReturn = true;
SGUI_SDK_SetEvnetSyncFlag(eSyncFlag, true);
break;
}
else
{
while(iWaitTimeMs--)
{
if(true == SGUI_SDK_GetEventSyncFlag(eSyncFlag))
{
// Sync done
bReturn = true;
break;
}
wxMilliSleep(1);
}
}
}
while(0);
return bReturn;
}
void SGUI_SDK_SetEvnetSyncFlag(ENV_FLAG_INDEX eIndex, bool bValue)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
EventSyncLock();
s_barrEventFlag[eIndex] = bValue;
EventSyncUnlock();
}
/*************************************************************************/
/** Function Name: SGUI_SDK_SyncKeyEventData. **/
/** Purpose: Set key code value when key press event targets. **/
/** Params: **/
/** @ uiKeyCode[in]: Key code. **/
/** Return: None. **/
/** Notice: This function used to save and keep pressed key **/
/** code value, must be called before SetEvnetFlag. **/
/*************************************************************************/
void SGUI_SDK_SyncKeyEventData(unsigned int uiKeyCode)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
EventSyncLock();
s_uiKeyCode = uiKeyCode;
EventSyncUnlock();
}
/*************************************************************************/
/** Function Name: SGUI_SDK_GetKeyEventData. **/
/** Purpose: Set key code value when key press event targets. **/
/** Params: none. **/
/** Return: Last targeted key event value. **/
/** Notice: This function used to save and keep pressed key **/
/** code value, must be called before SetEvnetFlag. **/
/*************************************************************************/
unsigned int SGUI_SDK_GetKeyEventData(void)
{
return s_uiKeyCode;
}
/*************************************************************************/
/** Function Name: GetEventFlag. **/
/** Purpose: Post SDK heart-beat timer set event to main frame. **/
/** Params: **/
/** @ uiIntervalMs[in]: Timer interval in ms, 0 to stop timer. **/
/** Return: **/
/** @ true: Post message and wait sync successfully. **/
/** @ false: Post message failed or wait for sync timeout. **/
/** Notice: This function will start a timer for demo process, **/
/** like screen auto scroll animation or dummy data **/
/** input. **/
/*************************************************************************/
bool SGUI_SDK_GetEventSyncFlag(ENV_FLAG_INDEX eIndex)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
bool bReturn;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
EventSyncLock();
bReturn = s_barrEventFlag[eIndex];
EventSyncUnlock();
return bReturn;
}
/*************************************************************************/
/** Function Name: SetSDKSysTickTimer. **/
/** Purpose: Post SDK heart-beat timer set event to main frame. **/
/** Params: **/
/** @ uiIntervalMs[in]: Timer interval in ms, 0 to stop timer. **/
/** Return: **/
/** @ true: Post message and wait sync successfully. **/
/** @ false: Post message failed or wait for sync timeout. **/
/** Notice: This function will start a timer for demo process, **/
/** like screen auto scroll animation or dummy data **/
/** input, the recommended setting is 20(ms) or more. **/
/*************************************************************************/
bool SGUI_SDK_ConfigHearBeatTimer(unsigned int uiIntervalMs)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
TimerSetEvent clsEventObject;
bool bReturn;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
bReturn = false;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
// Prepare event object.
clsEventObject.SetEventType(wxEVT_TIMER_SET);
clsEventObject.SetInterval(uiIntervalMs);
// Post event.
bReturn = SGUI_SDK_SyncMainFrameEvent(clsEventObject, ENV_FLAG_IDX_SDK_TIM_SET, SDK_DEFAULT_EVENT_SYNC_TIMEOUT_MS);
return bReturn;
}
/*************************************************************************/
/** Function Name: SetRTCTimer. **/
/** Purpose: Post RTC timer set event to main frame. **/
/** Params: **/
/** @ bEnabled[in]: RTC timer enable. **/
/** Return: **/
/** @ true: Post message and wait sync successfully. **/
/** @ false: Post message failed or wait for sync timeout. **/
/** Notice: This function will start RTC for demo process, like **/
/** screen auto scroll animation or dummy data input. **/
/*************************************************************************/
bool SGUI_SDK_EnableRTCInterrupt(bool bEnabled)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
RTCSwitchEvent clsEventObject;
bool bReturn;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
bReturn = false;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
// Prepare event object.
clsEventObject.SetEventType(wxEVT_RTC_SWITCH);
clsEventObject.SetReqState(bEnabled);
// Post event.
bReturn = SGUI_SDK_SyncMainFrameEvent(clsEventObject, ENV_FLAG_IDX_SDK_RTC_EN, SDK_DEFAULT_EVENT_SYNC_TIMEOUT_MS);
return bReturn;
}
/*************************************************************************/
/** Function Name: PrepareSDK. **/
/** Purpose: Initialize global variable of SDK. **/
/** Params: None. **/
/** Return: None. **/
/** Notice: This function must only called when dummy main **/
/** starting. **/
/*************************************************************************/
void SGUI_SDK_PrepareSDK(void)
{
/*----------------------------------*/
/* Process */
/*----------------------------------*/
// Initialize event sync flag
for(unsigned int i=0; i<ENV_FLAG_IDX_MAX; i++)
{
s_barrEventFlag[i] = false;
}
// Initialize key coed variable.
s_uiKeyCode = KEY_VALUE_NONE;
}
/*************************************************************************/
/** Function Name: InitializeSDK. **/
/** Purpose: Post initialize event and wait for event sync. **/
/** Params: None. **/
/** Return: None. **/
/** Notice: Post event to main frame for initialize SDK. **/
/*************************************************************************/
bool SGUI_SDK_Initialize(void)
{
/*----------------------------------*/
/* Variable Declaration */
/*----------------------------------*/
InitEvent clsEventObject;
bool bReturn;
/*----------------------------------*/
/* Initialize */
/*----------------------------------*/
bReturn = false;
/*----------------------------------*/
/* Process */
/*----------------------------------*/
// Prepare event object.
clsEventObject.SetEventType(wxEVT_SDK_INIT);
bReturn = SGUI_SDK_SyncMainFrameEvent(clsEventObject, ENV_FLAG_IDX_SDK_INIT, SDK_DEFAULT_EVENT_SYNC_TIMEOUT_MS);
return bReturn;
}
/*************************************************************************/
/** Function Name: SGUI_SDK_DummyMainProc **/
/** Purpose: Main process start interface. **/
/** Params: None. **/
/** Return: return code, 0 for no error. **/
/** Notice: This function simulates the main entry function of **/
/** the target platform, it will called by main frame **/
/** thread helper process. **/
/*************************************************************************/
int SGUI_SDK_DummyMainProc(void)
{
// Initialize SDK.
SGUI_SDK_PrepareSDK();
// Initialize main frame.
SGUI_SDK_Initialize();
// Call main process.
DemoMainProcess();
return 0;
}
/*************************************************************************/
/** Function Name: SGUI_SDK_SysTickTimerInterrput **/
/** Purpose: SDK Dummy SysTick timer interrupt service function. **/
/** Params: None. **/
/** Return: none. **/
/** Notice: This function simulates the SysTick timer interrupt **/
/** service, add custom processing here if needed. **/
/*************************************************************************/
void SGUI_SDK_SysTickTimerInterrput(void)
{
// Add your process here.
}
/*************************************************************************/
/** Function Name: SGUI_SDK_RTCInterrput **/
/** Purpose: SDK Dummy RTC interrupt service function. **/
/** Params: None. **/
/** Return: none. **/
/** Notice: This function simulates the RTC interrupt service, **/
/** add custom processing here if needed. **/
/*************************************************************************/
void SGUI_SDK_RTCInterrput(void)
{
// Add your process here.
}