⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guidemo_navi.c

📁 UCOSII在STM32平台的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/GUI
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              礐/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : GUIDEMO_Navi.c
Purpose     : Navigation system demo
----------------------------------------------------------------------
*/

#include <math.h>

//#include "GUI.h"
//#include "GUIDEMO.h"
#include "..\GUIinc\GUI.h"
#include "..\uCGUIDemo\GUIDEMO.h"

#if GUI_WINSUPPORT & GUI_SUPPORT_MEMDEV

#include "..\GUIinc\WM.h"
#include "..\GUIinc\FRAMEWIN.h"

#include "Map.h"

/*********************************************************************
*
*       defines
*
**********************************************************************
*/

#if GUIDEMO_TINY
#define BORDER 0
#else
#define BORDER 8
#endif

#define FORWARD     1
#define TURN_LEFT   2
#define TURN_RIGHT  3
#define CURVE_LEFT  4
#define CURVE_RIGHT 5
#define STOP        6

/*********************************************************************
*
*       static data
*
**********************************************************************
*/

static int _MapX = 0;
static int _MapY = 0;
static int _MapHereX = 90;
static int _MapHereY = 15;

static const GUI_POINT _aRouteToSegger[] =
{
   { 90,  15}, {131,  54}, {141,  62}, {166,  46}, {180,  40}, {204, 113},
   {213, 156}, {217, 172}, {206, 173}, {205, 165}
};

/*********************************************************************
*
*       static code
*
**********************************************************************
*/
/*********************************************************************
*
*       _cbNaviWindow
*/
static void _cbNaviWindow(WM_MESSAGE* pMsg)
{
   switch (pMsg->MsgId)
   {
   case WM_PAINT:
      GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
      GUI_SetTextMode(GUI_TM_TRANS);
      GUI_SetFont(&GUI_FontComic18B_ASCII);
      GUI_SetColor(0x0050FF);
      GUI_DrawBitmap(&bmMap, -_MapX, -_MapY);
      GUI_DrawCircle(_MapHereX - _MapX, _MapHereY - _MapY, 4);
      GUI_DrawCircle(_MapHereX - _MapX, _MapHereY - _MapY, 5);
      GUI_DispStringAt("You are here", _MapHereX - _MapX - 45,
         _MapHereY - _MapY - 22);
      break;
   default:
      WM_DefaultProc(pMsg);
   }
}

/*********************************************************************
*
*       _NavigationDriveTo
*/
static void _NavigationDriveTo(WM_HWIN hWin, int x1, int y1)
{
   GUI_RECT Rect;
   int x0 = _MapHereX;
   int y0 = _MapHereY;
   float dx = x1 - x0;
   float dy = y1 - y0;
   int Len = sqrt((dx* dx) + (dy* dy));
   float sx = dx / Len;
   float sy = dy / Len;
   int i;
   int tRef;
   WM_GetClientRectEx(hWin, &Rect);
   for (i = 1; (i < Len) && !GUIDEMO_CheckCancel(); i += 2)
   {
      tRef = GUI_GetTime() + 100;
      _MapHereX = x0 + (i * sx);
      _MapHereY = y0 + (i * sy);
      _MapX = _MapHereX - (Rect.x1 >> 1);
      _MapY = _MapHereY - (Rect.y1 >> 1);
      if (_MapX < 0)
      {
         _MapX = 0;
      }
      else if ((_MapX + Rect.x1) >= bmMap.XSize)
      {
         _MapX = bmMap.XSize - Rect.x1 - 1;
      }
      if (_MapY < 0)
      {
         _MapY = 0;
      }
      else if ((_MapY + Rect.y1) >= bmMap.YSize)
      {
         _MapY = bmMap.YSize - Rect.y1 - 1;
      }
      WM_InvalidateWindow(hWin);
      do
      {
         GUI_Exec();
      }
      while ((GUI_GetTime() < tRef) && !GUIDEMO_CheckCancel());
   }
   _MapHereX = x1;
   _MapHereY = y1;
   WM_InvalidateWindow(hWin);
}

/*********************************************************************
*
*       _ShowMovingMap
*/
static void _ShowMovingMap(void)
{
   WM_HWIN hWin;
   WM_HWIN hClient;
   int i, x, y, w, h;
   int xSize = LCD_GetXSize();
   int ySize = LCD_GetYSize();
#if GUIDEMO_LARGE
   y = 70;
#else
   y = BORDER;
#endif
   x = BORDER;
   w = xSize - x - BORDER;
   h = ySize - y - BORDER;
   if (w > bmMap.XSize)
   {
      w = bmMap.XSize;
   }
   if (h > bmMap.YSize)
   {
      h = bmMap.YSize;
   }
   hWin = FRAMEWIN_CreateEx(x, y, w, h, WM_HBKWIN, WM_CF_SHOW | WM_CF_MEMDEV,
            0, 0, "Map to Hilden/Germany", _cbNaviWindow);
   FRAMEWIN_SetActive(hWin, 0);
   hClient = WM_GetClientWindow(hWin);
   WM_SetCallback(hClient, &_cbNaviWindow);
   /* Initialize starting point */
   _MapHereX = _aRouteToSegger[0].x;
   _MapHereY = _aRouteToSegger[0].y;
   /* Move over map */
   for (i = 1; (i < 10) && !GUIDEMO_CheckCancel(); i++)
   {
      _NavigationDriveTo(hClient, _aRouteToSegger[i].x, _aRouteToSegger[i].y);
   }
   WM_DeleteWindow(hWin);
}

#else

#define _ShowMovingMap()

#endif

/*********************************************************************
*
*       GUIDEMO_Navigation
*
**********************************************************************
*/

void GUIDEMO_Navigation(void)
{
   GUIDEMO_ShowIntro("Navigation system",
      "\nSamples used in"
      "\nNavigation systems");
   _ShowMovingMap();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -