/*********************************************************************
*                     SEGGER Microcontroller GmbH                    *
*                        The Embedded Experts                        *
**********************************************************************
*                                                                    *
*       (c) 2003 - 2019  SEGGER Microcontroller GmbH                 *
*                                                                    *
*       www.segger.com     Support: support@segger.com               *
*                                                                    *
**********************************************************************
-------------------------- END-OF-HEADER -----------------------------
File    : GUI_VNC_Headless.c
Purpose : Shows how to use VNC.
Literature:
Notes:
Additional information:
  Sample output:
    Displays "Headless VNC server" which can be viewed via VNC.
*/
#include "DIALOG.h"
#include "GUI_VNC.h"
#include "IP.h"
#include "RTOS.h"
#include "TaskPrio.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/

/*********************************************************************
*
*       type definition
*
**********************************************************************
*/
/*********************************************************************
*
*       Static data
*
**********************************************************************
*/
static OS_STACKPTR int _aStack[256];       // Task stack
static OS_STACKPTR int _aIPRxStack[256];
static OS_TASK         _TCB;              // Task-control-blocks
static OS_TASK         _IPRxTCB;

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/
/*********************************************************************
*
*       _cbBk
*/
static void _cbBk(WM_MESSAGE * pMsg) {
  int xPos;
  int yPos;

  switch (pMsg->MsgId) {
  case WM_PAINT:
    //
    // Display something
    //
    GUI_SetBkColor(GUI_BLACK);
    GUI_Clear();
    xPos = LCD_GetXSize() >> 1;
    yPos = LCD_GetYSize() >> 1;
    GUI_SetFont(&GUI_Font20_1);
    GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    GUI_DispStringAt("Headless VNC server", xPos, yPos);
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       MainTask
*/
void MainTask(void);
void MainTask(void) {
  int IFaceId;
  //
  // Init GUI
  //
  GUI_Init();
  //
  // Init IP
  //
  IP_Init();
  IFaceId = IP_INFO_GetNumInterfaces() - 1;  // Get the last registered interface ID as this is most likely the interface we want to use in this sample.
  //
  // Start TCP/IP task
  //
  OS_CREATETASK(&_TCB,       "IP_Task",     IP_Task,              TASKPRIO_IPMAIN,  _aStack);
  OS_CREATETASK(&_IPRxTCB,   "IP_RxTask",   IP_RxTask,            TASKPRIO_IPRX,    _aIPRxStack);   // Start the IP_RxTask, optional.
  IP_Connect(IFaceId);                                                                              // Connect the interface if necessary.
  while (IP_IFaceIsReady() == 0) {
    GUI_X_Delay(5);
  }
  //
  // Start VNC server
  //
  GUI_VNC_X_StartServer(0, 0);
  //
  // Set a callback function for the back ground window
  //
  WM_SetCallback(WM_HBKWIN, &_cbBk);
  while (1) {
    GUI_Delay(100);
  }
}

/****** End Of File *************************************************/
